public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
@ 2019-07-01  2:55 Michael D Kinney
  2019-07-01  2:55 ` [edk2-platforms Patch 01/14] Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid Michael D Kinney
                   ` (14 more replies)
  0 siblings, 15 replies; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

The following changes remove all dependencies on the IntelFrameworkPkg and 
IntelFrameworkModulePkg from the Vlv2TbltDevicePkg platform builds.  These 
changes do depend on updates binaries on the edk2-non-osi repository.

* Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid
* Vlv2TbltDevicePkg: Reduce Intel Framework dependencies
* Vlv2TbltDevicePkg: Remove unused modules/libraries
* Vlv2TbltDevicePkg: Switch from ISA to SIO modules
* Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol
* Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol
* Vlv2TbltDevicePkg: Remove use of BIOS ID tools
* Vlv2TbltDevicePkg: Remove use of Data Hub Protocol
* Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI
* Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe
* Vlv2TbltDevicePkg: Update boot mode/state behaviors
* Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols
* Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>

Michael D Kinney (14):
  Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid
  Vlv2TbltDevicePkg: Reduce Intel Framework dependencies
  Vlv2TbltDevicePkg: Remove unused modules/libraries
  Vlv2TbltDevicePkg: Switch from ISA to SIO modules
  Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol
  Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol
  Vlv2TbltDevicePkg: Remove use of BIOS ID tools
  Vlv2TbltDevicePkg: Remove use of Data Hub Protocol
  Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI
  Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe
  Vlv2TbltDevicePkg: Update boot mode/state behaviors
  Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols
  Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol
  Vlv2TbltDevicePkg/PlatformInitPei: Update MemoryTypeInformation

 .../AcpiPlatform/AcpiPlatform.c               |  137 +-
 .../AcpiPlatform/AcpiPlatform.h               |   11 +-
 .../AcpiPlatform/AcpiPlatform.inf             |   14 +-
 Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env  |   25 -
 Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env  |   25 -
 .../Intel/Vlv2TbltDevicePkg/BiosIdx64D.env    |   25 -
 .../Intel/Vlv2TbltDevicePkg/BiosIdx64R.env    |   25 -
 .../BootScriptSaveDxe/BootScriptSaveDxe.inf   |   60 -
 .../InternalBootScriptSave.h                  |  102 -
 .../BootScriptSaveDxe/ScriptSave.c            |  626 ---
 .../Intel/Vlv2TbltDevicePkg/Build_IFWI.bat    |   33 -
 .../Library/FmpDeviceLib/FmpDeviceLib.c       |   12 +-
 .../FspAzaliaConfigData/AzaliaConfig.bin      |  Bin 3708 -> 0 bytes
 .../FspSupport/BootModePei/BootModePei.c      |   42 -
 .../FspSupport/BootModePei/BootModePei.inf    |   40 -
 .../FspHobProcessLibVlv2.c                    |  421 --
 .../FspHobProcessLibVlv2.inf                  |   74 -
 .../FspPlatformSecLibVlv2.c                   |  144 -
 .../FspPlatformSecLibVlv2.inf                 |   82 -
 .../Ia32/AsmSaveSecContext.asm                |   45 -
 .../SecFspPlatformSecLibVlv2/Ia32/Fsp.inc     |   45 -
 .../Ia32/PeiCoreEntry.asm                     |  135 -
 .../Ia32/SecEntry.asm                         |  338 --
 .../SecFspPlatformSecLibVlv2/Ia32/Stack.S     |   71 -
 .../SecFspPlatformSecLibVlv2/Ia32/Stack.asm   |   76 -
 .../SecFspPlatformSecLibVlv2/PlatformInit.c   |   36 -
 .../SecFspPlatformSecLibVlv2/SaveSecContext.c |  108 -
 .../SecGetPerformance.c                       |   83 -
 .../SecPlatformInformation.c                  |   77 -
 .../SecFspPlatformSecLibVlv2/SecRamInitData.c |   16 -
 .../SecTempRamSupport.c                       |  149 -
 .../SecFspPlatformSecLibVlv2/UartInit.c       |  192 -
 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId    |  Bin 12236 -> 0 bytes
 .../Intel/Vlv2TbltDevicePkg/GenBiosId.exe     |  Bin 384000 -> 0 bytes
 .../Vlv2TbltDevicePkg/Include/Guid/BiosId.h   |   30 -
 .../Vlv2TbltDevicePkg/Include/Guid/IdccData.h |  104 -
 .../Vlv2TbltDevicePkg/Include/Guid/ItkData.h  |   18 +-
 .../Include/Guid/PlatformInfo.h               |    9 +-
 .../Include/Library/BiosIdLib.h               |   22 +-
 .../Include/Library/EfiRegTableLib.h          |   51 +-
 .../Include/Protocol/LpcWpc83627Policy.h      |   92 -
 .../Include/Protocol/LpcWpce791Policy.h       |   55 -
 .../Include/Protocol/TpmMp.h                  |  136 -
 .../Include/Protocol/UsbPolicy.h              |  126 -
 .../Library/BiosIdLib/BiosIdLib.c             |  279 +-
 .../Library/BiosIdLib/BiosIdLib.inf           |   21 +-
 .../DxePlatformBootManagerLib/BdsPlatform.c   | 1434 ++++++
 .../DxePlatformBootManagerLib/BdsPlatform.h   |  253 +
 .../DxePlatformBootManagerLib.inf             |   97 +
 .../DxePlatformBootManagerLib/MemoryTest.c    |   83 +
 .../PlatformBootOption.c                      |  559 ++
 .../Library/EfiRegTableLib/EfiRegTableLib.c   |   57 +-
 .../Library/EfiRegTableLib/EfiRegTableLib.inf |   12 +-
 .../Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c |   46 -
 .../Library/I2CLib/I2CLibNull.inf             |   39 -
 .../Library/I2CLibDxe/I2CLib.c                |  735 ---
 .../Library/I2CLibDxe/I2CLibDxe.inf           |   39 -
 .../Library/I2CLibDxe/I2CRegs.h               |  126 -
 .../Library/I2CLibPei/I2CAccess.h             |   44 -
 .../Library/I2CLibPei/I2CDelayPei.c           |   46 -
 .../Library/I2CLibPei/I2CDelayPei.h           |   30 -
 .../Library/I2CLibPei/I2CIoLibPei.c           |  178 -
 .../Library/I2CLibPei/I2CIoLibPei.h           |  153 -
 .../Library/I2CLibPei/I2CLibPei.c             |  638 ---
 .../Library/I2CLibPei/I2CLibPei.h             |  280 -
 .../Library/I2CLibPei/I2CLibPei.inf           |   40 -
 .../BoardClkGens/BoardClkGens.c               |   23 +-
 .../BoardClkGens/BoardClkGens.h               |    8 +-
 .../MultiPlatformLib/BoardGpios/BoardGpios.c  |   12 +-
 .../MultiPlatformLib/BoardGpios/BoardGpios.h  |    7 +-
 .../MultiPlatformLib/MultiPlatformLib.h       |   11 +-
 .../MultiPlatformLib/MultiPlatformLib.inf     |   11 +-
 .../Library/PlatformBdsLib/BdsPlatform.c      | 3098 ------------
 .../Library/PlatformBdsLib/BdsPlatform.h      |  516 --
 .../Library/PlatformBdsLib/PlatformBdsLib.inf |  128 -
 .../PlatformBdsLib/PlatformBdsStrings.uni     |   30 -
 .../Library/PlatformBdsLib/PlatformData.c     |  306 --
 .../Library/PlatformFspLib/PlatformFspLib.c   |   44 -
 .../Library/PlatformFspLib/PlatformFspLib.inf |   49 -
 .../SerialPortLib/PlatformSerialPortLib.h     |   53 -
 .../Library/SerialPortLib/SerialPortLib.c     |  246 -
 .../Library/SerialPortLib/SerialPortLib.inf   |   52 -
 .../Library/SerialPortLib/SioInit.c           |  127 -
 .../Library/SerialPortLib/SioInit.h           |   62 -
 .../Library/SmbusLib/CommonHeader.h           |   26 -
 .../Library/SmbusLib/SmbusLib.c               |  873 ----
 .../Library/SmbusLib/SmbusLib.inf             |   46 -
 .../Metronome/LegacyMetronome.c               |  185 -
 .../Metronome/LegacyMetronome.h               |   64 -
 .../Vlv2TbltDevicePkg/Metronome/Metronome.inf |   49 -
 .../MonoStatusCode/MonoStatusCode.h           |   47 +-
 .../MonoStatusCode/MonoStatusCode.inf         |    9 +-
 .../Library/GenericBdsLib/BdsBoot.c           | 4490 -----------------
 .../Library/GenericBdsLib/BdsConnect.c        |  429 --
 .../Library/GenericBdsLib/BdsConsole.c        | 1061 ----
 .../Library/GenericBdsLib/BdsMisc.c           | 1575 ------
 .../Library/GenericBdsLib/DevicePath.c        |   27 -
 .../Library/GenericBdsLib/GenericBdsLib.inf   |  143 -
 .../Library/GenericBdsLib/GenericBdsLib.uni   |   19 -
 .../GenericBdsLib/GenericBdsStrings.uni       |   30 -
 .../Library/GenericBdsLib/InternalBdsLib.h    |  173 -
 .../Library/GenericBdsLib/String.c            |   26 -
 .../Library/GenericBdsLib/String.h            |   42 -
 .../PciPlatform/PciPlatform.c                 |    7 +-
 .../PciPlatform/PciPlatform.inf               |    9 +-
 .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c   |  951 ++++
 .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h   |  363 ++
 .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf |   38 +
 .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.c   |    8 +-
 .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.h   |   17 +-
 .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf |    8 +-
 .../Vlv2TbltDevicePkg/PlatformDxe/BoardId.c   |   45 +-
 .../PlatformDxe/ClockControl.c                |   80 +-
 .../PlatformDxe/Configuration.h               |    8 +-
 .../PlatformDxe/IchRegTable.c                 |    8 +-
 .../Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c  |   72 -
 .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  |  533 +-
 .../PlatformDxe/PlatformDxe.h                 |  521 +-
 .../PlatformDxe/PlatformDxe.inf               |   28 +-
 .../PlatformDxe/SioPlatformPolicy.c           |   82 -
 .../PlatformGopPolicy/PlatformGopPolicy.inf   |   15 +-
 .../Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c  |  319 --
 .../PlatformInitPei/MemoryCallback.c          |    8 +-
 .../PlatformInitPei/MemoryPeim.c              |   21 +-
 .../PlatformInitPei/PchInitPeim.c             |   10 +-
 .../PlatformInitPei/PlatformEarlyInit.c       |  209 +-
 .../PlatformInitPei/PlatformEarlyInit.h       |   31 +-
 .../PlatformInitPei/PlatformInitPei.inf       |   29 +-
 .../Vlv2TbltDevicePkg/PlatformPei/BootMode.c  |   99 +-
 .../PlatformPei/CommonHeader.h                |   12 +-
 .../PlatformPei/MemoryCallback.c              |    8 +-
 .../Vlv2TbltDevicePkg/PlatformPei/Platform.c  |   24 +-
 .../Vlv2TbltDevicePkg/PlatformPei/Platform.h  |   27 +-
 .../PlatformPei/PlatformPei.inf               |   12 +-
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |   28 +-
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |  286 +-
 .../Vlv2TbltDevicePkg/PlatformPkgConfig.dsc   |   22 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |  299 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |  561 +-
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |  562 +--
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |  563 +--
 .../PlatformSetupDxe/PlatformSetupDxe.h       |   30 +-
 .../PlatformSetupDxe/PlatformSetupDxe.inf     |   17 +-
 .../PlatformSetupDxe/SetupFunctions.c         |   38 +-
 .../PlatformSetupDxe/SetupInfoRecords.c       |  572 +--
 .../Vlv2TbltDevicePkg/PlatformSmm/Platform.c  |  196 +-
 .../PlatformSmm/PlatformSmm.inf               |   34 +-
 .../Vlv2TbltDevicePkg/PlatformSmm/S3Save.c    |   53 +-
 .../PlatformSmm/SmmPlatform.h                 |  111 +-
 .../PlatformSmm/SmmScriptSave.c               |  252 -
 .../PlatformSmm/SmmScriptSave.h               |   50 -
 .../Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf |    6 +-
 .../SmBiosMiscDxe/CommonHeader.h              |   10 +-
 .../SmBiosMiscDxe/DataHubRecords.h            | 2934 +++++++++++
 .../MiscBaseBoardManufacturerFunction.c       |    8 +-
 .../SmBiosMiscDxe/MiscBiosVendorFunction.c    |    9 +-
 .../SmBiosMiscDxe/MiscMemoryDeviceFunction.c  |  318 +-
 .../SmBiosMiscDxe/MiscOemType0x94Function.c   |   45 +-
 .../SmBiosMiscDxe/MiscProcessorCacheData.c    |   11 +-
 .../MiscProcessorCacheFunction.c              |  273 +-
 .../MiscProcessorInformationFunction.c        |  203 +-
 .../MiscSubclassDriverDataTable.c             |   14 +-
 .../MiscSubclassDriverEntryPoint.c            |   13 +-
 .../MiscSystemManufacturerFunction.c          |   10 +-
 .../SmBiosMiscDxe/SmBiosMiscDxe.inf           |   18 +-
 .../SmmSwDispatch2OnSmmSwDispatchThunk.c      |  459 --
 .../SmmSwDispatch2OnSmmSwDispatchThunk.inf    |   54 -
 .../SmramSaveInfoHandlerSmm.c                 |  164 -
 .../SmramSaveInfoHandlerSmm.inf               |   60 -
 .../Stitch/IFWIHeader/Vacant.bin              |  Bin 3928064 -> 0 bytes
 .../Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat   |  270 -
 .../Stitch/MNW2_Stitch_Config.txt             |   10 -
 .../Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c |   33 -
 .../Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf   |   32 -
 .../VlvPlatformInitDxe/IgdOpRegion.c          |   20 +-
 .../VlvPlatformInitDxe/IgdOpRegion.h          |   27 +-
 .../VlvPlatformInitDxe/VlvPlatformInitDxe.inf |   14 +-
 .../Vlv2TbltDevicePkg/Wpce791/LpcDriver.c     |  340 --
 .../Vlv2TbltDevicePkg/Wpce791/LpcDriver.h     |  112 -
 .../Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c    |  366 --
 .../Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h    |  103 -
 .../Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c  |  126 -
 .../Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h  |  101 -
 .../Vlv2TbltDevicePkg/Wpce791/Wpce791.inf     |   63 -
 Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat  |   47 +-
 Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh   |   52 +-
 .../Include/Protocol/SmmIchnDispatch.h        |  183 +
 .../Vlv2DeviceRefCodePkg.dec                  |    5 +-
 188 files changed, 8321 insertions(+), 28666 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootScriptSaveDxe.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/InternalBootScriptSave.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/ScriptSave.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/AsmSaveSecContext.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Fsp.inc
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/PeiCoreEntry.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/PlatformInit.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SaveSecContext.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecGetPerformance.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecPlatformInformation.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecRamInitData.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecTempRamSupport.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/UartInit.c
 delete mode 100755 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId.exe
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc83627Policy.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpce791Policy.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPolicy.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/MemoryTest.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/PlatformBootOption.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLibDxe.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRegs.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAccess.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsStrings.uni
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformData.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/PlatformSerialPortLib.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/CommonHeader.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/DevicePath.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.uni
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsStrings.uni
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatformPolicy.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRecords.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIHeader/Vacant.bin
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Config.txt
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf
 create mode 100644 Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmIchnDispatch.h

-- 
2.21.0.windows.1


^ permalink raw reply	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 01/14] Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:06   ` Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 02/14] Vlv2TbltDevicePkg: Reduce Intel Framework dependencies Michael D Kinney
                   ` (13 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

* Add the gEfiSmmIchnDispatchProtocolGuid from the IntelFrameworkPkg
  to the Si specific Vlv2TbltDevicePkg.  This removes a dependency
  on the IntelFrameworkPkg and adds a Si specific protocol to a Si
  package.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Include/Protocol/SmmIchnDispatch.h        | 183 ++++++++++++++++++
 .../Vlv2DeviceRefCodePkg.dec                  |   5 +-
 2 files changed, 186 insertions(+), 2 deletions(-)
 create mode 100644 Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmIchnDispatch.h

diff --git a/Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmIchnDispatch.h b/Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmIchnDispatch.h
new file mode 100644
index 0000000000..3cf86c0ff9
--- /dev/null
+++ b/Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmIchnDispatch.h
@@ -0,0 +1,183 @@
+/** @file
+  Provides the parent dispatch service for a given SMI source generator.
+  The EFI_SMM_ICHN_DISPATCH_PROTOCOL provides the ability to install child handlers for
+  the given event types.
+
+Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Revision Reference:
+  This Protocol is defined in Framework of EFI SMM Core Interface Spec
+  Version 0.9.
+
+**/
+
+#ifndef _EFI_SMM_ICHN_DISPATCH_H_
+#define _EFI_SMM_ICHN_DISPATCH_H_
+
+
+//
+// Global ID for the ICH SMI Protocol
+//
+#define EFI_SMM_ICHN_DISPATCH_PROTOCOL_GUID \
+  { \
+    0xc50b323e, 0x9075, 0x4f2a, {0xac, 0x8e, 0xd2, 0x59, 0x6a, 0x10, 0x85, 0xcc } \
+  }
+
+typedef struct _EFI_SMM_ICHN_DISPATCH_PROTOCOL  EFI_SMM_ICHN_DISPATCH_PROTOCOL;
+
+//
+// Related Definitions
+//
+//
+// ICHN Specific SMIs.  These are miscellaneous SMI sources that are supported by the
+// ICHN specific SMI implementation.  These may change over time.  TrapNumber is only
+// valid if the Type is Trap.
+//
+typedef enum {
+  //
+  // NOTE: NEVER delete items from this list/enumeration!  Doing so will prevent other versions
+  // of the code from compiling.  If the ICH version your driver is written for doesn't support
+  // some of these SMIs, then simply return EFI_UNSUPPORTED when a child/client tries to register
+  // for them.
+  //
+  IchnMch,
+  IchnPme,
+  IchnRtcAlarm,
+  IchnRingIndicate,
+  IchnAc97Wake,
+  IchnSerialIrq,
+  IchnY2KRollover,
+  IchnTcoTimeout,
+  IchnOsTco,
+  IchnNmi,
+  IchnIntruderDetect,
+  IchnBiosWp,
+  IchnMcSmi,
+  IchnPmeB0,
+  IchnThrmSts,
+  IchnSmBus,
+  IchnIntelUsb2,
+  IchnMonSmi7,
+  IchnMonSmi6,
+  IchnMonSmi5,
+  IchnMonSmi4,
+  IchnDevTrap13,
+  IchnDevTrap12,
+  IchnDevTrap11,
+  IchnDevTrap10,
+  IchnDevTrap9,
+  IchnDevTrap8,
+  IchnDevTrap7,
+  IchnDevTrap6,
+  IchnDevTrap5,
+  IchnDevTrap3,
+  IchnDevTrap2,
+  IchnDevTrap1,
+  IchnDevTrap0,
+  IchnIoTrap3,
+  IchnIoTrap2,
+  IchnIoTrap1,
+  IchnIoTrap0,
+  IchnPciExpress,
+  IchnMonitor,
+  IchnSpi,
+  IchnQRT,
+  IchnGpioUnlock,
+  //
+  // INSERT NEW ITEMS JUST BEFORE THIS LINE
+  //
+  NUM_ICHN_TYPES  // the number of items in this enumeration
+} EFI_SMM_ICHN_SMI_TYPE;
+
+typedef struct {
+  EFI_SMM_ICHN_SMI_TYPE Type;
+} EFI_SMM_ICHN_DISPATCH_CONTEXT;
+
+//
+// Member functions
+//
+/**
+  Dispatch function for a ICHN specific SMI handler.
+
+  @param  DispatchHandle        The handle of this dispatch function.
+  @param  DispatchContext       The pointer to the dispatch function's context.
+                                The DispatchContext fields are filled in
+                                by the dispatching driver prior to
+                                invoking this dispatch function.
+
+  @return None
+
+**/
+typedef
+VOID
+(EFIAPI *EFI_SMM_ICHN_DISPATCH)(
+  IN  EFI_HANDLE                      DispatchHandle,
+  IN  EFI_SMM_ICHN_DISPATCH_CONTEXT   *DispatchContext
+  );
+
+/**
+  Register a child SMI source dispatch function with a parent SMM driver.
+
+  @param  This                  The pointer to the EFI_SMM_ICHN_DISPATCH_PROTOCOL instance.
+  @param  DispatchFunction      The function to install.
+  @param  DispatchContext       The pointer to the dispatch function's context.
+                                The caller fills in this context before calling
+                                the register function to indicate to the register
+                                function the ICHN SMI source for which the dispatch
+                                function should be invoked.
+  @param  DispatchHandle        The handle generated by the dispatcher to track the function
+                                instance.
+
+  @retval EFI_SUCCESS           The dispatch function has been successfully
+                                registered and the SMI source has been enabled.
+  @retval EFI_DEVICE_ERROR      The driver could not enable the SMI source.
+  @retval EFI_OUT_OF_RESOURCES  Not enough memory (system or SMM) to manage this
+                                child.
+  @retval EFI_INVALID_PARAMETER DispatchContext is invalid. The ICHN input value
+                                is not within valid range.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SMM_ICHN_REGISTER)(
+  IN EFI_SMM_ICHN_DISPATCH_PROTOCOL            *This,
+  IN EFI_SMM_ICHN_DISPATCH                     DispatchFunction,
+  IN EFI_SMM_ICHN_DISPATCH_CONTEXT             *DispatchContext,
+  OUT EFI_HANDLE                               *DispatchHandle
+  );
+
+/**
+  Unregister a child SMI source dispatch function with a parent SMM driver
+
+  @param  This                  The pointer to the EFI_SMM_ICHN_DISPATCH_PROTOCOL instance.
+  @param  DispatchHandle        The handle of the service to remove.
+
+  @retval EFI_SUCCESS           The dispatch function has been successfully
+                                unregistered, and the SMI source has been disabled,
+                                if there are no other registered child dispatch
+                                functions for this SMI source.
+  @retval EFI_INVALID_PARAMETER The handle is invalid.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SMM_ICHN_UNREGISTER)(
+  IN EFI_SMM_ICHN_DISPATCH_PROTOCOL            *This,
+  IN EFI_HANDLE                                DispatchHandle
+  );
+
+//
+// Interface structure for the SMM ICHN specific SMI Dispatch Protocol
+//
+/**
+  Provides the parent dispatch service for a given SMI source generator.
+**/
+struct _EFI_SMM_ICHN_DISPATCH_PROTOCOL {
+  EFI_SMM_ICHN_REGISTER   Register;     ///< Installs a child service to be dispatched by this protocol.
+  EFI_SMM_ICHN_UNREGISTER UnRegister;   ///< Removes a child service dispatched by this protocol.
+};
+
+extern EFI_GUID gEfiSmmIchnDispatchProtocolGuid;
+
+#endif
diff --git a/Silicon/Intel/Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec b/Silicon/Intel/Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
index 6117f179ba..1af1ed757c 100644
--- a/Silicon/Intel/Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
+++ b/Silicon/Intel/Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
@@ -1,6 +1,6 @@
 ##  @file  Vlv2DeviceRefCodePkg.dec
 #
-# Copyright (c) 2012  - 2015, Intel Corporation. All rights reserved
+# Copyright (c) 2012  - 2019, Intel Corporation. All rights reserved
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -32,7 +32,7 @@ [Ppis]
   gEfiPeiReadOnlyVariable2PpiGuid       = { 0x2ab86ef5, 0xecb5, 0x4134, {0xb5, 0x56, 0x38, 0x54, 0xca, 0x1f, 0xe1, 0xb4}}
   gPchPeiInitPpiGuid                    = { 0xACB93B08, 0x5CDC, 0x4A8F, {0x93, 0xD4, 0x6, 0xE3, 0x42, 0xDF, 0x18, 0x2E}}
   gPttPassThruPpiGuid                   = { 0xc5068bac, 0xa7dc, 0x42f1, {0xae, 0x80, 0xca, 0xa2, 0x4b, 0xb4, 0x90, 0x4b}}
-  
+
 [Protocols]
   gEfiGlobalNvsAreaProtocolGuid         = { 0x074e1e48, 0x8132, 0x47a1, {0x8c, 0x2c, 0x3f, 0x14, 0xad, 0x9a, 0x66, 0xdc}}
   gPpmPlatformPolicyProtocolGuid        = { 0xddabfeac, 0xef63, 0x452c, {0x8f, 0x39, 0xed, 0x7f, 0xae, 0xd8, 0x26, 0x5e}}
@@ -41,6 +41,7 @@ [Protocols]
   gEfiSdHostIoProtocolGuid              = { 0xb63f8ec7, 0xa9c9, 0x4472, {0xa4, 0xc0, 0x4d, 0x8b, 0xf3, 0x65, 0xcc, 0x51}}
   gEfiSpiProtocolGuid                   = { 0x1156efc6, 0xea32, 0x4396, {0xb5, 0xd5, 0x26, 0x93, 0x2e, 0x83, 0xc3, 0x13}}
   gEfiSmmSpiProtocolGuid                = { 0xD9072C35, 0xEB8F, 0x43AD, {0xA2, 0x20, 0x34, 0xD4, 0x0E, 0x2A, 0x82, 0x85}}
+  gEfiSmmIchnDispatchProtocolGuid       = { 0xc50b323e, 0x9075, 0x4f2a, { 0xac, 0x8e, 0xd2, 0x59, 0x6a, 0x10, 0x85, 0xcc}}
   gEfiSmmIchnDispatchExProtocolGuid     = { 0x3920405B, 0xC897, 0x44DA, {0x88, 0xF3, 0x4C, 0x49, 0x8A, 0x6F, 0xF7, 0x36}}
   gEfiPchS3SupportProtocolGuid          = { 0xE287D20B, 0xD897, 0x4E1E, {0xA5, 0xD9, 0x97, 0x77, 0x63, 0x93, 0x6A, 0x04}}
   gPchResetProtocolGuid                 = { 0xDB63592C, 0xB8CC, 0x44C8, {0x91, 0x8C, 0x51, 0xF5, 0x34, 0x59, 0x8A, 0x5A}}
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 02/14] Vlv2TbltDevicePkg: Reduce Intel Framework dependencies
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
  2019-07-01  2:55 ` [edk2-platforms Patch 01/14] Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:06   ` Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 03/14] Vlv2TbltDevicePkg: Remove unused modules/libraries Michael D Kinney
                   ` (12 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

* Use BaseSerialPortLib16550 from MdeModulePkg.
* Remove unused DxeSmmDriverEntryPoint library instance mapping
  from the IntelFrameworkPkg.
* Remove all references to PS/2 Keyboard/Mouse that are not
  available on MinnowMax.
* Remove VgaClassDxe module from IntelFrameworkModulePkg that is
  not used.
* Remove DatahubStatusCodeHandlerDxe module from the
  IntelFrameworkModulePkg that is not used.
* Remove LegacyRegionDxe module from the IntelFrameworkModulePkg
  The Legacy Region Protocol produced by this module is not used.
* Remove VLV2 specific Metronome module that uses the CPU I/O
  Protocol defined in the IntelFrameworkPkg.  Instead, use the
  Metronome module from the MdeModulePkg that produces the
  Metronome Arch Protocol from a TimerLib instance.
* Remove use of MpCpu.inf from DSC/FDF file.
* Update DSC/FDF/source files to assume MINNOW2_FSP_BUILD is FALSE.
* Update DSC/FDF/source files to assume FTPM_ENABLE is FALSE.
* Remove TXT binary
* Use PcAtChisetPkg HpetDxe module instead of the VLV2 specific
  SmartTimer module that has an IntelFramework dependency.
* Remove SEC_ENABLE define and dependent modules.
* Remove IdeBusDxe module from DSC files.  IdeBusDxe is listed
  in DSC file, but not the FDF file, so it is not used.  This
  removes an IntelFrameworkModulkePkg dependency.
* Remove commented out SDIO and PiSmmCommunicationPei modules
* Remove unused Intel Framework S3Lib
* Remove use of PCD from the IntelFrameworkModulePkg
  PcdEbdaReservedMemorySize.
* Remove EdkCompatibilityPkg related [BuildOptions] sections
* Remove unused DEFINES from DSC/FDF
* Remove unused references to Ppi/Cache.h from Vlv2SocBinPkg.dec
* Remove unused references to gPeiCachePpiGuid from Vlv2SocBinPkg.dec
* Remove unused references to gEfiHtBistHobGuid from Vlv2SocBinPkg.dec
* Remove unused references to gEfiCpuTokenSpaceGuid PCDs from
  Vlv2SocBinPkg.dec
* Remove unused IntelPchLegacyInterrupt module
* Remove CpuIoDxe module from IntelFrameworkModulePkg
* Remove duplicate declaration of gEfiAcpiSupportProtocolGuid
  from Vlv2Tblt2DevicePkg
* Remove duplicate declaration of PcdShellFile from Vlv2Tblt2DevicePkg
* Remove unused gEfiAcpiTableProtocolGuid from AcpiPlatform.inf
* Add E7006X3 UNDI module to FDF files
* Remove gEfiSimpleNetworkProtocolGuid dependency.
  If gEfiSimpleNetworkProtocolGuid is not produced, still
  allow all SMBIOS records to be produced.  The MAC address
  from Simple Network Protocol is being used as a system
  serial number.  If Simple Network Protocol is not available,
  then default to a serial number of 0.
* Remove unused dependency on IntelFspWrapperPkg
* Remove Intel Framework S3 support.
* Remove use of the gEfiSmmPeiSmramMemoryReserveGuid GUIDed HOB.
* Remove production of unused gEfiFindFvPpiGuid.
* Update IA32 only builds to use a unique BUILD_OUTPUT directory

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../AcpiPlatform/AcpiPlatform.c               |  33 +-
 .../AcpiPlatform/AcpiPlatform.h               |   8 +-
 .../AcpiPlatform/AcpiPlatform.inf             |   5 -
 .../Intel/Vlv2TbltDevicePkg/Build_IFWI.bat    |  33 --
 .../Include/Library/EfiRegTableLib.h          |  11 +-
 .../Library/EfiRegTableLib/EfiRegTableLib.inf |  12 +-
 .../MultiPlatformLib/MultiPlatformLib.h       |   7 +-
 .../MultiPlatformLib/MultiPlatformLib.inf     |   9 +-
 .../Library/PlatformBdsLib/BdsPlatform.c      |   6 -
 .../MonoStatusCode/MonoStatusCode.h           |  47 +-
 .../MonoStatusCode/MonoStatusCode.inf         |   9 +-
 .../PciPlatform/PciPlatform.inf               |   8 +-
 .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.h   |  17 +-
 .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf |   8 +-
 .../PlatformDxe/Configuration.h               |   8 +-
 .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  | 524 +----------------
 .../PlatformDxe/PlatformDxe.h                 | 515 +----------------
 .../PlatformDxe/PlatformDxe.inf               |  20 +-
 .../PlatformGopPolicy/PlatformGopPolicy.inf   |  12 +-
 .../PlatformInitPei/MemoryCallback.c          |   8 +-
 .../PlatformInitPei/PlatformEarlyInit.c       | 209 +------
 .../PlatformInitPei/PlatformEarlyInit.h       |  21 +-
 .../PlatformInitPei/PlatformInitPei.inf       |  29 +-
 .../PlatformPei/CommonHeader.h                |  11 +-
 .../PlatformPei/MemoryCallback.c              |   8 +-
 .../Vlv2TbltDevicePkg/PlatformPei/Platform.c  |  16 +-
 .../PlatformPei/PlatformPei.inf               |  11 +-
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |  16 +-
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   | 254 +++------
 .../Vlv2TbltDevicePkg/PlatformPkgConfig.dsc   |  21 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      | 234 +++-----
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   | 532 ++++-------------
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     | 533 ++++-------------
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      | 534 ++++--------------
 .../PlatformSetupDxe/PlatformSetupDxe.h       |  28 +-
 .../PlatformSetupDxe/PlatformSetupDxe.inf     |  14 +-
 .../PlatformSetupDxe/SetupInfoRecords.c       |  43 +-
 .../Vlv2TbltDevicePkg/PlatformSmm/Platform.c  |  83 +--
 .../PlatformSmm/PlatformSmm.inf               |  17 +-
 .../Vlv2TbltDevicePkg/PlatformSmm/S3Save.c    |  53 +-
 .../PlatformSmm/SmmPlatform.h                 |   7 +-
 .../Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf |   6 +-
 .../MiscBaseBoardManufacturerFunction.c       |   8 +-
 .../SmBiosMiscDxe/MiscOemType0x94Function.c   |  42 +-
 .../MiscSystemManufacturerFunction.c          |  10 +-
 .../SmBiosMiscDxe/SmBiosMiscDxe.inf           |  15 +-
 .../VlvPlatformInitDxe/IgdOpRegion.c          |  11 +-
 .../VlvPlatformInitDxe/IgdOpRegion.h          |  27 +-
 .../VlvPlatformInitDxe/VlvPlatformInitDxe.inf |   8 +-
 Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat  |  39 +-
 50 files changed, 599 insertions(+), 3541 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
index 5c03f66edb..1f4d575b73 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
@@ -638,7 +638,6 @@ OnReadyToBoot (
   EFI_STATUS                  Status;
   EFI_ACPI_TABLE_VERSION      TableVersion;
   EFI_ACPI_SUPPORT_PROTOCOL   *AcpiSupport;
-  EFI_ACPI_S3_SAVE_PROTOCOL   *AcpiS3Save;
   SYSTEM_CONFIGURATION        SetupVarBuffer;
   UINTN                       VariableSize;
   EFI_PLATFORM_CPU_INFO       *PlatformCpuInfoPtr = NULL;
@@ -722,15 +721,6 @@ OnReadyToBoot (
                           TableVersion
                           );
   ASSERT_EFI_ERROR (Status);
-
-  //
-  // S3 script save.
-  //
-  Status = gBS->LocateProtocol (&gEfiAcpiS3SaveProtocolGuid, NULL, (VOID **) &AcpiS3Save);
-  if (!EFI_ERROR (Status)) {
-    AcpiS3Save->S3Save (AcpiS3Save, NULL);
-  }
-
 }
 
 VOID
@@ -1261,12 +1251,23 @@ AcpiPlatformEntryPoint (
     }
   }
 
-  Status = EfiCreateEventReadyToBootEx (
-             TPL_NOTIFY,
-             OnReadyToBoot,
-             NULL,
-             &Event
-             );
+  //
+  // Publish ACPI 1.0 or 2.0 Tables.
+  //
+//  Status = AcpiSupport->PublishTables (
+//                          AcpiSupport,
+//                          TableVersion
+//                          );
+//  ASSERT_EFI_ERROR (Status);
+
+//  Status = EfiCreateEventReadyToBootEx (
+//             TPL_NOTIFY,
+//             OnReadyToBoot,
+//             NULL,
+//             &Event
+//             );
+  Event = NULL;
+  OnReadyToBoot (Event, NULL);
 
   //
   // Finished.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
index 598756846a..f45590ea24 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
@@ -1,12 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   AcpiPlatform.h
@@ -26,7 +23,6 @@ Abstract:
 //
 // Statements that include other header files.
 //
-#include <FrameworkDxe.h>
 #include <PiDxe.h>
 #include <Base.h>
 #include <Library/UefiLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
index c59920db03..817ad58a81 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
@@ -37,7 +37,6 @@ [Packages]
   IntelFrameworkPkg/IntelFrameworkPkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
 
 [LibraryClasses]
@@ -63,13 +62,9 @@ [Guids]
   gEfiVlv2VariableGuid
 
 [Protocols]
-  gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
   gEnhancedSpeedstepProtocolGuid
   gEfiPlatformCpuProtocolGuid
   gEfiAcpiSupportProtocolGuid
-  gEfiAcpiS3SaveProtocolGuid
-  gEfiCpuIoProtocolGuid
-  gEfiPs2PolicyProtocolGuid
   gEfiFirmwareVolume2ProtocolGuid
   gEfiMpServiceProtocolGuid
   gEfiGlobalNvsAreaProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Build_IFWI.bat b/Platform/Intel/Vlv2TbltDevicePkg/Build_IFWI.bat
index 887206703a..44759c617f 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Build_IFWI.bat
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Build_IFWI.bat
@@ -114,7 +114,6 @@ if /i "%~1"=="/yL" (
     goto OptLoop
 )
 
-
 :: Require 2 input parameters
 if "%~2"=="" goto Usage
 
@@ -122,10 +121,6 @@ if "%~2"=="" goto Usage
 set Platform_Type=%~1
 set Build_Target=%~2
 
-if "%~3"=="" (
-    set "IFWI_Suffix= "
-) else set "IFWI_Suffix=/S %~3"
-
 :: Build BIOS
 echo ======================================================================
 echo Build_IFWI:  Calling BIOS build Script...
@@ -139,34 +134,6 @@ if %ERRORLEVEL% NEQ 0 (
 )
 echo.
 echo Finished Building BIOS.
-@REM Set BIOS_ID environment variable here.
-call %WORKSPACE%\Conf\BiosId.bat
-echo BIOS_ID=%BIOS_ID%
-
-:: Set the Board_Id, Build_Type, Version_Major, and Version_Minor environment variables
-find /v "#" %WORKSPACE%\Conf\BiosId.env > ver_strings
-for /f "tokens=1,3" %%i in (ver_strings) do set %%i=%%j
-del /f/q ver_strings >nul
-set BIOS_Name=%BOARD_ID%_%Arch%_%BUILD_TYPE%_%VERSION_MAJOR%_%VERSION_MINOR%.ROM
-
-:: Start Integration process
-echo ======================================================================
-echo Build_IFWI:  Calling IFWI Stitching Script...
-pushd %PLATFORM_PATH%\%PLATFORM_PACKAGE%\Stitch
-
-  :: IFWIStitch.bat [/nG] [/nM] [/nB] [/B BIOS.rom] [/C StitchConfig] [/S IFWISuffix]
-  call IFWIStitch.bat %Stitch_Flags% /B %BIOS_Name% %IFWI_Suffix%
-   
- @echo off
-popd
-if %ERRORLEVEL% NEQ 0 (
-    echo echo  -- Error Stitching %BIOS_Nam% & echo.
-    set exitCode=1
-)
-echo.
-echo Build_IFWI is finished.
-echo The final IFWI file is located in %ROOT_DIR%\Vlv2TbltDevicePkg\Stitch\
-echo ======================================================================
 goto Exit
 
 :Usage
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
index 915f8b39d9..12e44efed0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
@@ -1,12 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   EfiRegTableLib.h
@@ -31,10 +28,6 @@ Abstract:
 #include <Library/BaseLib.h>
 #include <Library/DebugLib.h>
 #include <Library/UefiLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Protocol/CpuIo.h>
-#include <Protocol/BootScriptSave.h>
-#include <Framework/BootScript.h>
 #include <Protocol/PciRootBridgeIo.h>
 
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
index 9cb8841d65..472fc4e0f6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
@@ -2,12 +2,9 @@
 #
 #/*++
 #
-# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

+# Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-
 #
 #  Module Name:
 #
@@ -40,8 +37,3 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-
-
-[LibraryClasses]
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
index 807ca20acb..3fa9f7b129 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
@@ -3,11 +3,11 @@
 
   This file includes package header files, library classes.
 
-  Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

+
 **/
 
 #ifndef _MULTIPLATFORM_LIB_H_
@@ -52,7 +52,6 @@
 #include <Ppi/Speaker.h>
 #include <Guid/FirmwareFileSystem.h>
 #include <Guid/MemoryTypeInformation.h>
-#include <Ppi/Cache.h>
 #include <Ppi/Reset.h>
 #include <Ppi/EndOfPeiPhase.h>
 #include <Ppi/MemoryDiscovered.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
index 758e47ca70..a4942a097c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
@@ -1,11 +1,8 @@
 #
 #
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
-#
-#
 #
 #  Module Name:
 #
@@ -59,13 +56,11 @@ [Packages]
   Vlv2TbltDevicePkg/PlatformPkg.dec
   IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  Vlv2SocBinPkg/Vlv2SocBinPkg.dec
 
 [LibraryClasses]
   DebugLib
   HobLib
   IoLib
-#  PeiKscLib
 
 [Ppis]
   gEfiPeiReadOnlyVariable2PpiGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
index 4d5997d6e9..4adca1b465 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
@@ -1789,9 +1789,6 @@ PlatformBdsPolicyBehavior (
     #ifdef TPM_ENABLED
     TcgPhysicalPresenceLibProcessRequest();
     #endif
-    #ifdef FTPM_ENABLE
-    Tcg2PhysicalPresenceLibProcessRequest(NULL);
-    #endif
 
     if (EsrtManagement != NULL) {
       EsrtManagement->LockEsrtRepository();
@@ -1997,9 +1994,6 @@ FULL_CONFIGURATION:
     }
    #ifdef TPM_ENABLED
    TcgPhysicalPresenceLibProcessRequest();
-   #endif
-   #ifdef FTPM_ENABLE
-   Tcg2PhysicalPresenceLibProcessRequest(NULL);
    #endif
 
     if (EsrtManagement != NULL) {
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.h b/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.h
index 0b256093a6..80a84d0d21 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   MonoStatusCode.h
@@ -24,41 +22,18 @@ Abstract:
 //
 // Statements that include other files.
 //
-#include "PiPei.h"
+#include <PiPei.h>
 
-#include "Pi/PiBootMode.h"
-
-#include "Ppi/StatusCode.h"
-#include "Ppi/MemoryDiscovered.h"
-#include "Ppi/FvLoadFile.h"
-
-#include "Library/HobLib.h"
-#include "Library/DebugLib.h"
-#include "Library/IoLib.h"
-#include "Library/SerialPortLib.h"
-#include "Protocol/StatusCode.h"
-
-
-#ifndef _STATUS_CODE_ENABLER_H_
-#define _STATUS_CODE_ENABLER_H_
-
-#ifdef EFI_DEBUG
-
-#define EFI_STATUS_CODE_ENABLER_HOB_GUID \
-  { \
-    0x5ffc6cf3, 0x71ad, 0x46f5, 0xbd, 0x8b, 0x7e, 0x8f, 0xfe, 0x19, 0x7, 0xd7 \
-  }
-
-extern EFI_GUID gEfiSerialStatusCodeEnablerHobGuid;
-
-typedef struct _EFI_STATUS_CODE_INFO {
-  BOOLEAN    StatusCodeDisable;
-} EFI_STATUS_CODE_INFO;
-
-#endif
-#endif
+#include <Pi/PiBootMode.h>
 
+#include <Ppi/StatusCode.h>
+#include <Ppi/MemoryDiscovered.h>
 
+#include <Library/HobLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/SerialPortLib.h>
+#include <Protocol/StatusCode.h>
 
 //
 // Platform specific function Declarations.  These must be implemented in a
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf b/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
index f1be5b8d6c..d429310ac4 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
@@ -1,9 +1,8 @@
 #
 #
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
 #
 #  Module Name:
 #
@@ -34,10 +33,8 @@ [sources.common]
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
-  Vlv2SocBinPkg/Vlv2SocBinPkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
 
 [LibraryClasses]
   PeimEntryPoint
@@ -52,7 +49,6 @@ [LibraryClasses]
 [Ppis]
   gEfiPeiMemoryDiscoveredPpiGuid
   gEfiPeiStatusCodePpiGuid
-  gEfiPeiFvFileLoaderPpiGuid
 
 [Protocols]
   gEfiStatusCodeRuntimeProtocolGuid
@@ -62,7 +58,6 @@ [Pcd]
 
 [Guids]
   gEfiPlatformCpuInfoGuid
-  gEfiHtBistHobGuid
   gEfiStatusCodeDataTypeStringGuid              ## CONSUMES
 
 [Depex]
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
index a0837917d8..18012a1d53 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
@@ -1,11 +1,8 @@
 #/*++
 #
-# Copyright (c)  2003  - 2018, Intel Corporation. All rights reserved
-#                                                                                  

+# Copyright (c)  2003  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-
 #
 #  Module Name:
 #
@@ -46,7 +43,6 @@ [Packages]
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
 
 [LibraryClasses]
   HobLib
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.h
index b13611f4f8..dfe3d1a0c7 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.h
@@ -1,12 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
   PlatformCpuInfoDxe.h
 
@@ -18,12 +15,10 @@ Abstract:
 #ifndef _PLATFORM_CPU_INFO_DRIVER_H_
 #define _PLATFORM_CPU_INFO_DRIVER_H_
 
-#include "PiDxe.h"
-#include "Library/HobLib.h"
-#include "Guid/GlobalVariable.h"
-#include "Guid/AcpiVariableCompatibility.h"
-#include "Guid/PlatformCpuInfo.h"
-#include "Library/UefiRuntimeServicesTableLib.h"
+#include <PiDxe.h>
+#include <Library/HobLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Guid/PlatformCpuInfo.h>
 #include <Guid/Vlv2Variable.h>
 
 #endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
index f2ade1b105..ac9c7f1ba1 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
@@ -1,10 +1,8 @@
 #/*++
 #
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
-
 #
 #  Module Name:
 #
@@ -36,9 +34,7 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2SocBinPkg/Vlv2SocBinPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
 
 [LibraryClasses]
   HobLib
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Configuration.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Configuration.h
index 23e03111c9..676f500530 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Configuration.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Configuration.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
     Configuration.h
@@ -89,8 +87,6 @@ Abstract:
 #define VAR_EQ_CONFIG_MODE_DECIMAL_NAME L"67"
 #define VAR_EQ_CPU_EE_NAME              0x0045  // E
 #define VAR_EQ_CPU_EE_DECIMAL_NAME  L"69"
-#define VAR_EQ_FLOPPY_MODE_NAME         0x0046  // F
-#define VAR_EQ_FLOPPY_MODE_DECIMAL_NAME L"70"
 #define VAR_EQ_HT_MODE_NAME             0x0048  // H
 #define VAR_EQ_HT_MODE_DECIMAL_NAME     L"72"
 #define VAR_EQ_AHCI_MODE_NAME           0x0049  // I
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
index 2a4a0b92e1..1d90117af6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
@@ -1,13 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
 
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   
-
-
 Module Name:
 
 
@@ -23,9 +19,7 @@ Abstract:
 #include "PlatformDxe.h"
 #include "Platform.h"
 #include "PchCommonDefinitions.h"
-#include <Protocol/UsbPolicy.h>
 #include <Protocol/PchPlatformPolicy.h>
-#include <Protocol/TpmMp.h>
 #include <Protocol/CpuIo2.h>
 #include <Library/S3BootScriptLib.h>
 #include <Guid/PciLanInfo.h>
@@ -63,10 +57,8 @@ GPIO_CONF_PAD_INIT mTB_BL_GpioInitData_SC_TRI_Exit_boot_Service[] =
 EFI_GUID mSystemHiiExportDatabase = EFI_HII_EXPORT_DATABASE_GUID;
 EFI_GUID mPlatformDriverGuid = EFI_PLATFORM_DRIVER_GUID;
 SYSTEM_CONFIGURATION  mSystemConfiguration;
-SYSTEM_PASSWORDS      mSystemPassword;
 EFI_HANDLE            mImageHandle;
 BOOLEAN               mMfgMode = FALSE;
-VOID                  *mDxePlatformStringPack;
 UINT32                mPlatformBootMode = PLATFORM_NORMAL_MODE;
 extern CHAR16 gItkDataVarName[];
 
@@ -77,8 +69,6 @@ EFI_EVENT  mReadyToBootEvent;
 
 UINT8 mSmbusRsvdAddresses[] = PLATFORM_SMBUS_RSVD_ADDRESSES;
 UINT8 mNumberSmbusAddress = sizeof( mSmbusRsvdAddresses ) / sizeof( mSmbusRsvdAddresses[0] );
-UINT32 mSubsystemVidDid;
-UINT32 mSubsystemAudioVidDid;
 
 UINTN   mPciLanCount = 0;
 VOID    *mPciLanInfo = NULL;
@@ -89,9 +79,6 @@ static EFI_SPEAKER_IF_PROTOCOL mSpeakerInterface = {
   GenerateBeepTone
 };
 
-EFI_USB_POLICY_PROTOCOL         mUsbPolicyData = {0};
-
-
 CFIO_PNP_INIT mTB_BL_GpioInitData_SC_TRI_S0ix_Exit_boot_Service[] =
 {
   {0x410 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_clkout1_pconf0
@@ -179,11 +166,6 @@ VOID
 UpdateDVMTSetup(
   );
 
-VOID
-InitPlatformUsbPolicy (
-  VOID
-  );
-
 VOID
 InitRC6Policy(
   VOID
@@ -427,14 +409,8 @@ SpiBiosProtectionFunction(
 
   BiosFlaLower0 = PcdGet32(PcdFlashMicroCodeAddress)-PcdGet32(PcdFlashAreaBaseAddress);
   BiosFlaLimit0 = PcdGet32(PcdFlashMicroCodeSize)-1;  
-  #ifdef MINNOW2_FSP_BUILD
-  BiosFlaLower1 = PcdGet32(PcdFlashFvFspBase)-PcdGet32(PcdFlashAreaBaseAddress);
-  BiosFlaLimit1 = (PcdGet32(PcdFlashFvRecoveryBase)-PcdGet32(PcdFlashFvFspBase)+PcdGet32(PcdFlashFvRecoverySize))-1;
-  #else
   BiosFlaLower1 = PcdGet32(PcdFlashFvMainBase)-PcdGet32(PcdFlashAreaBaseAddress);
   BiosFlaLimit1 = (PcdGet32(PcdFlashFvRecoveryBase)-PcdGet32(PcdFlashFvMainBase)+PcdGet32(PcdFlashFvRecoverySize))-1;
-  #endif
-
   
   mPciD31F0RegBase = MmPciAddress (0,
                          DEFAULT_PCI_BUS_NUMBER_PCH,
@@ -611,8 +587,6 @@ TristateLpcGpioS0i3Config (
 }
 
 
-EFI_BOOT_SCRIPT_SAVE_PROTOCOL *mBootScriptSave;
-
 /**
   Event Notification during exit boot service to enabel ACPI mode
 
@@ -862,8 +836,6 @@ InitializePlatform (
   //
   //  Add usb policy
   //
-  InitPlatformUsbPolicy();
-  InitSioPlatformPolicy();
   InitializeClockRouting();
   InitializeSlotInfo();
   InitTcoReset();
@@ -949,7 +921,7 @@ InitializePlatform (
                     );
   if (!EFI_ERROR (Status)) {
       Status = gBS->RegisterProtocolNotify (
-                      &gExitPmAuthProtocolGuid,
+                      &gEfiEndOfDxeEventGroupGuid,
                       RtcEvent,
                       &RtcCallbackReg
                       );
@@ -1042,58 +1014,6 @@ ReadyToBootFunction (
   VOID       *Context
   )
 {
-  EFI_STATUS                      Status;
-  EFI_ISA_ACPI_PROTOCOL           *IsaAcpi;
-  EFI_ISA_ACPI_DEVICE_ID          IsaDevice;
-  UINTN                           Size;
-  UINT16                          State;
-  EFI_TPM_MP_DRIVER_PROTOCOL      *TpmMpDriver;
-  EFI_CPU_IO_PROTOCOL             *CpuIo;
-  UINT8                           Data;
-  UINT8                           ReceiveBuffer [64];
-  UINT32                          ReceiveBufferSize;
-
-  UINT8 TpmForceClearCommand [] =              {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0A,
-                                                0x00, 0x00, 0x00, 0x5D};
-  UINT8 TpmPhysicalPresenceCommand [] =        {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0C,
-                                                0x40, 0x00, 0x00, 0x0A,
-                                                0x00, 0x00};
-  UINT8 TpmPhysicalDisableCommand [] =         {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0A,
-                                                0x00, 0x00, 0x00, 0x70};
-  UINT8 TpmPhysicalEnableCommand [] =          {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0A,
-                                                0x00, 0x00, 0x00, 0x6F};
-  UINT8 TpmPhysicalSetDeactivatedCommand [] =  {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0B,
-                                                0x00, 0x00, 0x00, 0x72,
-                                                0x00};
-  UINT8 TpmSetOwnerInstallCommand [] =         {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0B,
-                                                0x00, 0x00, 0x00, 0x71,
-                                                0x00};
-
-  Size = sizeof(UINT16);
-  Status = gRT->GetVariable (
-                  VAR_EQ_FLOPPY_MODE_DECIMAL_NAME,
-                  &gEfiNormalSetupGuid,
-                  NULL,
-                  &Size,
-                  &State
-                  );
-
-  //
-  // Disable Floppy Controller if needed
-  //
-  Status = gBS->LocateProtocol (&gEfiIsaAcpiProtocolGuid, NULL, (VOID **) &IsaAcpi);
-  if (!EFI_ERROR(Status) && (State == 0x00)) {
-    IsaDevice.HID = EISA_PNP_ID(0x604);
-    IsaDevice.UID = 0;
-    Status = IsaAcpi->EnableDevice(IsaAcpi, &IsaDevice, FALSE);
-  }
-
   //
   // save LAN info to a variable
   //
@@ -1111,386 +1031,6 @@ ReadyToBootFunction (
     gBS->FreePool (mPciLanInfo);
     mPciLanInfo = NULL;
   }
-  
-
-  //
-  // Handle ACPI OS TPM requests here
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiCpuIoProtocolGuid,
-                  NULL,
-                  (VOID **)&CpuIo
-                  );
-  Status = gBS->LocateProtocol (
-                  &gEfiTpmMpDriverProtocolGuid,
-                  NULL,
-                  (VOID **)&TpmMpDriver
-                  );
-  if (!EFI_ERROR (Status))
-  {
-    Data = ReadCmosBank1Byte (CpuIo, ACPI_TPM_REQUEST);
-
-    //
-    // Clear pending ACPI TPM request indicator
-    //
-    WriteCmosBank1Byte (CpuIo, ACPI_TPM_REQUEST, 0x00);
-    if (Data != 0)
-    {
-      WriteCmosBank1Byte (CpuIo, ACPI_TPM_LAST_REQUEST, Data);
-
-      //
-      // Assert Physical Presence for these commands
-      //
-      TpmPhysicalPresenceCommand [11] = 0x20;
-      ReceiveBufferSize = sizeof(ReceiveBuffer);
-      Status = TpmMpDriver->Transmit (
-                              TpmMpDriver, TpmPhysicalPresenceCommand,
-                              sizeof (TpmPhysicalPresenceCommand),
-                              ReceiveBuffer, &ReceiveBufferSize
-                              );
-      //
-      // PF PhysicalPresence = TRUE
-      //
-      TpmPhysicalPresenceCommand [11] = 0x08;
-      ReceiveBufferSize = sizeof(ReceiveBuffer);
-      Status = TpmMpDriver->Transmit (
-                              TpmMpDriver, TpmPhysicalPresenceCommand,
-                              sizeof (TpmPhysicalPresenceCommand),
-                              ReceiveBuffer,
-                              &ReceiveBufferSize
-                              );
-      if (Data == 0x01)
-      {
-        //
-        // TPM_PhysicalEnable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver, TpmPhysicalEnableCommand,
-                                sizeof (TpmPhysicalEnableCommand),
-                                ReceiveBuffer, &ReceiveBufferSize
-                                );
-      }
-      if (Data == 0x02)
-      {
-        //
-        // TPM_PhysicalDisable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver, TpmPhysicalDisableCommand,
-                                sizeof (TpmPhysicalDisableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-      }
-      if (Data == 0x03)
-      {
-        //
-        // TPM_PhysicalSetDeactivated=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer, &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);
-      }
-      if (Data == 0x04)
-      {
-        //
-        // TPM_PhysicalSetDeactivated=TRUE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x01;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x05)
-      {
-        //
-        // TPM_ForceClear
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmForceClearCommand,
-                                sizeof (TpmForceClearCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x06)
-      {
-        //
-        // TPM_PhysicalEnable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalEnableCommand,
-                                sizeof (TpmPhysicalEnableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalSetDeactivated=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x07)
-      {
-        //
-        // TPM_PhysicalSetDeactivated=TRUE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x01;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalDisable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalDisableCommand,
-                                sizeof (TpmPhysicalDisableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x08)
-      {
-        //
-        // TPM_SetOwnerInstall=TRUE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmSetOwnerInstallCommand [10] = 0x01;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmSetOwnerInstallCommand,
-                                sizeof (TpmSetOwnerInstallCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-      }
-      if (Data == 0x09)
-      {
-        //
-        // TPM_SetOwnerInstall=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmSetOwnerInstallCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmSetOwnerInstallCommand,
-                                sizeof (TpmSetOwnerInstallCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-      }
-      if (Data == 0x0A)
-      {
-        //
-        // TPM_PhysicalEnable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalEnableCommand,
-                                sizeof (TpmPhysicalEnableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalSetDeactivated=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // Do TPM_SetOwnerInstall=TRUE on next reboot
-        //
-
-        WriteCmosBank1Byte (CpuIo, ACPI_TPM_REQUEST, 0xF0);
-
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x0B)
-      {
-        //
-        // TPM_SetOwnerInstall=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmSetOwnerInstallCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmSetOwnerInstallCommand,
-                                sizeof (TpmSetOwnerInstallCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalSetDeactivated=TRUE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x01;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalDisable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalDisableCommand,
-                                sizeof (TpmPhysicalDisableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x0E)
-      {
-        //
-        // TPM_ForceClear
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmForceClearCommand,
-                                sizeof (TpmForceClearCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalEnable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalEnableCommand,
-                                sizeof (TpmPhysicalEnableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalSetDeactivated=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0xF0)
-      {
-        //
-        // Second part of ACPI TPM request 0x0A: OEM custom TPM_SetOwnerInstall=TRUE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmSetOwnerInstallCommand [10] = 0x01;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmSetOwnerInstallCommand,
-                                sizeof (TpmSetOwnerInstallCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        WriteCmosBank1Byte (CpuIo, ACPI_TPM_LAST_REQUEST, 0x0A);
-      }
-      //
-      // Deassert Physical Presence
-      //
-      TpmPhysicalPresenceCommand [11] = 0x10;
-      ReceiveBufferSize = sizeof(ReceiveBuffer);
-      Status = TpmMpDriver->Transmit (
-                              TpmMpDriver,
-                              TpmPhysicalPresenceCommand,
-                              sizeof (TpmPhysicalPresenceCommand),
-                              ReceiveBuffer,
-                              &ReceiveBufferSize
-                              );
-    }
-  }
-
-  return;
 }
 
 /**
@@ -1722,66 +1262,6 @@ UpdateDVMTSetup(
   }
 }
 
-VOID
-InitPlatformUsbPolicy (
-  VOID
-  )
-
-{
-  EFI_HANDLE              Handle;
-  EFI_STATUS              Status;
-
-  Handle = NULL;
-
-  mUsbPolicyData.Version                       = (UINT8)USB_POLICY_PROTOCOL_REVISION_2;
-  mUsbPolicyData.UsbMassStorageEmulationType   = mSystemConfiguration.UsbBIOSINT13DeviceEmulation;
-  if(mUsbPolicyData.UsbMassStorageEmulationType == 3) {
-    mUsbPolicyData.UsbEmulationSize = mSystemConfiguration.UsbBIOSINT13DeviceEmulationSize;
-  } else {
-    mUsbPolicyData.UsbEmulationSize = 0;
-  }
-  mUsbPolicyData.UsbZipEmulationType         = mSystemConfiguration.UsbZipEmulation;
-  mUsbPolicyData.UsbOperationMode              = HIGH_SPEED;
-
-  //
-  //  Some chipset need Period smi, 0 = LEGACY_PERIOD_UN_SUPP
-  //
-  mUsbPolicyData.USBPeriodSupport      = LEGACY_PERIOD_UN_SUPP;
-
-  //
-  //  Some platform need legacyfree, 0 = LEGACY_FREE_UN_SUPP
-  //
-  mUsbPolicyData.LegacyFreeSupport    = LEGACY_FREE_UN_SUPP;
-
-  //
-  //  Set Code base , TIANO_CODE_BASE =0x01, ICBD =0x00
-  //
-  mUsbPolicyData.CodeBase    = (UINT8)ICBD_CODE_BASE;
-
-  //
-  //  Some chispet 's LpcAcpibase are diffrent,set by platform or chipset,
-  //  default is Ich  acpibase =0x040. acpitimerreg=0x08.
-  mUsbPolicyData.LpcAcpiBase     = 0x40;
-  mUsbPolicyData.AcpiTimerReg    = 0x08;
-
-  //
-  //  Set for reduce usb post time
-  //
-  mUsbPolicyData.UsbTimeTue           = 0x00;
-  mUsbPolicyData.InternelHubExist     = 0x00;  //TigerPoint doesn't have RMH
-  mUsbPolicyData.EnumWaitPortStableStall    = 100;
-
-
-  Status = gBS->InstallProtocolInterface (
-                  &Handle,
-                  &gUsbPolicyGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &mUsbPolicyData
-                  );
-  ASSERT_EFI_ERROR(Status);
-
-}
-
 UINT8
 ReadCmosBank1Byte (
   IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
index 8f5df3257e..621fb08274 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
@@ -1,10 +1,8 @@
 /*++
 
-  Copyright (c) 2004  - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                                   
-
 
 Module Name:
 
@@ -42,25 +40,17 @@ Abstract:
 #include <Library/BiosIdLib.h>
 #include <Protocol/GlobalNvsArea.h>
 #include <Protocol/PciRootBridgeIo.h>
-#include <Protocol/IsaAcpi.h>
-#include <Framework/FrameworkInternalFormRepresentation.h>
-#include <Protocol/FrameworkHii.h>
-#include <Protocol/FrameworkFormCallback.h>
-#include <Protocol/CpuIo.h>
-#include <Protocol/BootScriptSave.h>
-#include <Framework/BootScript.h>
+#include <Protocol/CpuIo2.h>
 #include <Guid/GlobalVariable.h>
 #include <Guid/BoardFeatures.h>
 #include <Guid/DataHubRecords.h>
 #include <Protocol/DataHub.h>
 #include <Protocol/PciIo.h>
 #include <Protocol/Speaker.h>
-#include <Protocol/ExitPmAuth.h>
 #include <IndustryStandard/Pci22.h>
 #include <Guid/SetupVariable.h>
 #include <Guid/PlatformInfo.h>
 #include "Configuration.h"
-#define _EFI_H_    //skip efi.h
 #include "PchAccess.h"
 #include "VlvAccess.h"
 #include "BoardIdDecode.h"
@@ -86,25 +76,9 @@ Abstract:
 
 #define B_RTC_DATE_ALARM_MASK       0x3F
 
-//
-// Default CPU Alternate Duty Cycle (255=100%, 0=0%)
-//
-#define DEF_CPU_ALT_DUTY_CYCLE 0xFF
-
-#define MAX_ONBOARD_SATA_DEVICE 2
-
-#define DXE_DEVICE_ENABLED  1
-#define DXE_DEVICE_DISABLED 0
-
-#define AZALIA_MAX_LOOP_TIME  0x10000
-
 //
 // Platform driver GUID
 //
-#define EFI_PLATFORM_DRIVER_GUID \
-  { 0x056E7324, 0xA718, 0x465b, 0x9A, 0x84, 0x22, 0x8F, 0x06, 0x64, 0x2B, 0x4F }
-
-#define PASSWORD_MAX_SIZE               20
 #define PLATFORM_NORMAL_MODE          0x01
 #define PLATFORM_SAFE_MODE            0x02
 #define PLATFORM_RECOVERY_MODE        0x04
@@ -119,33 +93,10 @@ Abstract:
 #define EFI_CU_PLATFORM_DXE_STEP4                    (EFI_OEM_SPECIFIC | 0x00000015)
 #define EFI_CU_PLATFORM_DXE_INIT_DONE                (EFI_OEM_SPECIFIC | 0x00000016)
 
-
-#define EFI_SECTION_STRING                  0x1C
-#define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
-#define PREFIX_BLANK                        0x04
-
 #pragma pack(1)
 
 typedef UINT64 EFI_BOARD_FEATURES;
 
-//
-//BUGBUG: should remove these EDK hii definition once Hii transtion is done
-//
-typedef UINT16  STRING_REF;
-typedef UINT16  EFI_FORM_LABEL;
-
-typedef enum {
-  EfiUserPassword,
-  EfiAdminPassword
-} EFI_PASSWORD_TYPE;
-
-typedef struct {
-  CHAR16            TempPassword[PASSWORD_MAX_SIZE];
-  CHAR16            EncodedPassword[PASSWORD_MAX_SIZE];
-  VOID              *PasswordLocation;
-  EFI_PASSWORD_TYPE PasswordType;
-} EFI_PASSWORD_DATA;
-
 typedef struct {
   CHAR8 AaNumber[7];
   UINT8 BoardId;
@@ -155,111 +106,11 @@ typedef struct {
   UINT64 AcpiOemTableId;
 } BOARD_ID_DECODE;
 
-typedef
-EFI_STATUS
-(EFIAPI *EFI_FORM_ROUTINE) (
-  SYSTEM_CONFIGURATION *SetupBuffer
-  );
-
-typedef struct{
-  UINT16 DeviceNumber;
-  UINT16 FunctionNumber;
-}PCI_DEVICE_FUNC_INFO;
-
-typedef struct{
-  CHAR16 PortNumber[4];
-  STRING_REF SataDeviceInfoStringId;
-}SATA_DEVICE_STRING_INFO;
-
-typedef struct {
-  UINT16  Signature;
-  UINT8   Size;
-  UINT32  EntryPoint;
-  UINT8   Reserve[17];
-  UINT16  PciDataOff;
-  UINT16  ExpansionOff;
-} PNP_OPTION_ROM_HEADER;
-
-typedef struct {
-  UINT32  Signature;
-  UINT8   Revision;
-  UINT8   Length;
-  UINT16  NextHeader;
-  UINT8   Reserve;
-  UINT8   CheckSum;
-  UINT32  DeviceId;
-  UINT16  ManufactureStrOff;
-  UINT16  ProductStrOff;
-} PNP_EXPANSION_HEADER;
-
-typedef struct {
-  BOOLEAN                         Enable;
-  UINT8                           VerbTableNum;
-  UINT16                          CodecSSID;
-  EFI_PHYSICAL_ADDRESS            HDABar;
-  EFI_PHYSICAL_ADDRESS            UpperHDABar;
-  UINT8                           SDIPresent;
-  BOOLEAN                         Pme;
-  BOOLEAN                         LegacyFrontPanelAudio;
-  BOOLEAN                         HighDefinitionFrontPanelAudio;
-} EFI_AZALIA_S3;
-
-//
-//following structs are from R8. Remove them once R8->R9 transition is done
-//
-typedef struct {
-  CHAR16      *OptionString;  // Passed in string to generate a token for in a truly dynamic form creation
-  STRING_REF  StringToken;    // This is used when creating a single op-code without generating a StringToken (have one already)
-  UINT16      Value;
-  UINT8       Flags;
-  UINT16      Key;
-} IFR_OPTION;
-
-
-
-typedef struct {
-  UINT8   Number;
-  UINT32  HorizontalResolution;
-  UINT32  VerticalResolution;
-} PANEL_RESOLUTION;
-
 #pragma pack()
 
 //
 // Prototypes
 //
-EFI_STATUS
-EFIAPI
-EfiMain (
-  IN EFI_HANDLE         ImageHandle,
-  IN EFI_SYSTEM_TABLE   *SystemTable
-  );
-
-EFI_STATUS
-ProcessEventLog (
-  );
-
-EFI_STATUS
-FindDataRecords (
-  );
-
-EFI_STATUS
-ProcessPasswords(
-  );
-
-VOID
-MemorySetup(
-  );
-
-
-UINTN
-EfiValueToString (
-  IN  OUT CHAR16  *Buffer,
-  IN  INT64       Value,
-  IN  UINTN       Flags,
-  IN  UINTN       Width
-  );
-
 VOID
 EFIAPI
 ReadyToBootFunction (
@@ -267,60 +118,6 @@ ReadyToBootFunction (
   VOID       *Context
   );
 
-VOID
-InstallHiiDataAndGetSettings(
-  IN EFI_HII_STRING_PACK            *StringPack,
-      //
-  ... // 0 or more of => IN EFI_HII_IFR_PACK *IfrPack,
-      // Terminate list with NULL
-      //
-  );
-
-EFI_STATUS
-ReadOrInitSetupVariable(
-  IN UINTN         RequiredVariableSize,
-  IN UINTN         RequiredPasswordSize,
-  IN VOID          *DefaultData,
-  IN VOID          *MfgDefaultData,
-  OUT VOID         *SetupVariableData,
-  OUT VOID         *SystemPassword
-  );
-
-VOID
-EfiLogicalOrMem(
-  IN VOID   *Destination,
-  IN VOID   *Source,
-  IN UINTN  Length
-  );
-
-EFI_STATUS
-GetStringFromToken (
-  IN      EFI_GUID                  *ProducerGuid,
-  IN      STRING_REF                Token,
-  OUT     CHAR16                    **String
-  );
-
-UINT32
-ConvertBase2ToRaw (
-  IN  EFI_EXP_BASE2_DATA             *Data);
-
-UINT32
-ConvertBase10ToRaw (
-  IN  EFI_EXP_BASE10_DATA             *Data);
-
-CHAR16 *
-GetStringById (
-  IN  STRING_REF   Id,
-  EFI_HII_HANDLE   StringPackHandle
-  );
-
-VOID
-EFIAPI
-SetupDataFilter (
-  IN EFI_EVENT    Event,
-  IN VOID*        Context
-  );
-
 VOID
 EFIAPI
 IdeDataFilter (
@@ -328,20 +125,6 @@ IdeDataFilter (
   IN VOID*        Context
   );
 
-VOID
-EFIAPI
-UpdateAhciRaidDiskInfo (
-  IN EFI_EVENT    Event,
-  IN VOID*        Context
-  );
-
-VOID
-EFIAPI
-EventLogFilter (
-  IN EFI_EVENT    Event,
-  IN VOID*        Context
-  );
-
 VOID
 SwapEntries (
   IN  CHAR8 *Data
@@ -353,45 +136,12 @@ AsciiToUnicode (
   IN    CHAR16    *UnicodeString
   );
 
-UINT16
-ConfigModeStateGet();
-
-VOID
-SetSkus();
-
-VOID
-CPUSetupItems();
-
-EFI_STATUS
-SecurityDriverCallback (
-  IN EFI_FORM_CALLBACK_PROTOCOL       *This,
-  IN UINT16                           KeyValue,
-  IN EFI_IFR_DATA_ARRAY               *Data,
-  OUT EFI_HII_CALLBACK_PACKET         **Packet
-  );
-
-VOID
-SetPasswordState (
-  );
-
-VOID
-EncodePassword (
-  IN  CHAR16                      *Password
-  );
-
 VOID
 EFIAPI
 PciBusEvent (
   IN EFI_EVENT    Event,
   IN VOID*        Context
   );
-VOID
-AsfInitialize(
-  );
-
-VOID
-InitializeAsf (
-  );
 
 UINT8
 ReadCmosBank1Byte (
@@ -410,204 +160,6 @@ VOID
 InitializeBoardId (
   );
 
-EFI_STATUS
-InstallBootCallbackRoutine(
-  );
-
-EFI_STATUS
-InstallConfigurationCallbackRoutine(
-  );
-
-EFI_STATUS
-InstallPerformanceCallbackRoutine(
-  );
-
-EFI_STATUS
-InstallSecurityCallbackRoutine (
-  );
-
-EFI_STATUS
-InstallMainCallbackRoutine (
-  );
-
-EFI_STATUS
-MemoryConfigurationUpdate (
-  UINT16                *Key,
-  EFI_FORM_LABEL        *Label,
-  UINT16                *OpcodeCount,
-  UINT8                 **OpcodeData,
-  EFI_FORM_ROUTINE      *Routine
-  );
-
-EFI_STATUS
-MemoryConfigurationCallbackRoutine (
-  SYSTEM_CONFIGURATION  *SetupBuffer
-  );
-
-EFI_STATUS
-MemoryConfigurationCalculateSpeed(
-  SYSTEM_CONFIGURATION  *SetupBuffer
-  );
-
-VOID
-UpdateMemoryString(
-  IN  STRING_REF                  TokenToUpdate,
-  IN  CHAR16                      *NewString
-  );
-
-VOID
-InitFeaturePolicy (
-  IN EFI_PLATFORM_INFO_HOB      *PlatformInfo
-  );
-
-VOID
-InitializeSetupVarHide (
-  );
-
-VOID
-PreparePCIePCISlotInformation(
-  VOID
-  );
-
-
-EFI_STATUS
-BootConfigurationUpdate (
-  IN  OUT SYSTEM_CONFIGURATION  *SystemConfiguration
-  );
-
-EFI_STATUS
-InitializeBootConfiguration(
-  VOID
-  );
-
-UINT16
-GetStringSize(
-  IN      CHAR16 *ThisString
-  );
-
-UINT16
-GetDriveCount (
-  IN      STRING_REF *BootMap
-  );
-
-CHAR16 *
-GetBootString (
-  IN      STRING_REF    Id,
-      OUT UINTN        *Length
-  );
-
-EFI_STATUS
-BootCfgCreateTwoOptionOneOf(
-  IN      UINT16                QuestionId,
-  IN      EFI_FORM_LABEL        Label,
-  IN      STRING_REF            OptionPrompt,
-  IN      STRING_REF            OptionHelp,
-  IN      STRING_REF            OptionOneString,
-  IN      STRING_REF            OptionTwoString,
-  IN      UINT8                 OptionOneFlags,
-  IN      UINT8                 OptionTwoFlags,
-  IN      UINT16                KeyValueOne,
-  IN      UINT16                KeyValueTwo
-  );
-
-EFI_STATUS
-ReplaceOpcodeWithText(
-  IN      STRING_REF            OptionPrompt,
-  IN      STRING_REF            OptionHelp,
-  IN      STRING_REF            OptionOneString,
-  IN      EFI_FORM_LABEL        Label
-  );
-
-EFI_STATUS
-CreateDriveBootOrderOpcode(
-  IN      VOID                 *Data,
-  IN      STRING_REF           *BootMap,
-  IN      EFI_FORM_LABEL        Label,
-  IN      UINT16                QuestionId,
-  IN      STRING_REF            OptionOneString,
-  IN      STRING_REF            OptionTwoString
-  );
-
-VOID
-SetHyperBootCfgFlags(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-VOID
-GetHyperBootCfgFlags(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-VOID
-PrepareBootCfgForHyperBoot(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-BOOLEAN
-BootCfgChanged(
-  IN      SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-EFI_STATUS
-InsertOpcodeAtIndex(
-  IN      SYSTEM_CONFIGURATION *SystemConfiguration,
-  IN  OUT IFR_OPTION           *OptionList,
-  IN      IFR_OPTION            IfrOption,
-  IN      UINT16                OptionCount
-  );
-
-VOID
-ConfigureBootOrderStrings(
-  IN      SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-VOID
-InitializeAllBootStrings(
-  VOID
-  );
-
-VOID
-SaveUsbCfgSettings(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-VOID
-RestoreUsbCfgSettings(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-EFI_STATUS
-UpdateBootDevicePriority(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-EFI_STATUS
-DisableHyperBoot(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-BOOLEAN
-CheckForUserPassword(
-  VOID
-  );
-
-EFI_STATUS
-EFIAPI
-HyperBootPasswordCallback(
-  IN  OUT VOID*  Data
-  );
-
-EFI_STATUS
-EFIAPI
-HyperBootF9Callback (
-  IN VOID*  Data
-  );
-
-EFI_STATUS
-InstallHiiEvents(
-  VOID
-  );
-
 EFI_STATUS
 EFIAPI
 ProgramToneFrequency (
@@ -637,73 +189,13 @@ AdjustDefaultRtcTimeCallback (
   IN VOID             *Context
   );
 
-typedef struct _GOP_DISPLAY_BRIGHTNESS_PROTOCOL GOP_DISPLAY_BRIGHTNESS_PROTOCOL;
-
-typedef
-EFI_STATUS
-(EFIAPI *GET_MAXIMUM_BRIGHTNESS_LEVEL) (
-  IN  GOP_DISPLAY_BRIGHTNESS_PROTOCOL *This,
-  OUT UINT32 *MaxBrightnessLevel
-  );
-
-
-typedef
-EFI_STATUS
-(EFIAPI *GET_CURRENT_BRIGHTNESS_LEVEL) (
-  IN  GOP_DISPLAY_BRIGHTNESS_PROTOCOL *This,
-  OUT UINT32 *MaxBrightnessLevel
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *SET_BRIGHTNESS_LEVEL) (
-  IN  GOP_DISPLAY_BRIGHTNESS_PROTOCOL *This,
-  IN  UINT32  BrightnessLevel
-  );
-
-struct _GOP_DISPLAY_BRIGHTNESS_PROTOCOL {
-  UINT32  Revision;
-  GET_MAXIMUM_BRIGHTNESS_LEVEL GetMaxBrightnessLevel;
-  GET_CURRENT_BRIGHTNESS_LEVEL GetCurrentBrightnessLevel;
-  SET_BRIGHTNESS_LEVEL SetBrightnessLevel;
-};
-
 //
 // Global externs
 //
-extern UINT8 MaintenanceBin[];
-extern UINT8 MainBin[];
-extern UINT8 ConfigurationBin[];
-extern UINT8 MemoryConfigurationBin[];
-extern UINT8 PerformanceBin[];
-extern UINT8 SecurityBin[];
-extern UINT8 BootBin[];
-extern UINT8 PowerBin[];
-extern UINT8 SystemSetupBin[];
-
-extern VOID                 *mDxePlatformStringPack;
-extern EFI_HII_PROTOCOL     *mHii;
 extern SYSTEM_CONFIGURATION mSystemConfiguration;
-extern FRAMEWORK_EFI_HII_HANDLE       mMaintenanceHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mMainHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mConfigurationHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mPerformanceHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mPowerHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mBootHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mSecurityHiiHandle;
-
-extern SYSTEM_PASSWORDS     mSystemPassword;
-extern EFI_PASSWORD_DATA    mAdminPassword;
-extern EFI_PASSWORD_DATA    mUserPassword;
 
 extern EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *mPciRootBridgeIo;
 
-//
-//extern EFI_REG_TABLE mSubsystemIdRegs[];
-//
-extern UINT32 mSubsystemVidDid;
-extern UINT32 mSubsystemAudioVidDid;
-
 extern UINT8 mBoardIdIndex;
 extern BOOLEAN mFoundAANum;
 extern EFI_BOARD_FEATURES mBoardFeatures;
@@ -718,5 +210,4 @@ extern BOOLEAN mMfgMode;
 extern UINT32 mPlatformBootMode;
 extern CHAR8 BoardAaNumber[];
 
-extern EFI_GUID gEfiGlobalNvsAreaProtocolGuid;
 #endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index 4d1949d05d..e8652f2a84 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -1,6 +1,6 @@
 ## @file
 #
-#  Copyright (c)  1999  - 2016, Intel Corporation. All rights reserved
+#  Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -50,13 +50,10 @@ [sources.common]
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   SecurityPkg/SecurityPkg.dec
   CryptoPkg/CryptoPkg.dec
-  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
 
 [LibraryClasses]
   BaseLib
@@ -91,24 +88,18 @@ [Guids]
   gEfiEventExitBootServicesGuid
   gEfiVlv2VariableGuid
   gEfiSecureBootEnableDisableGuid
+  gEfiEndOfDxeEventGroupGuid
 
 [Protocols]
   gEfiPciRootBridgeIoProtocolGuid    # CONSUMES  ## GUID
   gEfiVariableArchProtocolGuid
   gEfiVariableWriteArchProtocolGuid
   gEfiHiiConfigAccessProtocolGuid
-  gEfiBootScriptSaveProtocolGuid
-  gEfiCpuIoProtocolGuid
+  gEfiCpuIo2ProtocolGuid
   gEfiDevicePathProtocolGuid
   gEfiDiskInfoProtocolGuid
-  gEfiPs2PolicyProtocolGuid
-  gEfiIsaAcpiProtocolGuid
-  gEfiDataHubProtocolGuid
   gEfiPciIoProtocolGuid
   gDxePchPlatformPolicyProtocolGuid
-  gEfiTpmMpDriverProtocolGuid
-  gEfiLpcWpce791PolicyProtocolGuid
-  gUsbPolicyGuid
   gEfiSpeakerInterfaceProtocolGuid
   gDxeVlvPlatformPolicyGuid
   gEfiSmbiosSlotPopulationGuid
@@ -121,7 +112,6 @@ [Protocols]
   gEfiGlobalNvsAreaProtocolGuid
   gEfiCpuIo2ProtocolGuid
   gIgdOpRegionProtocolGuid
-  gExitPmAuthProtocolGuid
   gEdkiiVariableLockProtocolGuid
 
 [Pcd.common]
@@ -134,15 +124,13 @@ [Pcd.common]
   gPlatformModuleTokenSpaceGuid.PcdFlashFvMainBase
   gPlatformModuleTokenSpaceGuid.PcdFlashFvRecoveryBase
   gPlatformModuleTokenSpaceGuid.PcdFlashFvRecoverySize
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase
 
 
 [Depex]
   gEfiPciRootBridgeIoProtocolGuid     AND
   gEfiVariableArchProtocolGuid        AND
   gEfiVariableWriteArchProtocolGuid   AND
-  gEfiBootScriptSaveProtocolGuid      AND
-  gEfiCpuIoProtocolGuid               AND
+  gEfiCpuIo2ProtocolGuid               AND
   gDxePchPlatformPolicyProtocolGuid   AND
   gEfiGlobalNvsAreaProtocolGuid
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
index 948793f719..c00553e224 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
@@ -1,15 +1,10 @@
 #
 #
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#                                                                                  
# SPDX-License-Identifier: BSD-2-Clause-Patent
 #
 ##
 
-
 [Defines]
   INF_VERSION                    = 0x00010005
   BASE_NAME                      = PlatformGOPPolicy
@@ -29,14 +24,13 @@ [Sources.common]
 
 [Packages]
   MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
+
 [LibraryClasses]
   BaseLib
   DebugLib
   UefiDriverEntryPoint
   UefiRuntimeServicesTableLib
-#  DxeKscLib
 
 [Guids]
   gBmpImageGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryCallback.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryCallback.c
index 070848ed1e..074bf7debb 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryCallback.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryCallback.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   MemoryCallback.c
@@ -158,12 +156,10 @@ MemoryDiscoveredPpiNotifyCallback (
     IoWrite16 (ACPI_BASE_ADDRESS + R_PCH_ACPI_PM1_CNT, Pm1Cnt);
   }
 
-  #ifndef MINNOW2_FSP_BUILD
   //
   // Set PEI cache mode here
   //
   SetPeiCacheMode (PeiServices);
-  #endif
 
   //
   //  Pulish memory tyoe info
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c
index a359c95920..ec636a4cd9 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   PlatformEarlyInit.c
@@ -70,10 +67,6 @@ static EFI_PEI_PPI_DESCRIPTOR       mInstallSpeakerInterfacePpi = {
 static EFI_PEI_RESET_PPI            mResetPpi = { IchReset };
 
 
-static EFI_PEI_FIND_FV_PPI mEfiFindFvPpi = {
-  (EFI_PEI_FIND_FV_FINDFV)FindFv
-};
-
 static EFI_PEI_PPI_DESCRIPTOR       mPpiList[] = {
   {
     EFI_PEI_PPI_DESCRIPTOR_PPI,
@@ -81,14 +74,9 @@ static EFI_PEI_PPI_DESCRIPTOR       mPpiList[] = {
     NULL
   },
   {
-    EFI_PEI_PPI_DESCRIPTOR_PPI,
+    (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
     &gEfiPeiResetPpiGuid,
     &mResetPpi
-  },
-  {
-    (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
-    &gEfiFindFvPpiGuid,
-    &mEfiFindFvPpi
   }
 };
 
@@ -815,158 +803,6 @@ PlatformEarlyInitEntry (
   EFI_PLATFORM_INFO_HOB       *PlatformInfo;
   EFI_PEI_HOB_POINTERS        Hob;
   EFI_PLATFORM_CPU_INFO       PlatformCpuInfo;
-  EFI_SMRAM_HOB_DESCRIPTOR_BLOCK  *DescriptorBlock;
-  EFI_SMRAM_HOB_DESCRIPTOR_BLOCK  *NewDescriptorBlock;
-  UINTN                           Index;
-  UINTN                           MaxIndex;
-  UINT64                          Base;
-  UINT64                          Size;
-  UINT64                          NewSize;
-
-  //
-  // Make sure base and size of the SMRAM region is aligned
-  //
-  Hob.Raw = GetFirstGuidHob (&gEfiSmmPeiSmramMemoryReserveGuid);
-  if (Hob.Raw != NULL) {
-    DescriptorBlock = GET_GUID_HOB_DATA (Hob.Raw);
-    DEBUG ((DEBUG_INFO, "SMM PEI SMRAM Memory Reserved HOB\n"));
-    for (Index = 0; Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) {
-      DEBUG((DEBUG_INFO, "  SMRAM Descriptor[%02x]: Start=%016lx  Size=%016lx  State=%02x\n",
-        Index,
-        DescriptorBlock->Descriptor[Index].PhysicalStart,
-        DescriptorBlock->Descriptor[Index].PhysicalSize,
-        DescriptorBlock->Descriptor[Index].RegionState
-        ));
-    }
-
-    //
-    // Find the largest usable range of SMRAM between 1MB and 4GB
-    //
-    for (Index = 0, MaxIndex = 0, Size = 0; Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) {
-      //
-      // Skip any SMRAM region that is already allocated, needs testing, or needs ECC initialization
-      //
-      if ((DescriptorBlock->Descriptor[Index].RegionState & (EFI_ALLOCATED | EFI_NEEDS_TESTING | EFI_NEEDS_ECC_INITIALIZATION)) != 0) {
-        continue;
-      }
-      //
-      // Skip any SMRAM region below 1MB
-      //
-      if (DescriptorBlock->Descriptor[Index].CpuStart < BASE_1MB) {
-        continue;
-      }
-      //
-      // Skip any SMRAM region that is above 4GB or crosses the 4GB boundary
-      //
-      if ((DescriptorBlock->Descriptor[Index].CpuStart + DescriptorBlock->Descriptor[Index].PhysicalSize) >= BASE_4GB) {
-        continue;
-      }
-      //
-      // Cache the largest SMRAM region index
-      //
-      if (DescriptorBlock->Descriptor[Index].PhysicalSize >= DescriptorBlock->Descriptor[MaxIndex].PhysicalSize) {
-        MaxIndex = Index;
-      }
-    }
-
-    //
-    // Find the extent of the contiguous SMRAM region that surrounds the largest usable SMRAM range
-    //
-    Base = DescriptorBlock->Descriptor[MaxIndex].CpuStart;
-    Size = DescriptorBlock->Descriptor[MaxIndex].PhysicalSize;
-    for (Index = 0; Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) {
-      if (DescriptorBlock->Descriptor[Index].CpuStart < Base &&
-          Base == (DescriptorBlock->Descriptor[Index].CpuStart + DescriptorBlock->Descriptor[Index].PhysicalSize)) {
-        Base  = DescriptorBlock->Descriptor[Index].CpuStart;
-        Size += DescriptorBlock->Descriptor[Index].PhysicalSize;
-      } else if ((Base + Size) == DescriptorBlock->Descriptor[Index].CpuStart) {
-        Size += DescriptorBlock->Descriptor[Index].PhysicalSize;
-      }
-    }
-
-    //
-    // Round SMRAM region up to nearest power of 2 that is at least 4KB
-    //
-    NewSize = MAX (LShiftU64 (1, HighBitSet64 (Size - 1) + 1), SIZE_4KB);
-    if ((Base & ~(NewSize - 1)) != Base) {
-      //
-      // SMRAM region Base Address has smaller alignment than SMRAM region Size
-      // This is not compatible with SMRR settings
-      //
-      DEBUG((DEBUG_ERROR, "ERROR: SMRAM Region Size has larger alignment than SMRAM Region Base\n"));
-      DEBUG((DEBUG_ERROR, "  SMRAM Region Base=%016lx  Size=%016lx\n", Base, NewSize));
-      ASSERT (FALSE);
-    } else if (Size != NewSize) {
-      //
-      // See if the size difference can be added to an adjacent descriptor that is already allocated
-      //
-      for (Index = 0; Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) {
-        if ((DescriptorBlock->Descriptor[Index].CpuStart + DescriptorBlock->Descriptor[Index].PhysicalSize) == (Base + Size)) {
-          if (((DescriptorBlock->Descriptor[Index].RegionState) & EFI_ALLOCATED) != 0) {
-            DescriptorBlock->Descriptor[Index].PhysicalSize += (NewSize - Size);
-            Size = NewSize;
-            break;
-          }
-        }
-      }
-
-      if (Size != NewSize) {
-        //
-        // Add an allocated descriptor to the SMM PEI SMRAM Memory Reserved HOB to accomodate the larger size.
-        //
-        Index = DescriptorBlock->NumberOfSmmReservedRegions;
-        NewDescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)BuildGuidHob (
-          &gEfiSmmPeiSmramMemoryReserveGuid,
-          sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK) + ((Index + 1) * sizeof (EFI_SMRAM_DESCRIPTOR))
-          );
-        ASSERT (NewDescriptorBlock != NULL);
-
-        //
-        // Copy old EFI_SMRAM_HOB_DESCRIPTOR_BLOCK to new allocated region
-        //
-        CopyMem (
-          NewDescriptorBlock,
-          DescriptorBlock,
-          sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK) + (Index * sizeof (EFI_SMRAM_DESCRIPTOR))
-          );
-
-        //
-        // Make sure last descriptor in NewDescriptorBlock contains last descriptor from DescriptorBlock
-        //
-        CopyMem (
-          &NewDescriptorBlock->Descriptor[Index],
-          &NewDescriptorBlock->Descriptor[Index - 1],
-          sizeof (EFI_SMRAM_DESCRIPTOR)
-          );
-
-        //
-        // Fill next to last descriptor with an allocated descriptor that aligns the total size of SMRAM
-        //
-        NewDescriptorBlock->Descriptor[Index - 1].CpuStart      = Base + Size;
-        NewDescriptorBlock->Descriptor[Index - 1].PhysicalStart = Base + Size;
-        NewDescriptorBlock->Descriptor[Index - 1].PhysicalSize  = NewSize - Size;
-        NewDescriptorBlock->Descriptor[Index - 1].RegionState   = DescriptorBlock->Descriptor[MaxIndex].RegionState | EFI_ALLOCATED;
-        NewDescriptorBlock->NumberOfSmmReservedRegions++;
-
-        //
-        // Invalidate the original gEfiSmmPeiSmramMemoryReserveGuid HOB
-        //
-        ZeroMem (&Hob.Guid->Name, sizeof (&Hob.Guid->Name));
-      }
-
-      Hob.Raw = GetFirstGuidHob (&gEfiSmmPeiSmramMemoryReserveGuid);
-      DescriptorBlock = GET_GUID_HOB_DATA (Hob.Raw);
-      DEBUG ((DEBUG_INFO, "SMM PEI SMRAM Memory Reserved HOB - Updated\n"));
-      for (Index = 0; Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) {
-        DEBUG((DEBUG_INFO, "  SMRAM Descriptor[%02x]: Start=%016lx  Size=%016lx  State=%02x\n",
-          Index,
-          DescriptorBlock->Descriptor[Index].PhysicalStart,
-          DescriptorBlock->Descriptor[Index].PhysicalSize,
-          DescriptorBlock->Descriptor[Index].RegionState
-          ));
-      }
-    }
-  }
 
   //
   // Initialize SmbusPolicy PPI
@@ -1118,45 +954,6 @@ PlatformEarlyInitEntry (
   return Status;
 }
 
-/**
-
-  Return the mainblockcompact Fv.
-
-  @param FvNumber    Our enumeration of the firmware volumes we care about.
-
-  @param FvAddress  Base Address of the memory containing the firmware volume
-
-  @retval EFI_SUCCESS
-  @retval EFI_NOT_FOUND
-
-**/
-EFI_STATUS
-EFIAPI
-FindFv (
-  IN EFI_PEI_FIND_FV_PPI          *This,
-  IN CONST EFI_PEI_SERVICES             **PeiServices,
-  IN OUT UINT8                    *FvNumber,
-  OUT EFI_FIRMWARE_VOLUME_HEADER  **FVAddress
-  )
-{
-	//
-  // At present, we only have one Fv to search
-  //
-  if (*FvNumber == 0) {
-    *FvNumber = 1;
-    *FVAddress = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FixedPcdGet32 (PcdFlashFvMainBase);
-    return EFI_SUCCESS;
-  }
-  else if (*FvNumber == 1) {
-    *FvNumber = 2;
-    *FVAddress = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FixedPcdGet32 (PcdFlashFvRecovery2Base);
-    return EFI_SUCCESS;
-  }
-  else { // Not the one Fv we care about
-    return EFI_NOT_FOUND;
-  }
-}
-
 EFI_STATUS
 EFIAPI
 CpuOnlyReset (
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
index 29749277d7..9631d49a84 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   PlatformEarlyInit.h
@@ -30,7 +28,7 @@ Abstract:
 #define _EFI_PLATFORM_EARLY_INIT_H_
 
 #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
-#include <FrameworkPei.h>
+#include <PiPei.h>
 #include "PlatformBaseAddresses.h"
 #include "PchAccess.h"
 #include "VlvAccess.h"
@@ -43,7 +41,6 @@ Abstract:
 #include <Guid/PlatformInfo.h>
 #include <Guid/SetupVariable.h>
 #include <Ppi/AtaController.h>
-#include <Ppi/FindFv.h>
 #include <Ppi/BootInRecoveryMode.h>
 #include <Ppi/ReadOnlyVariable2.h>
 #include <Ppi/Capsule.h>
@@ -60,7 +57,6 @@ Abstract:
 
 #include <IndustryStandard/Pci22.h>
 #include <Ppi/Speaker.h>
-#include <Guid/FirmwareFileSystem.h>
 #include <Guid/MemoryTypeInformation.h>
 #include <Ppi/Cache.h>
 #include <Ppi/Smbus.h>
@@ -73,12 +69,10 @@ Abstract:
 #include <Guid/GlobalVariable.h>
 #include <Ppi/RecoveryModule.h>
 #include <Ppi/DeviceRecoveryModule.h>
-#include <Guid/Capsule.h>
 #include <Guid/RecoveryDevice.h>
 #include <Ppi/MasterBootMode.h>
 #include <Guid/PlatformCpuInfo.h>
 #include <Guid/OsSelection.h>
-#include <Guid/SmramMemoryReserve.h>
 #include <Register/Msr.h>
 
 #define SMC_LAN_ON       0x46
@@ -1379,15 +1373,6 @@ CheckIfJumperSetForRecovery(
   VOID
   );
 
-EFI_STATUS
-EFIAPI    
-FindFv (
-  IN EFI_PEI_FIND_FV_PPI              *This,
-  IN CONST EFI_PEI_SERVICES             **PeiServices,
-  IN OUT UINT8                    *FvNumber,
-  OUT EFI_FIRMWARE_VOLUME_HEADER  **FVAddress
-  );
-
 BOOLEAN
 IsA16Inverted (
   );
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf
index 54277b1e8b..eeb9a4a023 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf
@@ -1,10 +1,8 @@
 #
 #
-# Copyright (c)  1999  - 2016, Intel Corporation. All rights reserved
-#                                                                                  
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
-#
 #
 #  Module Name:
 #
@@ -17,13 +15,13 @@
 #--*/
 
 [defines]
-INF_VERSION 				   = 0x00010005
-BASE_NAME					   = PlatformEarlyInit
-FILE_GUID					   = 0A5EA2E1-BE0B-44a0-A775-F429C9A018A0
-MODULE_TYPE 				   = PEIM
-VERSION_STRING				   = 1.0
-PI_SPECIFICATION_VERSION	   = 0x0001000A
-ENTRY_POINT 				   = PlatformEarlyInitEntry
+INF_VERSION               = 0x00010005
+BASE_NAME                 = PlatformEarlyInit
+FILE_GUID                 = 0A5EA2E1-BE0B-44a0-A775-F429C9A018A0
+MODULE_TYPE               = PEIM
+VERSION_STRING            = 1.0
+PI_SPECIFICATION_VERSION  = 0x0001000A
+ENTRY_POINT               = PlatformEarlyInitEntry
 
 [sources.common]
   BootMode.c
@@ -44,19 +42,15 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2SocBinPkg/Vlv2SocBinPkg.dec
   UefiCpuPkg/UefiCpuPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
 
 [LibraryClasses]
   PeimEntryPoint
   DebugLib
   HobLib
   IoLib
-#  PeiKscLib
   MultiPlatformLib
   PcdLib
   PchPlatformLib
@@ -71,14 +65,12 @@ [Ppis]
   gEfiPeiResetPpiGuid
   gEfiEndOfPeiSignalPpiGuid
   gPeiSmbusPolicyPpiGuid
-  gEfiFindFvPpiGuid
   gPeiCapsulePpiGuid
   gEfiPeiBootInRecoveryModePpiGuid
   gEfiPeiRecoveryModulePpiGuid
   gEfiPeiDeviceRecoveryModulePpiGuid
   gPeiCachePpiGuid
   gEfiPeiMasterBootModePpiGuid
-  gEfiPeiSmbusPpiGuid
   gPchInitPpiGuid
   gPchUsbPolicyPpiGuid
 
@@ -96,7 +88,6 @@ [Guids]
   gEfiNormalSetupGuid
   gEfiMemoryTypeInformationGuid
   gOsSelectionVariableGuid
-  gEfiSmmPeiSmramMemoryReserveGuid
 
 [Pcd.common]
   gPlatformModuleTokenSpaceGuid.PcdFlashFvMainBase
@@ -111,7 +102,7 @@ [Pcd.common]
 
 [Pcd]
   gEfiVLVTokenSpaceGuid.PcdMeasuredBootEnable
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootState
+  gPlatformModuleTokenSpaceGuid.PcdBootState
 
 [Depex]
   gEfiPeiReadOnlyVariable2PpiGuid  AND gPeiCachePpiGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
index 283993b44c..a533f3918c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 **/
 
 #ifndef __COMMON_HEADER_H_
@@ -13,18 +11,15 @@
 
 
 
-#include <FrameworkPei.h>
+#include <PiPei.h>
 
 #include <IndustryStandard/SmBus.h>
 #include <IndustryStandard/Pci22.h>
 #include <Ppi/AtaController.h>
-#include <Guid/Capsule.h>
-#include <Ppi/Cache.h>
 #include <Ppi/MasterBootMode.h>
 #include <Guid/MemoryTypeInformation.h>
 #include <Guid/RecoveryDevice.h>
 #include <Ppi/ReadOnlyVariable2.h>
-#include <Ppi/FvLoadFile.h>
 #include <Ppi/DeviceRecoveryModule.h>
 #include <Ppi/Capsule.h>
 #include <Ppi/Reset.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/MemoryCallback.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/MemoryCallback.c
index 7dcc2c3ce9..1932aa7125 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/MemoryCallback.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/MemoryCallback.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
   This file includes a memory call back function notified when MRC is done,
   following action is performed in this file,
     1. ICH initialization after MRC.
@@ -21,7 +18,6 @@
 
 #include "CommonHeader.h"
 #include "Platform.h"
-#include <Ppi/Cache.h>
 #include <Library/BaseCryptLib.h>
 #include <Library/PciLib.h>
 #include "VlvAccess.h"
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
index eba1dfff30..aa03f6ea95 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
 **/
@@ -816,15 +813,6 @@ PeiInitPlatform (
     sizeof (EFI_PLATFORM_INFO_HOB)
     );
 
-
-#ifdef FTPM_ENABLE
-  Status = FtpmPolicyInit(PeiServices, &SystemConfiguration);
-  if (EFI_ERROR (Status)) {
-    DEBUG((EFI_D_ERROR, "fTPM init failed.\n"));
-  }
-#endif
-
-
   //
   // Set the new boot mode for MRC
   //
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
index c976273ce3..28a5274c40 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
@@ -1,9 +1,9 @@
 #
 #
-# Copyright (c)  1999  - 2018, Intel Corporation. All rights reserved
-#                                                                                  
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
+#
 #
 # This PEIM includes 3 parts, pre memory initialization, MRC
 #  wrapper and post memory initialization.
@@ -63,9 +63,7 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  Vlv2SocBinPkg/Vlv2SocBinPkg.dec
   UefiCpuPkg/UefiCpuPkg.dec
   CryptoPkg/CryptoPkg.dec
 
@@ -89,14 +87,11 @@ [Ppis]
   gEfiPeiReadOnlyVariable2PpiGuid
   gEfiPeiResetPpiGuid
   gEfiEndOfPeiSignalPpiGuid
-  gEfiFindFvPpiGuid
   gPeiCapsulePpiGuid
   gEfiPeiBootInRecoveryModePpiGuid
   gEfiPeiRecoveryModulePpiGuid
   gEfiPeiDeviceRecoveryModulePpiGuid
-  gPeiCachePpiGuid
   gEfiPeiMasterBootModePpiGuid
-  gEfiPeiSmbusPpiGuid
   gPeiMfgMemoryTestPpiGuid
   gPeiSha256HashPpiGuid
   gVlvMmioPolicyPpiGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index 4653f63a66..9951aa4a58 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -2,14 +2,9 @@
 # Platform Package
 #
 # This package provides platform specific modules.
-# Copyright (c) 2009  - 2015, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2009  - 2019, Intel Corporation. All rights reserved.<BR>
 #
-
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#
-
-#
 #
 #**/
 
@@ -66,9 +61,6 @@ [Protocols]
   gEfiActiveBiosProtocolGuid              = { 0xebbe2d1b, 0x1647, 0x4bda, { 0xab, 0x9a, 0x78, 0x63, 0xe3, 0x96, 0xd4, 0x1a } }
   gEfiPlatformCpuProtocolGuid             = { 0xbd26cdc9, 0xa092, 0x462a, { 0x87, 0x7a, 0x5a, 0xb6, 0xad, 0xce, 0x48, 0x12 } }
   gDxePchPlatformPolicyProtocolGuid       = { 0x4b0165a9, 0x61d6, 0x4e23, { 0xa0, 0xb5, 0x3e, 0xc7, 0x9c, 0x2e, 0x30, 0xd5 } }
-  gEfiTpmMpDriverProtocolGuid             = { 0xde161cfe, 0x1e60, 0x42a1, { 0x8c, 0xc3, 0xee, 0x7e, 0xf0, 0x73, 0x52, 0x12 } }
-  gEfiLpcWpce791PolicyProtocolGuid        = { 0xab2bee2f, 0xc1a6, 0x4399, { 0x85, 0x3d, 0xc0, 0x7c, 0x77, 0x4f, 0xfd, 0x0d } }
-  gUsbPolicyGuid                          = { 0xf617b358, 0x12cf, 0x414a, { 0xa0, 0x69, 0x60, 0x67, 0x7b, 0xda, 0x13, 0xb4 } }
   gEfiSpeakerInterfaceProtocolGuid        = { 0x400b4476, 0x3081, 0x11d6, { 0x87, 0xed, 0x00, 0x06, 0x29, 0x45, 0xc3, 0xb9 } }
   gDxeVlvPlatformPolicyGuid               = { 0x5bab88ba, 0xe0e2, 0x4674, { 0xb6, 0xad, 0xb8, 0x12, 0xf6, 0x88, 0x1c, 0xd6 } }
   gEfiSmbiosSlotPopulationGuid            = { 0xef7bf7d6, 0xf8ff, 0x4a76, { 0x82, 0x47, 0xc0, 0xd0, 0xd1, 0xcc, 0x49, 0xc0 } }
@@ -80,9 +72,6 @@ [Protocols]
   gEfiPlatformIdeInitProtocolGuid         = { 0x377c66a3, 0x8fe7, 0x4ee8, { 0x85, 0xb8, 0xf1, 0xa2, 0x82, 0x56, 0x9e, 0x3b } }
   gEfiPciPlatformProtocolGuid             = { 0x07d75280, 0x27d4, 0x4d69, { 0x90, 0xd0, 0x56, 0x43, 0xe2, 0x38, 0xb3, 0x41 } }
   gEnhancedSpeedstepProtocolGuid          = { 0x91a1ddcf, 0x5374, 0x4939, { 0x89, 0x51, 0xd7, 0x29, 0x3f, 0x1a, 0x78, 0x6f } }
-  gEfiAcpiSupportProtocolGuid             = { 0xdbff9d55, 0x89b7, 0x46da, { 0xbd, 0xdf, 0x67, 0x7d, 0x3d, 0xc0, 0x24, 0x1d } }
-  gEfiAcpiS3SaveProtocolGuid              = { 0x125f2de1, 0xfb85, 0x440c, { 0xa5, 0x4c, 0x4d, 0x99, 0x35, 0x8a, 0x8d, 0x38 } }
-  gEfiCpuIoProtocolGuid                   = { 0xB0732526, 0x38C8, 0x4b40, { 0x88, 0x77, 0x61, 0xC7, 0xB0, 0x6A, 0xAC, 0x45 } }
   gPlatformGOPPolicyGuid                  = { 0xec2e931b, 0x3281, 0x48a5, { 0x81, 0x07, 0xdf, 0x8a, 0x8b, 0xed, 0x3c, 0x5d } }
   gEfiGopDisplayBrightnessProtocolGuid    = { 0x6ff23f1d, 0x877c, 0x4b1b, { 0x93, 0xfc, 0xf1, 0x42, 0xb2, 0xee, 0xa6, 0xa7 } }
   gEfiUsbKeyboardConnectGuid              = { 0xad9c4381, 0x1ede, 0x430c, { 0x8d, 0x42, 0x23, 0x76, 0x7c, 0x46, 0x5d, 0x52 } }
@@ -130,9 +119,6 @@ [PcdsFixedAtBuild]
 
   gEfiPchTokenSpaceGuid.PcdPchAcpiIoPortBaseAddress|0x400|UINT16|0x0000000B
 
-   ## FFS filename to find the shell application.
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile|{ 0xB7, 0xD6, 0x7A, 0xC5, 0x15, 0x05, 0xA8, 0x40, 0x9D, 0x21, 0x55, 0x16, 0x52, 0x85, 0x4E, 0x37 }|VOID*|0x40000004
-
   gEfiIchTokenSpaceGuid.PcdPeiIchUhciControllerIoPortBaseAddress|0x4000|UINT16|0x30000017
   gEfiIchTokenSpaceGuid.PcdPeiIchEhciControllerMemoryBaseAddress|0xFC000000|UINT32|0x30000019
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index 5827386977..87b905c95b 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -9,45 +9,34 @@
 #**/
 
 [Defines]
-DEFINE FLASH_BASE       = 0xFFC00000     #The base address of the 4Mb FLASH Device.
-DEFINE FLASH_SIZE       = 0x00400000     #The flash size in bytes of the 4Mb FLASH Device.
+DEFINE FLASH_BASE       = 0xFF800000     #The base address of the 4Mb FLASH Device.
+DEFINE FLASH_SIZE       = 0x00800000     #The flash size in bytes of the 4Mb FLASH Device.
 DEFINE FLASH_BLOCK_SIZE = 0x1000        #The block size in bytes of the 4Mb FLASH Device.
-DEFINE FLASH_NUM_BLOCKS = 0x400           #The number of blocks in 4Mb FLASH Device.
+DEFINE FLASH_NUM_BLOCKS = 0x800           #The number of blocks in 4Mb FLASH Device.
 DEFINE FLASH_AREA_BASE_ADDRESS                                = 0xFF800000
 DEFINE FLASH_AREA_SIZE                                        = 0x00800000
 
-DEFINE FLASH_REGION_VLVMICROCODE_OFFSET                       = 0x00000000
+DEFINE FLASH_REGION_VLVMICROCODE_OFFSET                       = 0x00400000
 DEFINE FLASH_REGION_VLVMICROCODE_SIZE                         = 0x00040000
 DEFINE FLASH_REGION_VLVMICROCODE_BASE                         = 0xFFC00000
 
-DEFINE FLASH_REGION_VPD_OFFSET                                = 0x00040000
+DEFINE FLASH_REGION_VPD_OFFSET                                = 0x00440000
 DEFINE FLASH_REGION_VPD_SIZE                                  = 0x0003E000
 
-DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_OFFSET = 0x0007E000
+DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_OFFSET = 0x0047E000
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_SIZE   = 0x00002000
 
 
-DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET   = 0x00080000
+DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET   = 0x00480000
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_SIZE     = 0x00040000
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-DEFINE FLASH_REGION_FSPBIN_OFFSET                             = 0x000C0000
-DEFINE FLASH_REGION_FSPBIN_SIZE                               = 0x00048000
-DEFINE FLASH_REGION_FSPBIN_BASE                               = 0xFFCC0000
-
-DEFINE FLASH_REGION_AZALIABIN_OFFSET                          = 0x00108000
-DEFINE FLASH_REGION_AZALIABIN_SIZE                            = 0x00008000
-DEFINE FLASH_REGION_AZALIABIN_BASE                            = 0xFFD08000
-
-!endif
-
-DEFINE FLASH_REGION_FVMAIN_OFFSET                             = 0x00110000
+DEFINE FLASH_REGION_FVMAIN_OFFSET                             = 0x00510000
 DEFINE FLASH_REGION_FVMAIN_SIZE                               = 0x00210000
 
-DEFINE FLASH_REGION_FV_RECOVERY2_OFFSET                       = 0x00320000
+DEFINE FLASH_REGION_FV_RECOVERY2_OFFSET                       = 0x00720000
 DEFINE FLASH_REGION_FV_RECOVERY2_SIZE                         = 0x00070000
 
-DEFINE FLASH_REGION_FV_RECOVERY_OFFSET                        = 0x00390000
+DEFINE FLASH_REGION_FV_RECOVERY_OFFSET                        = 0x00790000
 DEFINE FLASH_REGION_FV_RECOVERY_SIZE                          = 0x00070000
 
 ################################################################################
@@ -79,17 +68,6 @@ [FD.Vlv]
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress = $(FLASH_REGION_VLVMICROCODE_BASE) + 0x60
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize = $(FLASH_REGION_VLVMICROCODE_SIZE) - 0x60
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-# put below PCD value setting into dsc file
-#SET gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress                = $(FLASH_REGION_VLVMICROCODE_BASE)
-#SET gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize             = $(FLASH_REGION_VLVMICROCODE_SIZE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset                    = 0x60
-#SET gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress                   = $(FLASH_AREA_BASE_ADDRESS)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize                      = $(FLASH_AREA_SIZE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase                          = $(FLASH_REGION_FSPBIN_BASE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize                          = $(FLASH_REGION_FSPBIN_SIZE)
-
-!endif
 ################################################################################
 #
 # Following are lists of FD Region layout which correspond to the locations of different
@@ -106,6 +84,13 @@ [FD.Vlv]
 # Fv Size can be adjusted; FVMAIN_COMPACT can be reduced to 0x120000, and FV_RECOVERY can be enlarged to 0x80000
 #
 ################################################################################
+
+  #
+  # IFWI Header
+  #
+0x0000|0x1000
+FILE=Vlv2TbltDevicePkg/Stitch/IFWIHeader/IFWI_HEADER.bin
+
   #
   # CPU Microcodes
   #
@@ -173,18 +158,6 @@ [FD.Vlv]
 $(FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET)|$(FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_SIZE)
 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-
-  $(FLASH_REGION_FSPBIN_OFFSET)|$(FLASH_REGION_FSPBIN_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase|gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize
-  FILE = Vlv2SocBinPkg/FspBinary/FvFsp.bin
-
-
-  $(FLASH_REGION_AZALIABIN_OFFSET)|$(FLASH_REGION_AZALIABIN_SIZE)
-  FILE = Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin
-
-!endif
-
   #
   # Main Block
   #
@@ -258,7 +231,7 @@ [FV.FVRECOVERY_COMPONENTS]
 READ_LOCK_CAP      = TRUE
 READ_LOCK_STATUS   = TRUE
 
-INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
+INF  RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
 INF  MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf
 INF  MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf
 INF  MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPei.inf
@@ -299,28 +272,22 @@ [FV.FVRECOVERY2]
 
 
 
-INF $(PLATFORM_PACKAGE)/PlatformInitPei/PlatformInitPei.inf
+INF Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
 INF UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MpS3.inf
-!endif
+INF UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
 
-# INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PiSmmCommunicationPei.inf
 !if $(TPM_ENABLED) == TRUE
 INF SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf
 INF SecurityPkg/Tcg/TcgPei/TcgPei.inf
 INF SecurityPkg/Tcg/PhysicalPresencePei/PhysicalPresencePei.inf
 !endif
-!if $(FTPM_ENABLE) == TRUE
-INF  SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf #use PCD config
-!endif
 INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
 !if $(ACPI50_ENABLE) == TRUE
@@ -359,31 +326,15 @@ [FV.FVRECOVERY]
 READ_LOCK_STATUS   = TRUE
 FvNameGuid         = B73FE497-B92E-416e-8326-45AD0D270091
 
-
-!if $(MINNOW2_FSP_BUILD) == TRUE
-INF IntelFspWrapperPkg/FspWrapperSecCore/FspWrapperSecCore.inf
-!else
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
-!endif
-
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
 INF MdeModulePkg/Core/Pei/PeiMain.inf
-!if $(MINNOW2_FSP_BUILD) == TRUE
-INF Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
-INF IntelFspWrapperPkg/FspInitPei/FspInitPei.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
 INF MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
 INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
 
-INF $(PLATFORM_PACKAGE)/PlatformPei/PlatformPei.inf
+INF Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/fTPMInitPeim.inf
-!endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   INF  SourceLevelDebugPkg/DebugAgentPei/DebugAgentPei.inf
@@ -397,12 +348,10 @@ [FV.FVRECOVERY]
 !endif
 !endif
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
 !if $(PCIESC_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf
 !endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf
 
 INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
 
@@ -440,10 +389,6 @@ [FV.FVMAIN]
   # EDK II Related Platform codes
   #
 
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  INF IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.inf
-  !endif
-
 INF MdeModulePkg/Core/Dxe/DxeMain.inf
 INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 !if $(ACPI50_ENABLE) == TRUE
@@ -452,14 +397,14 @@ [FV.FVMAIN]
 !endif
 
 
-INF IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
 INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
 INF MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
 INF MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
 INF MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterSmm.inf
 INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
 INF UefiCpuPkg/CpuDxe/CpuDxe.inf
-INF $(PLATFORM_PACKAGE)/Metronome/Metronome.inf
+INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
+INF MdeModulePkg/Universal/Metronome/Metronome.inf
 INF IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
 !if $(ARCH) == IA32
 INF USE=IA32 MdeModulePkg/Logo/Logo.inf
@@ -469,13 +414,12 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
 INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
-INF IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
 
 INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf
 INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf
-INF $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbSmm.inf
+INF Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbSmm.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
 !if $(SECURE_BOOT_ENABLE)
 INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
 !endif
@@ -485,89 +429,62 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
 INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
 INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
-INF $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbRuntimeDxe.inf
+INF Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbRuntimeDxe.inf
 
 
-INF $(PLATFORM_PACKAGE)/PlatformSetupDxe/PlatformSetupDxe.inf
+INF Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
 !if $(DATAHUB_ENABLE) == TRUE
 INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf
 !endif
-INF IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
 INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
 
   #
   # EDK II Related Silicon codes
   #
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
 
-!if $(USE_HPET_TIMER) == TRUE
 INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
-!else
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmartTimer.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/IntelPchLegacyInterrupt.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
 !if $(PCIESC_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
 !endif
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
-!else
-INF IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
-INF Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
-!endif
-!if $(MINNOW2_FSP_BUILD) == FALSE
-  !if $(SEC_ENABLE) == TRUE
-  INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/HeciDrv.inf
-  INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SeCPolicyInitDxe.inf
-  !endif
-!endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
 !if $(TPM_ENABLED) == TRUE
 INF SecurityPkg/Tcg/TcgConfigDxe/TcgConfigDxe.inf
 INF SecurityPkg/Tcg/TcgDxe/TcgDxe.inf
 INF RuleOverride = DRIVER_ACPITABLE SecurityPkg/Tcg/TcgSmm/TcgSmm.inf
 !endif
-!if $(FTPM_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/Tpm2DeviceSeCPei.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Tpm2DeviceSeCDxe.inf
-INF SecurityPkg/Tcg/MemoryOverwriteControl/TcgMor.inf
-INF SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/FtpmSmm.inf
-!endif
 
 #
 # EDK II Related Platform codes
 #
-INF $(PLATFORM_PACKAGE)/PlatformSmm/PlatformSmm.inf
-INF $(PLATFORM_PACKAGE)/PlatformInfoDxe/PlatformInfoDxe.inf
-INF $(PLATFORM_PACKAGE)/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
-INF $(PLATFORM_PACKAGE)/PlatformDxe/PlatformDxe.inf
-INF $(PLATFORM_PACKAGE)/PciPlatform/PciPlatform.inf
-INF $(PLATFORM_PACKAGE)/SaveMemoryConfig/SaveMemoryConfig.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
-INF $(PLATFORM_PACKAGE)/PpmPolicy/PpmPolicy.inf
-INF $(PLATFORM_PACKAGE)/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+INF Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
+INF Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
+INF Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+INF Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+INF Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+INF Vlv2TbltDevicePkg/SaveMemoryConfig/SaveMemoryConfig.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
+INF Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
 !if $(GOP_DRIVER_ENABLE) == TRUE
- INF $(PLATFORM_PACKAGE)/PlatformGopPolicy/PlatformGopPolicy.inf
+ INF Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
  FILE DRIVER = FF0C8745-3270-4439-B74F-3E45F8C77064 {
   SECTION DXE_DEPEX_EXP = {gPlatformGOPPolicyGuid}
   SECTION PE32 = Vlv2SocBinPkg/GOP/7.2.1011/RELEASE_VS2008x86/$(DXE_ARCHITECTURE)/IntelGopDriver.efi
@@ -575,7 +492,7 @@ [FV.FVMAIN]
 }
 !endif
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
   #
   # SMM
   #
@@ -586,25 +503,22 @@ [FV.FVMAIN]
 INF UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
 INF MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf
 INF UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
-INF $(PLATFORM_PACKAGE)/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
 
-#
-# Remove the following two SMM binary modules that prevent platform from booting to UEFI Shell
-#
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/GraphicDxeInitSmm.inf
 
   #
   # ACPI
   #
 INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
-INF $(PLATFORM_PACKAGE)/BootScriptSaveDxe/BootScriptSaveDxe.inf
+INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 INF IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
 INF RuleOverride = ACPITABLE2 Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
-INF RuleOverride = ACPITABLE $(PLATFORM_RC_PACKAGE)/AcpiTablesPCAT/AcpiTables.inf
+INF RuleOverride = ACPITABLE Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
 
-INF $(PLATFORM_PACKAGE)/AcpiPlatform/AcpiPlatform.inf
+INF Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
 
 INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
@@ -613,26 +527,17 @@ [FV.FVMAIN]
   #
 INF MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
 
 
 #
 # ISA
 #
-INF $(PLATFORM_PACKAGE)/Wpce791/Wpce791.inf
-INF IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
-INF IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
+INF Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 !if $(SOURCE_DEBUG_ENABLE) != TRUE
 INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
 !endif
-#INF IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf
-#INF IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf
 
-#
-# SDIO
-#
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcHost.inf
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcMediaDevice.inf
 #
 # IDE/SCSI/AHCI
 #
@@ -642,7 +547,7 @@ [FV.FVMAIN]
 
 INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
 !if $(SATA_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
 #
 
 #
@@ -659,7 +564,6 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
 INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
 INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
-INF IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
 INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
 INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
 INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
@@ -682,9 +586,9 @@ [FV.FVMAIN]
   # SMBIOS
   #
 INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
-INF $(PLATFORM_PACKAGE)/SmBiosMiscDxe/SmBiosMiscDxe.inf
+INF Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
 
 
 #
@@ -719,8 +623,14 @@ [FV.FVMAIN]
 !if $(NETWORK_ENABLE) == TRUE
   FILE DRIVER = 22DE1691-D65D-456a-993E-A253DD1F308C {
     SECTION PE32 = Vlv2SocBinPkg/UNDI/RtkUndiDxe/$(DXE_ARCHITECTURE)/RtkUndiDxe.efi
-    SECTION UI = "UNDI"
+    SECTION UI = "RtkUndiDxe"
   }
+  !if $(DXE_ARCHITECTURE) == "X64"
+    FILE DRIVER = 7C7467E9-8BB3-4BF1-8694-6FED7D25D13E {
+      SECTION PE32 = Vlv2SocBinPkg/UNDI/I211PcieUndiDxe/$(DXE_ARCHITECTURE)/E7006X3.EFI
+      SECTION UI = "E7006X3"
+    }
+  !endif
 !endif
 
 !if $(CAPSULE_ENABLE)
@@ -908,7 +818,7 @@ [Rule.Common.UEFI_DRIVER.BINARY]
 
 [Rule.Common.UEFI_DRIVER.NATIVE_BINARY]
   FILE DRIVER = $(NAMED_GUID) {
-    DXE_DEPEX DXE_DEPEX Optional      $(WORKSPACE)/$(PLATFORM_PACKAGE)/IntelGopDepex/IntelGopDriver.depex
+    DXE_DEPEX DXE_DEPEX Optional      $(WORKSPACE)/Vlv2TbltDevicePkg/IntelGopDepex/IntelGopDriver.depex
     PE32      PE32                    |.efi
     UI        STRING="$(MODULE_NAME)" Optional
     VERSION   STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
index 61eca30be1..d5068b514c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
@@ -1,11 +1,9 @@
 #/** @file
 # platform configuration file.
 #
-# Copyright (c) 2012  - 2016, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

+# Copyright (c) 2012  - 2019, Intel Corporation. All rights reserved.<BR>
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

 #
 #**/
 
@@ -13,12 +11,6 @@
 # TRUE is ENABLE. FASLE is DISABLE.
 #
 
-#
-# FSP selection
-#
-DEFINE MINNOW2_FSP_BUILD = FALSE
-
-
 DEFINE SCSI_ENABLE = TRUE
 
 
@@ -31,14 +23,6 @@
 # Feature selection
 #
 
-#
-# Select system timer which is used to produce Timer Arch Protocol:
-# TRUE  - HPET timer is used.
-# FALSE - 8254 timer is used.
-#
-DEFINE USE_HPET_TIMER = TRUE
-
-
 #
 # Feature selection
 #
@@ -65,7 +49,6 @@
 
 DEFINE GOP_DRIVER_ENABLE = TRUE
 DEFINE DATAHUB_ENABLE = TRUE
-DEFINE DATAHUB_STATUS_CODE_ENABLE = TRUE
 DEFINE USB_ENABLE = TRUE
 
 DEFINE ISA_SERIAL_STATUS_CODE_ENABLE = TRUE
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index a6859d3b6d..110efe28c3 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -30,17 +30,6 @@ [Defines]
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET   = 0x00080000
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_SIZE     = 0x00040000
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-DEFINE FLASH_REGION_FSPBIN_OFFSET                             = 0x000C0000
-DEFINE FLASH_REGION_FSPBIN_SIZE                               = 0x00048000
-DEFINE FLASH_REGION_FSPBIN_BASE                               = 0xFFCC0000
-
-DEFINE FLASH_REGION_AZALIABIN_OFFSET                          = 0x00108000
-DEFINE FLASH_REGION_AZALIABIN_SIZE                            = 0x00008000
-DEFINE FLASH_REGION_AZALIABIN_BASE                            = 0xFFD08000
-
-!endif
-
 DEFINE FLASH_REGION_FVMAIN_OFFSET                             = 0x00110000
 DEFINE FLASH_REGION_FVMAIN_SIZE                               = 0x00215000
 
@@ -79,17 +68,6 @@ [FD.Vlv]
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress = $(FLASH_REGION_VLVMICROCODE_BASE) + 0x60
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize = $(FLASH_REGION_VLVMICROCODE_SIZE) - 0x60
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-# put below PCD value setting into dsc file
-#SET gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress                = $(FLASH_REGION_VLVMICROCODE_BASE)
-#SET gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize             = $(FLASH_REGION_VLVMICROCODE_SIZE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset                    = 0x60
-#SET gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress                   = $(FLASH_AREA_BASE_ADDRESS)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize                      = $(FLASH_AREA_SIZE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase                          = $(FLASH_REGION_FSPBIN_BASE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize                          = $(FLASH_REGION_FSPBIN_SIZE)
-
-!endif
 ################################################################################
 #
 # Following are lists of FD Region layout which correspond to the locations of different
@@ -129,18 +107,6 @@ [FD.Vlv]
 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
 FILE = Vlv2TbltDevicePkg/Stitch/Gcc/NvStorageFtwSpare.bin
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-
-  $(FLASH_REGION_FSPBIN_OFFSET)|$(FLASH_REGION_FSPBIN_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase|gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize
-  FILE = Vlv2SocBinPkg/FspBinary/FvFsp.bin
-
-
-  $(FLASH_REGION_AZALIABIN_OFFSET)|$(FLASH_REGION_AZALIABIN_SIZE)
-  FILE = Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin
-
-!endif
-
   #
   # Main Block
   #
@@ -214,7 +180,7 @@ [FV.FVRECOVERY_COMPONENTS]
 READ_LOCK_CAP      = TRUE
 READ_LOCK_STATUS   = TRUE
 
-INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
+INF  RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
 INF  MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf
 INF  MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf
 INF  MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPei.inf
@@ -253,30 +219,21 @@ [FV.FVRECOVERY2]
 READ_LOCK_STATUS   = TRUE
 FvNameGuid         = B73FE497-B92E-416e-8326-45AD0D270092
 
-
-
-INF $(PLATFORM_PACKAGE)/PlatformInitPei/PlatformInitPei.inf
-
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
+INF Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
 INF UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MpS3.inf
-!endif
+INF UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
 
-# INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PiSmmCommunicationPei.inf
 !if $(TPM_ENABLED) == TRUE
 INF SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf
 INF SecurityPkg/Tcg/TcgPei/TcgPei.inf
 INF SecurityPkg/Tcg/PhysicalPresencePei/PhysicalPresencePei.inf
 !endif
-!if $(FTPM_ENABLE) == TRUE
-INF  SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf #use PCD config
-!endif
 INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
 !if $(ACPI50_ENABLE) == TRUE
@@ -315,31 +272,15 @@ [FV.FVRECOVERY]
 READ_LOCK_STATUS   = TRUE
 FvNameGuid         = B73FE497-B92E-416e-8326-45AD0D270091
 
-
-!if $(MINNOW2_FSP_BUILD) == TRUE
-INF IntelFspWrapperPkg/FspWrapperSecCore/FspWrapperSecCore.inf
-!else
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
-!endif
-
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
 INF MdeModulePkg/Core/Pei/PeiMain.inf
-!if $(MINNOW2_FSP_BUILD) == TRUE
-INF Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
-INF IntelFspWrapperPkg/FspInitPei/FspInitPei.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
 INF MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
 INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
 
-INF $(PLATFORM_PACKAGE)/PlatformPei/PlatformPei.inf
+INF Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/fTPMInitPeim.inf
-!endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   INF  SourceLevelDebugPkg/DebugAgentPei/DebugAgentPei.inf
@@ -353,12 +294,10 @@ [FV.FVRECOVERY]
 !endif
 !endif
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
 !if $(PCIESC_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf
 !endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf
 
 INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
 
@@ -396,10 +335,6 @@ [FV.FVMAIN]
   # EDK II Related Platform codes
   #
 
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  INF IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.inf
-  !endif
-
 INF MdeModulePkg/Core/Dxe/DxeMain.inf
 INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 !if $(ACPI50_ENABLE) == TRUE
@@ -408,14 +343,14 @@ [FV.FVMAIN]
 !endif
 
 
-INF IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
 INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
 INF MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
 INF MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
 INF MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterSmm.inf
 INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
 INF UefiCpuPkg/CpuDxe/CpuDxe.inf
-INF $(PLATFORM_PACKAGE)/Metronome/Metronome.inf
+INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
+INF MdeModulePkg/Universal/Metronome/Metronome.inf
 INF IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
 !if $(ARCH) == IA32
 INF USE=IA32 MdeModulePkg/Logo/Logo.inf
@@ -425,13 +360,12 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
 INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
-INF IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
 
 INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf
 INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf
-INF $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbSmm.inf
+INF Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbSmm.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
 !if $(SECURE_BOOT_ENABLE)
 INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
 !endif
@@ -441,89 +375,62 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
 INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
 INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
-INF $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbRuntimeDxe.inf
+INF Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbRuntimeDxe.inf
 
 
-INF $(PLATFORM_PACKAGE)/PlatformSetupDxe/PlatformSetupDxe.inf
+INF Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
 !if $(DATAHUB_ENABLE) == TRUE
 INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf
 !endif
-INF IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
 INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
 
   #
   # EDK II Related Silicon codes
   #
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
 
-!if $(USE_HPET_TIMER) == TRUE
 INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
-!else
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmartTimer.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/IntelPchLegacyInterrupt.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
 !if $(PCIESC_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
 !endif
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
-!else
-INF IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
-INF Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
-!endif
-!if $(MINNOW2_FSP_BUILD) == FALSE
-  !if $(SEC_ENABLE) == TRUE
-  INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/HeciDrv.inf
-  INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SeCPolicyInitDxe.inf
-  !endif
-!endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
 !if $(TPM_ENABLED) == TRUE
 INF SecurityPkg/Tcg/TcgConfigDxe/TcgConfigDxe.inf
 INF SecurityPkg/Tcg/TcgDxe/TcgDxe.inf
 INF RuleOverride = DRIVER_ACPITABLE SecurityPkg/Tcg/TcgSmm/TcgSmm.inf
 !endif
-!if $(FTPM_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/Tpm2DeviceSeCPei.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Tpm2DeviceSeCDxe.inf
-INF SecurityPkg/Tcg/MemoryOverwriteControl/TcgMor.inf
-INF SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/FtpmSmm.inf
-!endif
 
 #
 # EDK II Related Platform codes
 #
-INF $(PLATFORM_PACKAGE)/PlatformSmm/PlatformSmm.inf
-INF $(PLATFORM_PACKAGE)/PlatformInfoDxe/PlatformInfoDxe.inf
-INF $(PLATFORM_PACKAGE)/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
-INF $(PLATFORM_PACKAGE)/PlatformDxe/PlatformDxe.inf
-INF $(PLATFORM_PACKAGE)/PciPlatform/PciPlatform.inf
-INF $(PLATFORM_PACKAGE)/SaveMemoryConfig/SaveMemoryConfig.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
-INF $(PLATFORM_PACKAGE)/PpmPolicy/PpmPolicy.inf
-INF $(PLATFORM_PACKAGE)/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+INF Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
+INF Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
+INF Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+INF Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+INF Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+INF Vlv2TbltDevicePkg/SaveMemoryConfig/SaveMemoryConfig.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
+INF Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
 !if $(GOP_DRIVER_ENABLE) == TRUE
- INF $(PLATFORM_PACKAGE)/PlatformGopPolicy/PlatformGopPolicy.inf
+ INF Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
  FILE DRIVER = FF0C8745-3270-4439-B74F-3E45F8C77064 {
   SECTION DXE_DEPEX_EXP = {gPlatformGOPPolicyGuid}
   SECTION PE32 = Vlv2SocBinPkg/GOP/7.2.1011/RELEASE_VS2008x86/$(DXE_ARCHITECTURE)/IntelGopDriver.efi
@@ -531,7 +438,7 @@ [FV.FVMAIN]
 }
 !endif
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
   #
   # SMM
   #
@@ -542,25 +449,22 @@ [FV.FVMAIN]
 INF UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
 INF MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf
 INF UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
-INF $(PLATFORM_PACKAGE)/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
 
-#
-# Remove the following two SMM binary modules that prevent platform from booting to UEFI Shell
-#
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/GraphicDxeInitSmm.inf
 
   #
   # ACPI
   #
 INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
-INF $(PLATFORM_PACKAGE)/BootScriptSaveDxe/BootScriptSaveDxe.inf
+INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 INF IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
 INF RuleOverride = ACPITABLE2 Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
-INF RuleOverride = ACPITABLE $(PLATFORM_RC_PACKAGE)/AcpiTablesPCAT/AcpiTables.inf
+INF RuleOverride = ACPITABLE Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
 
-INF $(PLATFORM_PACKAGE)/AcpiPlatform/AcpiPlatform.inf
+INF Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
 
 INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
@@ -569,26 +473,17 @@ [FV.FVMAIN]
   #
 INF MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
 
 
 #
 # ISA
 #
-INF $(PLATFORM_PACKAGE)/Wpce791/Wpce791.inf
-INF IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
-INF IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
+INF Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 !if $(SOURCE_DEBUG_ENABLE) != TRUE
 INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
 !endif
-#INF IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf
-#INF IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf
 
-#
-# SDIO
-#
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcHost.inf
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcMediaDevice.inf
 #
 # IDE/SCSI/AHCI
 #
@@ -598,7 +493,7 @@ [FV.FVMAIN]
 
 INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
 !if $(SATA_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
 #
 
 #
@@ -615,7 +510,6 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
 INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
 INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
-INF IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
 INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
 INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
 INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
@@ -638,9 +532,9 @@ [FV.FVMAIN]
   # SMBIOS
   #
 INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
-INF $(PLATFORM_PACKAGE)/SmBiosMiscDxe/SmBiosMiscDxe.inf
+INF Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
 
 
 #
@@ -675,8 +569,14 @@ [FV.FVMAIN]
 !if $(NETWORK_ENABLE) == TRUE
   FILE DRIVER = 22DE1691-D65D-456a-993E-A253DD1F308C {
     SECTION PE32 = Vlv2SocBinPkg/UNDI/RtkUndiDxe/$(DXE_ARCHITECTURE)/RtkUndiDxe.efi
-    SECTION UI = "UNDI"
+    SECTION UI = "RtkUndiDxe"
   }
+  !if $(DXE_ARCHITECTURE) == "X64"
+    FILE DRIVER = 7C7467E9-8BB3-4BF1-8694-6FED7D25D13E {
+      SECTION PE32 = Vlv2SocBinPkg/UNDI/I211PcieUndiDxe/$(DXE_ARCHITECTURE)/E7006X3.EFI
+      SECTION UI = "E7006X3"
+    }
+  !endif
 !endif
 
 !if $(CAPSULE_ENABLE)
@@ -786,11 +686,7 @@ [Rule.Common.SEC]
 [Rule.Common.SEC.BINARY]
   FILE SEC = $(NAMED_GUID) RELOCS_STRIPPED {
     PE32  PE32    Align = 8       |.efi
-!if $(MINNOW2_FSP_BUILD) == TRUE
-    RAW   RAW                     |.raw
-!else
     RAW   BIN     Align = 16      |.com
-!endif
   }
 
 [Rule.Common.PEI_CORE]
@@ -868,7 +764,7 @@ [Rule.Common.UEFI_DRIVER.BINARY]
 
 [Rule.Common.UEFI_DRIVER.NATIVE_BINARY]
   FILE DRIVER = $(NAMED_GUID) {
-    DXE_DEPEX DXE_DEPEX Optional      $(WORKSPACE)/$(PLATFORM_PACKAGE)/IntelGopDepex/IntelGopDriver.depex
+    DXE_DEPEX DXE_DEPEX Optional      $(WORKSPACE)/Vlv2TbltDevicePkg/IntelGopDepex/IntelGopDriver.depex
     PE32      PE32                    |.efi
     UI        STRING="$(MODULE_NAME)" Optional
     VERSION   STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index 0a57587e82..25d1beb400 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -18,25 +18,11 @@ [Defines]
   PLATFORM_GUID                       = 465B0A0B-7AC1-443b-8F67-7B8DEC145F90
   PLATFORM_VERSION                    = 0.1
   DSC_SPECIFICATION                   = 0x00010005
-
-  #
-  # Set platform specific package/folder name, same as passed from PREBUILD script.
-  # PLATFORM_PACKAGE would be the same as PLATFORM_NAME as well as package build folder
-  # DEFINE only takes effect at R9 DSC and FDF.
-  #
-  DEFINE      PLATFORM_PACKAGE                = Vlv2TbltDevicePkg
-  DEFINE      PLATFORM_RC_PACKAGE             = Vlv2DeviceRefCodePkg
-  DEFINE      PLATFORM_BINARY_PACKAGE         = Vlv2SocBinPkg
-  OUTPUT_DIRECTORY                    = Build/$(PLATFORM_PACKAGE)
+  OUTPUT_DIRECTORY                    = Build/Vlv2TbltDevicePkg
   SUPPORTED_ARCHITECTURES             = IA32|X64
   BUILD_TARGETS                       = DEBUG|RELEASE
   SKUID_IDENTIFIER                    = DEFAULT
 
-  DEFINE CPU_ARCH                 =ValleyView2
-  DEFINE PROJECT_SC_FAMILY        =IntelPch
-  DEFINE PROJECT_SC_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/SouthCluster
-  DEFINE PROJECT_VLV_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/NorthCluster
-
   DEFINE RC_BINARY_RELEASE        = TRUE
   #
   # Platform On/Off features are defined here
@@ -47,22 +33,18 @@ [Defines]
   #   3.BayleyBay
   #     ENBDT_PF_ENABLE  = TRUE
   #
-  !include $(PLATFORM_PACKAGE)/AutoPlatformCFG.txt
-  !include $(PLATFORM_PACKAGE)/PlatformPkgConfig.dsc
+  !include Vlv2TbltDevicePkg/AutoPlatformCFG.txt
+  !include Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
 
   DEFINE PLATFORMX64_ENABLE = TRUE
 
 !if $(X64_CONFIG) == TRUE
   DEFINE      DXE_ARCHITECTURE        = X64
-  DEFINE      EDK_DXE_ARCHITECTURE    = X64
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 64
 !else
   DEFINE      DXE_ARCHITECTURE        = IA32
-  DEFINE      EDK_DXE_ARCHITECTURE    = Ia32
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 32
 !endif
 
-  FLASH_DEFINITION                    = $(PLATFORM_PACKAGE)/PlatformPkgGcc.fdf
+  FLASH_DEFINITION                    = Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
 !if $(LFMA_ENABLE) == TRUE
   FIX_LOAD_TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
   DEFINE   TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
@@ -73,10 +55,6 @@ [Defines]
 
   DEFINE   PLATFORM_PCIEXPRESS_BASE   = 0E0000000
 
-  DEFINE SEC_ENABLE = FALSE
-  DEFINE SEC_DEBUG_INFO_ENABLE = FALSE
-  DEFINE FTPM_ENABLE = FALSE
-
 ################################################################################
 #
 # SKU Identification section - list of all SKU IDs supported by this
@@ -100,7 +78,6 @@ [LibraryClasses.common]
   DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
   UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
   UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
-  DxeSmmDriverEntryPoint|IntelFrameworkPkg/Library/DxeSmmDriverEntryPoint/DxeSmmDriverEntryPoint.inf
 
   #
   # Basic
@@ -144,8 +121,7 @@ [LibraryClasses.common]
   GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
-  PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLib.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   #
   # Framework
@@ -168,10 +144,6 @@ [LibraryClasses.common]
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
 !endif
 
-!if $(S3_ENABLE) == TRUE
-  S3Lib|IntelFrameworkModulePkg/Library/PeiS3Lib/PeiS3Lib.inf
-!endif
-
   OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
 !if $(CAPSULE_ENABLE) == TRUE
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
@@ -199,27 +171,27 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|$(PLATFORM_PACKAGE)/Library/SmbusLib/SmbusLib.inf
-  SmmLib|$(PLATFORM_PACKAGE)/Library/PchSmmLib/PchSmmLib.inf
+  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
   # Platform
   #
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
-  ResetSystemLib|$(PLATFORM_PACKAGE)/Library/ResetSystemLib/ResetSystemLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  ResetSystemLib|Vlv2TbltDevicePkg/Library/ResetSystemLib/ResetSystemLib.inf
 
-  PlatformCmosLib|$(PLATFORM_PACKAGE)/Library/PlatformCmosLib/PlatformCmosLib.inf
+  PlatformCmosLib|Vlv2TbltDevicePkg/Library/PlatformCmosLib/PlatformCmosLib.inf
 
   #
   # Misc
   #
-  MonoStatusCodeLib|$(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf
+  MonoStatusCodeLib|Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
 !if $(TARGET) == RELEASE
   DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
@@ -231,10 +203,11 @@ [LibraryClasses.common]
 
 !endif
 
+  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
+
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   PeCoffExtraActionLib|SourceLevelDebugPkg/Library/PeCoffExtraActionLibDebug/PeCoffExtraActionLibDebug.inf
   DebugCommunicationLib|SourceLevelDebugPkg/Library/DebugCommunicationLibSerialPort/DebugCommunicationLibSerialPort.inf
-  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
   SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !else
   PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
@@ -249,10 +222,10 @@ [LibraryClasses.common]
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
 !endif
 
- BiosIdLib|$(PLATFORM_PACKAGE)/Library/BiosIdLib/BiosIdLib.inf
- CpuIA32Lib|$(PLATFORM_PACKAGE)/Library/CpuIA32Lib/CpuIA32Lib.inf
+ BiosIdLib|Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
+ CpuIA32Lib|Vlv2TbltDevicePkg/Library/CpuIA32Lib/CpuIA32Lib.inf
 
-  StallSmmLib|$(PLATFORM_PACKAGE)/Library/StallSmmLib/StallSmmLib.inf
+  StallSmmLib|Vlv2TbltDevicePkg/Library/StallSmmLib/StallSmmLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
@@ -266,13 +239,10 @@ [LibraryClasses.common]
   AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
 !endif
   VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
-!if $(RC_BINARY_RELEASE) == TRUE
-  I2cLib|Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
-!endif
   ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
   FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
   SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
-!if $(FTPM_ENABLE) == TRUE || $(NETWORK_ISCSI_ENABLE) == TRUE
+!if $(NETWORK_ISCSI_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
   IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
@@ -283,12 +253,6 @@ [LibraryClasses.common]
 
 
   Tpm2CommandLib|SecurityPkg/Library/Tpm2CommandLib/Tpm2CommandLib.inf
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  FspApiLib|IntelFspWrapperPkg/Library/BaseFspApiLib/BaseFspApiLib.inf
-  FspPlatformInfoLib|IntelFspWrapperPkg/Library/BaseFspPlatformInfoLibSample/BaseFspPlatformInfoLibSample.inf
-  FspPlatformSecLib|Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
-  FspHobProcessLib|Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
-!endif
 
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
 
@@ -309,14 +273,14 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
   ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
   ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf
-  MultiPlatformLib|$(PLATFORM_PACKAGE)/Library/MultiPlatformLib/MultiPlatformLib.inf
+  MultiPlatformLib|Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
   MpInitLib|UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
 
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(TARGET) == RELEASE
@@ -324,7 +288,7 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxPeiLib.inf
@@ -333,13 +297,6 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgentLib.inf
 !endif
 
- !if $(MINNOW2_FSP_BUILD) == TRUE
- PlatformFspLib|Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
- !endif
-!if $(FTPM_ENABLE) == TRUE
-  Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCPei/Tpm2DeviceLibSeC.inf
-!endif
-
 [LibraryClasses.X64]
   #
   # DXE phase common
@@ -356,7 +313,7 @@ [LibraryClasses.X64]
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.inf
-  EfiRegTableLib|$(PLATFORM_PACKAGE)/Library/EfiRegTableLib/EfiRegTableLib.inf
+  EfiRegTableLib|Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
@@ -371,14 +328,14 @@ [LibraryClasses.X64.DXE_DRIVER]
   CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgentLib.inf
 !endif
 
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
 
 [LibraryClasses.X64.DXE_CORE]
   HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
@@ -386,7 +343,7 @@ [LibraryClasses.X64.DXE_CORE]
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
@@ -411,7 +368,7 @@ [LibraryClasses.X64.DXE_SMM_DRIVER]
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgentLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
 
@@ -485,12 +442,6 @@ [PcdsFeatureFlag.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|FALSE
-!endif
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmEnableBspElection|FALSE
-!if $(DATAHUB_STATUS_CODE_ENABLE) == TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|TRUE
-!else
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|FALSE
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE
 !if $(TARGET) == RELEASE
@@ -516,59 +467,20 @@ [PcdsFeatureFlag.common]
 !endif
 
 
-  ## This PCD specifies whether PS2 keyboard does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2KbdExtendedVerification|FALSE
-
-  ## This PCD specifies whether PS2 mouse does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2MouseExtendedVerification|FALSE
-
 !if $(VARIABLE_INFO_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|FALSE
 !endif
 
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
-
 !if $(SOURCE_DEBUG_ENABLE)
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmDebug|TRUE
 !endif
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
+
 [PcdsFixedAtBuild.common]
-!if $(MINNOW2_FSP_BUILD) == TRUE
-# $(FLASH_REGION_VLVMICROCODE_BASE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress|0xFFC00000
-# $(FLASH_REGION_VLVMICROCODE_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize|0x00040000
-  gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset|0x60
-# $(FLASH_AREA_BASE_ADDRESS)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress|0xFF800000
-# $(FLASH_AREA_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize|0x00800000
-# $(FLASH_REGION_FSPBIN_BASE)
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase|0xFFCC0000
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  # in FSP, when this got used, the memory already is up
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-!else
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-!endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-
-!else
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-  !else
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-  !endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-  gEfiCpuTokenSpaceGuid.PcdPeiTemporaryRamStackSize|0x3C00
-!endif
-
-
 !if $(SECURE_BOOT_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x22000
 !else
@@ -576,11 +488,8 @@ [PcdsFixedAtBuild.common]
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize|0x00000800
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize|0x400
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDRamSize|0x400000
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdS3AcpiReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdSrIovSupport|FALSE
   gEfiMdeModulePkgTokenSpaceGuid.PcdAriSupport|FALSE
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmApSyncTimeout|1000
 !if $(S4_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|TRUE
 !else
@@ -598,13 +507,9 @@ [PcdsFixedAtBuild.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries|60
 !endif
 
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdEbdaReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable|$(TOP_MEMORY_ADDRESS)
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserSubtitleTextColor|0x0
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldTextColor|0x01
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDEnabled|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVbeEnable|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVgaEnable|TRUE
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17
@@ -650,11 +555,6 @@ [PcdsFixedAtBuild.IA32]
 [PcdsPatchableInModule.common]
   gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0x$(PLATFORM_PCIEXPRESS_BASE)
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLegacyBiosCacheLegacyRegion|FALSE
-
-  ## This PCD specifies whether to use the optimized timing for best PS2 detection performance.
-  #  Note this PCD could be set to TRUE for best boot performance and set to FALSE for best device compatibility.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFastPS2Detection|TRUE
 
   #######################################################################################################
   #
@@ -829,10 +729,6 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdFTPMStatus|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateSmmDataPtr|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0
-  gEfiCpuTokenSpaceGuid.PcdCpuS3DataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuHotPlugDataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuCallbackSignal|0
-  gEfiCpuTokenSpaceGuid.PcdCpuConfigContextBuffer|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
@@ -845,24 +741,7 @@ [PcdsDynamicExDefault.X64.DEFAULT]
 
 [Components.IA32]
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
-
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspWrapperSecCore/FspWrapperSecCore.inf {
-    !if $(TARGET) == DEBUG
-
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
-  IntelFspWrapperPkg/FspInitPei/FspInitPei.inf {
-    !if $(TARGET) == DEBUG
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  !endif
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
 
   MdeModulePkg/Core/Pei/PeiMain.inf {
 !if $(TARGET) == DEBUG
@@ -873,31 +752,23 @@ [Components.IA32]
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 
-  $(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf {
+  Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf {
 !if $(TARGET) == DEBUG
     <PcdsFixedAtBuild>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2E
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <BuildOptions>
-      !if $(FTPM_ENABLE)==TRUE
-        *_*_IA32_CC_FLAGS = /D FTPM_ENABLE
-      !endif
   }
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-$(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/fTPMInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
 !endif
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformPei/PlatformPei.inf {
+  Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf {
     <BuildOptions>
       *_*_IA32_CC_FLAGS      = -DRC_BINARY_RELEASE
   !if $(TARGET) == DEBUG
@@ -917,10 +788,6 @@ [Components.IA32]
     }
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/Tpm2DeviceSeCPei.inf
-!endif
-
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/PhysicalPresencePei/PhysicalPresencePei.inf
   SecurityPkg/Tcg/TcgPei/TcgPei.inf {
@@ -931,7 +798,7 @@ [Components.IA32]
 }
 !endif
 
- $(PLATFORM_PACKAGE)/PlatformInitPei/PlatformInitPei.inf {
+ Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
     <LibraryClasses>
@@ -940,34 +807,33 @@ [Components.IA32]
 !endif
       PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/FvInfoPei/FvInfoPei.inf
+  Vlv2TbltDevicePkg/FvInfoPei/FvInfoPei.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
   MdeModulePkg/Universal/PCD/Pei/Pcd.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
   UefiCpuPkg/CpuIoPei/CpuIoPei.inf
   UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MpS3.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PiSmmCommunicationPei.inf
+  UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
 
 !if $(RECOVERY_ENABLE)
   #
   # Recovery
   #
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
   MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf
   MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf
   MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPei.inf
@@ -993,17 +859,6 @@ [Components.IA32]
  MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
  MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
 
-!if $(FTPM_ENABLE) == TRUE
-   SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      NULL|SecurityPkg/Library\HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
-  }
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1013,7 +868,7 @@ [Components.IA32]
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTablePei/FirmwarePerformancePei.inf{
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 
 !endif
@@ -1021,17 +876,6 @@ [Components.IA32]
   MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf
 !endif
 [Components.X64]
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.inf {
-    !if $(TARGET) == DEBUG
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-
-  !endif
   #
   # EDK II Related Platform codes
   #
@@ -1049,24 +893,10 @@ [Components.X64]
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
 !endif
   }
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf {
-    <PcdsPatchableInModule>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-    <PcdsFixedAtBuild>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x27
-    <LibraryClasses>
-    !if $(TARGET) != RELEASE
-          DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-       <BuildOptions>
-        ICC:*_*_*_CC_FLAGS = -D MDEPKG_NDEBUG
-        GCC:RELEASE_*_*_CC_FLAGS = -D MDEPKG_NDEBUG
-  }
   MdeModulePkg/Universal/PCD/Dxe/Pcd.inf {
     <LibraryClasses>
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
   }
-  IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
   UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
 
   MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
@@ -1099,13 +929,9 @@ [Components.X64]
 
 !if $(TPM_ENABLED) == TRUE
       NULL|SecurityPkg/Library/DxeTpmMeasureBootLib/DxeTpmMeasureBootLib.inf
-!endif
-!if $(FTPM_ENABLE) == TRUE
-      NULL|SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MpCpu.inf
-  $(PLATFORM_PACKAGE)/Metronome/Metronome.inf
+  MdeModulePkg/Universal/Metronome/Metronome.inf
 
   IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
     <LibraryClasses>
@@ -1115,12 +941,8 @@ [Components.X64]
       PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
-    !if $(FTPM_ENABLE) == TRUE
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-    !else
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
-    !endif
   }
 
   $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
@@ -1132,11 +954,11 @@ [Components.X64]
   MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf {
     <LibraryClasses>
       NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbSmm.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbSmm.inf
   MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
 !if $(SECURE_BOOT_ENABLE) == TRUE
   SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf {
     <LibraryClasses>
@@ -1158,9 +980,9 @@ [Components.X64]
   PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
   MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
 
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbRuntimeDxe.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbRuntimeDxe.inf
 
-  $(PLATFORM_PACKAGE)/PlatformSetupDxe/PlatformSetupDxe.inf
+  Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
 !if $(DATAHUB_ENABLE) == TRUE
   IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
@@ -1168,38 +990,30 @@ [Components.X64]
       gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
   }
 !endif
-  IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
-  !if $(USE_HPET_TIMER) == TRUE
-    PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
-  !else
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmartTimer.inf
-  !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
+  PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/IntelPchLegacyInterrupt.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
     <PcdsPatchableInModule>
         gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
 
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
-
-  IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
 
   #
   # Performance Application; Set PERFORMANCE_ENABLE=TRUE for normal boot performance and smm performance data
@@ -1219,35 +1033,9 @@ [Components.X64]
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
 
-!if $(SEC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/HeciDrv.inf {
-!if $(SEC_DEBUG_INFO_ENABLE) == TRUE
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=1
-!else
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=0
-!endif
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SeCPolicyInitDxe.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Tpm2DeviceSeCDxe.inf
-  SecurityPkg/Tcg/MemoryOverwriteControl/TcgMor.inf
-  SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf{
-    <LibraryClasses>
-      NULL|SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library\DxePcdLib/DxePcdLib.inf
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/FtpmSmm.inf
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1274,24 +1062,23 @@ [Components.X64]
   #
   # EDK II Related Platform codes
   #
-  $(PLATFORM_PACKAGE)/PlatformSmm/PlatformSmm.inf{
+  Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf{
     <LibraryClasses>
     !if $(TARGET) != RELEASE
           DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
     !endif
           PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/PlatformInfoDxe/PlatformInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformDxe/PlatformDxe.inf
+  Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
 
-  $(PLATFORM_PACKAGE)/PciPlatform/PciPlatform.inf
-  $(PLATFORM_PACKAGE)/SaveMemoryConfig/SaveMemoryConfig.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
-  $(PLATFORM_PACKAGE)/PpmPolicy/PpmPolicy.inf
-  $(PLATFORM_PACKAGE)/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+  Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+  Vlv2TbltDevicePkg/SaveMemoryConfig/SaveMemoryConfig.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
+  Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
 !if $(GOP_DRIVER_ENABLE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformGopPolicy/PlatformGopPolicy.inf
+  Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
 
 !endif
 
@@ -1302,13 +1089,15 @@ [Components.X64]
   MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf
   MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf
   UefiCpuPkg/CpuDxe/CpuDxe.inf
+  UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
   UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
   UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
   MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf
   UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
-  $(PLATFORM_PACKAGE)/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/GraphicDxeInitSmm.inf
 
   #
   # ACPI
@@ -1321,14 +1110,14 @@ [Components.X64]
     <LibraryClasses>
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
+  MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  $(PLATFORM_PACKAGE)/BootScriptSaveDxe/BootScriptSaveDxe.inf
   IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
-  $(PLATFORM_RC_PACKAGE)/AcpiTablesPCAT/AcpiTables.inf
+  Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
 
-  $(PLATFORM_PACKAGE)/AcpiPlatform/AcpiPlatform.inf
+  Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
 
   MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
@@ -1338,31 +1127,23 @@ [Components.X64]
   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
 
 
-#
-# ISA
-#
-  $(PLATFORM_PACKAGE)/Wpce791/Wpce791.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf
-#
-# SDIO
-#
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcHost.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcMediaDevice.inf
+  #
+  # ISA
+  #
+  Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
+  MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf
+
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/FirmwarePerformanceDxe.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/FirmwarePerformanceSmm.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 !endif
 
@@ -1370,7 +1151,6 @@ [Components.X64]
 # IDE/SCSI/AHCI
 #
   MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
-  IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/IdeBusDxe.inf
   MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
   MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
   MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
@@ -1394,7 +1174,7 @@ [Components.X64]
       gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000
   }
 !if $(SATA_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
 !endif
   MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
 !if $(SCSI_ENABLE) == TRUE
@@ -1407,7 +1187,6 @@ [Components.X64]
   MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
   MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
   MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
-  IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
   MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
   MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
@@ -1431,9 +1210,9 @@ [Components.X64]
   # SMBIOS
   #
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
-  $(PLATFORM_PACKAGE)/SmBiosMiscDxe/SmBiosMiscDxe.inf
+  Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
@@ -1448,12 +1227,6 @@ [Components.X64]
   #
 !include NetworkPkg/Network.dsc.inc
 
-!if $(NETWORK_ENABLE) == TRUE
-  !if $(CSM_ENABLE) == TRUE
-    IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Snp16Dxe.inf
-  !endif
-!endif
-
 !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE)
   MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf
   MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
@@ -1471,7 +1244,7 @@ [Components.X64]
     <LibraryClasses>
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
 !endif
 
@@ -1483,11 +1256,7 @@ [BuildOptions]
 #
 # Define token for different Platform
 #
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  DEFINE MINNOW2_FSP_OPTION = -DMINNOW2_FSP_BUILD
-!else
   DEFINE MINNOW2_FSP_OPTION =
-!endif
 
 !if $(ENBDT_PF_BUILD) == TRUE
   DEFINE ENBDT_PF_ENABLE = -DENBDT_PF_ENABLE=1
@@ -1526,11 +1295,6 @@ [BuildOptions]
   DEFINE X64_BUILD_ENABLE =
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  DEFINE DSC_FTPM_BUILD_OPTIONS = -DFTPM_ENABLE
-!else
-  DEFINE DSC_FTPM_BUILD_OPTIONS =
-!endif
 !if $(TPM_ENABLED) == TRUE
   DEFINE DSC_TPM_BUILD_OPTIONS = -DTPM_ENABLED
 !else
@@ -1538,7 +1302,7 @@ [BuildOptions]
 !endif
 
 
-  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
+  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
 !if $(PERFORMANCE_ENABLE) == TRUE
   DEFINE PDB_BUILD_OPTION = /Zi
 !endif
@@ -1570,76 +1334,6 @@ [BuildOptions.common.EDKII.DXE_SMM_DRIVER, BuildOptions.common.EDKII.SMM_CORE]
   MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096
   GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000
 
-[BuildOptions.Common.EDK]
-
-#
-# Define token for different Platform
-#
-!if $(ENBDT_PF_BUILD) == TRUE
-  DEFINE ENBDT_PF_ENABLE = -DENBDT_PF_ENABLE=1
-!else
-  DEFINE ENBDT_PF_ENABLE = -DENBDT_PF_ENABLE=0
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-  RELEASE_*_*_DLINK_FLAGS = -DEBUG
-!endif
-
-!if $(S3_ENABLE) == TRUE
-  DEFINE DSC_S3_BUILD_OPTIONS = -DEFI_S3_RESUME
-!else
-  DEFINE DSC_S3_BUILD_OPTIONS =
-!endif
-
-!if $(ENBDT_S3_SUPPORT) == TRUE
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS = -DNOCS_S3_SUPPORT
-!else
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS =
-!endif
-
-!if $(X64_CONFIG) == TRUE
-  DEFINE X64_BUILD_ENABLE = -DX64_BUILD_ENABLE=1
-!else
-  DEFINE X64_BUILD_ENABLE =
-!endif
-
-
-  DEFINE EDK_GLUE_LIB_DEBUG  =
-  DEFINE DEBUG_BUILD_OPTIONS = -D EFI_DEBUG -D DEBUG_MODE=1  /GL- $(EDK_GLUE_LIB_DEBUG) -DEDKII_GLUE_DebugPrintErrorLevel=(EFI_D_ERROR)
-  DEFINE EDK_DSC_FEATURE_BUILD_OPTIONS = $(DSC_S3_BUILD_OPTIONS) $(DSC_ACPI_BUILD_OPTIONS) $(DSC_SEC_BUILD_OPTIONS) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(SOFTSDV_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(QT_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS) -D$(PROJECT_SC_CHIPSET)
-
-  DEFINE EDK_DSC_OTHER_BUILD_OPTIONS = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS) $(SV_BUILD_OPTIONS) $(INTEL_FASTBOOT_BUILD_OPTION)
-  DEFINE EDK_DSC_GLOBAL_BUILD_OPTIONS = $(ENBDT_PF_ENABLE) $(EDK_DSC_FEATURE_BUILD_OPTIONS) $(EDK_DSC_OTHER_BUILD_OPTIONS) -D EFI_SPECIFICATION_VERSION=0x00020000  -D PI_SPECIFICATION_VERSION=0x00000009  -D TIANO_RELEASE_VERSION=0x00080006 -D SUPPORT_DEPRECATED_PCI_CFG_PPI -D CSM_SMMENTRY_PORT8DATA8 -D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE) -D MAX_VARIABLE_SIZE=0x2000 -D EFI_FIRMWARE_VENDOR="L/"INTEL/"" -D EFI_BUILD_VERSION="L/"EDKII/"" -DEFI_PEI_REPORT_STATUS_CODE_ON $(ENBDT_S3_SUPPORT_OPTIONS)
-
-  *_*_IA32_ASM_FLAGS         = -DEFI32 -D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h -DNOCS_S3_SUPPORT
-  DEBUG_*_IA32_CC_FLAGS      = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_CC_FLAGS    = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_VFRPP_FLAGS   = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_VFRPP_FLAGS = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_APP_FLAGS     = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_APP_FLAGS   = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_PP_FLAGS      = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_PP_FLAGS    = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_IA32_ASLPP_FLAGS       = -D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASLCC_FLAGS       = -D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASM16_FLAGS       = -D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
-
-  *_*_X64_ASM_FLAGS          = -DEFIX64 -D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h -DNOCS_S3_SUPPORT
-  DEBUG_*_X64_CC_FLAGS       = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_CC_FLAGS     = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_VFRPP_FLAGS    = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_VFRPP_FLAGS  = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_APP_FLAGS      = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_APP_FLAGS    = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_PP_FLAGS       = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_PP_FLAGS     = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_X64_ASLPP_FLAGS        = -D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASLCC_FLAGS        = -D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASM16_FLAGS        = -D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
- # *_*_*_BUILD_FLAGS = -s
-  *_*_*_VFR_FLAGS   = -c
-  *_*_*_BUILD_FLAGS = -c
-
 [BuildOptions.Common.EDKII]
   *_*_IA32_ASM_FLAGS     = $(VP_BUILD_OPTIONS) -D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h -DNOCS_S3_SUPPORT
 
@@ -1654,25 +1348,3 @@ [BuildOptions.Common.EDKII]
   *_*_X64_APP_FLAGS      = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_PP_FLAGS       = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_ASLPP_FLAGS    = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
-
-
-[Components.X64]
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cBus.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cHost.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cPortA0Pio.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cMmioDeviceDxe.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index 933a7ec760..8a5c42577d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -18,25 +18,11 @@ [Defines]
   PLATFORM_GUID                       = 465B0A0B-7AC1-443b-8F67-7B8DEC145F90
   PLATFORM_VERSION                    = 0.1
   DSC_SPECIFICATION                   = 0x00010005
-
-  #
-  # Set platform specific package/folder name, same as passed from PREBUILD script.
-  # PLATFORM_PACKAGE would be the same as PLATFORM_NAME as well as package build folder
-  # DEFINE only takes effect at R9 DSC and FDF.
-  #
-  DEFINE      PLATFORM_PACKAGE                = Vlv2TbltDevicePkg
-  DEFINE      PLATFORM_RC_PACKAGE             = Vlv2DeviceRefCodePkg
-  DEFINE      PLATFORM_BINARY_PACKAGE         = Vlv2SocBinPkg
-  OUTPUT_DIRECTORY                    = Build/$(PLATFORM_PACKAGE)
+  OUTPUT_DIRECTORY                    = Build/Vlv2TbltDevicePkgIA32
   SUPPORTED_ARCHITECTURES             = IA32
   BUILD_TARGETS                       = DEBUG|RELEASE
   SKUID_IDENTIFIER                    = DEFAULT
 
-  DEFINE CPU_ARCH                 =ValleyView2
-  DEFINE PROJECT_SC_FAMILY        =IntelPch
-  DEFINE PROJECT_SC_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/SouthCluster
-  DEFINE PROJECT_VLV_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/NorthCluster
-
   DEFINE RC_BINARY_RELEASE        = TRUE
   #
   # Platform On/Off features are defined here
@@ -47,20 +33,16 @@ [Defines]
   #   3.BayleyBay
   #     ENBDT_PF_ENABLE  = TRUE
   #
-  !include $(PLATFORM_PACKAGE)/AutoPlatformCFG.txt
-  !include $(PLATFORM_PACKAGE)/PlatformPkgConfig.dsc
+  !include Vlv2TbltDevicePkg/AutoPlatformCFG.txt
+  !include Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
 
 !if $(X64_CONFIG) == TRUE
   DEFINE      DXE_ARCHITECTURE        = X64
-  DEFINE      EDK_DXE_ARCHITECTURE    = X64
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 64
 !else
   DEFINE      DXE_ARCHITECTURE        = IA32
-  DEFINE      EDK_DXE_ARCHITECTURE    = Ia32
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 32
 !endif
 
-  FLASH_DEFINITION                    = $(PLATFORM_PACKAGE)/PlatformPkg.fdf
+  FLASH_DEFINITION                    = Vlv2TbltDevicePkg/PlatformPkg.fdf
 !if $(LFMA_ENABLE) == TRUE
   FIX_LOAD_TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
   DEFINE   TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
@@ -71,10 +53,6 @@ [Defines]
 
   DEFINE   PLATFORM_PCIEXPRESS_BASE   = 0E0000000
 
-  DEFINE SEC_ENABLE = FALSE
-  DEFINE SEC_DEBUG_INFO_ENABLE = FALSE
-  DEFINE FTPM_ENABLE = FALSE
-
 ################################################################################
 #
 # SKU Identification section - list of all SKU IDs supported by this
@@ -98,7 +76,6 @@ [LibraryClasses.common]
   DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
   UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
   UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
-  DxeSmmDriverEntryPoint|IntelFrameworkPkg/Library/DxeSmmDriverEntryPoint/DxeSmmDriverEntryPoint.inf
 
   #
   # Basic
@@ -142,8 +119,7 @@ [LibraryClasses.common]
   GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
-  PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLib.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   #
   # Framework
@@ -166,10 +142,6 @@ [LibraryClasses.common]
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
 !endif
 
-!if $(S3_ENABLE) == TRUE
-  S3Lib|IntelFrameworkModulePkg/Library/PeiS3Lib/PeiS3Lib.inf
-!endif
-
   OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
 !if $(CAPSULE_ENABLE) == TRUE
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
@@ -197,27 +169,27 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|$(PLATFORM_PACKAGE)/Library/SmbusLib/SmbusLib.inf
-  SmmLib|$(PLATFORM_PACKAGE)/Library/PchSmmLib/PchSmmLib.inf
+  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
   # Platform
   #
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
-  ResetSystemLib|$(PLATFORM_PACKAGE)/Library/ResetSystemLib/ResetSystemLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  ResetSystemLib|Vlv2TbltDevicePkg/Library/ResetSystemLib/ResetSystemLib.inf
 
-  PlatformCmosLib|$(PLATFORM_PACKAGE)/Library/PlatformCmosLib/PlatformCmosLib.inf
+  PlatformCmosLib|Vlv2TbltDevicePkg/Library/PlatformCmosLib/PlatformCmosLib.inf
 
   #
   # Misc
   #
-  MonoStatusCodeLib|$(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf
+  MonoStatusCodeLib|Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
 !if $(TARGET) == RELEASE
   DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
@@ -229,10 +201,11 @@ [LibraryClasses.common]
 
 !endif
 
+  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
+
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   PeCoffExtraActionLib|SourceLevelDebugPkg/Library/PeCoffExtraActionLibDebug/PeCoffExtraActionLibDebug.inf
   DebugCommunicationLib|SourceLevelDebugPkg/Library/DebugCommunicationLibSerialPort/DebugCommunicationLibSerialPort.inf
-  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
   SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !else
   PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
@@ -247,10 +220,10 @@ [LibraryClasses.common]
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
 !endif
 
- BiosIdLib|$(PLATFORM_PACKAGE)/Library/BiosIdLib/BiosIdLib.inf
- CpuIA32Lib|$(PLATFORM_PACKAGE)/Library/CpuIA32Lib/CpuIA32Lib.inf
+ BiosIdLib|Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
+ CpuIA32Lib|Vlv2TbltDevicePkg/Library/CpuIA32Lib/CpuIA32Lib.inf
 
-  StallSmmLib|$(PLATFORM_PACKAGE)/Library/StallSmmLib/StallSmmLib.inf
+  StallSmmLib|Vlv2TbltDevicePkg/Library/StallSmmLib/StallSmmLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
@@ -264,13 +237,10 @@ [LibraryClasses.common]
   AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
 !endif
   VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
-!if $(RC_BINARY_RELEASE) == TRUE
-  I2cLib|Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
-!endif
   ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
   FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
   SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
-!if $(FTPM_ENABLE) == TRUE || $(NETWORK_ISCSI_ENABLE) == TRUE
+!if $(NETWORK_ISCSI_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
   IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
@@ -281,13 +251,6 @@ [LibraryClasses.common]
 
 
   Tpm2CommandLib|SecurityPkg/Library/Tpm2CommandLib/Tpm2CommandLib.inf
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  FspApiLib|IntelFspWrapperPkg/Library/BaseFspApiLib/BaseFspApiLib.inf
-  FspPlatformInfoLib|IntelFspWrapperPkg/Library/BaseFspPlatformInfoLibSample/BaseFspPlatformInfoLibSample.inf
-  FspPlatformSecLib|Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
-  FspHobProcessLib|Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
-!endif
-
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
 
 [LibraryClasses.IA32.SEC]
@@ -307,14 +270,14 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
   ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
   ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf
-  MultiPlatformLib|$(PLATFORM_PACKAGE)/Library/MultiPlatformLib/MultiPlatformLib.inf
+  MultiPlatformLib|Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
   MpInitLib|UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
 
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(TARGET) == RELEASE
@@ -322,7 +285,7 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxPeiLib.inf
@@ -331,13 +294,6 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgentLib.inf
 !endif
 
- !if $(MINNOW2_FSP_BUILD) == TRUE
- PlatformFspLib|Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
- !endif
-!if $(FTPM_ENABLE) == TRUE
-  Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCPei/Tpm2DeviceLibSeC.inf
-!endif
-
 [LibraryClasses.IA32]
   #
   # DXE phase common
@@ -354,7 +310,7 @@ [LibraryClasses.IA32]
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.inf
-  EfiRegTableLib|$(PLATFORM_PACKAGE)/Library/EfiRegTableLib/EfiRegTableLib.inf
+  EfiRegTableLib|Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
@@ -369,14 +325,14 @@ [LibraryClasses.IA32.DXE_DRIVER]
   CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgentLib.inf
 !endif
 
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
 
 [LibraryClasses.IA32.DXE_CORE]
   HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
@@ -384,7 +340,7 @@ [LibraryClasses.IA32.DXE_CORE]
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
@@ -409,7 +365,7 @@ [LibraryClasses.IA32.DXE_SMM_DRIVER]
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgentLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
 
@@ -483,12 +439,6 @@ [PcdsFeatureFlag.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|FALSE
-!endif
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmEnableBspElection|FALSE
-!if $(DATAHUB_STATUS_CODE_ENABLE) == TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|TRUE
-!else
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|FALSE
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE
 !if $(TARGET) == RELEASE
@@ -514,59 +464,20 @@ [PcdsFeatureFlag.common]
 !endif
 
 
-  ## This PCD specifies whether PS2 keyboard does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2KbdExtendedVerification|FALSE
-
-  ## This PCD specifies whether PS2 mouse does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2MouseExtendedVerification|FALSE
-
 !if $(VARIABLE_INFO_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|FALSE
 !endif
 
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
-
 !if $(SOURCE_DEBUG_ENABLE)
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmDebug|TRUE
 !endif
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
+
 [PcdsFixedAtBuild.common]
-!if $(MINNOW2_FSP_BUILD) == TRUE
-# $(FLASH_REGION_VLVMICROCODE_BASE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress|0xFFC00000
-# $(FLASH_REGION_VLVMICROCODE_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize|0x00040000
-  gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset|0x60
-# $(FLASH_AREA_BASE_ADDRESS)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress|0xFF800000
-# $(FLASH_AREA_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize|0x00800000
-# $(FLASH_REGION_FSPBIN_BASE)
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase|0xFFCC0000
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  # in FSP, when this got used, the memory already is up
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-!else
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-!endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-
-!else
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-  !else
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-  !endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-  gEfiCpuTokenSpaceGuid.PcdPeiTemporaryRamStackSize|0x3C00
-!endif
-
-
 !if $(SECURE_BOOT_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x22000
 !else
@@ -574,11 +485,8 @@ [PcdsFixedAtBuild.common]
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize|0x00000800
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize|0x400
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDRamSize|0x400000
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdS3AcpiReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdSrIovSupport|FALSE
   gEfiMdeModulePkgTokenSpaceGuid.PcdAriSupport|FALSE
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmApSyncTimeout|1000
 !if $(S4_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|TRUE
 !else
@@ -596,13 +504,9 @@ [PcdsFixedAtBuild.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries|60
 !endif
 
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdEbdaReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable|$(TOP_MEMORY_ADDRESS)
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserSubtitleTextColor|0x0
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldTextColor|0x01
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDEnabled|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVbeEnable|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVgaEnable|TRUE
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17
@@ -648,11 +552,6 @@ [PcdsFixedAtBuild.IA32]
 [PcdsPatchableInModule.common]
   gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0x$(PLATFORM_PCIEXPRESS_BASE)
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLegacyBiosCacheLegacyRegion|FALSE
-
-  ## This PCD specifies whether to use the optimized timing for best PS2 detection performance.
-  #  Note this PCD could be set to TRUE for best boot performance and set to FALSE for best device compatibility.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFastPS2Detection|TRUE
 
   #######################################################################################################
   #
@@ -827,10 +726,6 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdFTPMStatus|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateSmmDataPtr|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0
-  gEfiCpuTokenSpaceGuid.PcdCpuS3DataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuHotPlugDataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuCallbackSignal|0
-  gEfiCpuTokenSpaceGuid.PcdCpuConfigContextBuffer|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
@@ -843,24 +738,7 @@ [PcdsDynamicExDefault.X64.DEFAULT]
 
 [Components.IA32]
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
-
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspWrapperSecCore/FspWrapperSecCore.inf {
-    !if $(TARGET) == DEBUG
-
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
-  IntelFspWrapperPkg/FspInitPei/FspInitPei.inf {
-    !if $(TARGET) == DEBUG
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  !endif
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
 
   MdeModulePkg/Core/Pei/PeiMain.inf {
 !if $(TARGET) == DEBUG
@@ -871,31 +749,23 @@ [Components.IA32]
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 
-  $(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf {
+  Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf {
 !if $(TARGET) == DEBUG
     <PcdsFixedAtBuild>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2E
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <BuildOptions>
-      !if $(FTPM_ENABLE)==TRUE
-        *_*_IA32_CC_FLAGS = /D FTPM_ENABLE
-      !endif
   }
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-$(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/fTPMInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
 !endif
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformPei/PlatformPei.inf {
+  Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf {
     <BuildOptions>
       *_*_IA32_CC_FLAGS      = /DRC_BINARY_RELEASE
   !if $(TARGET) == DEBUG
@@ -915,10 +785,6 @@ [Components.IA32]
     }
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/Tpm2DeviceSeCPei.inf
-!endif
-
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/PhysicalPresencePei/PhysicalPresencePei.inf
   SecurityPkg/Tcg/TcgPei/TcgPei.inf {
@@ -929,7 +795,7 @@ [Components.IA32]
 }
 !endif
 
- $(PLATFORM_PACKAGE)/PlatformInitPei/PlatformInitPei.inf {
+ Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
     <LibraryClasses>
@@ -938,34 +804,33 @@ [Components.IA32]
 !endif
       PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/FvInfoPei/FvInfoPei.inf
+  Vlv2TbltDevicePkg/FvInfoPei/FvInfoPei.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
   MdeModulePkg/Universal/PCD/Pei/Pcd.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
   UefiCpuPkg/CpuIoPei/CpuIoPei.inf
   UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MpS3.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PiSmmCommunicationPei.inf
+  UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
 
 !if $(RECOVERY_ENABLE)
   #
   # Recovery
   #
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
   MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf
   MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf
   MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPei.inf
@@ -991,17 +856,6 @@ [Components.IA32]
  MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
  MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
 
-!if $(FTPM_ENABLE) == TRUE
-   SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      NULL|SecurityPkg/Library\HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
-  }
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1011,7 +865,7 @@ [Components.IA32]
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTablePei/FirmwarePerformancePei.inf{
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 
 !endif
@@ -1019,17 +873,6 @@ [Components.IA32]
   MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf
 !endif
 [Components.IA32]
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.inf {
-    !if $(TARGET) == DEBUG
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-
-  !endif
   #
   # EDK II Related Platform codes
   #
@@ -1047,24 +890,10 @@ [Components.IA32]
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
 !endif
   }
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf {
-    <PcdsPatchableInModule>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-    <PcdsFixedAtBuild>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x27
-    <LibraryClasses>
-    !if $(TARGET) != RELEASE
-          DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-       <BuildOptions>
-        ICC:*_*_*_CC_FLAGS = /D MDEPKG_NDEBUG
-        GCC:*_*_*_CC_FLAGS = -D MDEPKG_NDEBUG
-  }
   MdeModulePkg/Universal/PCD/Dxe/Pcd.inf {
     <LibraryClasses>
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
   }
-  IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
   UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
 
   MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
@@ -1084,13 +913,9 @@ [Components.IA32]
 
 !if $(TPM_ENABLED) == TRUE
       NULL|SecurityPkg/Library/DxeTpmMeasureBootLib/DxeTpmMeasureBootLib.inf
-!endif
-!if $(FTPM_ENABLE) == TRUE
-      NULL|SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MpCpu.inf
-  $(PLATFORM_PACKAGE)/Metronome/Metronome.inf
+  MdeModulePkg/Universal/Metronome/Metronome.inf
 
   IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
     <LibraryClasses>
@@ -1100,12 +925,8 @@ [Components.IA32]
       PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
-    !if $(FTPM_ENABLE) == TRUE
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-    !else
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
-    !endif
   }
 
   $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
@@ -1117,11 +938,11 @@ [Components.IA32]
   MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf {
     <LibraryClasses>
       NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbSmm.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbSmm.inf
   MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
 !if $(SECURE_BOOT_ENABLE) == TRUE
   SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf {
     <LibraryClasses>
@@ -1143,9 +964,9 @@ [Components.IA32]
   PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
   MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
 
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbRuntimeDxe.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbRuntimeDxe.inf
 
-  $(PLATFORM_PACKAGE)/PlatformSetupDxe/PlatformSetupDxe.inf
+  Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
 !if $(DATAHUB_ENABLE) == TRUE
   IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
@@ -1153,38 +974,30 @@ [Components.IA32]
       gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
   }
 !endif
-  IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
-  !if $(USE_HPET_TIMER) == TRUE
-    PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
-  !else
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmartTimer.inf
-  !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
+  PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/IntelPchLegacyInterrupt.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
     <PcdsPatchableInModule>
         gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
 
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
-
-  IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
 
   #
   # Performance Application; Set PERFORMANCE_ENABLE=TRUE for normal boot performance and smm performance data
@@ -1204,35 +1017,9 @@ [Components.IA32]
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
 
-!if $(SEC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/HeciDrv.inf {
-!if $(SEC_DEBUG_INFO_ENABLE) == TRUE
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=1
-!else
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=0
-!endif
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SeCPolicyInitDxe.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Tpm2DeviceSeCDxe.inf
-  SecurityPkg/Tcg/MemoryOverwriteControl/TcgMor.inf
-  SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf{
-    <LibraryClasses>
-      NULL|SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library\DxePcdLib/DxePcdLib.inf
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/FtpmSmm.inf
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1259,24 +1046,23 @@ [Components.IA32]
   #
   # EDK II Related Platform codes
   #
-  $(PLATFORM_PACKAGE)/PlatformSmm/PlatformSmm.inf{
+  Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf{
     <LibraryClasses>
     !if $(TARGET) != RELEASE
           DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
     !endif
           PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/PlatformInfoDxe/PlatformInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformDxe/PlatformDxe.inf
+  Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
 
-  $(PLATFORM_PACKAGE)/PciPlatform/PciPlatform.inf
-  $(PLATFORM_PACKAGE)/SaveMemoryConfig/SaveMemoryConfig.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
-  $(PLATFORM_PACKAGE)/PpmPolicy/PpmPolicy.inf
-  $(PLATFORM_PACKAGE)/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+  Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+  Vlv2TbltDevicePkg/SaveMemoryConfig/SaveMemoryConfig.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
+  Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
 !if $(GOP_DRIVER_ENABLE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformGopPolicy/PlatformGopPolicy.inf
+  Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
 
 !endif
 
@@ -1287,13 +1073,15 @@ [Components.IA32]
   MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf
   MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf
   UefiCpuPkg/CpuDxe/CpuDxe.inf
+  UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
   UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
   UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
   MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf
   UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
-  $(PLATFORM_PACKAGE)/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/GraphicDxeInitSmm.inf
 
   #
   # ACPI
@@ -1306,14 +1094,14 @@ [Components.IA32]
     <LibraryClasses>
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
+  MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  $(PLATFORM_PACKAGE)/BootScriptSaveDxe/BootScriptSaveDxe.inf
   IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
-  $(PLATFORM_RC_PACKAGE)/AcpiTablesPCAT/AcpiTables.inf
+  Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
 
-  $(PLATFORM_PACKAGE)/AcpiPlatform/AcpiPlatform.inf
+  Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
 
   MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
@@ -1323,31 +1111,23 @@ [Components.IA32]
   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
 
 
-#
-# ISA
-#
-  $(PLATFORM_PACKAGE)/Wpce791/Wpce791.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf
-#
-# SDIO
-#
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcHost.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcMediaDevice.inf
+  #
+  # ISA
+  #
+  Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
+  MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf
+
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/FirmwarePerformanceDxe.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/FirmwarePerformanceSmm.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 !endif
 
@@ -1355,7 +1135,6 @@ [Components.IA32]
 # IDE/SCSI/AHCI
 #
   MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
-  IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/IdeBusDxe.inf
   MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
   MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
   MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
@@ -1379,7 +1158,7 @@ [Components.IA32]
       gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000
   }
 !if $(SATA_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
 !endif
   MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
 !if $(SCSI_ENABLE) == TRUE
@@ -1392,7 +1171,6 @@ [Components.IA32]
   MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
   MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
   MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
-  IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
   MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
   MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
@@ -1416,9 +1194,9 @@ [Components.IA32]
   # SMBIOS
   #
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
-  $(PLATFORM_PACKAGE)/SmBiosMiscDxe/SmBiosMiscDxe.inf
+  Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
@@ -1433,12 +1211,6 @@ [Components.IA32]
   #
 !include NetworkPkg/Network.dsc.inc
 
-!if $(NETWORK_ENABLE) == TRUE
-  !if $(CSM_ENABLE) == TRUE
-    IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Snp16Dxe.inf
-  !endif
-!endif
-
 !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE)
   MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf
   MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
@@ -1456,7 +1228,7 @@ [Components.IA32]
     <LibraryClasses>
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
 !endif
 
@@ -1468,11 +1240,7 @@ [BuildOptions]
 #
 # Define token for different Platform
 #
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  DEFINE MINNOW2_FSP_OPTION = /DMINNOW2_FSP_BUILD
-!else
   DEFINE MINNOW2_FSP_OPTION =
-!endif
 
 !if $(ENBDT_PF_BUILD) == TRUE
   DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=1
@@ -1511,11 +1279,6 @@ [BuildOptions]
   DEFINE X64_BUILD_ENABLE =
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  DEFINE DSC_FTPM_BUILD_OPTIONS = /DFTPM_ENABLE
-!else
-  DEFINE DSC_FTPM_BUILD_OPTIONS =
-!endif
 !if $(TPM_ENABLED) == TRUE
   DEFINE DSC_TPM_BUILD_OPTIONS = /DTPM_ENABLED
 !else
@@ -1523,7 +1286,7 @@ [BuildOptions]
 !endif
 
 
-  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
+  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
 !if $(PERFORMANCE_ENABLE) == TRUE
   DEFINE PDB_BUILD_OPTION = /Zi
 !endif
@@ -1556,76 +1319,6 @@ [BuildOptions.common.EDKII.DXE_SMM_DRIVER, BuildOptions.common.EDKII.SMM_CORE]
   MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096
   GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000
 
-[BuildOptions.Common.EDK]
-
-#
-# Define token for different Platform
-#
-!if $(ENBDT_PF_BUILD) == TRUE
-  DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=1
-!else
-  DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=0
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-  RELEASE_*_*_DLINK_FLAGS = /DEBUG
-!endif
-
-!if $(S3_ENABLE) == TRUE
-  DEFINE DSC_S3_BUILD_OPTIONS = /DEFI_S3_RESUME
-!else
-  DEFINE DSC_S3_BUILD_OPTIONS =
-!endif
-
-!if $(ENBDT_S3_SUPPORT) == TRUE
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS = /DNOCS_S3_SUPPORT
-!else
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS =
-!endif
-
-!if $(X64_CONFIG) == TRUE
-  DEFINE X64_BUILD_ENABLE = /DX64_BUILD_ENABLE=1
-!else
-  DEFINE X64_BUILD_ENABLE =
-!endif
-
-
-  DEFINE EDK_GLUE_LIB_DEBUG  =
-  DEFINE DEBUG_BUILD_OPTIONS = /D EFI_DEBUG /D DEBUG_MODE=1  /GL- $(EDK_GLUE_LIB_DEBUG) /DEDKII_GLUE_DebugPrintErrorLevel=(EFI_D_ERROR)
-  DEFINE EDK_DSC_FEATURE_BUILD_OPTIONS = $(DSC_S3_BUILD_OPTIONS) $(DSC_ACPI_BUILD_OPTIONS) $(DSC_SEC_BUILD_OPTIONS) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(SOFTSDV_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(QT_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS) /D$(PROJECT_SC_CHIPSET)
-
-  DEFINE EDK_DSC_OTHER_BUILD_OPTIONS = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS) $(SV_BUILD_OPTIONS) $(INTEL_FASTBOOT_BUILD_OPTION)
-  DEFINE EDK_DSC_GLOBAL_BUILD_OPTIONS = $(ENBDT_PF_ENABLE) $(EDK_DSC_FEATURE_BUILD_OPTIONS) $(EDK_DSC_OTHER_BUILD_OPTIONS) /D EFI_SPECIFICATION_VERSION=0x00020000  /D PI_SPECIFICATION_VERSION=0x00000009  /D TIANO_RELEASE_VERSION=0x00080006 /D SUPPORT_DEPRECATED_PCI_CFG_PPI /D CSM_SMMENTRY_PORT8DATA8 /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE) /D MAX_VARIABLE_SIZE=0x2000 /D EFI_FIRMWARE_VENDOR="L/"INTEL/"" /D EFI_BUILD_VERSION="L/"EDKII/"" /DEFI_PEI_REPORT_STATUS_CODE_ON $(ENBDT_S3_SUPPORT_OPTIONS)
-
-  *_*_IA32_ASM_FLAGS         = /DEFI32 /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
-  DEBUG_*_IA32_CC_FLAGS      = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_CC_FLAGS    = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_VFRPP_FLAGS   = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_VFRPP_FLAGS = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_APP_FLAGS     = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_APP_FLAGS   = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_PP_FLAGS      = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_PP_FLAGS    = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_IA32_ASLPP_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASLCC_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASM16_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
-
-  *_*_X64_ASM_FLAGS          = /DEFIX64 /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
-  DEBUG_*_X64_CC_FLAGS       = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_CC_FLAGS     = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_VFRPP_FLAGS    = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_VFRPP_FLAGS  = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_APP_FLAGS      = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_APP_FLAGS    = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_PP_FLAGS       = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_PP_FLAGS     = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_X64_ASLPP_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASLCC_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASM16_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
- # *_*_*_BUILD_FLAGS = -s
-  *_*_*_VFR_FLAGS   = -c
-  *_*_*_BUILD_FLAGS = -c
-
 [BuildOptions.Common.EDKII]
   *_*_IA32_ASM_FLAGS     = $(VP_BUILD_OPTIONS) /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
 
@@ -1640,25 +1333,3 @@ [BuildOptions.Common.EDKII]
   *_*_X64_APP_FLAGS      = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_PP_FLAGS       = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_ASLPP_FLAGS    = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
-
-
-[Components.IA32]
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cBus.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cHost.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cPortA0Pio.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cMmioDeviceDxe.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index 9ec48f9fee..c0fe0892ac 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -18,25 +18,11 @@ [Defines]
   PLATFORM_GUID                       = 465B0A0B-7AC1-443b-8F67-7B8DEC145F90
   PLATFORM_VERSION                    = 0.1
   DSC_SPECIFICATION                   = 0x00010005
-
-  #
-  # Set platform specific package/folder name, same as passed from PREBUILD script.
-  # PLATFORM_PACKAGE would be the same as PLATFORM_NAME as well as package build folder
-  # DEFINE only takes effect at R9 DSC and FDF.
-  #
-  DEFINE      PLATFORM_PACKAGE                = Vlv2TbltDevicePkg
-  DEFINE      PLATFORM_RC_PACKAGE             = Vlv2DeviceRefCodePkg
-  DEFINE      PLATFORM_BINARY_PACKAGE         = Vlv2SocBinPkg
-  OUTPUT_DIRECTORY                    = Build/$(PLATFORM_PACKAGE)
+  OUTPUT_DIRECTORY                    = Build/Vlv2TbltDevicePkg
   SUPPORTED_ARCHITECTURES             = IA32|X64
   BUILD_TARGETS                       = DEBUG|RELEASE
   SKUID_IDENTIFIER                    = DEFAULT
 
-  DEFINE CPU_ARCH                 =ValleyView2
-  DEFINE PROJECT_SC_FAMILY        =IntelPch
-  DEFINE PROJECT_SC_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/SouthCluster
-  DEFINE PROJECT_VLV_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/NorthCluster
-
   DEFINE RC_BINARY_RELEASE        = TRUE
   #
   # Platform On/Off features are defined here
@@ -47,22 +33,18 @@ [Defines]
   #   3.BayleyBay
   #     ENBDT_PF_ENABLE  = TRUE
   #
-  !include $(PLATFORM_PACKAGE)/AutoPlatformCFG.txt
-  !include $(PLATFORM_PACKAGE)/PlatformPkgConfig.dsc
+  !include Vlv2TbltDevicePkg/AutoPlatformCFG.txt
+  !include Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
 
   DEFINE PLATFORMX64_ENABLE = TRUE
 
 !if $(X64_CONFIG) == TRUE
   DEFINE      DXE_ARCHITECTURE        = X64
-  DEFINE      EDK_DXE_ARCHITECTURE    = X64
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 64
 !else
   DEFINE      DXE_ARCHITECTURE        = IA32
-  DEFINE      EDK_DXE_ARCHITECTURE    = Ia32
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 32
 !endif
 
-  FLASH_DEFINITION                    = $(PLATFORM_PACKAGE)/PlatformPkg.fdf
+  FLASH_DEFINITION                    = Vlv2TbltDevicePkg/PlatformPkg.fdf
 !if $(LFMA_ENABLE) == TRUE
   FIX_LOAD_TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
   DEFINE   TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
@@ -73,10 +55,6 @@ [Defines]
 
   DEFINE   PLATFORM_PCIEXPRESS_BASE   = 0E0000000
 
-  DEFINE SEC_ENABLE = FALSE
-  DEFINE SEC_DEBUG_INFO_ENABLE = FALSE
-  DEFINE FTPM_ENABLE = FALSE
-
 ################################################################################
 #
 # SKU Identification section - list of all SKU IDs supported by this
@@ -100,7 +78,6 @@ [LibraryClasses.common]
   DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
   UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
   UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
-  DxeSmmDriverEntryPoint|IntelFrameworkPkg/Library/DxeSmmDriverEntryPoint/DxeSmmDriverEntryPoint.inf
 
   #
   # Basic
@@ -144,8 +121,7 @@ [LibraryClasses.common]
   GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
-  PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLib.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   #
   # Framework
@@ -167,9 +143,6 @@ [LibraryClasses.common]
 !if $(SCSI_ENABLE) == TRUE
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
 !endif
-!if $(S3_ENABLE) == TRUE
-  S3Lib|IntelFrameworkModulePkg/Library/PeiS3Lib/PeiS3Lib.inf
-!endif
 
   OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
 !if $(CAPSULE_ENABLE) == TRUE
@@ -198,27 +171,27 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|$(PLATFORM_PACKAGE)/Library/SmbusLib/SmbusLib.inf
-  SmmLib|$(PLATFORM_PACKAGE)/Library/PchSmmLib/PchSmmLib.inf
+  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
   # Platform
   #
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
-  ResetSystemLib|$(PLATFORM_PACKAGE)/Library/ResetSystemLib/ResetSystemLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  ResetSystemLib|Vlv2TbltDevicePkg/Library/ResetSystemLib/ResetSystemLib.inf
 
-  PlatformCmosLib|$(PLATFORM_PACKAGE)/Library/PlatformCmosLib/PlatformCmosLib.inf
+  PlatformCmosLib|Vlv2TbltDevicePkg/Library/PlatformCmosLib/PlatformCmosLib.inf
 
   #
   # Misc
   #
-  MonoStatusCodeLib|$(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf
+  MonoStatusCodeLib|Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
 !if $(TARGET) == RELEASE
   DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
@@ -230,10 +203,11 @@ [LibraryClasses.common]
 
 !endif
 
+  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
+
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   PeCoffExtraActionLib|SourceLevelDebugPkg/Library/PeCoffExtraActionLibDebug/PeCoffExtraActionLibDebug.inf
   DebugCommunicationLib|SourceLevelDebugPkg/Library/DebugCommunicationLibSerialPort/DebugCommunicationLibSerialPort.inf
-  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
   SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !else
   PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
@@ -248,10 +222,10 @@ [LibraryClasses.common]
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
 !endif
 
- BiosIdLib|$(PLATFORM_PACKAGE)/Library/BiosIdLib/BiosIdLib.inf
- CpuIA32Lib|$(PLATFORM_PACKAGE)/Library/CpuIA32Lib/CpuIA32Lib.inf
+ BiosIdLib|Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
+ CpuIA32Lib|Vlv2TbltDevicePkg/Library/CpuIA32Lib/CpuIA32Lib.inf
 
-  StallSmmLib|$(PLATFORM_PACKAGE)/Library/StallSmmLib/StallSmmLib.inf
+  StallSmmLib|Vlv2TbltDevicePkg/Library/StallSmmLib/StallSmmLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
@@ -265,15 +239,10 @@ [LibraryClasses.common]
   AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
 !endif
   VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
-!if $(RC_BINARY_RELEASE) == TRUE
-  I2cLib|Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
-!endif
   ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
-  ShellCommandLib|ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
-  HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
   FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
   SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
-!if $(FTPM_ENABLE) == TRUE || $(NETWORK_ISCSI_ENABLE) == TRUE
+!if $(NETWORK_ISCSI_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
   IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
@@ -284,13 +253,6 @@ [LibraryClasses.common]
 
 
   Tpm2CommandLib|SecurityPkg/Library/Tpm2CommandLib/Tpm2CommandLib.inf
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  FspApiLib|IntelFspWrapperPkg/Library/BaseFspApiLib/BaseFspApiLib.inf
-  FspPlatformInfoLib|IntelFspWrapperPkg/Library/BaseFspPlatformInfoLibSample/BaseFspPlatformInfoLibSample.inf
-  FspPlatformSecLib|Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
-  FspHobProcessLib|Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
-!endif
-
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
 
 [LibraryClasses.IA32.SEC]
@@ -310,14 +272,14 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
   ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
   ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf
-  MultiPlatformLib|$(PLATFORM_PACKAGE)/Library/MultiPlatformLib/MultiPlatformLib.inf
+  MultiPlatformLib|Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
   MpInitLib|UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
 
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(TARGET) == RELEASE
@@ -325,7 +287,7 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxPeiLib.inf
@@ -334,13 +296,6 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgentLib.inf
 !endif
 
- !if $(MINNOW2_FSP_BUILD) == TRUE
- PlatformFspLib|Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
- !endif
-!if $(FTPM_ENABLE) == TRUE
-  Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCPei/Tpm2DeviceLibSeC.inf
-!endif
-
 [LibraryClasses.X64]
   #
   # DXE phase common
@@ -357,7 +312,7 @@ [LibraryClasses.X64]
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.inf
-  EfiRegTableLib|$(PLATFORM_PACKAGE)/Library/EfiRegTableLib/EfiRegTableLib.inf
+  EfiRegTableLib|Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
@@ -372,14 +327,14 @@ [LibraryClasses.X64.DXE_DRIVER]
   CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgentLib.inf
 !endif
 
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
 
 [LibraryClasses.X64.DXE_CORE]
   HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
@@ -387,7 +342,7 @@ [LibraryClasses.X64.DXE_CORE]
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
@@ -412,7 +367,7 @@ [LibraryClasses.X64.DXE_SMM_DRIVER]
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgentLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
 
@@ -486,12 +441,6 @@ [PcdsFeatureFlag.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|FALSE
-!endif
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmEnableBspElection|FALSE
-!if $(DATAHUB_STATUS_CODE_ENABLE) == TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|TRUE
-!else
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|FALSE
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE
 !if $(TARGET) == RELEASE
@@ -517,59 +466,20 @@ [PcdsFeatureFlag.common]
 !endif
 
 
-  ## This PCD specifies whether PS2 keyboard does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2KbdExtendedVerification|FALSE
-
-  ## This PCD specifies whether PS2 mouse does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2MouseExtendedVerification|FALSE
-
 !if $(VARIABLE_INFO_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|FALSE
 !endif
 
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
-
 !if $(SOURCE_DEBUG_ENABLE)
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmDebug|TRUE
 !endif
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
+
 [PcdsFixedAtBuild.common]
-!if $(MINNOW2_FSP_BUILD) == TRUE
-# $(FLASH_REGION_VLVMICROCODE_BASE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress|0xFFC00000
-# $(FLASH_REGION_VLVMICROCODE_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize|0x00040000
-  gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset|0x60
-# $(FLASH_AREA_BASE_ADDRESS)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress|0xFF800000
-# $(FLASH_AREA_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize|0x00800000
-# $(FLASH_REGION_FSPBIN_BASE)
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase|0xFFCC0000
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  # in FSP, when this got used, the memory already is up
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-!else
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-!endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-
-!else
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-  !else
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-  !endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-  gEfiCpuTokenSpaceGuid.PcdPeiTemporaryRamStackSize|0x3C00
-!endif
-
-
 !if $(SECURE_BOOT_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x22000
 !else
@@ -577,11 +487,8 @@ [PcdsFixedAtBuild.common]
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize|0x00000800
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize|0x400
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDRamSize|0x400000
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdS3AcpiReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdSrIovSupport|FALSE
   gEfiMdeModulePkgTokenSpaceGuid.PcdAriSupport|FALSE
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmApSyncTimeout|1000
 !if $(S4_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|TRUE
 !else
@@ -599,13 +506,9 @@ [PcdsFixedAtBuild.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries|60
 !endif
 
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdEbdaReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable|$(TOP_MEMORY_ADDRESS)
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserSubtitleTextColor|0x0
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldTextColor|0x01
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDEnabled|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVbeEnable|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVgaEnable|TRUE
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17
@@ -651,11 +554,6 @@ [PcdsFixedAtBuild.IA32]
 [PcdsPatchableInModule.common]
   gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0x$(PLATFORM_PCIEXPRESS_BASE)
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLegacyBiosCacheLegacyRegion|FALSE
-
-  ## This PCD specifies whether to use the optimized timing for best PS2 detection performance.
-  #  Note this PCD could be set to TRUE for best boot performance and set to FALSE for best device compatibility.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFastPS2Detection|TRUE
 
   #######################################################################################################
   #
@@ -830,10 +728,6 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdFTPMStatus|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateSmmDataPtr|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0
-  gEfiCpuTokenSpaceGuid.PcdCpuS3DataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuHotPlugDataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuCallbackSignal|0
-  gEfiCpuTokenSpaceGuid.PcdCpuConfigContextBuffer|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
@@ -846,24 +740,7 @@ [PcdsDynamicExDefault.X64.DEFAULT]
 
 [Components.IA32]
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
-
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspWrapperSecCore/FspWrapperSecCore.inf {
-    !if $(TARGET) == DEBUG
-
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
-  IntelFspWrapperPkg/FspInitPei/FspInitPei.inf {
-    !if $(TARGET) == DEBUG
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  !endif
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
 
   MdeModulePkg/Core/Pei/PeiMain.inf {
 !if $(TARGET) == DEBUG
@@ -874,31 +751,23 @@ [Components.IA32]
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 
-  $(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf {
+  Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf {
 !if $(TARGET) == DEBUG
     <PcdsFixedAtBuild>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2E
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <BuildOptions>
-      !if $(FTPM_ENABLE)==TRUE
-        *_*_IA32_CC_FLAGS = /D FTPM_ENABLE
-      !endif
   }
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-$(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/fTPMInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
 !endif
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformPei/PlatformPei.inf {
+  Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf {
     <BuildOptions>
       *_*_IA32_CC_FLAGS      = /DRC_BINARY_RELEASE
   !if $(TARGET) == DEBUG
@@ -918,10 +787,6 @@ [Components.IA32]
     }
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/Tpm2DeviceSeCPei.inf
-!endif
-
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/PhysicalPresencePei/PhysicalPresencePei.inf
   SecurityPkg/Tcg/TcgPei/TcgPei.inf {
@@ -932,7 +797,7 @@ [Components.IA32]
 }
 !endif
 
- $(PLATFORM_PACKAGE)/PlatformInitPei/PlatformInitPei.inf {
+ Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
     <LibraryClasses>
@@ -941,34 +806,33 @@ [Components.IA32]
 !endif
       PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/FvInfoPei/FvInfoPei.inf
+  Vlv2TbltDevicePkg/FvInfoPei/FvInfoPei.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
   MdeModulePkg/Universal/PCD/Pei/Pcd.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
   UefiCpuPkg/CpuIoPei/CpuIoPei.inf
   UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MpS3.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PiSmmCommunicationPei.inf
+  UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
 
 !if $(RECOVERY_ENABLE)
   #
   # Recovery
   #
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
   MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf
   MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf
   MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPei.inf
@@ -994,17 +858,6 @@ [Components.IA32]
  MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
  MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
 
-!if $(FTPM_ENABLE) == TRUE
-   SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      NULL|SecurityPkg/Library\HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
-  }
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1014,7 +867,7 @@ [Components.IA32]
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTablePei/FirmwarePerformancePei.inf{
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 
 !endif
@@ -1022,17 +875,6 @@ [Components.IA32]
   MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf
 !endif
 [Components.X64]
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.inf {
-    !if $(TARGET) == DEBUG
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-
-  !endif
   #
   # EDK II Related Platform codes
   #
@@ -1050,24 +892,10 @@ [Components.X64]
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
 !endif
   }
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf {
-    <PcdsPatchableInModule>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-    <PcdsFixedAtBuild>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x27
-    <LibraryClasses>
-    !if $(TARGET) != RELEASE
-          DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-       <BuildOptions>
-        ICC:*_*_*_CC_FLAGS = /D MDEPKG_NDEBUG
-        GCC:*_*_*_CC_FLAGS = -D MDEPKG_NDEBUG
-  }
   MdeModulePkg/Universal/PCD/Dxe/Pcd.inf {
     <LibraryClasses>
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
   }
-  IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
   UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
 
   MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
@@ -1100,13 +928,9 @@ [Components.X64]
 
 !if $(TPM_ENABLED) == TRUE
       NULL|SecurityPkg/Library/DxeTpmMeasureBootLib/DxeTpmMeasureBootLib.inf
-!endif
-!if $(FTPM_ENABLE) == TRUE
-      NULL|SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MpCpu.inf
-  $(PLATFORM_PACKAGE)/Metronome/Metronome.inf
+  MdeModulePkg/Universal/Metronome/Metronome.inf
 
   IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
     <LibraryClasses>
@@ -1116,12 +940,8 @@ [Components.X64]
       PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
-    !if $(FTPM_ENABLE) == TRUE
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-    !else
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
-    !endif
   }
 
   $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
@@ -1133,11 +953,11 @@ [Components.X64]
   MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf {
     <LibraryClasses>
       NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbSmm.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbSmm.inf
   MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
 !if $(SECURE_BOOT_ENABLE) == TRUE
   SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf {
     <LibraryClasses>
@@ -1159,9 +979,9 @@ [Components.X64]
   PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
   MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
 
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbRuntimeDxe.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbRuntimeDxe.inf
 
-  $(PLATFORM_PACKAGE)/PlatformSetupDxe/PlatformSetupDxe.inf
+  Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
 !if $(DATAHUB_ENABLE) == TRUE
   IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
@@ -1169,38 +989,30 @@ [Components.X64]
       gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
   }
 !endif
-  IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
-  !if $(USE_HPET_TIMER) == TRUE
-    PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
-  !else
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmartTimer.inf
-  !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
+  PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/IntelPchLegacyInterrupt.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
     <PcdsPatchableInModule>
         gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
 
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
-
-  IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
 
   #
   # Performance Application; Set PERFORMANCE_ENABLE=TRUE for normal boot performance and smm performance data
@@ -1220,35 +1032,9 @@ [Components.X64]
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
 
-!if $(SEC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/HeciDrv.inf {
-!if $(SEC_DEBUG_INFO_ENABLE) == TRUE
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=1
-!else
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=0
-!endif
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SeCPolicyInitDxe.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Tpm2DeviceSeCDxe.inf
-  SecurityPkg/Tcg/MemoryOverwriteControl/TcgMor.inf
-  SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf{
-    <LibraryClasses>
-      NULL|SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library\DxePcdLib/DxePcdLib.inf
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/FtpmSmm.inf
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1275,24 +1061,23 @@ [Components.X64]
   #
   # EDK II Related Platform codes
   #
-  $(PLATFORM_PACKAGE)/PlatformSmm/PlatformSmm.inf{
+  Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf{
     <LibraryClasses>
     !if $(TARGET) != RELEASE
           DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
     !endif
           PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/PlatformInfoDxe/PlatformInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformDxe/PlatformDxe.inf
+  Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
 
-  $(PLATFORM_PACKAGE)/PciPlatform/PciPlatform.inf
-  $(PLATFORM_PACKAGE)/SaveMemoryConfig/SaveMemoryConfig.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
-  $(PLATFORM_PACKAGE)/PpmPolicy/PpmPolicy.inf
-  $(PLATFORM_PACKAGE)/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+  Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+  Vlv2TbltDevicePkg/SaveMemoryConfig/SaveMemoryConfig.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
+  Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
 !if $(GOP_DRIVER_ENABLE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformGopPolicy/PlatformGopPolicy.inf
+  Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
 
 !endif
 
@@ -1303,13 +1088,15 @@ [Components.X64]
   MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf
   MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf
   UefiCpuPkg/CpuDxe/CpuDxe.inf
+  UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
   UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
   UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
   MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf
   UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
-  $(PLATFORM_PACKAGE)/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/GraphicDxeInitSmm.inf
 
   #
   # ACPI
@@ -1322,14 +1109,14 @@ [Components.X64]
     <LibraryClasses>
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
+  MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  $(PLATFORM_PACKAGE)/BootScriptSaveDxe/BootScriptSaveDxe.inf
   IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
-  $(PLATFORM_RC_PACKAGE)/AcpiTablesPCAT/AcpiTables.inf
+  Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
 
-  $(PLATFORM_PACKAGE)/AcpiPlatform/AcpiPlatform.inf
+  Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
 
   MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
@@ -1339,31 +1126,23 @@ [Components.X64]
   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
 
 
-#
-# ISA
-#
-  $(PLATFORM_PACKAGE)/Wpce791/Wpce791.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf
-#
-# SDIO
-#
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcHost.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcMediaDevice.inf
+  #
+  # ISA
+  #
+  Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
+  MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf
+
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/FirmwarePerformanceDxe.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/FirmwarePerformanceSmm.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 !endif
 
@@ -1371,7 +1150,6 @@ [Components.X64]
 # IDE/SCSI/AHCI
 #
   MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
-  IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/IdeBusDxe.inf
   MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
   MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
   MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
@@ -1395,7 +1173,7 @@ [Components.X64]
       gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000
   }
 !if $(SATA_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
 !endif
   MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
 !if $(SCSI_ENABLE) == TRUE
@@ -1408,7 +1186,6 @@ [Components.X64]
   MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
   MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
   MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
-  IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
   MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
   MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
@@ -1432,9 +1209,9 @@ [Components.X64]
   # SMBIOS
   #
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
-  $(PLATFORM_PACKAGE)/SmBiosMiscDxe/SmBiosMiscDxe.inf
+  Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
@@ -1449,12 +1226,6 @@ [Components.X64]
   #
 !include NetworkPkg/Network.dsc.inc
 
-!if $(NETWORK_ENABLE) == TRUE
-  !if $(CSM_ENABLE) == TRUE
-    IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Snp16Dxe.inf
-  !endif
-!endif
-
 !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE)
   MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf
   MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
@@ -1472,7 +1243,7 @@ [Components.X64]
     <LibraryClasses>
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
 !endif
 
@@ -1484,11 +1255,7 @@ [BuildOptions]
 #
 # Define token for different Platform
 #
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  DEFINE MINNOW2_FSP_OPTION = /DMINNOW2_FSP_BUILD
-!else
   DEFINE MINNOW2_FSP_OPTION =
-!endif
 
 !if $(ENBDT_PF_BUILD) == TRUE
   DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=1
@@ -1527,11 +1294,6 @@ [BuildOptions]
   DEFINE X64_BUILD_ENABLE =
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  DEFINE DSC_FTPM_BUILD_OPTIONS = /DFTPM_ENABLE
-!else
-  DEFINE DSC_FTPM_BUILD_OPTIONS =
-!endif
 !if $(TPM_ENABLED) == TRUE
   DEFINE DSC_TPM_BUILD_OPTIONS = /DTPM_ENABLED
 !else
@@ -1539,7 +1301,7 @@ [BuildOptions]
 !endif
 
 
-  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
+  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
 !if $(PERFORMANCE_ENABLE) == TRUE
   DEFINE PDB_BUILD_OPTION = /Zi
 !endif
@@ -1572,76 +1334,6 @@ [BuildOptions.common.EDKII.DXE_SMM_DRIVER, BuildOptions.common.EDKII.SMM_CORE]
   MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096
   GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000
 
-[BuildOptions.Common.EDK]
-
-#
-# Define token for different Platform
-#
-!if $(ENBDT_PF_BUILD) == TRUE
-  DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=1
-!else
-  DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=0
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-  RELEASE_*_*_DLINK_FLAGS = /DEBUG
-!endif
-
-!if $(S3_ENABLE) == TRUE
-  DEFINE DSC_S3_BUILD_OPTIONS = /DEFI_S3_RESUME
-!else
-  DEFINE DSC_S3_BUILD_OPTIONS =
-!endif
-
-!if $(ENBDT_S3_SUPPORT) == TRUE
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS = /DNOCS_S3_SUPPORT
-!else
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS =
-!endif
-
-!if $(X64_CONFIG) == TRUE
-  DEFINE X64_BUILD_ENABLE = /DX64_BUILD_ENABLE=1
-!else
-  DEFINE X64_BUILD_ENABLE =
-!endif
-
-
-  DEFINE EDK_GLUE_LIB_DEBUG  =
-  DEFINE DEBUG_BUILD_OPTIONS = /D EFI_DEBUG /D DEBUG_MODE=1  /GL- $(EDK_GLUE_LIB_DEBUG) /DEDKII_GLUE_DebugPrintErrorLevel=(EFI_D_ERROR)
-  DEFINE EDK_DSC_FEATURE_BUILD_OPTIONS = $(DSC_S3_BUILD_OPTIONS) $(DSC_ACPI_BUILD_OPTIONS) $(DSC_SEC_BUILD_OPTIONS) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(SOFTSDV_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(QT_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS) /D$(PROJECT_SC_CHIPSET)
-
-  DEFINE EDK_DSC_OTHER_BUILD_OPTIONS = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS) $(SV_BUILD_OPTIONS) $(INTEL_FASTBOOT_BUILD_OPTION)
-  DEFINE EDK_DSC_GLOBAL_BUILD_OPTIONS = $(ENBDT_PF_ENABLE) $(EDK_DSC_FEATURE_BUILD_OPTIONS) $(EDK_DSC_OTHER_BUILD_OPTIONS) /D EFI_SPECIFICATION_VERSION=0x00020000  /D PI_SPECIFICATION_VERSION=0x00000009  /D TIANO_RELEASE_VERSION=0x00080006 /D SUPPORT_DEPRECATED_PCI_CFG_PPI /D CSM_SMMENTRY_PORT8DATA8 /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE) /D MAX_VARIABLE_SIZE=0x2000 /D EFI_FIRMWARE_VENDOR="L/"INTEL/"" /D EFI_BUILD_VERSION="L/"EDKII/"" /DEFI_PEI_REPORT_STATUS_CODE_ON $(ENBDT_S3_SUPPORT_OPTIONS)
-
-  *_*_IA32_ASM_FLAGS         = /DEFI32 /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
-  DEBUG_*_IA32_CC_FLAGS      = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_CC_FLAGS    = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_VFRPP_FLAGS   = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_VFRPP_FLAGS = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_APP_FLAGS     = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_APP_FLAGS   = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_PP_FLAGS      = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_PP_FLAGS    = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_IA32_ASLPP_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASLCC_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASM16_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
-
-  *_*_X64_ASM_FLAGS          = /DEFIX64 /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
-  DEBUG_*_X64_CC_FLAGS       = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_CC_FLAGS     = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_VFRPP_FLAGS    = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_VFRPP_FLAGS  = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_APP_FLAGS      = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_APP_FLAGS    = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_PP_FLAGS       = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_PP_FLAGS     = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_X64_ASLPP_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASLCC_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASM16_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
- # *_*_*_BUILD_FLAGS = -s
-  *_*_*_VFR_FLAGS   = -c
-  *_*_*_BUILD_FLAGS = -c
-
 [BuildOptions.Common.EDKII]
   *_*_IA32_ASM_FLAGS     = $(VP_BUILD_OPTIONS) /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
 
@@ -1656,25 +1348,3 @@ [BuildOptions.Common.EDKII]
   *_*_X64_APP_FLAGS      = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_PP_FLAGS       = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_ASLPP_FLAGS    = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
-
-
-[Components.X64]
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cBus.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cHost.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cPortA0Pio.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cMmioDeviceDxe.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
index 53372bb922..1ba75175e1 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
@@ -1,18 +1,15 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 **/
 
 #ifndef _PLAT_OVER_MNGR_H_
 #define _PLAT_OVER_MNGR_H_
 
-#include <FrameworkDxe.h>
+#include <PiDxe.h>
 
 #include <Protocol/HiiConfigAccess.h>
 #include <Protocol/HiiConfigRouting.h>
@@ -57,24 +54,11 @@
 #include <CpuType.h>
 #include <Guid/PlatformCpuInfo.h>
 #include <Protocol/SimpleTextIn.h>
-#include <Protocol/FrameworkFormBrowser.h>
+
+typedef UINT16  STRING_REF;
+
 extern EFI_HII_HANDLE   mHiiHandle;
 
-UINT32
-ConvertBase10ToRaw (
-  IN  EFI_EXP_BASE10_DATA             *Data);
-
-UINT32
-ConvertBase2ToRaw (
-  IN  EFI_EXP_BASE2_DATA             *Data);
-
-EFI_STATUS
-GetStringFromToken (
-  IN      EFI_GUID                  *ProducerGuid,
-  IN      STRING_REF                Token,
-  OUT     CHAR16                    **String
-  );
-
 VOID
 SwapEntries (
   IN  CHAR8 *Data
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
index 6d7e7c3f6c..ae100df26d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
@@ -1,11 +1,8 @@
 #
 #
-# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

+# Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
 #
 #  This driver produces UEFI PLATFORM_DRIVER_OVERRIDE_PROTOCOL if this protocol doesn't exist.
 #  It doesn't install again if this protocol exists.
@@ -63,7 +60,6 @@ [Sources]
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec    #for PchAccess.h
   SecurityPkg/SecurityPkg.dec
@@ -94,10 +90,6 @@ [Guids]
   #
   # gEfiCallerIdGuid                            ## Private  ## Variable:L"PlatDriOver"
   gEfiIfrTianoGuid                              ## CONSUMES ## Guid
-  gEfiProcessorSubClassGuid
-  gEfiMiscSubClassGuid
-  gEfiCacheSubClassGuid
-  gEfiMemorySubClassGuid
   gEfiPlatformInfoGuid
   gEfiNormalSetupGuid
   gEfiSecureBootEnableDisableGuid
@@ -123,8 +115,6 @@ [Protocols]
   gEfiDevicePathToTextProtocolGuid              ## CONSUMED
   gEdkiiFormBrowserEx2ProtocolGuid
 
-  gEfiDataHubProtocolGuid
-  gEfiLegacyBiosProtocolGuid
   gEfiSimpleNetworkProtocolGuid
 
   gEfiDiskInfoProtocolGuid                      ## CONSUMED
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
index c404ada588..fb82cdb984 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
     SetupInfoRecords.c
@@ -19,7 +16,6 @@ Revision History:
 --*/
 
 #include "PlatformSetupDxe.h"
-#include <Protocol/LegacyBios.h>
 #include <Protocol/PciRootBridgeIo.h>
 #include <Protocol/SimpleNetwork.h>
 #include <Protocol/DevicePath.h>
@@ -31,7 +27,6 @@ Revision History:
 #include <Protocol/Smbios.h>
 #include <IndustryStandard/SmBios.h>
 #include <Library/IoLib.h>
-#include <Library/I2CLib.h>
 #include <Guid/GlobalVariable.h>
 
 #include "Valleyview.h"
@@ -1172,11 +1167,6 @@ UpdatePlatformInformation (
 {
   UINT32                   MicroCodeVersion;
   CHAR16                   Buffer[40];
-  UINT8                    IgdVBIOSRevH;
-  UINT8                    IgdVBIOSRevL;
-  UINT16                   EDX;
-  EFI_IA32_REGISTER_SET    RegSet;
-  EFI_LEGACY_BIOS_PROTOCOL *LegacyBios = NULL;
   EFI_STATUS               Status;
   UINT8                    CpuFlavor=0;
   EFI_PEI_HOB_POINTERS     GuidHob;
@@ -1202,35 +1192,6 @@ UpdatePlatformInformation (
     }
   }
 
-  //
-  //VBIOS version
-  //
-  Status = gBS->LocateProtocol(
-                  &gEfiLegacyBiosProtocolGuid,
-                  NULL,
-                  (void **)&LegacyBios
-                  );
-  if (!EFI_ERROR (Status)) {
-  RegSet.X.AX = 0x5f01;
-  Status = LegacyBios->Int86 (LegacyBios, 0x10, &RegSet);
-  ASSERT_EFI_ERROR(Status);
-
-  //
-  // simulate AMI int15 (ax=5f01) handler
-  // check NbInt15.asm in AMI code for asm edition
-  //
-  EDX = (UINT16)((RegSet.E.EBX >> 16) & 0xffff);
-  IgdVBIOSRevH = (UINT8)(((EDX & 0x0F00) >> 4) | (EDX & 0x000F));
-  IgdVBIOSRevL = (UINT8)(((RegSet.X.BX & 0x0F00) >> 4) | (RegSet.X.BX & 0x000F));
-
-  if (IgdVBIOSRevH==0 && IgdVBIOSRevL==0){
-    HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), L"N/A", NULL);
-  } else {
-    UnicodeSPrint (Buffer, sizeof (Buffer), L"%02X%02X", IgdVBIOSRevH,IgdVBIOSRevL);
-    HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), Buffer, NULL);
-    }
-  }
-
   Status = GetGOPDriverName(Name);
 
   if (!EFI_ERROR(Status))
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
index 8b46fbdfd1..14b9250e99 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
     Platform.c
@@ -70,26 +68,9 @@ UINT8 mTco1Sources[] = {
   IchnNmi
 };
 
-UINTN
-DevicePathSize (
-  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
-  );
-
 VOID
 S4S5ProgClock();
 
-EFI_STATUS
-InitRuntimeScriptTable (
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  );
-
-VOID
-S5SleepWakeOnRtcCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
-  );
-
-
 VOID
 EnableS5WakeOnRtc();
 
@@ -98,12 +79,6 @@ HexToBcd(
   UINT8 HexValue
   );
 
-UINT8
-BcdToHex(
-  IN UINT8 BcdValue
-  );
-
-
 VOID
 CpuSmmSxWorkAround(
   );
@@ -779,46 +754,6 @@ DummyTco1Callback (
 {
 }
 
-UINTN
-DevicePathSize (
-  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL     *Start;
-
-  if (DevicePath == NULL) {
-    return 0;
-  }
-
-  //
-  // Search for the end of the device path structure
-  //
-  Start = DevicePath;
-  while (!IsDevicePathEnd (DevicePath)) {
-    DevicePath = NextDevicePathNode (DevicePath);
-  }
-
-  //
-  // Compute the size and add back in the size of the end device path structure
-  //
-  return ((UINTN)DevicePath - (UINTN)Start) + sizeof(EFI_DEVICE_PATH_PROTOCOL);
-}
-
-/**
-
-  @param DispatchHandle   The handle of this callback, obtained when registering
-  @param DispatchContext  The predefined context which contained sleep type and phase
-
-**/
-VOID
-S5SleepWakeOnRtcCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
-  )
-{
-  EnableS5WakeOnRtc();
-}
-
 /**
 
  @retval 1. Check Alarm interrupt is not set.
@@ -981,17 +916,3 @@ HexToBcd(
   return ((UINT8)(LowByte + (HighByte << 4)));
 }
 
-UINT8
-BcdToHex(
-  IN UINT8 BcdValue
-  )
-{
-  UINTN   HighByte;
-  UINTN   LowByte;
-
-  HighByte    = (UINTN)((BcdValue >> 4) * 10);
-  LowByte     = (UINTN)(BcdValue & 0x0F);
-
-  return ((UINT8)(LowByte + HighByte));
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
index 1b7b05d9b3..3c4f55cf54 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
@@ -1,11 +1,8 @@
 #
 #
-# Copyright (c)  1999  - 2018, Intel Corporation. All rights reserved
-#                                                                                  

+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
 #
 #  Module Name:
 #
@@ -51,16 +48,8 @@ [LibraryClasses]
 
 [Guids]
   gEfiSetupVariableGuid
-  gDmiDataGuid
-  gEfiAcpiVariableCompatiblityGuid
-  gEfiPciLanInfoGuid
-  gEfiPciLanInfoGuid
-
-[FeaturePcd]
-  gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode
 
 [Protocols]
-  gEfiSmmBase2ProtocolGuid
   gEfiSmmIchnDispatchProtocolGuid
   gEfiGlobalNvsAreaProtocolGuid
   gEfiSmmSwDispatchProtocolGuid
@@ -75,13 +64,11 @@ [Packages]
   IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
 
 [Pcd.common]
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
 
 [Depex]
-  gEfiSmmBase2ProtocolGuid                 AND
   gEfiSmmAccess2ProtocolGuid               AND
   gEfiSmmPowerButtonDispatchProtocolGuid  AND
   gEfiSmmSxDispatchProtocolGuid           AND
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/S3Save.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/S3Save.c
index 19089233b2..7bd0270655 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/S3Save.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/S3Save.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
     IchS3Save.c
@@ -23,52 +20,6 @@ Revision History
 extern  UINT16                          mAcpiBaseAddr;
 EFI_PHYSICAL_ADDRESS                    mRuntimeScriptTableBase;
 
-EFI_STATUS
-InitRuntimeScriptTable (
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  EFI_STATUS        Status;
-  UINT32            VarAttrib;
-  UINTN             VarSize;
-  ACPI_VARIABLE_SET_COMPATIBILITY *AcpiVariableBase;
-
-  //
-  // Allocate runtime ACPI script table space. We need it to save some
-  // settings done by CSM, which runs after normal script table closed
-  //
-  Status = gBS->AllocatePages (
-                  AllocateAnyPages,
-                  EfiACPIReclaimMemory,
-                  1,
-                  &mRuntimeScriptTableBase
-                  );
-  if (EFI_ERROR(Status)) {
-    return EFI_OUT_OF_RESOURCES ;
-  }
-
-  //
-  // Save runtime script table base into global ACPI variable
-  //
-  VarAttrib = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS
-              | EFI_VARIABLE_NON_VOLATILE;
-  VarSize   = sizeof (UINTN);
-  Status = SystemTable->RuntimeServices->GetVariable (
-                          ACPI_GLOBAL_VARIABLE,
-                          &gEfiAcpiVariableCompatiblityGuid,
-                          &VarAttrib,
-                          &VarSize,
-                          &AcpiVariableBase
-                          );
-  if (EFI_ERROR(Status)) {
-    return Status;
-  }
-
-  AcpiVariableBase->RuntimeScriptTableBase = mRuntimeScriptTableBase;
-
-  return EFI_SUCCESS;
-}
-
 EFI_STATUS
 SaveRuntimeScriptTable (
   VOID
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
index 8bf2ebafc1..bcb1d8ae92 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   SmmPlatform.h
@@ -35,7 +33,6 @@ Abstract:
 #include <Protocol/PciRootBridgeIo.h>
 #include <Protocol/LoadedImage.h>
 #include "Protocol/GlobalNvsArea.h"
-#include <Guid/AcpiVariableCompatibility.h>
 #include <Guid/SetupVariable.h>
 #include <Guid/EfiVpdData.h>
 #include <Guid/PciLanInfo.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf b/Platform/Intel/Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
index 331076a2d4..2c0a13f6af 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
@@ -1,9 +1,8 @@
 #/*++
 #
-#  Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  
+#  Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                     
 #
 #  Module Name:
 #
@@ -29,7 +28,6 @@ [Sources]
 [Packages]
   MdePkg/MdePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2SocBinPkg/Vlv2SocBinPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
 
 [LibraryClasses]
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c
index aa8c213d83..4e02486853 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c
@@ -1,10 +1,8 @@
 /*++
 
-Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   
+Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                                   
-
 
 Module Name:
 
@@ -138,7 +136,7 @@ MISC_SMBIOS_TABLE_FUNCTION(MiscBaseBoardManufacturer)
              &MacStr
              );
   if (EFI_ERROR (Status)) {	
-    return Status;
+    MacStr = L"000000000000";
   }
   SerialNumber = MacStr;    
   SerialNumStrLen = StrLen(SerialNumber);
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
index 15c180129c..81b66ce9af 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
@@ -1,13 +1,9 @@
 /*++
 
-Copyright (c) 1999  - 2014, Intel Corporation.  All rights reserved.
-                                                                                   

+Copyright (c) 1999  - 2019, Intel Corporation.  All rights reserved.
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
-
 Module Name:
 
   MiscOemType0x94Function.c
@@ -36,7 +32,6 @@ Abstract:
 #include <Protocol/I2cBus.h>
 
 #include <Library/IoLib.h>
-#include <Library/I2CLib.h>
 #include <Library/CpuIA32.h>
 #include <Library/UefiRuntimeServicesTableLib.h>
 #include <Guid/PlatformInfo.h>
@@ -527,11 +522,6 @@ UpdatePlatformInformation (
 {
   UINT32                   MicroCodeVersion;
   CHAR16                   Buffer[40];
-  UINT8                    IgdVBIOSRevH;
-  UINT8                    IgdVBIOSRevL;
-  UINT16                   EDX;
-  EFI_IA32_REGISTER_SET    RegSet;
-  EFI_LEGACY_BIOS_PROTOCOL *LegacyBios = NULL;
   EFI_STATUS               Status;
   UINT8                    CpuFlavor=0;
   EFI_PEI_HOB_POINTERS     GuidHob;
@@ -561,34 +551,6 @@ UpdatePlatformInformation (
     }
   }
 
-  //
-  //VBIOS version
-  //
-  Status = gBS->LocateProtocol(
-                  &gEfiLegacyBiosProtocolGuid,
-                  NULL,
-                  (VOID **)&LegacyBios
-                  );
-
-  RegSet.X.AX = 0x5f01;
-  Status = LegacyBios->Int86 (LegacyBios, 0x10, &RegSet);
-  ASSERT_EFI_ERROR(Status);
-
-  //
-  // simulate AMI int15 (ax=5f01) handler
-  // check NbInt15.asm in AMI code for asm edition
-  //
-  EDX = (UINT16)((RegSet.E.EBX >> 16) & 0xffff);
-  IgdVBIOSRevH = (UINT8)(((EDX & 0x0F00) >> 4) | (EDX & 0x000F));
-  IgdVBIOSRevL = (UINT8)(((RegSet.X.BX & 0x0F00) >> 4) | (RegSet.X.BX & 0x000F));
-
-  if (IgdVBIOSRevH==0 && IgdVBIOSRevL==0) {
-    HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), L"N/A", NULL);
-  } else {
-    UnicodeSPrint (Buffer, sizeof (Buffer), L"%02X%02X", IgdVBIOSRevH,IgdVBIOSRevL);
-    HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), Buffer, NULL);
-  }
-
   Status = TGetGOPDriverName(Name);
 
   if(!EFI_ERROR(Status))
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSystemManufacturerFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSystemManufacturerFunction.c
index 63c4f50ed5..f537e0db76 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSystemManufacturerFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSystemManufacturerFunction.c
@@ -1,10 +1,8 @@
 /*++
 
-Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   
+Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                                   
-
 
 Module Name:
 
@@ -219,8 +217,8 @@ AddSmbiosManuCallback (
              NULL,
              &MacStr
              );
-  if (EFI_ERROR (Status)) {	
-    return Status;
+  if (EFI_ERROR (Status)) {
+    MacStr = L"000000000000";
   }
   SerialNumber = MacStr; 
   SerialNumStrLen = StrLen(SerialNumber);
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
index 9d2f5410a0..99b1a18185 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
@@ -2,12 +2,9 @@
 # Component name for module MiscSubclass
 #
 # FIX ME!
-# Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
-#                                                                                  
+# Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
-#
-#
 #
 ##
 
@@ -87,9 +84,8 @@ [Packages]
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
   MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  NetworkPkg/NetworkPkg.dec
+  NetworkPkg/NetworkPkg.dec
 
 [LibraryClasses]
   HiiLib
@@ -107,13 +103,10 @@ [LibraryClasses]
   PrintLib
   CpuIA32Lib
   PchPlatformLib
-  I2cLib
   NetLib
   HobLib
   
 [Guids]
-  gEfiProcessorSubClassGuid
-  gEfiCacheSubClassGuid
   gEfiNormalSetupGuid
   gEfiPlatformInfoGuid
   gEfiVlv2VariableGuid
@@ -137,4 +130,4 @@ [Pcd]
   gEfiVLVTokenSpaceGuid.PcdProductSerialNumber
 
 [Depex]
- gEfiSmbiosProtocolGuid AND gMemInfoProtocolGuid AND gEfiMpServiceProtocolGuid AND gEfiSimpleNetworkProtocolGuid
+  gEfiSmbiosProtocolGuid AND gMemInfoProtocolGuid AND gEfiMpServiceProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
index ba81bd9def..8fe1482106 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
@@ -1,13 +1,10 @@
 
 /*++
 
-Copyright (c)  2011  - 2018, Intel Corporation. All rights reserved
-                                                                                   

+Copyright (c)  2011  - 2019, Intel Corporation. All rights reserved
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   IgdOpRegion.c
@@ -35,14 +32,12 @@ Abstract:
 
 #include "IgdOpRegion.h"
 #include "VlvPlatformInit.h"
-#include <FrameworkDxe.h>
-#include <Uefi.h>
+#include <PiDxe.h>
 #include <PchRegs.h>
 
 #include <Guid/DataHubRecords.h>
 
 #include <Protocol/IgdOpRegion.h>
-#include <Protocol/FrameworkHii.h>
 #include <Protocol/FirmwareVolume2.h>
 #include <Protocol/PlatformGopPolicy.h>
 #include <Protocol/PciIo.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.h b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.h
index cd1d208d61..597bdaf46a 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.h
@@ -1,13 +1,10 @@
 
 /*++
 
-Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-                                                                                   

+Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   IgdOpRegion.h
@@ -36,7 +33,7 @@ Abstract:
 #include "VlvPlatformInit.h"
 #include "VlvCommonDefinitions.h"
 #include <Uefi/UefiInternalFormRepresentation.h>
-#include <FrameworkDxe.h>
+#include <PiDxe.h>
 
 //
 //
@@ -177,24 +174,6 @@ GetSVER (
   OUT UINT8 *SVER
   );
 
-/**
-  Acquire the string associated with the ProducerGuid and return it.
-
-  @param ProducerGuid  The Guid to search the HII database for
-  @param Token         The token value of the string to extract
-  @param String        The string that is extracted
-
-  @retval EFI_SUCCESS       The function completed successfully
-  @retval EFI_NOT_FOUND     The requested string was not found
-
-**/
-EFI_STATUS
-GetStringFromToken (
-  IN      EFI_GUID                  *ProducerGuid,
-  IN      STRING_REF                Token,
-  OUT     CHAR16                    **String
-  );
-
 /**
 
   Graphics OpRegion / Software SCI driver installation function.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
index 9d277dd7cf..1e86adadb3 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
@@ -2,11 +2,10 @@
 #
 #/*++
 #
-#  Copyright (c)  1999  - 2018, Intel Corporation. All rights reserved
-#                                                                                  

+#  Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#                                                                                  
+
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

 #
 #  Module Name:
 #
@@ -34,7 +33,6 @@ [Sources]
 
 [Packages]
   MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
index d8594053b0..8cf8938a4e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
+++ b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
@@ -212,8 +212,12 @@ if defined VS140COMNTOOLS (
   goto :BldFail
 )
 
-echo Ensuring correct build directory is present for GenBiosId...
-set BUILD_PATH=%WORKSPACE%\Build\%PLATFORM_NAME%\%TARGET%_%TOOL_CHAIN_TAG%
+echo Ensuring correct build directory is present
+if "%Arch%"=="IA32" (
+  set BUILD_PATH=%WORKSPACE%\Build\%PLATFORM_NAME%IA32\%TARGET%_%TOOL_CHAIN_TAG%
+) else (
+  set BUILD_PATH=%WORKSPACE%\Build\%PLATFORM_NAME%\%TARGET%_%TOOL_CHAIN_TAG%
+)
 
 echo Modifing Conf files for this build...
 :: Remove lines with these tags from target.txt
@@ -240,16 +244,6 @@ move /Y %WORKSPACE%\Conf\target.txt.tmp %WORKSPACE%\Conf\target.txt >nul
 :: Build BIOS
 ::**********************************************************************
 
-echo Creating BiosId...
-if not exist %BUILD_PATH%\IA32  mkdir %BUILD_PATH%\IA32
-%PLATFORM_PACKAGE%\GenBiosId.exe -i %WORKSPACE%\Conf\BiosId.env -o %BUILD_PATH%\IA32\BiosId.bin -ob %WORKSPACE%\Conf\BiosId.bat
-if "%Arch%"=="X64" (
-   if not exist %BUILD_PATH%\X64  mkdir %BUILD_PATH%\X64
-   %PLATFORM_PACKAGE%\GenBiosId.exe -i %WORKSPACE%\Conf\BiosId.env -o %BUILD_PATH%\X64\BiosId.bin -ob %WORKSPACE%\Conf\BiosId.bat
-)
-
-if %ERRORLEVEL% NEQ 0 goto BldFail
-
 echo.
 echo Invoking EDK2 build...
 call build %Build_Flags%
@@ -267,31 +261,14 @@ pushd %PLATFORM_PACKAGE%
 %PLATFORM_PACKAGE%\fce read -i %BUILD_PATH%\FV\Vlv.fd > %BUILD_PATH%\FV\HiiDefaultData.txt
 
 :: save changes to VlvXXX.fd
-%PLATFORM_PACKAGE%\fce update -i %BUILD_PATH%\FV\Vlv.fd -s %BUILD_PATH%\FV\HiiDefaultData.txt -o %BUILD_PATH%\FV\Vlv%Arch%.fd
+%PLATFORM_PACKAGE%\fce update -i %BUILD_PATH%\FV\Vlv.fd -s %BUILD_PATH%\FV\HiiDefaultData.txt -o %BUILD_PATH%\FV\Vlv.ROM
 popd
 
 if %ERRORLEVEL% NEQ 0 goto BldFail
 ::echo FD successfully updated with default Hii values.
 
-:: Set the Board_Id, Build_Type, Version_Major, and Version_Minor environment variables
-find /v "#" %WORKSPACE%\Conf\BiosId.env > ver_strings
-for /f "tokens=1,3" %%i in (ver_strings) do set %%i=%%j
-del /f/q ver_strings >nul
-
-set BIOS_Name=%BOARD_ID%_%Arch%_%BUILD_TYPE%_%VERSION_MAJOR%_%VERSION_MINOR%.ROM
-copy /y/b %BUILD_PATH%\FV\Vlv%Arch%.fd  %PLATFORM_PACKAGE%\Stitch\%BIOS_Name% >nul
-copy /y/b %BUILD_PATH%\FV\Vlv%Arch%.fd  %BUILD_PATH%\FV\Vlv.ROM >nul
-
-echo.
-echo Build location:     %BUILD_PATH%
-echo BIOS ROM Created:   %BIOS_Name%
-echo.
-echo -------------------- The EDKII BIOS build has successfully completed. --------------------
-echo.
-
 @REM build capsule here
-echo > %BUILD_PATH%\FV\SYSTEMFIRMWAREUPDATECARGO.Fv
-build -p %PLATFORM_PACKAGE%\PlatformCapsule.dsc
+call build -p %PLATFORM_PACKAGE%\PlatformCapsule.dsc
 
 goto Exit
 
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 03/14] Vlv2TbltDevicePkg: Remove unused modules/libraries
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
  2019-07-01  2:55 ` [edk2-platforms Patch 01/14] Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid Michael D Kinney
  2019-07-01  2:55 ` [edk2-platforms Patch 02/14] Vlv2TbltDevicePkg: Reduce Intel Framework dependencies Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:07   ` Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 04/14] Vlv2TbltDevicePkg: Switch from ISA to SIO modules Michael D Kinney
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

* Delete platform specific SerialPortLib
* Delete platform specific Metronome module
* Delete platform specific BootScriptSaveDxe module
* Delete SmmSwDispatch2OnSmmSwDispatchThunk module
* Delete SmramSaveInfoHandlerSmm module
* Delete unused FSP content
* Delete unused I2C content
* Delete unused Stitch content
* Delete unused portions of PlatformSmm module

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../BootScriptSaveDxe/BootScriptSaveDxe.inf   |  60 --
 .../InternalBootScriptSave.h                  | 102 ---
 .../BootScriptSaveDxe/ScriptSave.c            | 626 ---------------
 .../FspAzaliaConfigData/AzaliaConfig.bin      | Bin 3708 -> 0 bytes
 .../FspSupport/BootModePei/BootModePei.c      |  42 -
 .../FspSupport/BootModePei/BootModePei.inf    |  40 -
 .../FspHobProcessLibVlv2.c                    | 421 ----------
 .../FspHobProcessLibVlv2.inf                  |  74 --
 .../FspPlatformSecLibVlv2.c                   | 144 ----
 .../FspPlatformSecLibVlv2.inf                 |  82 --
 .../Ia32/AsmSaveSecContext.asm                |  45 --
 .../SecFspPlatformSecLibVlv2/Ia32/Fsp.inc     |  45 --
 .../Ia32/PeiCoreEntry.asm                     | 135 ----
 .../Ia32/SecEntry.asm                         | 338 --------
 .../SecFspPlatformSecLibVlv2/Ia32/Stack.S     |  71 --
 .../SecFspPlatformSecLibVlv2/Ia32/Stack.asm   |  76 --
 .../SecFspPlatformSecLibVlv2/PlatformInit.c   |  36 -
 .../SecFspPlatformSecLibVlv2/SaveSecContext.c | 108 ---
 .../SecGetPerformance.c                       |  83 --
 .../SecPlatformInformation.c                  |  77 --
 .../SecFspPlatformSecLibVlv2/SecRamInitData.c |  16 -
 .../SecTempRamSupport.c                       | 149 ----
 .../SecFspPlatformSecLibVlv2/UartInit.c       | 192 -----
 .../Include/Protocol/TpmMp.h                  | 136 ----
 .../Include/Protocol/UsbPolicy.h              | 126 ---
 .../Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c |  46 --
 .../Library/I2CLib/I2CLibNull.inf             |  39 -
 .../Library/I2CLibDxe/I2CLib.c                | 735 ------------------
 .../Library/I2CLibDxe/I2CLibDxe.inf           |  39 -
 .../Library/I2CLibDxe/I2CRegs.h               | 126 ---
 .../Library/I2CLibPei/I2CAccess.h             |  44 --
 .../Library/I2CLibPei/I2CDelayPei.c           |  46 --
 .../Library/I2CLibPei/I2CDelayPei.h           |  30 -
 .../Library/I2CLibPei/I2CIoLibPei.c           | 178 -----
 .../Library/I2CLibPei/I2CIoLibPei.h           | 153 ----
 .../Library/I2CLibPei/I2CLibPei.c             | 638 ---------------
 .../Library/I2CLibPei/I2CLibPei.h             | 280 -------
 .../Library/I2CLibPei/I2CLibPei.inf           |  40 -
 .../Library/PlatformFspLib/PlatformFspLib.c   |  44 --
 .../Library/PlatformFspLib/PlatformFspLib.inf |  49 --
 .../SerialPortLib/PlatformSerialPortLib.h     |  53 --
 .../Library/SerialPortLib/SerialPortLib.c     | 246 ------
 .../Library/SerialPortLib/SerialPortLib.inf   |  52 --
 .../Library/SerialPortLib/SioInit.c           | 127 ---
 .../Library/SerialPortLib/SioInit.h           |  62 --
 .../Metronome/LegacyMetronome.c               | 185 -----
 .../Metronome/LegacyMetronome.h               |  64 --
 .../Vlv2TbltDevicePkg/Metronome/Metronome.inf |  49 --
 .../PlatformSmm/SmmScriptSave.c               | 252 ------
 .../PlatformSmm/SmmScriptSave.h               |  50 --
 .../SmmSwDispatch2OnSmmSwDispatchThunk.c      | 459 -----------
 .../SmmSwDispatch2OnSmmSwDispatchThunk.inf    |  54 --
 .../SmramSaveInfoHandlerSmm.c                 | 164 ----
 .../SmramSaveInfoHandlerSmm.inf               |  60 --
 .../Stitch/IFWIHeader/Vacant.bin              | Bin 3928064 -> 0 bytes
 .../Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat   | 270 -------
 .../Stitch/MNW2_Stitch_Config.txt             |  10 -
 57 files changed, 7868 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootScriptSaveDxe.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/InternalBootScriptSave.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/ScriptSave.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/AsmSaveSecContext.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Fsp.inc
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/PeiCoreEntry.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/PlatformInit.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SaveSecContext.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecGetPerformance.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecPlatformInformation.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecRamInitData.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecTempRamSupport.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/UartInit.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPolicy.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLibDxe.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRegs.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAccess.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/PlatformSerialPortLib.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIHeader/Vacant.bin
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Config.txt

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootScriptSaveDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootScriptSaveDxe.inf
deleted file mode 100644
index d2fa621096..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootScriptSaveDxe.inf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-## @file
-# Component description file for ScriptSave Lite module.
-#
-# This is an implementation of the Boot Script Save protocol.
-# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = BootScriptSaveDxe
-  FILE_GUID                      = 42BB673D-09F3-4e2e-9FEE-D081131DED5B
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-
-  ENTRY_POINT                    = InitializeScriptSave
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  ScriptSave.c
-  InternalBootScriptSave.h
-
-
-[Packages]
-  MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-
-
-[LibraryClasses]
-  PcdLib
-  UefiRuntimeServicesTableLib
-  UefiBootServicesTableLib
-  MemoryAllocationLib
-  UefiDriverEntryPoint
-  BaseMemoryLib
-  DebugLib
-  BaseLib
-  S3BootScriptLib
-
-[Protocols]
-  gEfiBootScriptSaveProtocolGuid                # PROTOCOL ALWAYS_PRODUCED
-
-
-[Depex]
-  TRUE
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/InternalBootScriptSave.h b/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/InternalBootScriptSave.h
deleted file mode 100644
index f232281e2b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/InternalBootScriptSave.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/** @file
-//
-//
-  Internal header file for S3 Boot Script Saver driver.
-
-  Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-
-#ifndef _INTERNAL_BOOT_SCRIPT_SAVE_H_
-#define _INTERNAL_BOOT_SCRIPT_SAVE_H_
-#include <FrameworkDxe.h>
-
-#include <Protocol/BootScriptSave.h>
-#include <Protocol/FirmwareVolume.h>
-
-#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/S3BootScriptLib.h>
-#include <Library/PcdLib.h>
-#include <Library/SmbusLib.h>
-#include <IndustryStandard/SmBus.h>
-
-/**
-  Adds a record into a specified Framework boot script table.
-
-  This function is used to store a boot script record into a given boot
-  script table. If the table specified by TableName is nonexistent in the
-  system, a new table will automatically be created and then the script record
-  will be added into the new table. A boot script table can add new script records
-  until EFI_BOOT_SCRIPT_SAVE_PROTOCOL.CloseTable() is called. Currently, the only
-  meaningful table name is EFI_ACPI_S3_RESUME_SCRIPT_TABLE. This function is
-  responsible for allocating necessary memory for the script.
-
-  This function has a variable parameter list. The exact parameter list depends on
-  the OpCode that is passed into the function. If an unsupported OpCode or illegal
-  parameter list is passed in, this function returns EFI_INVALID_PARAMETER.
-  If there are not enough resources available for storing more scripts, this function returns
-  EFI_OUT_OF_RESOURCES.
-
-  @param[in]  This                 A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
-  @param[in]  TableName            Name of the script table. Currently, the only meaningful value is
-                                   EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-  @param[in]  OpCode               The operation code (opcode) number.
-  @param[in]  ...                  Argument list that is specific to each opcode.
-
-  @retval EFI_SUCCESS              The operation succeeded. A record was added into the
-                                   specified script table.
-  @retval EFI_INVALID_PARAMETER    The parameter is illegal or the given boot script is not supported.
-                                   If the opcode is unknow or not supported because of the PCD
-                                   Feature Flags.
-  @retval EFI_OUT_OF_RESOURCES     There is insufficient memory to store the boot script.
-
-**/
-EFI_STATUS
-EFIAPI
-BootScriptWrite (
-  IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL    *This,
-  IN UINT16                           TableName,
-  IN UINT16                           OpCode,
-  ...
-  );
-
-/**
-  Closes the specified script table.
-
-  This function closes the specified boot script table and returns the base address
-  of the table. It allocates a new pool to duplicate all the boot scripts in the specified
-  table. Once this function is called, the specified table will be destroyed after it is
-  copied into the allocated pool. As a result, any attempts to add a script record into a
-  closed table will cause a new table to be created. The base address of the allocated pool
-  will be returned in Address. After using the boot script table, the caller is responsible
-  for freeing the pool that is allocated by this function. If the boot script table,
-  such as EFI_ACPI_S3_RESUME_SCRIPT_TABLE, is required to be stored in a nonperturbed
-  memory region, the caller should copy the table into the nonperturbed memory region by itself.
-
-  @param[in]  This              A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
-  @param[in]  TableName         Name of the script table. Currently, the only meaningful value is
-                                EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-  @param[in]  Address           A pointer to the physical address where the table begins.
-
-  @retval EFI_SUCCESS           The table was successfully returned.
-  @retval EFI_NOT_FOUND         The specified table was not created previously.
-  @retval EFI_OUT_OF_RESOURCE   Memory is insufficient to hold the reorganized boot script table.
-  @retval EFI_UNSUPPORTED       The table type is not EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-
-**/
-EFI_STATUS
-EFIAPI
-BootScriptCloseTable (
-  IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL    *This,
-  IN UINT16                           TableName,
-  OUT EFI_PHYSICAL_ADDRESS            *Address
-  );
-#endif //_INTERNAL_BOOT_SCRIPT_SAVE_H_
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/ScriptSave.c b/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/ScriptSave.c
deleted file mode 100644
index 837a8c95cd..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/ScriptSave.c
+++ /dev/null
@@ -1,626 +0,0 @@
-/** @file
-  Implementation for S3 Boot Script Saver driver.
-
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-
-#include "InternalBootScriptSave.h"
-
-EFI_HANDLE                    mHandle = NULL;
-EFI_BOOT_SCRIPT_SAVE_PROTOCOL mS3ScriptSave = {
-  BootScriptWrite,
-  BootScriptCloseTable
-  };
-
-/**
-  Internal function to add IO write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptIoWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINTN                 Count;
-  UINT8                 *Buffer;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Count       = VA_ARG (Marker, UINTN);
-  Buffer      = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSaveIoWrite (Width, Address, Count, Buffer);
-}
-
-/**
-  Internal function to add IO read/write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptIoReadWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINT8                 *Data;
-  UINT8                 *DataMask;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Data        = VA_ARG (Marker, UINT8 *);
-  DataMask    = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSaveIoReadWrite (Width, Address, Data, DataMask);
-}
-
-/**
-  Internal function to add memory write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptMemWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINTN                 Count;
-  UINT8                 *Buffer;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Count       = VA_ARG (Marker, UINTN);
-  Buffer      = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSaveMemWrite (Width, Address, Count, Buffer);
-}
-
-/**
-  Internal function to add memory read/write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptMemReadWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINT8                 *Data;
-  UINT8                 *DataMask;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Data        = VA_ARG (Marker, UINT8 *);
-  DataMask    = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSaveMemReadWrite (Width, Address, Data, DataMask);
-}
-
-/**
-  Internal function to add PciCfg write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptPciCfgWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINTN                 Count;
-  UINT8                 *Buffer;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Count       = VA_ARG (Marker, UINTN);
-  Buffer      = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSavePciCfgWrite (Width, Address, Count, Buffer);
-}
-
-/**
-  Internal function to PciCfg read/write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptPciCfgReadWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINT8                 *Data;
-  UINT8                 *DataMask;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Data        = VA_ARG (Marker, UINT8 *);
-  DataMask    = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSavePciCfgReadWrite (Width, Address, Data, DataMask);
-}
-
-/**
-  Internal function to add PciCfg2 write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptPciCfg2Write (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINTN                 Count;
-  UINT8                 *Buffer;
-  UINT16                Segment;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Count       = VA_ARG (Marker, UINTN);
-  Buffer      = VA_ARG (Marker, UINT8 *);
-  Segment     = VA_ARG (Marker, UINT16);
-
-  return S3BootScriptSavePciCfg2Write (Width, Segment, Address, Count, Buffer);
-}
-
-/**
-  Internal function to PciCfg2 read/write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptPciCfg2ReadWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT16                Segment;
-  UINT64                Address;
-  UINT8                 *Data;
-  UINT8                 *DataMask;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Segment     = VA_ARG (Marker, UINT16);
-  Data        = VA_ARG (Marker, UINT8 *);
-  DataMask    = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSavePciCfg2ReadWrite (Width, Segment, Address, Data, DataMask);
-}
-
-/**
-  Internal function to add smbus execute opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptSmbusExecute (
-  IN VA_LIST                       Marker
-  )
-{
-  EFI_SMBUS_DEVICE_ADDRESS  SlaveAddress;
-  EFI_SMBUS_DEVICE_COMMAND  Command;
-  EFI_SMBUS_OPERATION       Operation;
-  BOOLEAN                   PecCheck;
-  VOID                     *Buffer;
-  UINTN                    *DataSize;
-  UINTN                     SmBusAddress;
-
-  SlaveAddress.SmbusDeviceAddress = VA_ARG (Marker, UINTN);
-  Command                         = VA_ARG (Marker, EFI_SMBUS_DEVICE_COMMAND);
-  Operation                       = VA_ARG (Marker, EFI_SMBUS_OPERATION);
-  PecCheck                        = VA_ARG (Marker, BOOLEAN);
-  SmBusAddress                    = SMBUS_LIB_ADDRESS (SlaveAddress.SmbusDeviceAddress,Command,0,PecCheck);
-  DataSize                        = VA_ARG (Marker, UINTN *);
-  Buffer                          = VA_ARG (Marker, VOID *);
-
-  return S3BootScriptSaveSmbusExecute (SmBusAddress, Operation, DataSize, Buffer);
-}
-
-/**
-  Internal function to add stall opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptStall (
-  IN VA_LIST                       Marker
-  )
-{
-  UINT32                Duration;
-
-  Duration    = VA_ARG (Marker, UINT32);
-
-  return S3BootScriptSaveStall (Duration);
-}
-
-/**
-  Internal function to add Save jmp address according to DISPATCH_OPCODE.
-  We ignore "Context" parameter.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptDispatch (
-  IN VA_LIST                       Marker
-  )
-{
-  VOID        *EntryPoint;
-
-  EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
-  return S3BootScriptSaveDispatch (EntryPoint);
-}
-
-/**
-  Internal function to add memory pool operation to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptMemPoll (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINT8                 *BitMask;
-  UINT8                 *BitValue;
-  UINTN                Duration;
-  UINT64               LoopTimes;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  BitMask     = VA_ARG (Marker, UINT8 *);
-  BitValue    = VA_ARG (Marker, UINT8 *);
-  Duration    = (UINTN)VA_ARG (Marker, UINT64);
-  LoopTimes   = VA_ARG (Marker, UINT64);
-
-  return S3BootScriptSaveMemPoll (Width, Address, BitMask, BitValue, Duration, LoopTimes);
-}
-
-/**
-  Internal function to add Save jmp address according to DISPATCH_OPCODE2.
-  The "Context" parameter is not ignored.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptDispatch2 (
-  IN VA_LIST                       Marker
-  )
-{
-  VOID                  *EntryPoint;
-  VOID                  *Context;
-
-  EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
-  Context    = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
-
-  return S3BootScriptSaveDispatch2 (EntryPoint, Context);
-}
-
-/**
-  Internal function to add the opcode link node to the link list.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enought resource to complete the operations.
-  @retval EFI_SUCCESS           The opcode entry is added to the link list
-                                successfully.
-**/
-EFI_STATUS
-BootScriptInformation (
-  IN VA_LIST                       Marker
-  )
-{
-  UINT32                InformationLength;
-  EFI_PHYSICAL_ADDRESS  Information;
-
-  InformationLength = VA_ARG (Marker, UINT32);
-  Information = VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
-  return S3BootScriptSaveInformation (InformationLength, (VOID*)(UINTN)Information);
-}
-
-/**
-  Adds a record into a specified Framework boot script table.
-
-  This function is used to store a boot script record into a given boot
-  script table. If the table specified by TableName is nonexistent in the
-  system, a new table will automatically be created and then the script record
-  will be added into the new table. A boot script table can add new script records
-  until EFI_BOOT_SCRIPT_SAVE_PROTOCOL.CloseTable() is called. Currently, the only
-  meaningful table name is EFI_ACPI_S3_RESUME_SCRIPT_TABLE. This function is
-  responsible for allocating necessary memory for the script.
-
-  This function has a variable parameter list. The exact parameter list depends on
-  the OpCode that is passed into the function. If an unsupported OpCode or illegal
-  parameter list is passed in, this function returns EFI_INVALID_PARAMETER.
-  If there are not enough resources available for storing more scripts, this function returns
-  EFI_OUT_OF_RESOURCES.
-
-  @param  This                  A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
-  @param  TableName             Name of the script table. Currently, the only meaningful value is
-                                EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-  @param  OpCode                The operation code (opcode) number.
-  @param  ...                   Argument list that is specific to each opcode.
-
-  @retval EFI_SUCCESS           The operation succeeded. A record was added into the
-                                specified script table.
-  @retval EFI_INVALID_PARAMETER The parameter is illegal or the given boot script is not supported.
-                                If the opcode is unknow or not supported because of the PCD
-                                Feature Flags.
-  @retval EFI_OUT_OF_RESOURCES  There is insufficient memory to store the boot script.
-
-**/
-EFI_STATUS
-EFIAPI
-BootScriptWrite (
-  IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL    *This,
-  IN UINT16                           TableName,
-  IN UINT16                           OpCode,
-  ...
-  )
-{
-  EFI_STATUS                Status;
-  VA_LIST                   Marker;
-
-  if (TableName != FRAMEWORK_EFI_ACPI_S3_RESUME_SCRIPT_TABLE) {
-    //
-    // Only S3 boot script is supported for now.
-    //
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  //
-  // Build script according to opcode.
-  //
-  switch (OpCode) {
-
-  case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptIoWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptIoReadWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptMemWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptMemReadWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptPciCfgWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptPciCfgReadWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptSmbusExecute (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_STALL_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptStall (Marker);
-    VA_END (Marker);
-
-    break;
-
-  case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptDispatch (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptDispatch2 (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptInformation (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptMemPoll (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptPciCfg2Write (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptPciCfg2ReadWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  default:
-    Status = EFI_INVALID_PARAMETER;
-    break;
-  }
-
-  return Status;
-}
-
-/**
-  Closes the specified script table.
-
-  This function closes the specified boot script table and returns the base address
-  of the table. It allocates a new pool to duplicate all the boot scripts in the specified
-  table. Once this function is called, the specified table will be destroyed after it is
-  copied into the allocated pool. As a result, any attempts to add a script record into a
-  closed table will cause a new table to be created. The base address of the allocated pool
-  will be returned in Address. After using the boot script table, the caller is responsible
-  for freeing the pool that is allocated by this function. If the boot script table,
-  such as EFI_ACPI_S3_RESUME_SCRIPT_TABLE, is required to be stored in a nonperturbed
-  memory region, the caller should copy the table into the nonperturbed memory region by itself.
-
-  @param  This                  A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
-  @param  TableName             Name of the script table. Currently, the only meaningful value is
-                                 EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-  @param  Address               A pointer to the physical address where the table begins.
-
-  @retval EFI_SUCCESS           The table was successfully returned.
-  @retval EFI_NOT_FOUND         The specified table was not created previously.
-  @retval EFI_OUT_OF_RESOURCE   Memory is insufficient to hold the reorganized boot script table.
-  @retval EFI_UNSUPPORTED       The table type is not EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-
-**/
-EFI_STATUS
-EFIAPI
-BootScriptCloseTable (
-  IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL    *This,
-  IN UINT16                           TableName,
-  OUT EFI_PHYSICAL_ADDRESS            *Address
-  )
-{
-  if (TableName != FRAMEWORK_EFI_ACPI_S3_RESUME_SCRIPT_TABLE) {
-    //
-    // Only S3 boot script is supported for now.
-    //
-    return EFI_NOT_FOUND;
-  }
-  *Address = (EFI_PHYSICAL_ADDRESS)(UINTN)S3BootScriptCloseTable ();
-
-  if (*Address == 0) {
-    return  EFI_NOT_FOUND;
-  }
-  return EFI_SUCCESS;
-}
-
-/**
-  This routine is entry point of ScriptSave driver.
-
-  @param  ImageHandle           Handle for this drivers loaded image protocol.
-  @param  SystemTable           EFI system table.
-
-  @retval EFI_OUT_OF_RESOURCES  No enough resource.
-  @retval EFI_SUCCESS           Succesfully installed the ScriptSave driver.
-  @retval other                 Errors occured.
-
-**/
-EFI_STATUS
-EFIAPI
-InitializeScriptSave (
-  IN EFI_HANDLE           ImageHandle,
-  IN EFI_SYSTEM_TABLE     *SystemTable
-  )
-{
-  return  gBS->InstallProtocolInterface (
-                  &mHandle,
-                  &gEfiBootScriptSaveProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &mS3ScriptSave
-                  );
-
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin b/Platform/Intel/Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin
deleted file mode 100644
index da24c02b5d25ce888c630c664095902b4bb035e7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3708
zcmd^>Pl#JZ9LMK3`)XRdt$F?9>(+TQNqa~UwYzRL6+{xdH3}71P@h!~iwKK?QYsja
zyX|(<qQVxzbj5>fq4Da)Ts;(X@!&zpF$WI;5lLww$LD8u(;7lcLET;q4D-G_leaV9
z`ONQ|ZR6t$o%9hYzfnH1u=S6uQmNdpwECI9F1+yKF{PAjL*H2Jq)QXOgh~bLdf(Yj
zx{Q{={HK>X>1pl1uVg3l=gxJ~cL&<PZ)v%co*%q_JNnyNCp|Z$e>&eufBh)t{i$qa
zymz6Ko;kF<fYxKYbk8T9^zHTcrQ*MT^i#$MdK~@MXPtDW{K}NLuFTl3<m0X=(-m=j
zxoZ39zGO`wT@kSrDa94Z8J=B&PSA<u4bN^KJufTqyc{q*yDGXWlW|oJ8lGK47HtDf
zGYxc2)@+UWHJLIsS#>R$wk^39x8#&*q1$rZw$W`_Fm2JUDS6xE|21XSG|_dwU+4RE
znKN}^tDE}4qiNQxW^7I6<C;>Yro`3NRa-~bRo2weO(nLeSfk1ro?RE+MR!%+@QkN|
zrz?1RVBOP<7MszNaYi3BJiC@!v@JCm(@cx`ZMA0GY9(%~l4+||7vWKaClMY+c+gjQ
z+voj#HEa4xy9}OWcz*^@GMnznsNr~Yq{O;PtS`?xHS5iqf=FDD$QES96{Kg1=%Vbl
zMS0m3VWGl$E3CW1e9u<Gcp?p(Fh7yUJWDV&4O^=))-zRfRj$~oyy~jx8oGwAp=;=d
zgfMm;)-J+a4^~2$ISxBz80x{6z}V-ob`s`B_psR-kDkb~#xiTnvqsGtCt0KC8g{rB
zP3}XBd%`+dBTUHSrj18!G|jbT+HgnXu7tKL6RwMAeYprzYp?|qQi3JV)FNz&%jj7X
zX^A6!(MI~Di}ai+pbL7+7W9NGXwC#()Zf`6<3)4@UD4NUh4BhH(b+iB$8Ey<5`7Om
zdQz(``s;53YS<Qi?D>E-M4TfHuF7zggR5<Dbs4T!2V8}46~a{+uCj2&9^kCPc!hIM
z_&yD;%5c?#s}Qb2xGE303gIe*t1?_onwngSH)>SiJXdw*(`=pbI(mb%kTWcEhBrA2
zIYZCcqnz27oLR(~l{m8=XBH05tjw7?&V+lSxhFc{O#D8_N*nw2{oOo<qvGU<2cvs-
z?0LODv*+M8doKOUJ#Jx-XV~NJ!5(viJsyY4fIW_$SqhgaTq?L!aQOgxCKq*<{&yGX
zkp9CRfsW}z{=PoG_IH0bPe#Y_=;&{`NR8(s_2z*{We?Ke!e^Mkh0nBIcm&&M8Xkpk
zF$Whu%LFd=n5yL9Lf}H+A~)n2c_4@3;w!jVgA4M2EaX1N8(HTwj~tK_ag)35GwbjA
z<7<!4yD>cc9uFV911CMxhZ~yh!&U!3uUB~VR348M9xdb1!oZ`MA&-1bp24F$9_ib7
z<ZJTq-I*QoNaN8iJj&vc3_L2~(UBpKUc#eGc(jH`zW(_d9mX{LDbsp*BzSZdk50Na
zcXQ(|dCtUn&NkhnXLF`O4mZf-207bMj(qny&$*(TN|D!!-0qRzC2~AVUbAKu`urxx
z`Ax-mm+>y+Jd@Xo-0u1OCdZW_uj7pLY=(Nlvx(3VIzscz9+{7(zIzV1OU&2I*UZ;H
zWLQt8t)~8r)UF%R=vCNs4M)egTR9b1a<AD+Zl9~<;0B$b6LgZBH1p_r^nC7h$MgT}
zgGV!?HL*tx4`Z4waK8)dxiws$?v`7l^(fC>yTo1d^~nE5K0H#7;CB7D2Hf7NN4M@8
zHA%Q@KgMm@!(F>wZry{scKj6e==4xMQYkzSwVSzj1<zInp82egsOc-z^wE0cJ=zy<
zWce8N=$~Zy5}xe6gC{=Avx6)jBg^0SxppDYAJgysBGC8IOFqyO^vV7}@Au<me3Aa)
og+TA{`cR;E`u>AJKSaMh8|ZiFi`_ua(_elr(C^Vdb2!j{0U29Y3;+NC

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.c
deleted file mode 100644
index bf6c7efba5..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/** @file
-  This PEIM will parse the hoblist from fsp and report them into pei core.
-  This file contains the main entrypoint of the PEIM.
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-
-#include <PiPei.h>
-#include <Ppi/MasterBootMode.h>
-
-static EFI_PEI_PPI_DESCRIPTOR       mPpiList[] = {
-  {
-    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
-    &gEfiPeiMasterBootModePpiGuid,
-    NULL
-  },
-};
-
-/**
-  This is the entrypoint of PEIM
-
-  @param  FileHandle  Handle of the file being invoked.
-  @param  PeiServices Describes the list of possible PEI Services.
-
-  @retval EFI_SUCCESS if it completed successfully.
-**/
-EFI_STATUS
-EFIAPI
-BootModePeiEntryPoint (
-  IN       EFI_PEI_FILE_HANDLE  FileHandle,
-  IN CONST EFI_PEI_SERVICES     **PeiServices
-  )
-{
-  (*PeiServices)->SetBootMode(PeiServices, BOOT_WITH_FULL_CONFIGURATION);
-
-  (*PeiServices)->InstallPpi (PeiServices, &mPpiList[0]);
-
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
deleted file mode 100644
index 27200bca15..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
+++ /dev/null
@@ -1,40 +0,0 @@
-## @file
-# FSP PEI Module
-#
-# Parses the hoblist from fsp and report them into pei core. It will install
-# the memory as required.
-#
-#  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = BootModePeim
-  FILE_GUID                      = 2B1D0832-2184-4C8F-A90D-8E4AF9DE5BCD
-  MODULE_TYPE                    = PEIM
-  VERSION_STRING                 = 1.0
-  ENTRY_POINT                    = BootModePeiEntryPoint
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32
-#
-
-[Sources]
-  BootModePei.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-
-[LibraryClasses]
-  PeimEntryPoint
-
-[Ppis]
-  gEfiPeiMasterBootModePpiGuid
-
-[Depex]
-  TRUE
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c
deleted file mode 100644
index 8a97e25bd4..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c
+++ /dev/null
@@ -1,421 +0,0 @@
-/** @file
-  Null instance of Platform Sec Lib.
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-
-#include <Library/PeiServicesLib.h>
-#include <Library/PeiServicesTablePointerLib.h>
-#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/HobLib.h>
-#include <Library/PcdLib.h>
-#include <Library/FspPlatformInfoLib.h>
-
-#include <Guid/GuidHobFsp.h>
-#include <Guid/MemoryTypeInformation.h>
-#include <Ppi/Capsule.h>
-
-#include <PlatformFspLib.h>
-#include <Guid/SmramMemoryReserve.h>
-EFI_GUID gFspReservedMemoryResourceHobTsegGuid = {0xd038747c, 0xd00c, 0x4980, {0xb3, 0x19, 0x49, 0x01, 0x99, 0xa4, 0x7d, 0x55}};
-
-//
-// Additional pages are used by DXE memory manager.
-// It should be consistent between RetrieveRequiredMemorySize() and GetPeiMemSize()
-//
-#define PEI_ADDITIONAL_MEMORY_SIZE    (16 * EFI_PAGE_SIZE)
-
-/**
-  Get the mem size in memory type infromation table.
-
-  @param PeiServices  PEI Services table.
-
-  @return the mem size in memory type infromation table.
-**/
-UINT64
-GetMemorySizeInMemoryTypeInformation (
-  IN EFI_PEI_SERVICES **PeiServices
-  )
-{
-  EFI_PEI_HOB_POINTERS        Hob;
-  EFI_MEMORY_TYPE_INFORMATION *MemoryData;
-  UINT8                       Index;
-  UINTN                       TempPageNum;
-
-  MemoryData = NULL;
-  (*PeiServices)->GetHobList ((CONST EFI_PEI_SERVICES **)PeiServices, (VOID **) &Hob.Raw);
-  while (!END_OF_HOB_LIST (Hob)) {
-    if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION &&
-      CompareGuid (&Hob.Guid->Name, &gEfiMemoryTypeInformationGuid)) {
-      MemoryData = (EFI_MEMORY_TYPE_INFORMATION *) (Hob.Raw + sizeof (EFI_HOB_GENERIC_HEADER) + sizeof (EFI_GUID));
-      break;
-    }
-
-    Hob.Raw = GET_NEXT_HOB (Hob);
-  }
-
-  if (MemoryData == NULL) {
-    return 0;
-  }
-
-  TempPageNum = 0;
-  for (Index = 0; MemoryData[Index].Type != EfiMaxMemoryType; Index++) {
-    //
-    // Accumulate default memory size requirements
-    //
-    TempPageNum += MemoryData[Index].NumberOfPages;
-  }
-
-  return TempPageNum * EFI_PAGE_SIZE;
-}
-
-/**
-  Get the mem size need to be reserved in PEI phase.
-
-  @param PeiServices  PEI Services table.
-
-  @return the mem size need to be reserved in PEI phase.
-**/
-UINT64
-RetrieveRequiredMemorySize (
-  IN EFI_PEI_SERVICES **PeiServices
-  )
-{
-  UINT64                      Size;
-
-  Size = GetMemorySizeInMemoryTypeInformation (PeiServices);
-  return Size + PEI_ADDITIONAL_MEMORY_SIZE;
-}
-
-/**
-  Get the mem size need to be consumed and reserved in PEI phase.
-
-  @param PeiServices  PEI Services table.
-  @param BootMode     Current boot mode.
-
-  @return the mem size need to be consumed and reserved in PEI phase.
-**/
-UINT64
-GetPeiMemSize (
-  IN EFI_PEI_SERVICES **PeiServices,
-  IN UINT32           BootMode
-  )
-{
-  UINT64                      Size;
-  UINT64                      MinSize;
-
-  if (BootMode == BOOT_IN_RECOVERY_MODE) {
-    return PcdGet32 (PcdPeiRecoveryMinMemSize);
-  }
-
-  Size = GetMemorySizeInMemoryTypeInformation (PeiServices);
-
-  if (BootMode == BOOT_ON_FLASH_UPDATE) {
-    //
-    // Maybe more size when in CapsuleUpdate phase ?
-    //
-    MinSize = PcdGet32 (PcdPeiMinMemSize);
-  } else {
-    MinSize = PcdGet32 (PcdPeiMinMemSize);
-  }
-
-  return MinSize + Size + PEI_ADDITIONAL_MEMORY_SIZE;
-}
-
-/**
-  BIOS process FspBobList.
-
-  @param FspHobList  Pointer to the HOB data structure produced by FSP.
-
-  @return If platform process the FSP hob list successfully.
-**/
-EFI_STATUS
-EFIAPI
-FspHobProcessForMemoryResource (
-  IN VOID                 *FspHobList
-  )
-{
-  EFI_PEI_HOB_POINTERS Hob;
-  UINT64               LowMemorySize;
-  UINT64               FspMemorySize;
-  EFI_PHYSICAL_ADDRESS FspMemoryBase;
-  UINT64               PeiMemSize;
-  EFI_PHYSICAL_ADDRESS PeiMemBase;
-  UINT64               S3PeiMemSize;
-  EFI_PHYSICAL_ADDRESS S3PeiMemBase;
-  BOOLEAN              FoundFspMemHob;
-  EFI_STATUS           Status;
-  EFI_BOOT_MODE        BootMode;
-  PEI_CAPSULE_PPI      *Capsule;
-  VOID                 *CapsuleBuffer;
-  UINTN                CapsuleBufferLength;
-  UINT64               RequiredMemSize;
-  EFI_PEI_SERVICES     **PeiServices;
-  UINT64               TsegSize;
-  EFI_PHYSICAL_ADDRESS TsegBase;
-  BOOLEAN              FoundTsegHob;
-
-  PeiServices = (EFI_PEI_SERVICES **)GetPeiServicesTablePointer ();
-
-  PeiServicesGetBootMode (&BootMode);
-
-  PeiMemBase = 0;
-  LowMemorySize = 0;
-  FspMemorySize = 0;
-  FspMemoryBase = 0;
-  FoundFspMemHob = FALSE;
-  TsegSize      = 0;
-  TsegBase      = 0;
-  FoundTsegHob   = FALSE;
-
-  //
-  // Parse the hob list from fsp
-  // Report all the resource hob except the memory between 1M and 4G
-  //
-  Hob.Raw = (UINT8 *)(UINTN)FspHobList;
-  DEBUG((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));
-
-  while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw)) != NULL) {
-    DEBUG((DEBUG_INFO, "\nResourceType: 0x%x\n", Hob.ResourceDescriptor->ResourceType));
-    if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) ||
-        (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED)) {
-      DEBUG((DEBUG_INFO, "ResourceAttribute: 0x%x\n", Hob.ResourceDescriptor->ResourceAttribute));
-      DEBUG((DEBUG_INFO, "PhysicalStart: 0x%x\n", Hob.ResourceDescriptor->PhysicalStart));
-      DEBUG((DEBUG_INFO, "ResourceLength: 0x%x\n", Hob.ResourceDescriptor->ResourceLength));
-      DEBUG((DEBUG_INFO, "Owner: %g\n\n", &Hob.ResourceDescriptor->Owner));
-    }
-
-    if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY)  // Found the low memory length below 4G
-        && (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB)
-        && (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= BASE_4GB)) {
-        LowMemorySize += Hob.ResourceDescriptor->ResourceLength;
-      Hob.Raw = GET_NEXT_HOB (Hob);
-      continue;
-    }
-
-    if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED)  // Found the low memory length below 4G
-        && (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB)
-        && (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= BASE_4GB)
-        && (CompareGuid (&Hob.ResourceDescriptor->Owner, &gFspReservedMemoryResourceHobGuid))) {
-      FoundFspMemHob = TRUE;
-      FspMemoryBase = Hob.ResourceDescriptor->PhysicalStart;
-      FspMemorySize = Hob.ResourceDescriptor->ResourceLength;
-      DEBUG((DEBUG_INFO, "Find fsp mem hob, base 0x%x, len 0x%x\n", FspMemoryBase, FspMemorySize));
-    }
-
-    if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED)  // Found the low memory length below 4G
-      && (Hob.ResourceDescriptor->PhysicalStart >= 0x100000)
-      && (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= 0x100000000)
-      && (CompareGuid (&Hob.ResourceDescriptor->Owner, &gFspReservedMemoryResourceHobTsegGuid))) {
-        FoundTsegHob = TRUE;
-        TsegBase = Hob.ResourceDescriptor->PhysicalStart;
-
-
-        if ((Hob.ResourceDescriptor->ResourceLength == 0  ) || (Hob.ResourceDescriptor->ResourceLength > 0x800000)){
-          Hob.ResourceDescriptor->ResourceLength = 0x800000;
-        }
-
-
-        TsegSize = Hob.ResourceDescriptor->ResourceLength;
-        DEBUG((EFI_D_ERROR, "Find Tseg mem hob, base 0x%lx, len 0x%lx\n", TsegBase, TsegSize));
-      }
-
-    //
-    // Report the resource hob
-    //
-    BuildResourceDescriptorHob (
-      Hob.ResourceDescriptor->ResourceType,
-      Hob.ResourceDescriptor->ResourceAttribute,
-      Hob.ResourceDescriptor->PhysicalStart,
-      Hob.ResourceDescriptor->ResourceLength
-      );
-
-    Hob.Raw = GET_NEXT_HOB (Hob);
-  }
-
-  if (!FoundFspMemHob) {
-    DEBUG((DEBUG_INFO, "Didn't find the fsp used memory information.\n"));
-    //ASSERT(FALSE);
-  }
-
-  DEBUG((DEBUG_INFO, "LowMemorySize: 0x%x.\n", LowMemorySize));
-  DEBUG((DEBUG_INFO, "FspMemoryBase: 0x%x.\n", FspMemoryBase));
-  DEBUG((DEBUG_INFO, "FspMemorySize: 0x%x.\n", FspMemorySize));
-
-  if (BootMode == BOOT_ON_S3_RESUME) {
-    BuildResourceDescriptorHob (
-      EFI_RESOURCE_SYSTEM_MEMORY,
-      (
-         EFI_RESOURCE_ATTRIBUTE_PRESENT |
-         EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
-         // EFI_RESOURCE_ATTRIBUTE_TESTED |
-         EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
-      ),
-      BASE_1MB,
-      LowMemorySize
-      );
-
-    Status = GetS3MemoryInfo (&S3PeiMemBase, &S3PeiMemSize);
-    ASSERT_EFI_ERROR (Status);
-    DEBUG((DEBUG_INFO, "S3 memory %Xh - %Xh bytes\n", S3PeiMemBase, S3PeiMemSize));
-
-    //
-    // Make sure Stack and PeiMemory are not overlap - JYAO1
-    //
-
-    Status = PeiServicesInstallPeiMemory (
-               S3PeiMemBase,
-               S3PeiMemSize
-               );
-    ASSERT_EFI_ERROR (Status);
-  } else {
-    PeiMemSize = GetPeiMemSize (PeiServices, BootMode);
-    DEBUG((DEBUG_INFO, "PEI memory size = %Xh bytes\n", PeiMemSize));
-
-    //
-    // Capsule mode
-    //
-    Capsule = NULL;
-    CapsuleBuffer = NULL;
-    CapsuleBufferLength = 0;
-    if (BootMode == BOOT_ON_FLASH_UPDATE) {
-      Status = PeiServicesLocatePpi (
-                 &gPeiCapsulePpiGuid,
-                 0,
-                 NULL,
-                 (VOID **) &Capsule
-                 );
-      ASSERT_EFI_ERROR (Status);
-
-      if (Status == EFI_SUCCESS) {
-        //
-        // Make sure Stack and CapsuleBuffer are not overlap - JYAO1
-        //
-        CapsuleBuffer = (VOID *)(UINTN)BASE_1MB;
-        CapsuleBufferLength = (UINTN)(LowMemorySize - PeiMemSize);
-        //
-        // Call the Capsule PPI Coalesce function to coalesce the capsule data.
-        //
-        Status = Capsule->Coalesce (PeiServices, &CapsuleBuffer, &CapsuleBufferLength);
-      }
-    }
-
-    RequiredMemSize = RetrieveRequiredMemorySize (PeiServices);
-    DEBUG((DEBUG_INFO, "Required memory size = %Xh bytes\n", RequiredMemSize));
-
-    //
-    // Report the main memory
-    //
-    BuildResourceDescriptorHob (
-      EFI_RESOURCE_SYSTEM_MEMORY,
-      (
-         EFI_RESOURCE_ATTRIBUTE_PRESENT |
-         EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
-         EFI_RESOURCE_ATTRIBUTE_TESTED |
-         EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
-      ),
-      BASE_1MB,
-      LowMemorySize
-      );
-
-    //
-    // Make sure Stack and CapsuleBuffer are not overlap - JYAO1
-    //
-
-    //
-    // Install efi memory
-    //
-    PeiMemBase = BASE_1MB + LowMemorySize - PeiMemSize;
-    Status = PeiServicesInstallPeiMemory (
-               PeiMemBase,
-               PeiMemSize - RequiredMemSize
-               );
-    ASSERT_EFI_ERROR (Status);
-
-    if (Capsule != NULL) {
-      Status = Capsule->CreateState (PeiServices, CapsuleBuffer, CapsuleBufferLength);
-    }
-  }
-
-  //
-  // Report GUIDed HOB for reserving SMRAM regions
-  //
-  if (FoundTsegHob) {
-    EFI_SMRAM_HOB_DESCRIPTOR_BLOCK  *SmramHobDescriptorBlock;
-
-    SmramHobDescriptorBlock = BuildGuidHob (
-             &gEfiSmmPeiSmramMemoryReserveGuid,
-             sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK)
-             );
-    ASSERT (SmramHobDescriptorBlock != NULL);
-
-    SmramHobDescriptorBlock->NumberOfSmmReservedRegions = 1;
-
-    SmramHobDescriptorBlock->Descriptor[0].PhysicalStart = TsegBase;
-    SmramHobDescriptorBlock->Descriptor[0].CpuStart      = TsegBase;
-    SmramHobDescriptorBlock->Descriptor[0].PhysicalSize  = TsegSize;
-    SmramHobDescriptorBlock->Descriptor[0].RegionState   = EFI_SMRAM_CLOSED;
-  }
-  return EFI_SUCCESS;
-}
-
-/**
-  BIOS process FspBobList for other data (not Memory Resource Descriptor).
-
-  @param[in] FspHobList  Pointer to the HOB data structure produced by FSP.
-
-  @return If platform process the FSP hob list successfully.
-**/
-EFI_STATUS
-EFIAPI
-FspHobProcessForOtherData (
-  IN VOID                 *FspHobList
-  )
-{
-  EFI_PEI_SERVICES     **PeiServices;
-
-  PeiServices = (EFI_PEI_SERVICES **)GetPeiServicesTablePointer ();
-
-  //
-  // Other hob for platform
-  //
-  PlatformHobCreateFromFsp ((CONST EFI_PEI_SERVICES **) PeiServices,  FspHobList);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  BIOS process FspBobList.
-
-  @param[in] FspHobList  Pointer to the HOB data structure produced by FSP.
-
-  @return If platform process the FSP hob list successfully.
-**/
-EFI_STATUS
-EFIAPI
-FspHobProcess (
-  IN VOID                 *FspHobList
-  )
-{
-  EFI_STATUS  Status;
-
-  Status = FspHobProcessForMemoryResource (FspHobList);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  Status = FspHobProcessForOtherData (FspHobList);
-
-  return Status;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
deleted file mode 100644
index b789b27f4c..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
+++ /dev/null
@@ -1,74 +0,0 @@
-## @file
-#
-#  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-################################################################################
-#
-# Defines Section - statements that will be processed to create a Makefile.
-#
-################################################################################
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = PeiFspHobProcessLibVlv2
-  FILE_GUID                      = C7B7070B-E5A8-4b86-9110-BDCA1095F496
-  MODULE_TYPE                    = SEC
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = FspHobProcessLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64
-#
-
-################################################################################
-#
-# Sources Section - list of files that are required for the build to succeed.
-#
-################################################################################
-
-[Sources]
-  FspHobProcessLibVlv2.c
-
-
-################################################################################
-#
-# Package Dependency Section - list of Package files that are required for
-#                              this module.
-#
-################################################################################
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
-  IntelFspPkg/IntelFspPkg.dec
-  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-
-[LibraryClasses]
-  BaseLib
-  BaseMemoryLib
-  HobLib
-  DebugLib
-  FspPlatformInfoLib
-  PeiServicesLib
-  PeiServicesTablePointerLib
-  PlatformFspLib
-
-[Pcd]
-  gFspWrapperTokenSpaceGuid.PcdPeiMinMemSize
-  gFspWrapperTokenSpaceGuid.PcdPeiRecoveryMinMemSize
-
-[Guids]
-  gFspReservedMemoryResourceHobGuid
-  gEfiMemoryTypeInformationGuid
-  gEfiSmmPeiSmramMemoryReserveGuid
-
-[Ppis]
-  gPeiCapsulePpiGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.c
deleted file mode 100644
index 2b03cfaec9..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/** @file
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-
-#include <Ppi/SecPlatformInformation.h>
-#include <Ppi/SecPerformance.h>
-#include <Ppi/TemporaryRamSupport.h>
-
-#include <Library/LocalApicLib.h>
-
-/**
-  This interface conveys state information out of the Security (SEC) phase into PEI.
-
-  @param  PeiServices               Pointer to the PEI Services Table.
-  @param  StructureSize             Pointer to the variable describing size of the input buffer.
-  @param  PlatformInformationRecord Pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD.
-
-  @retval EFI_SUCCESS               The data was successfully returned.
-  @retval EFI_BUFFER_TOO_SMALL      The buffer was too small.
-
-**/
-EFI_STATUS
-EFIAPI
-SecPlatformInformation (
-  IN CONST EFI_PEI_SERVICES                     **PeiServices,
-  IN OUT   UINT64                               *StructureSize,
-     OUT   EFI_SEC_PLATFORM_INFORMATION_RECORD  *PlatformInformationRecord
-  );
-
-/**
-  This interface conveys performance information out of the Security (SEC) phase into PEI.
-
-  This service is published by the SEC phase. The SEC phase handoff has an optional
-  EFI_PEI_PPI_DESCRIPTOR list as its final argument when control is passed from SEC into the
-  PEI Foundation. As such, if the platform supports collecting performance data in SEC,
-  this information is encapsulated into the data structure abstracted by this service.
-  This information is collected for the boot-strap processor (BSP) on IA-32.
-
-  @param[in]  PeiServices  The pointer to the PEI Services Table.
-  @param[in]  This         The pointer to this instance of the PEI_SEC_PERFORMANCE_PPI.
-  @param[out] Performance  The pointer to performance data collected in SEC phase.
-
-  @retval EFI_SUCCESS      The data was successfully returned.
-
-**/
-EFI_STATUS
-EFIAPI
-SecGetPerformance (
-  IN CONST EFI_PEI_SERVICES          **PeiServices,
-  IN       PEI_SEC_PERFORMANCE_PPI   *This,
-  OUT      FIRMWARE_SEC_PERFORMANCE  *Performance
-  );
-
-/**
-  This service of the TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into
-  permanent memory.
-
-  @param PeiServices            Pointer to the PEI Services Table.
-  @param TemporaryMemoryBase    Source Address in temporary memory from which the SEC or PEIM will copy the
-                                Temporary RAM contents.
-  @param PermanentMemoryBase    Destination Address in permanent memory into which the SEC or PEIM will copy the
-                                Temporary RAM contents.
-  @param CopySize               Amount of memory to migrate from temporary to permanent memory.
-
-  @retval EFI_SUCCESS           The data was successfully returned.
-  @retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when
-                                TemporaryMemoryBase > PermanentMemoryBase.
-
-**/
-EFI_STATUS
-EFIAPI
-SecTemporaryRamSupport (
-  IN CONST EFI_PEI_SERVICES   **PeiServices,
-  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,
-  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,
-  IN UINTN                    CopySize
-  );
-
-EFI_SEC_PLATFORM_INFORMATION_PPI  mSecPlatformInformationPpi = {
-  SecPlatformInformation
-};
-
-PEI_SEC_PERFORMANCE_PPI  mSecPerformancePpi = {
-  SecGetPerformance
-};
-
-EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI gSecTemporaryRamSupportPpi = {
-  SecTemporaryRamSupport
-};
-
-EFI_PEI_PPI_DESCRIPTOR  mPeiSecPlatformPpi[] = {
-  {
-    EFI_PEI_PPI_DESCRIPTOR_PPI,
-    &gEfiSecPlatformInformationPpiGuid,
-    &mSecPlatformInformationPpi
-  },
-  {
-    EFI_PEI_PPI_DESCRIPTOR_PPI,
-    &gPeiSecPerformancePpiGuid,
-    &mSecPerformancePpi
-  },
-  {
-    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
-    &gEfiTemporaryRamSupportPpiGuid,
-    &gSecTemporaryRamSupportPpi
-  },
-};
-
-/**
-  A developer supplied function to perform platform specific operations.
-
-  It's a developer supplied function to perform any operations appropriate to a
-  given platform. It's invoked just before passing control to PEI core by SEC
-  core. Platform developer may modify the SecCoreData passed to PEI Core.
-  It returns a platform specific PPI list that platform wishes to pass to PEI core.
-  The Generic SEC core module will merge this list to join the final list passed to
-  PEI core.
-
-  @param  SecCoreData           The same parameter as passing to PEI core. It
-                                could be overridden by this function.
-
-  @return The platform specific PPI list to be passed to PEI core or
-          NULL if there is no need of such platform specific PPI list.
-
-**/
-EFI_PEI_PPI_DESCRIPTOR *
-EFIAPI
-SecPlatformMain (
-  IN OUT   EFI_SEC_PEI_HAND_OFF        *SecCoreData
-  )
-{
-  EFI_PEI_PPI_DESCRIPTOR      *PpiList;
-
-  InitializeApicTimer (0, (UINT32) -1, TRUE, 5);
-
-  PpiList = &mPeiSecPlatformPpi[0];
-
-  return PpiList;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
deleted file mode 100644
index 578066d98f..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
+++ /dev/null
@@ -1,82 +0,0 @@
-## @file
-#
-#  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-################################################################################
-#
-# Defines Section - statements that will be processed to create a Makefile.
-#
-################################################################################
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SecPeiFspPlatformSecLibVlv2
-  FILE_GUID                      = 6653876C-F6A1-45BB-A027-20455093BC6D
-  MODULE_TYPE                    = SEC
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = FspPlatformSecLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64
-#
-
-################################################################################
-#
-# Sources Section - list of files that are required for the build to succeed.
-#
-################################################################################
-
-[Sources]
-  FspPlatformSecLibVlv2.c
-  SecRamInitData.c
-  SaveSecContext.c
-  SecPlatformInformation.c
-  SecGetPerformance.c
-  SecTempRamSupport.c
-  PlatformInit.c
-  UartInit.c
-
-[Sources.IA32]
-  Ia32/SecEntry.asm
-  Ia32/PeiCoreEntry.asm
-  Ia32/AsmSaveSecContext.asm
-  Ia32/Stack.asm
-
-################################################################################
-#
-# Package Dependency Section - list of Package files that are required for
-#                              this module.
-#
-################################################################################
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  UefiCpuPkg/UefiCpuPkg.dec
-  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
-
-[LibraryClasses]
-  LocalApicLib
-  SerialPortLib
-
-[Ppis]
-  gEfiSecPlatformInformationPpiGuid
-  gPeiSecPerformancePpiGuid
-  gEfiTemporaryRamSupportPpiGuid
-
-[Pcd]
-  gFspWrapperTokenSpaceGuid.PcdPeiTemporaryRamStackSize
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize
-
-[FixedPcd]
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize
-  gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/AsmSaveSecContext.asm b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/AsmSaveSecContext.asm
deleted file mode 100644
index 2546a09a1a..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/AsmSaveSecContext.asm
+++ /dev/null
@@ -1,45 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-; SPDX-License-Identifier: BSD-2-Clause-Patent
-;
-; Module Name:
-;
-;  SecEntry.asm
-;
-; Abstract:
-;
-;  This is the code that goes from real-mode to protected mode.
-;  It consumes the reset vector, calls two basic APIs from FSP binary.
-;
-;------------------------------------------------------------------------------
-
-.686p
-.xmm
-.model flat,c
-.code
-
-;----------------------------------------------------------------------------
-;  MMX Usage:
-;              MM0 = BIST State
-;              MM5 = Save time-stamp counter value high32bit
-;              MM6 = Save time-stamp counter value low32bit.
-;
-;  It should be same as SecEntry.asm and PeiCoreEntry.asm.
-;----------------------------------------------------------------------------
-
-AsmSaveBistValue   PROC PUBLIC
-  mov     eax, [esp+4]
-  movd    mm0, eax
-  ret
-AsmSaveBistValue   ENDP
-
-AsmSaveTickerValue   PROC PUBLIC
-  mov     eax, [esp+4]
-  movd    mm6, eax
-  mov     eax, [esp+8]
-  movd    mm5, eax
-  ret
-AsmSaveTickerValue   ENDP
-
-END
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Fsp.inc b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Fsp.inc
deleted file mode 100644
index 23295587b4..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Fsp.inc
+++ /dev/null
@@ -1,45 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-; SPDX-License-Identifier: BSD-2-Clause-Patent
-;
-; Module Name:
-;
-;   Fsp.inc
-;
-; Abstract:
-;
-;   Fsp related definitions
-;
-;------------------------------------------------------------------------------
-
-
-;
-; Fv Header
-;
-FVH_SIGINATURE_OFFSET       EQU  028h
-FVH_SIGINATURE_VALID_VALUE  EQU  04856465Fh    ; valid signature:_FVH
-FVH_HEADER_LENGTH_OFFSET    EQU  030h
-FVH_EXTHEADER_OFFSET_OFFSET EQU  034h
-FVH_EXTHEADER_SIZE_OFFSET   EQU  010h
-
-;
-; Ffs Header
-;
-FSP_HEADER_GUID_DWORD1      EQU  0912740BEh
-FSP_HEADER_GUID_DWORD2      EQU  047342284h
-FSP_HEADER_GUID_DWORD3      EQU  0B08471B9h
-FSP_HEADER_GUID_DWORD4      EQU  00C3F3527h
-FFS_HEADER_SIZE_VALUE       EQU  018h
-
-;
-; Section Header
-;
-SECTION_HEADER_TYPE_OFFSET  EQU  03h
-RAW_SECTION_HEADER_SIZE_VALUE  EQU  04h
-
-;
-; Fsp Header
-;
-FSP_HEADER_IMAGEBASE_OFFSET   EQU  01Ch
-FSP_HEADER_TEMPRAMINIT_OFFSET EQU  030h
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/PeiCoreEntry.asm b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/PeiCoreEntry.asm
deleted file mode 100644
index 3d34c62ea4..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/PeiCoreEntry.asm
+++ /dev/null
@@ -1,135 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-; SPDX-License-Identifier: BSD-2-Clause-Patent
-;
-; Module Name:
-;
-;  SecEntry.asm
-;
-; Abstract:
-;
-;  This is the code that goes from real-mode to protected mode.
-;  It consumes the reset vector, calls two basic APIs from FSP binary.
-;
-;------------------------------------------------------------------------------
-
-.686p
-.xmm
-.model flat, c
-.code
-
-EXTRN   SecStartup:NEAR
-EXTRN   PlatformInit:NEAR
-
-CallPeiCoreEntryPoint   PROC PUBLIC
-  ;
-  ; Obtain the hob list pointer
-  ;
-  mov     eax, [esp+4]
-  ;
-  ; Obtain the stack information
-  ;   ECX: start of range
-  ;   EDX: end of range
-  ;
-  mov     ecx, [esp+8]
-  mov     edx, [esp+0Ch]
-
-  ;
-  ; Platform init
-  ;
-  pushad
-  push edx
-  push ecx
-  push eax
-  call PlatformInit
-  pop  eax
-  pop  eax
-  pop  eax
-  popad
-
-  ;
-  ; Set stack top pointer
-  ;
-  mov     esp, edx
-
-  ;
-  ; Push the hob list pointer
-  ;
-  push    eax
-
-  ;
-  ; Save the value
-  ;   ECX: start of range
-  ;   EDX: end of range
-  ;
-  mov     ebp, esp
-  push    ecx
-  push    edx
-
-  ;
-  ; Push processor count to stack first, then BIST status (AP then BSP)
-  ;
-  mov     eax, 1
-  cpuid
-  shr     ebx, 16
-  and     ebx, 0000000FFh
-  cmp     bl, 1
-  jae     PushProcessorCount
-
-  ;
-  ; Some processors report 0 logical processors.  Effectively 0 = 1.
-  ; So we fix up the processor count
-  ;
-  inc     ebx
-
-PushProcessorCount:
-  push    ebx
-
-  ;
-  ; We need to implement a long-term solution for BIST capture.  For now, we just copy BSP BIST
-  ; for all processor threads
-  ;
-  xor     ecx, ecx
-  mov     cl, bl
-PushBist:
-  movd    eax, mm0
-  push    eax
-  loop    PushBist
-
-  ; Save Time-Stamp Counter
-  movd eax, mm5
-  push eax
-
-  movd eax, mm6
-  push eax
-
-  ;
-  ; Pass entry point of the PEI core
-  ;
-  mov     edi, 0FFFFFFE0h
-  push    DWORD PTR ds:[edi]
-
-  ;
-  ; Pass BFV into the PEI Core
-  ;
-  mov     edi, 0FFFFFFFCh
-  push    DWORD PTR ds:[edi]
-
-  ;
-  ; Pass stack size into the PEI Core
-  ;
-  mov     ecx, [ebp - 4]
-  mov     edx, [ebp - 8]
-  push    ecx       ; RamBase
-
-  sub     edx, ecx
-  push    edx       ; RamSize
-
-  ;
-  ; Pass Control into the PEI Core
-  ;
-  call SecStartup
-CallPeiCoreEntryPoint   ENDP
-
-END
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm
deleted file mode 100644
index b7026c433f..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm
+++ /dev/null
@@ -1,338 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-; SPDX-License-Identifier: BSD-2-Clause-Patent
-;
-; Module Name:
-;
-;  SecEntry.asm
-;
-; Abstract:
-;
-;  This is the code that goes from real-mode to protected mode.
-;  It consumes the reset vector, calls two basic APIs from FSP binary.
-;
-;------------------------------------------------------------------------------
-  INCLUDE Fsp.inc
-
-.686p
-.xmm
-.model small, c
-
-EXTRN   CallPeiCoreEntryPoint:NEAR
-EXTRN   TempRamInitParams:FAR
-
-; Pcds
-EXTRN   PcdGet32 (PcdFlashFvFspBase):DWORD
-EXTRN   PcdGet32 (PcdFlashFvFspSize):DWORD
-
-_TEXT_REALMODE      SEGMENT PARA PUBLIC USE16 'CODE'
-                    ASSUME  CS:_TEXT_REALMODE, DS:_TEXT_REALMODE
-
-;----------------------------------------------------------------------------
-;
-; Procedure:    _ModuleEntryPoint
-;
-; Input:        None
-;
-; Output:       None
-;
-; Destroys:     Assume all registers
-;
-; Description:
-;
-;   Transition to non-paged flat-model protected mode from a
-;   hard-coded GDT that provides exactly two descriptors.
-;   This is a bare bones transition to protected mode only
-;   used for a while in PEI and possibly DXE.
-;
-;   After enabling protected mode, a far jump is executed to
-;   transfer to PEI using the newly loaded GDT.
-;
-; Return:       None
-;
-;  MMX Usage:
-;              MM0 = BIST State
-;              MM5 = Save time-stamp counter value high32bit
-;              MM6 = Save time-stamp counter value low32bit.
-;
-;----------------------------------------------------------------------------
-
-align 4
-_ModuleEntryPoint PROC NEAR C PUBLIC
-  fninit                                ; clear any pending Floating point exceptions
-  ;
-  ; Store the BIST value in mm0
-  ;
-  movd    mm0, eax
-
-  ;
-  ; Save time-stamp counter value
-  ; rdtsc load 64bit time-stamp counter to EDX:EAX
-  ;
-  rdtsc
-  movd    mm5, edx
-  movd    mm6, eax
-
-  ;
-  ; Load the GDT table in GdtDesc
-  ;
-  mov     esi,  OFFSET GdtDesc
-  DB      66h
-  lgdt    fword ptr cs:[si]
-
-  ;
-  ; Transition to 16 bit protected mode
-  ;
-  mov     eax, cr0                   ; Get control register 0
-  or      eax, 00000003h             ; Set PE bit (bit #0) & MP bit (bit #1)
-  mov     cr0, eax                   ; Activate protected mode
-
-  mov     eax, cr4                   ; Get control register 4
-  or      eax, 00000600h             ; Set OSFXSR bit (bit #9) & OSXMMEXCPT bit (bit #10)
-  mov     cr4, eax
-
-  ;
-  ; Now we're in 16 bit protected mode
-  ; Set up the selectors for 32 bit protected mode entry
-  ;
-  mov     ax, SYS_DATA_SEL
-  mov     ds, ax
-  mov     es, ax
-  mov     fs, ax
-  mov     gs, ax
-  mov     ss, ax
-
-  ;
-  ; Transition to Flat 32 bit protected mode
-  ; The jump to a far pointer causes the transition to 32 bit mode
-  ;
-  mov esi, offset ProtectedModeEntryLinearAddress
-  jmp     fword ptr cs:[si]
-
-_ModuleEntryPoint   ENDP
-_TEXT_REALMODE      ENDS
-
-_TEXT_PROTECTED_MODE      SEGMENT PARA PUBLIC USE32 'CODE'
-                          ASSUME  CS:_TEXT_PROTECTED_MODE, DS:_TEXT_PROTECTED_MODE
-
-;----------------------------------------------------------------------------
-;
-; Procedure:    ProtectedModeEntryPoint
-;
-; Input:        None
-;
-; Output:       None
-;
-; Destroys:     Assume all registers
-;
-; Description:
-;
-; This function handles:
-;   Call two basic APIs from FSP binary
-;   Initializes stack with some early data (BIST, PEI entry, etc)
-;
-; Return:       None
-;
-;----------------------------------------------------------------------------
-
-align 4
-ProtectedModeEntryPoint PROC NEAR PUBLIC
-
-  ; Find the fsp info header
-  mov  edi, PcdGet32 (PcdFlashFvFspBase)
-  mov  ecx, PcdGet32 (PcdFlashFvFspSize)
-
-  mov  eax, dword ptr [edi + FVH_SIGINATURE_OFFSET]
-  cmp  eax, FVH_SIGINATURE_VALID_VALUE
-  jnz  FspHeaderNotFound
-
-  xor  eax, eax
-  mov  ax, word ptr [edi + FVH_EXTHEADER_OFFSET_OFFSET]
-  cmp  ax, 0
-  jnz  FspFvExtHeaderExist
-
-  xor  eax, eax
-  mov  ax, word ptr [edi + FVH_HEADER_LENGTH_OFFSET]   ; Bypass Fv Header
-  add  edi, eax
-  jmp  FspCheckFfsHeader
-
-FspFvExtHeaderExist:
-  add  edi, eax
-  mov  eax, dword ptr [edi + FVH_EXTHEADER_SIZE_OFFSET]  ; Bypass Ext Fv Header
-  add  edi, eax
-
-  ; Round up to 8 byte alignment
-  mov  eax, edi
-  and  al,  07h
-  jz FspCheckFfsHeader
-
-  and  edi, 0FFFFFFF8h
-  add  edi, 08h
-
-FspCheckFfsHeader:
-  ; Check the ffs guid
-  mov  eax, dword ptr [edi]
-  cmp  eax, FSP_HEADER_GUID_DWORD1
-  jnz FspHeaderNotFound
-
-  mov  eax, dword ptr [edi + 4]
-  cmp  eax, FSP_HEADER_GUID_DWORD2
-  jnz FspHeaderNotFound
-
-  mov  eax, dword ptr [edi + 8]
-  cmp  eax, FSP_HEADER_GUID_DWORD3
-  jnz FspHeaderNotFound
-
-  mov  eax, dword ptr [edi + 0Ch]
-  cmp  eax, FSP_HEADER_GUID_DWORD4
-  jnz FspHeaderNotFound
-
-  add  edi, FFS_HEADER_SIZE_VALUE       ; Bypass the ffs header
-
-  ; Check the section type as raw section
-  mov  al, byte ptr [edi + SECTION_HEADER_TYPE_OFFSET]
-  cmp  al, 019h
-  jnz FspHeaderNotFound
-
-  add  edi, RAW_SECTION_HEADER_SIZE_VALUE ; Bypass the section header
-  jmp FspHeaderFound
-
-FspHeaderNotFound:
-  jmp  $
-
-FspHeaderFound:
-  ; Get the fsp TempRamInit Api address
-  mov eax, dword ptr [edi + FSP_HEADER_IMAGEBASE_OFFSET]
-  add eax, dword ptr [edi + FSP_HEADER_TEMPRAMINIT_OFFSET]
-
-  ; Setup the hardcode stack
-  mov esp, OFFSET TempRamInitStack
-
-  ; Call the fsp TempRamInit Api
-  jmp eax
-
-TempRamInitDone:
-  cmp eax, 0
-  jnz FspApiFailed
-
-  ;   ECX: start of range
-  ;   EDX: end of range
-  mov     esp, edx
-  push    edx
-  push    ecx
-  push    eax ; zero - no hob list yet
-  call CallPeiCoreEntryPoint
-
-FspApiFailed:
-  jmp $
-
-align 10h
-TempRamInitStack:
-    DD  OFFSET TempRamInitDone
-    DD  OFFSET TempRamInitParams
-
-ProtectedModeEntryPoint ENDP
-
-;
-; ROM-based Global-Descriptor Table for the Tiano PEI Phase
-;
-align 16
-PUBLIC  BootGdtTable
-
-;
-; GDT[0]: 0x00: Null entry, never used.
-;
-NULL_SEL            EQU $ - GDT_BASE    ; Selector [0]
-GDT_BASE:
-BootGdtTable        DD  0
-                    DD  0
-;
-; Linear data segment descriptor
-;
-LINEAR_SEL          EQU $ - GDT_BASE    ; Selector [0x8]
-    DW  0FFFFh                          ; limit 0xFFFFF
-    DW  0                               ; base 0
-    DB  0
-    DB  092h                            ; present, ring 0, data, expand-up, writable
-    DB  0CFh                            ; page-granular, 32-bit
-    DB  0
-;
-; Linear code segment descriptor
-;
-LINEAR_CODE_SEL     EQU $ - GDT_BASE    ; Selector [0x10]
-    DW  0FFFFh                          ; limit 0xFFFFF
-    DW  0                               ; base 0
-    DB  0
-    DB  09Bh                            ; present, ring 0, data, expand-up, not-writable
-    DB  0CFh                            ; page-granular, 32-bit
-    DB  0
-;
-; System data segment descriptor
-;
-SYS_DATA_SEL        EQU $ - GDT_BASE    ; Selector [0x18]
-    DW  0FFFFh                          ; limit 0xFFFFF
-    DW  0                               ; base 0
-    DB  0
-    DB  093h                            ; present, ring 0, data, expand-up, not-writable
-    DB  0CFh                            ; page-granular, 32-bit
-    DB  0
-
-;
-; System code segment descriptor
-;
-SYS_CODE_SEL        EQU $ - GDT_BASE    ; Selector [0x20]
-    DW  0FFFFh                          ; limit 0xFFFFF
-    DW  0                               ; base 0
-    DB  0
-    DB  09Ah                            ; present, ring 0, data, expand-up, writable
-    DB  0CFh                            ; page-granular, 32-bit
-    DB  0
-;
-; Spare segment descriptor
-;
-SYS16_CODE_SEL      EQU $ - GDT_BASE    ; Selector [0x28]
-    DW  0FFFFh                          ; limit 0xFFFFF
-    DW  0                               ; base 0
-    DB  0Eh                             ; Changed from F000 to E000.
-    DB  09Bh                            ; present, ring 0, code, expand-up, writable
-    DB  00h                             ; byte-granular, 16-bit
-    DB  0
-;
-; Spare segment descriptor
-;
-SYS16_DATA_SEL      EQU $ - GDT_BASE    ; Selector [0x30]
-    DW  0FFFFh                          ; limit 0xFFFF
-    DW  0                               ; base 0
-    DB  0
-    DB  093h                            ; present, ring 0, data, expand-up, not-writable
-    DB  00h                             ; byte-granular, 16-bit
-    DB  0
-
-;
-; Spare segment descriptor
-;
-SPARE5_SEL          EQU $ - GDT_BASE    ; Selector [0x38]
-    DW  0                               ; limit 0
-    DW  0                               ; base 0
-    DB  0
-    DB  0                               ; present, ring 0, data, expand-up, writable
-    DB  0                               ; page-granular, 32-bit
-    DB  0
-GDT_SIZE            EQU $ - BootGdtTable    ; Size, in bytes
-
-;
-; GDT Descriptor
-;
-GdtDesc:                                ; GDT descriptor
-    DW  GDT_SIZE - 1                    ; GDT limit
-    DD  OFFSET BootGdtTable             ; GDT base address
-
-
-ProtectedModeEntryLinearAddress   LABEL   FWORD
-ProtectedModeEntryLinearOffset    LABEL   DWORD
-  DD      OFFSET ProtectedModeEntryPoint  ; Offset of our 32 bit code
-  DW      LINEAR_CODE_SEL
-
-_TEXT_PROTECTED_MODE    ENDS
-END
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S
deleted file mode 100644
index 9bd29ce0f4..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S
+++ /dev/null
@@ -1,71 +0,0 @@
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-# Abstract:
-#
-#   Switch the stack from temporary memory to permenent memory.
-#
-#------------------------------------------------------------------------------
-
-
-#------------------------------------------------------------------------------
-# VOID
-# EFIAPI
-# SecSwitchStack (
-#   UINT32   TemporaryMemoryBase,
-#   UINT32   PermenentMemoryBase
-#   )#
-#------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX (SecSwitchStack)
-ASM_PFX(SecSwitchStack):
-    #
-    # Save standard registers so they can be used to change stack
-    #
-    pushl %eax
-    pushl %ebx
-    pushl %ecx
-    pushl %edx
-
-    #
-    # !!CAUTION!! this function address's is pushed into stack after
-    # migration of whole temporary memory, so need save it to permenent
-    # memory at first!
-    #
-    movl  20(%esp), %ebx         # Save the first parameter
-    movl  24(%esp), %ecx         # Save the second parameter
-
-    #
-    # Save this function's return address into permenent memory at first.
-    # Then, Fixup the esp point to permenent memory
-    #
-    movl  %esp, %eax
-    subl  %ebx, %eax
-    addl  %ecx, %eax
-    movl  0(%esp), %edx          # copy pushed register's value to permenent memory
-    movl  %edx, 0(%eax)
-    movl  4(%esp), %edx
-    movl  %edx, 4(%eax)
-    movl  8(%esp), %edx
-    movl  %edx, 8(%eax)
-    movl  12(%esp), %edx
-    movl  %edx, 12(%eax)
-    movl  16(%esp), %edx        # Update this function's return address into permenent memory
-    movl  %edx, 16(%eax)
-    movl  %eax, %esp            # From now, esp is pointed to permenent memory
-
-    #
-    # Fixup the ebp point to permenent memory
-    #
-    movl  %ebp, %eax
-    subl  %ebx, %eax
-    addl  %ecx, %eax
-    movl  %eax, %ebp            # From now, ebp is pointed to permenent memory
-
-    popl  %edx
-    popl  %ecx
-    popl  %ebx
-    popl  %eax
-    ret
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.asm b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.asm
deleted file mode 100644
index 95e56cec9b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.asm
+++ /dev/null
@@ -1,76 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-; SPDX-License-Identifier: BSD-2-Clause-Patent
-;
-; Abstract:
-;
-;   Switch the stack from temporary memory to permenent memory.
-;
-;------------------------------------------------------------------------------
-
-    .586p
-    .model  flat,C
-    .code
-
-;------------------------------------------------------------------------------
-; VOID
-; EFIAPI
-; SecSwitchStack (
-;   UINT32   TemporaryMemoryBase,
-;   UINT32   PermenentMemoryBase
-;   );
-;------------------------------------------------------------------------------
-SecSwitchStack   PROC
-    ;
-    ; Save three register: eax, ebx, ecx
-    ;
-    push  eax
-    push  ebx
-    push  ecx
-    push  edx
-
-    ;
-    ; !!CAUTION!! this function address's is pushed into stack after
-    ; migration of whole temporary memory, so need save it to permenent
-    ; memory at first!
-    ;
-
-    mov   ebx, [esp + 20]          ; Save the first parameter
-    mov   ecx, [esp + 24]          ; Save the second parameter
-
-    ;
-    ; Save this function's return address into permenent memory at first.
-    ; Then, Fixup the esp point to permenent memory
-    ;
-    mov   eax, esp
-    sub   eax, ebx
-    add   eax, ecx
-    mov   edx, dword ptr [esp]         ; copy pushed register's value to permenent memory
-    mov   dword ptr [eax], edx
-    mov   edx, dword ptr [esp + 4]
-    mov   dword ptr [eax + 4], edx
-    mov   edx, dword ptr [esp + 8]
-    mov   dword ptr [eax + 8], edx
-    mov   edx, dword ptr [esp + 12]
-    mov   dword ptr [eax + 12], edx
-    mov   edx, dword ptr [esp + 16]    ; Update this function's return address into permenent memory
-    mov   dword ptr [eax + 16], edx
-    mov   esp, eax                     ; From now, esp is pointed to permenent memory
-
-    ;
-    ; Fixup the ebp point to permenent memory
-    ;
-    mov   eax, ebp
-    sub   eax, ebx
-    add   eax, ecx
-    mov   ebp, eax                ; From now, ebp is pointed to permenent memory
-
-    pop   edx
-    pop   ecx
-    pop   ebx
-    pop   eax
-    ret
-SecSwitchStack   ENDP
-
-    END
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/PlatformInit.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/PlatformInit.c
deleted file mode 100644
index d4e1c2a425..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/PlatformInit.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/** @file
-  This PEIM will parse the hoblist from fsp and report them into pei core.
-  This file contains the main entrypoint of the PEIM.
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-
-#include <PiPei.h>
-#include <Library/DebugLib.h>
-#include <Library/SerialPortLib.h>
-
-VOID EnableInternalUart ();
-
-VOID
-EFIAPI
-PlatformInit (
-  IN VOID                 *FspHobList,
-  IN VOID                 *StartOfRange,
-  IN VOID                 *EndOfRange
-  )
-{
-  //
-  // Platform initialization
-  // Enable Serial port here
-  //
-  EnableInternalUart ();
-  SerialPortInitialize ();
-
-  DEBUG ((DEBUG_INFO, "PlatformInit\n"));
-  DEBUG ((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));
-  DEBUG ((DEBUG_INFO, "StartOfRange - 0x%x\n", StartOfRange));
-  DEBUG ((DEBUG_INFO, "EndOfRange - 0x%x\n", EndOfRange));
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SaveSecContext.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SaveSecContext.c
deleted file mode 100644
index 382e617b27..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SaveSecContext.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/** @file
-  This PEIM will parse the hoblist from fsp and report them into pei core.
-  This file contains the main entrypoint of the PEIM.
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-
-#include <PiPei.h>
-#include <Library/DebugLib.h>
-
-#include <Ppi/TopOfTemporaryRam.h>
-#include <Ppi/SecPlatformInformation.h>
-
-/**
-  Save BIST value before call FspInit.
-
-  @param Bist   BIST value.
-**/
-VOID
-AsmSaveBistValue (
-  IN UINT32  Bist
-  );
-
-/**
-  Save Ticker value before call FspInit.
-
-  @param Ticker   Ticker value.
-**/
-VOID
-AsmSaveTickerValue (
-  IN UINT64  Ticker
-  );
-
-/**
-  Save SEC context before call FspInit.
-
-  @param PeiServices  Pointer to PEI Services Table.
-**/
-VOID
-EFIAPI
-SaveSecContext (
-  IN CONST EFI_PEI_SERVICES                     **PeiServices
-  )
-{
-  UINT32      *Bist;
-  UINT64      *Ticker;
-  UINT32      Size;
-  UINT32      Count;
-  UINT32      TopOfTemporaryRam;
-  VOID        *TopOfTemporaryRamPpi;
-  EFI_STATUS  Status;
-
-  DEBUG ((DEBUG_INFO, "SaveSecContext - 0x%x\n", PeiServices));
-
-  Status = (*PeiServices)->LocatePpi (
-                             PeiServices,
-                             &gTopOfTemporaryRamPpiGuid,
-                             0,
-                             NULL,
-                             (VOID **) &TopOfTemporaryRamPpi
-                             );
-  if (EFI_ERROR (Status)) {
-    return ;
-  }
-
-  DEBUG ((DEBUG_INFO, "TopOfTemporaryRamPpi - 0x%x\n", TopOfTemporaryRamPpi));
-
-  //
-  // The entries of BIST information, together with the number of them,
-  // reside in the bottom of stack, left untouched by normal stack operation.
-  // This routine copies the BIST information to the buffer pointed by
-  // PlatformInformationRecord for output.
-  //
-  // |--------------| <- TopOfTemporaryRam
-  // |Number of BSPs|
-  // |--------------|
-  // |     BIST     |
-  // |--------------|
-  // |     ....     |
-  // |--------------|
-  // |  TSC[63:32]  |
-  // |--------------|
-  // |  TSC[31:00]  |
-  // |--------------|
-  //
-
-  TopOfTemporaryRam = (UINT32)(UINTN)TopOfTemporaryRamPpi - sizeof(UINT32);
-  TopOfTemporaryRam -= sizeof(UINT32) * 2;
-  DEBUG ((DEBUG_INFO, "TopOfTemporaryRam - 0x%x\n", TopOfTemporaryRam));
-  Count             = *(UINT32 *)(UINTN)(TopOfTemporaryRam - sizeof(UINT32));
-  DEBUG ((DEBUG_INFO, "Count - 0x%x\n", Count));
-  Size              = Count * sizeof (IA32_HANDOFF_STATUS);
-  DEBUG ((DEBUG_INFO, "Size - 0x%x\n", Size));
-
-  Bist   = (UINT32 *)(UINTN)(TopOfTemporaryRam - sizeof(UINT32) - Size);
-  DEBUG ((DEBUG_INFO, "Bist - 0x%x\n", *Bist));
-  Ticker = (UINT64 *)(UINTN)(TopOfTemporaryRam - sizeof(UINT32) - Size - sizeof(UINT64));
-  DEBUG ((DEBUG_INFO, "Ticker - 0x%lx\n", *Ticker));
-
-  //
-  // Just need record BSP
-  //
-  AsmSaveBistValue (*Bist);
-  AsmSaveTickerValue (*Ticker);
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecGetPerformance.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecGetPerformance.c
deleted file mode 100644
index c5c22a29c2..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecGetPerformance.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/** @file
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-
-#include <Ppi/SecPerformance.h>
-#include <Ppi/TopOfTemporaryRam.h>
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/TimerLib.h>
-#include <Library/DebugLib.h>
-
-/**
-  This interface conveys performance information out of the Security (SEC) phase into PEI.
-
-  This service is published by the SEC phase. The SEC phase handoff has an optional
-  EFI_PEI_PPI_DESCRIPTOR list as its final argument when control is passed from SEC into the
-  PEI Foundation. As such, if the platform supports collecting performance data in SEC,
-  this information is encapsulated into the data structure abstracted by this service.
-  This information is collected for the boot-strap processor (BSP) on IA-32.
-
-  @param[in]  PeiServices  The pointer to the PEI Services Table.
-  @param[in]  This         The pointer to this instance of the PEI_SEC_PERFORMANCE_PPI.
-  @param[out] Performance  The pointer to performance data collected in SEC phase.
-
-  @retval EFI_SUCCESS  The data was successfully returned.
-
-**/
-EFI_STATUS
-EFIAPI
-SecGetPerformance (
-  IN CONST EFI_PEI_SERVICES          **PeiServices,
-  IN       PEI_SEC_PERFORMANCE_PPI   *This,
-  OUT      FIRMWARE_SEC_PERFORMANCE  *Performance
-  )
-{
-  UINT32      Size;
-  UINT32      Count;
-  UINT32      TopOfTemporaryRam;
-  UINT64      Ticker;
-  VOID        *TopOfTemporaryRamPpi;
-  EFI_STATUS  Status;
-
-  DEBUG ((DEBUG_INFO, "SecGetPerformance\n"));
-
-  Status = (*PeiServices)->LocatePpi (
-                             PeiServices,
-                             &gTopOfTemporaryRamPpiGuid,
-                             0,
-                             NULL,
-                             (VOID **) &TopOfTemporaryRamPpi
-                             );
-  if (EFI_ERROR (Status)) {
-    return EFI_NOT_FOUND;
-  }
-
-  //
-  // |--------------| <- TopOfTemporaryRam
-  // |Number of BSPs|
-  // |--------------|
-  // |     BIST     |
-  // |--------------|
-  // |     ....     |
-  // |--------------|
-  // |  TSC[63:32]  |
-  // |--------------|
-  // |  TSC[31:00]  |
-  // |--------------|
-  //
-  TopOfTemporaryRam = (UINT32)(UINTN)TopOfTemporaryRamPpi - sizeof(UINT32);
-  TopOfTemporaryRam -= sizeof(UINT32) * 2;
-  Count             = *(UINT32 *) (UINTN) (TopOfTemporaryRam - sizeof (UINT32));
-  Size              = Count * sizeof (UINT64);
-
-  Ticker = *(UINT64 *) (UINTN) (TopOfTemporaryRam - sizeof (UINT32) - Size - sizeof (UINT32) * 2);
-  Performance->ResetEnd = GetTimeInNanoSecond (Ticker);
-
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecPlatformInformation.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecPlatformInformation.c
deleted file mode 100644
index a1ba35d47d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecPlatformInformation.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/** @file
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-
-#include <Ppi/SecPlatformInformation.h>
-#include <Ppi/TopOfTemporaryRam.h>
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-
-/**
-  This interface conveys state information out of the Security (SEC) phase into PEI.
-
-  @param  PeiServices               Pointer to the PEI Services Table.
-  @param  StructureSize             Pointer to the variable describing size of the input buffer.
-  @param  PlatformInformationRecord Pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD.
-
-  @retval EFI_SUCCESS           The data was successfully returned.
-  @retval EFI_BUFFER_TOO_SMALL  The buffer was too small.
-
-**/
-EFI_STATUS
-EFIAPI
-SecPlatformInformation (
-  IN CONST EFI_PEI_SERVICES                     **PeiServices,
-  IN OUT   UINT64                               *StructureSize,
-     OUT   EFI_SEC_PLATFORM_INFORMATION_RECORD  *PlatformInformationRecord
-  )
-{
-  UINT32      *Bist;
-  UINT32      Size;
-  UINT32      Count;
-  UINT32      TopOfTemporaryRam;
-  VOID        *TopOfTemporaryRamPpi;
-  EFI_STATUS  Status;
-
-  DEBUG ((DEBUG_INFO, "SecPlatformInformation\n"));
-
-  Status = (*PeiServices)->LocatePpi (
-                             PeiServices,
-                             &gTopOfTemporaryRamPpiGuid,
-                             0,
-                             NULL,
-                             (VOID **) &TopOfTemporaryRamPpi
-                             );
-  if (EFI_ERROR (Status)) {
-    return EFI_NOT_FOUND;
-  }
-
-  //
-  // The entries of BIST information, together with the number of them,
-  // reside in the bottom of stack, left untouched by normal stack operation.
-  // This routine copies the BIST information to the buffer pointed by
-  // PlatformInformationRecord for output.
-  //
-  TopOfTemporaryRam = (UINT32)(UINTN)TopOfTemporaryRamPpi - sizeof (UINT32);
-  TopOfTemporaryRam -= sizeof(UINT32) * 2;
-  Count             = *((UINT32 *)(UINTN) (TopOfTemporaryRam - sizeof (UINT32)));
-  Size              = Count * sizeof (IA32_HANDOFF_STATUS);
-
-  if ((*StructureSize) < (UINT64) Size) {
-    *StructureSize = Size;
-    return EFI_BUFFER_TOO_SMALL;
-  }
-
-  *StructureSize  = Size;
-  Bist            = (UINT32 *) (TopOfTemporaryRam - sizeof (UINT32) - Size);
-
-  CopyMem (PlatformInformationRecord, Bist, Size);
-
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecRamInitData.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecRamInitData.c
deleted file mode 100644
index 33734e3111..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecRamInitData.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/** @file
-  Calling Fsp Apis in SEC
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <Library/PcdLib.h>
-
-GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT32 TempRamInitParams[4] = {
-  ((UINT32)FixedPcdGet64 (PcdCpuMicrocodePatchAddress) + FixedPcdGet32 (PcdFlashMicroCodeOffset)),
-  ((UINT32)FixedPcdGet64 (PcdCpuMicrocodePatchRegionSize) - FixedPcdGet32 (PcdFlashMicroCodeOffset)),
-  FixedPcdGet32 (PcdFlashCodeCacheAddress),
-  FixedPcdGet32 (PcdFlashCodeCacheSize)
-};
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecTempRamSupport.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecTempRamSupport.c
deleted file mode 100644
index 8dd1367980..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecTempRamSupport.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/** @file
-  C functions in SEC
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-
-#include <Ppi/TemporaryRamSupport.h>
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/PcdLib.h>
-#include <Library/DebugAgentLib.h>
-
-/**
-  Switch the stack in the temporary memory to the one in the permanent memory.
-
-  This function must be invoked after the memory migration immediately. The relative
-  position of the stack in the temporary and permanent memory is same.
-
-  @param TemporaryMemoryBase  Base address of the temporary memory.
-  @param PermenentMemoryBase  Base address of the permanent memory.
-**/
-VOID
-EFIAPI
-SecSwitchStack (
-  UINT32   TemporaryMemoryBase,
-  UINT32   PermenentMemoryBase
-  );
-
-/**
-  This service of the TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into
-  permanent memory.
-
-  @param PeiServices            Pointer to the PEI Services Table.
-  @param TemporaryMemoryBase    Source Address in temporary memory from which the SEC or PEIM will copy the
-                                Temporary RAM contents.
-  @param PermanentMemoryBase    Destination Address in permanent memory into which the SEC or PEIM will copy the
-                                Temporary RAM contents.
-  @param CopySize               Amount of memory to migrate from temporary to permanent memory.
-
-  @retval EFI_SUCCESS           The data was successfully returned.
-  @retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when
-                                TemporaryMemoryBase > PermanentMemoryBase.
-
-**/
-EFI_STATUS
-EFIAPI
-SecTemporaryRamSupport (
-  IN CONST EFI_PEI_SERVICES   **PeiServices,
-  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,
-  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,
-  IN UINTN                    CopySize
-  )
-{
-  IA32_DESCRIPTOR   IdtDescriptor;
-  VOID*             OldHeap;
-  VOID*             NewHeap;
-  VOID*             OldStack;
-  VOID*             NewStack;
-  DEBUG_AGENT_CONTEXT_POSTMEM_SEC  DebugAgentContext;
-  BOOLEAN           OldStatus;
-  UINTN             PeiStackSize;
-
-  PeiStackSize = (UINTN)PcdGet32 (PcdPeiTemporaryRamStackSize);
-  if (PeiStackSize == 0) {
-    PeiStackSize = (CopySize >> 1);
-  }
-
-  ASSERT (PeiStackSize < CopySize);
-
-  //
-  // |-------------------|---->
-  // |      Stack        |    PeiStackSize
-  // |-------------------|---->
-  // |      Heap         |    PeiTemporayRamSize
-  // |-------------------|---->  TempRamBase
-  //
-  // |-------------------|---->
-  // |      Heap         |    PeiTemporayRamSize
-  // |-------------------|---->
-  // |      Stack        |    PeiStackSize
-  // |-------------------|---->  PermanentMemoryBase
-  //
-
-  OldHeap = (VOID*)(UINTN)TemporaryMemoryBase;
-  NewHeap = (VOID*)((UINTN)PermanentMemoryBase + PeiStackSize);
-
-  OldStack = (VOID*)((UINTN)TemporaryMemoryBase + CopySize - PeiStackSize);
-  NewStack = (VOID*)(UINTN)PermanentMemoryBase;
-
-  DebugAgentContext.HeapMigrateOffset = (UINTN)NewHeap - (UINTN)OldHeap;
-  DebugAgentContext.StackMigrateOffset = (UINTN)NewStack - (UINTN)OldStack;
-
-  OldStatus = SaveAndSetDebugTimerInterrupt (FALSE);
-
-  //
-  // Initialize Debug Agent to support source level debug in PEI phase after memory ready.
-  // It will build HOB and fix up the pointer in IDT table.
-  //
-  InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, (VOID *) &DebugAgentContext, NULL);
-
-  //
-  // Migrate Heap
-  //
-  CopyMem (NewHeap, OldHeap, CopySize - PeiStackSize);
-
-  //
-  // Migrate Stack
-  //
-  CopyMem (NewStack, OldStack, PeiStackSize);
-
-
-  //
-  // We need *not* fix the return address because currently,
-  // The PeiCore is executed in flash.
-  //
-
-  //
-  // Rebase IDT table in permanent memory
-  //
-  AsmReadIdtr (&IdtDescriptor);
-  IdtDescriptor.Base = IdtDescriptor.Base - (UINTN)OldStack + (UINTN)NewStack;
-
-  AsmWriteIdtr (&IdtDescriptor);
-
-
-  //
-  // Program MTRR
-  //
-
-  //
-  // SecSwitchStack function must be invoked after the memory migration
-  // immediately, also we need fixup the stack change caused by new call into
-  // permanent memory.
-  //
-  SecSwitchStack (
-    (UINT32) (UINTN) OldStack,
-    (UINT32) (UINTN) NewStack
-    );
-
-  SaveAndSetDebugTimerInterrupt (OldStatus);
-
-  return EFI_SUCCESS;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/UartInit.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/UartInit.c
deleted file mode 100644
index 2a9ab17120..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/UartInit.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/** @file
-  This PEIM will parse the hoblist from fsp and report them into pei core.
-  This file contains the main entrypoint of the PEIM.
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-
-#include <PiPei.h>
-#include <Library/IoLib.h>
-#include <Library/SerialPortLib.h>
-
-#define PCI_IDX        0xCF8
-#define PCI_DAT        0xCFC
-
-#define PCI_LPC_BASE    (0x8000F800)
-#define PCI_LPC_REG(x)  (PCI_LPC_BASE + (x))
-
-#define PMC_BASE_ADDRESS                  0xFED03000    // PMC Memory Base Address
-#define R_PCH_LPC_PMC_BASE                        0x44  // PBASE, 32bit, 512 Bytes
-#define B_PCH_LPC_PMC_BASE_EN                     BIT1  // Enable Bit
-#define R_PCH_PMC_GEN_PMCON_1                     0x20  // General PM Configuration 1
-#define B_PCH_PMC_GEN_PMCON_SUS_PWR_FLR           BIT14 // SUS Well Power Failure
-#define B_PCH_PMC_GEN_PMCON_PWROK_FLR             BIT16 // PWROK Failure
-
-#define R_PCH_LPC_UART_CTRL                       0x80  // UART Control
-#define B_PCH_LPC_UART_CTRL_COM1_EN               BIT0  // COM1 Enable
-
-#define ILB_BASE_ADDRESS                  0xFED08000    // ILB Memory Base Address
-#define R_PCH_ILB_IRQE                            0x88  // IRQ Enable Control
-
-#define IO_BASE_ADDRESS                   0xFED0C000    // IO Memory Base Address
-
-#define V_PCH_ILB_IRQE_UARTIRQEN_IRQ3             BIT3  // UART IRQ3 Enable
-#define V_PCH_ILB_IRQE_UARTIRQEN_IRQ4             BIT4  // UART IRQ4 Enable
-#define PCIEX_BASE_ADDRESS                        0xE0000000
-#define PCI_EXPRESS_BASE_ADDRESS                  PCIEX_BASE_ADDRESS
-#define PciD31F0RegBase                           PCIEX_BASE_ADDRESS + (UINT32) (31 << 15)
-#define SB_RCBA                                   0xfed1c000
-
-typedef enum {
-  PchA0         = 0,
-  PchA1         = 1,
-  PchB0         = 2,
-  PchB1         = 3,
-  PchB2         = 4,
-  PchB3         = 5,
-  PchC0         = 6,
-  PchSteppingMax
-} PCH_STEPPING;
-
-#define MmPciAddress( Segment, Bus, Device, Function, Register ) \
-  ( (UINTN)PCI_EXPRESS_BASE_ADDRESS + \
-    (UINTN)(Bus << 20) + \
-    (UINTN)(Device << 15) + \
-    (UINTN)(Function << 12) + \
-    (UINTN)(Register) \
-  )
-
-#define DEFAULT_PCI_BUS_NUMBER_PCH  0
-#define PCI_DEVICE_NUMBER_PCH_LPC                 31
-#define PCI_FUNCTION_NUMBER_PCH_LPC               0
-
-#define R_PCH_LPC_RID_CC                          0x08  // Revision ID & Class Code
-
-#define V_PCH_LPC_RID_0                           0x01  // A0 Stepping (17 x 17)
-#define V_PCH_LPC_RID_1                           0x02  // A0 Stepping (25 x 27)
-#define V_PCH_LPC_RID_2                           0x03  // A1 Stepping (17 x 17)
-#define V_PCH_LPC_RID_3                           0x04  // A1 Stepping (25 x 27)
-#define V_PCH_LPC_RID_4                           0x05  // B0 Stepping (17 x 17)
-#define V_PCH_LPC_RID_5                           0x06  // B0 Stepping (25 x 27)
-#define V_PCH_LPC_RID_6                           0x07  // B1 Stepping (17 x 17)
-#define V_PCH_LPC_RID_7                           0x08  // B1 Stepping (25 x 27)
-#define V_PCH_LPC_RID_8                           0x09  // B2 Stepping (17 x 17)
-#define V_PCH_LPC_RID_9                           0x0A  // B2 Stepping (25 x 27)
-#define V_PCH_LPC_RID_A                           0x0B  // B3 Stepping (17 x 17)
-#define V_PCH_LPC_RID_B                           0x0C  // B3 Stepping (25 x 27)
-#define V_PCH_LPC_RID_C                           0x0D  // C0 Stepping (17 x 17)
-#define V_PCH_LPC_RID_D                           0x0E  // C0 Stepping (25 x 27)
-
-/**
-  Return Pch stepping type
-
-  @param[in] None
-
-  @retval PCH_STEPPING            Pch stepping type
-
-**/
-PCH_STEPPING
-EFIAPI
-PchStepping (
-  VOID
-  )
-{
-  UINT8 RevId;
-
-  RevId = MmioRead8 (
-          MmPciAddress (0,
-            DEFAULT_PCI_BUS_NUMBER_PCH,
-            PCI_DEVICE_NUMBER_PCH_LPC,
-            PCI_FUNCTION_NUMBER_PCH_LPC,
-            R_PCH_LPC_RID_CC)
-          );
-
-  switch (RevId) {
-    case V_PCH_LPC_RID_0:
-    case V_PCH_LPC_RID_1:
-      return PchA0;
-      break;
-
-    case V_PCH_LPC_RID_2:
-    case V_PCH_LPC_RID_3:
-      return PchA1;
-      break;
-
-    case V_PCH_LPC_RID_4:
-    case V_PCH_LPC_RID_5:
-      return PchB0;
-      break;
-
-    case V_PCH_LPC_RID_6:
-    case V_PCH_LPC_RID_7:
-      return PchB1;
-      break;
-
-    case V_PCH_LPC_RID_8:
-    case V_PCH_LPC_RID_9:
-      return PchB2;
-      break;
-
-    case V_PCH_LPC_RID_A:
-    case V_PCH_LPC_RID_B:
-      return PchB3;
-      break;
-
-    case V_PCH_LPC_RID_C:
-    case V_PCH_LPC_RID_D:
-      return PchC0;
-      break;
-
-    default:
-      return PchSteppingMax;
-      break;
-
-  }
-}
-
-/**
-  Enable legacy decoding on ICH6
-
- @param[in] none
-
- @retval EFI_SUCCESS     Always returns success.
-
-**/
-VOID
-EnableInternalUart(
-  VOID
-  )
-{
-
-  //
-  // Program and enable PMC Base.
-  //
-  IoWrite32 (PCI_IDX,  PCI_LPC_REG(R_PCH_LPC_PMC_BASE));
-  IoWrite32 (PCI_DAT,  (PMC_BASE_ADDRESS | B_PCH_LPC_PMC_BASE_EN));
-
-  //
-  // Enable COM1 for debug message output.
-  //
-  MmioAndThenOr32 (PMC_BASE_ADDRESS + R_PCH_PMC_GEN_PMCON_1, (UINT32) (~(B_PCH_PMC_GEN_PMCON_SUS_PWR_FLR + B_PCH_PMC_GEN_PMCON_PWROK_FLR)), BIT24);
-
-  //
-  // Silicon Steppings
-  //
-  if (PchStepping()>= PchB0)
-    MmioOr8 (ILB_BASE_ADDRESS + R_PCH_ILB_IRQE, (UINT8) V_PCH_ILB_IRQE_UARTIRQEN_IRQ4);
-  else
-    MmioOr8 (ILB_BASE_ADDRESS + R_PCH_ILB_IRQE, (UINT8) V_PCH_ILB_IRQE_UARTIRQEN_IRQ3);
-  MmioAnd32(IO_BASE_ADDRESS + 0x0520, (UINT32)~(0x00000187));
-  MmioOr32 (IO_BASE_ADDRESS + 0x0520, (UINT32)0x81); // UART3_RXD-L
-  MmioAnd32(IO_BASE_ADDRESS + 0x0530, (UINT32)~(0x00000007));
-  MmioOr32 (IO_BASE_ADDRESS + 0x0530, (UINT32)0x1); // UART3_RXD-L
-  MmioOr8 (PciD31F0RegBase + R_PCH_LPC_UART_CTRL, (UINT8) B_PCH_LPC_UART_CTRL_COM1_EN);
-
-  SerialPortInitialize ();
-  SerialPortWrite ((UINT8 *)"EnableInternalUart!\r\n", sizeof("EnableInternalUart!\r\n") - 1);
-
-  return  ;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.h
deleted file mode 100644
index 415e53daf2..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  Tpm.h
-
-Abstract:
-
-
---*/
-
-#ifndef __EFI_TPM_MP_DRIVER_PROTOCOL_H__
-#define __EFI_TPM_MP_DRIVER_PROTOCOL_H__
-
-
-#define EFI_TPM_MP_DRIVER_PROTOCOL_GUID \
-  { 0xde161cfe, 0x1e60, 0x42a1, 0x8c, 0xc3, 0xee, 0x7e, 0xf0, 0x73, 0x52, 0x12 }
-
-
-EFI_FORWARD_DECLARATION (EFI_TPM_MP_DRIVER_PROTOCOL);
-
-#define TPM_DRIVER_STATUS         0
-#define TPM_DEVICE_STATUS         1
-
-#define TPM_DRIVER_OK             0
-#define TPM_DRIVER_FAILED         1
-#define TPM_DRIVER_NOT_OPENED     2
-#define TPM_DEVICE_OK             0
-#define TPM_DEVICE_UNRECOVERABLE  1
-#define TPM_DEVICE_RECOVERABLE    2
-#define TPM_DEVICE_NOT_FOUND      3
-
-//
-// Prototypes for the TPM MP Driver Protocol
-//
-
-/**
-  This service Open the TPM interface
-
-  @param[in] This             A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.
-
-  @retval  EFI_SUCCESS        Operation completed successfully
-  @retval  EFI_DEVICE_ERROR   The command was unsuccessful
-  @retval  EFI_NOT_FOUND      The component was not running
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_TPM_MP_INIT) (
-  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This
-  );
-
-/**
-  This service close the TPM interface and deactivate TPM
-
-  @param[in] This            A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.
-
-  @retval EFI_SUCCESS        Operation completed successfully
-  @retval EFI_DEVICE_ERROR   The command was unsuccessful
-  @retval EFI_NOT_FOUND      The component was not running
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_TPM_MP_CLOSE) (
-  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This
-  );
-
-/**
-  This service get the current status infomation of TPM
-
-  @param[in]  This                  A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.
-  @param[in]  ReqStatusType	        Requested type of status information, driver or device.
-  @param[in]  Status	              Pointer to the returned status.
-
-  @retval  EFI_SUCCESS              Operation completed successfully
-  @retval  EFI_DEVICE_ERROR         The command was unsuccessful
-  @retval  EFI_INVALID_PARAMETER    One or more of the parameters are incorrect
-  @retval  EFI_BUFFER_TOO_SMALL     The receive buffer is too small
-  @retval  EFI_NOT_FOUND            The component was not running
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_TPM_MP_GET_STATUS_INFO) (
-  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This,
-  IN UINT32				                ReqStatusType,
-  OUT UINT32				              *Status
-  );
-
-/**
-  This service transmit data to the TPM and get response from TPM
-
-  @param[in] This                  A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.
-  @param[in] TransmitBuf	         Pointer to a buffer containing TPM transmit data.
-  @param[in] TransmitBufLen	       Sizeof TPM input buffer in bytes.
-  @param[in] ReceiveBuf	           Pointer to a buffer containing TPM receive data.
-  @param[in]  ReceiveBufLen	       On input, size of TPM receive buffer in bytes.
-                                   On output, number of bytes written.
-
-  @retval  EFI_SUCCESS             Operation completed successfully
-  @retval  EFI_DEVICE_ERROR        The command was unsuccessful
-  @retval  EFI_INVALID_PARAMETER   One or more of the parameters are incorrect
-  @retval  EFI_BUFFER_TOO_SMALL    The receive buffer is too small
-  @retval  EFI_NOT_FOUND           The component was not running
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_TPM_MP_TRANSMIT) (
-  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This,
-  IN UINT8				  	            *TransmitBuffer,
-  IN UINT32			  	              TransmitBufferLen,
-  OUT UINT8				  	            *ReceiveBuf,
-  IN OUT UINT32			  	          *ReceiveBufLen
-  );
-
-
-
-typedef struct _EFI_TPM_MP_DRIVER_PROTOCOL {
-  EFI_TPM_MP_INIT			              Init;
-  EFI_TPM_MP_CLOSE			            Close;
-  EFI_TPM_MP_GET_STATUS_INFO 		    GetStatusInfo;
-  EFI_TPM_MP_TRANSMIT		            Transmit;
-} EFI_TPM_MP_DRIVER_PROTOCOL;
-
-extern EFI_GUID gEfiTpmMpDriverProtocolGuid;
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPolicy.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPolicy.h
deleted file mode 100644
index 16e9f9c6bc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPolicy.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-  UsbPolicy.h
-
-Abstract:
-
---*/
-
-#ifndef _USB_POLICY_H_
-#define _USB_POLICY_H_
-
-EFI_FORWARD_DECLARATION (EFI_USB_POLICY_PROTOCOL);
-
-#define USB_POLICY_GUID \
-  {\
-    0xf617b358, 0x12cf, 0x414a, 0xa0, 0x69, 0x60, 0x67, 0x7b, 0xda, 0x13, 0xb4\
-  }
-
-#define TIANO_CODE_BASE           0x00
-#define ICBD_CODE_BASE            0x01
-
-#define ATUO_TYPE                 0x00
-#define USB_FDD_TYPE              0x01
-#define HDD_TYPE                  0x02
-#define ZIP_TYPE                  0x03
-#define CDROM_TYPE                0x04
-#define SIZE_TYPE                 0x05
-
-#define ZIP_FDD                 0x80
-
-#define FDD_EMULATION             0x00
-#define HDD_EMULATION             0x01
-
-#define HIGH_SPEED                0x00
-#define FULL_SPEED                0x01
-#define SUPER_SPEED               0x02
-
-#define LEGACY_KB_EN              0x01
-#define LEGACY_KB_DIS             0x00
-#define LEGACY_MS_EN              0x01
-#define LEGACY_MS_DIS             0x00
-#define LEGACY_USB_EN             0x00
-#define LEGACY_USB_DIS            0x01
-#define LEGACY_FREE_SUPP          0x01
-#define LEGACY_FREE_UN_SUPP       0x00
-#define LEGACY_PERIOD_SUPP        0x01
-#define LEGACY_PERIOD_UN_SUPP     0x00
-
-#define LEGACY_USB_TIME_TUE_ENABLE       0x01
-#define LEGACY_USB_TIME_TUE_DISABLE      0x00
-#define USB_HAVE_HUB_INTERNEL            0x01
-#define USB_NOT_HAVE_HUB_INTERNEL        0x00
-
-#define USB_POLICY_PROTOCOL_REVISION_1 1
-#define USB_POLICY_PROTOCOL_REVISION_2 2
-
-#ifndef __GNUC__
-#pragma warning ( disable : 4306 )
-#pragma warning ( disable : 4054 )
-#endif
-
-#define GET_USB_CFG (UsbCfg);\
- do{\
-  UINT16                *pSegOfEbda;\
-  UINT32                mToEbda;\
-  pSegOfEbda = (UINT16 *)(UINTN)0x40E;\
-  mToEbda    = (UINT32)(((UINTN)(*pSegOfEbda) << 4) + 0x80);\
-  UsbCfg     = (USB_CFG *)(UINTN)mToEbda;\
- }while(0);
-
-#pragma    pack(1)
-typedef struct {
-    UINT8   HasUSBKeyboard:1;
-    UINT8   HasUSBMouse:1;
-    UINT8   LegacyFreeSupport:1;
-    UINT8   UsbOperationMode:1;
-    UINT8   LegacyKBEnable:1;
-    UINT8   LegacyMSEnable:1;
-    UINT8   USBPeriodSupport:1;
-    UINT8   Reserved:1;
-} USB_DEVICE_INFOR;
-
-typedef struct {
-    UINT8               Codebase;
-    UINT8               USBHDDForceType;
-    UINT8               Configurated;
-    UINT8               LpcAcpiBase;
-    UINT8               AcpiTimerReg;
-    UINT8               Reserved1[0x01];
-    UINT8               LegacyUsbEnable;
-    USB_DEVICE_INFOR    UsbDeviceInfor;
-    UINT16              UsbEmulationSize;
-    UINT8               Reserved2[0x06];
-} USB_CFG;
-#pragma pack()
-
-typedef struct _EFI_USB_POLICY_PROTOCOL{
-  UINT8   Version;
-  UINT8   UsbMassStorageEmulationType;  // 1: FDD_Type; 2: HDD_Type; other:Auto_Type*
-  UINT8   UsbOperationMode;             // 0: High_Speed; 1: Full_Speed;
-  UINT8   LegacyKBEnable;               // 0: Disabled;   1: Enabled*
-  UINT8   LegacyMSEnable;               // 0: Disabled;   1: Enabled*
-  UINT8   USBPeriodSupport;             // 0; Unsupport;  1: Support
-  UINT8   LegacyUsbEnable;              // 1: Disabled;   0: Enabled*
-  UINT8   LegacyFreeSupport;            // 0: Unsupport;  1: Support
-  UINT8   CodeBase;
-  UINT8   LpcAcpiBase;                  // 40h(default)
-  UINT8   AcpiTimerReg;
-  UINT8   UsbTimeTue;
-  UINT8   InternelHubExist;             // 1: Host have internel hub on board; 0: No internel hub on board
-  UINT8   EnumWaitPortStableStall;      // Value for wait port stable when enum a new dev.
-  UINT16  UsbEmulationSize;             // Mbytes.
-  UINT8   UsbZipEmulationType;
-  UINT8   Reserved[3];                  // Reserved fields for future expansion w/o protocol change
-} EFI_USB_POLICY_PROTOCOL;
-
-extern EFI_GUID gUsbPolicyGuid;
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c
deleted file mode 100644
index 85f066a9e3..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*++
-
-Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  I2CLib.c
-
-
-
---*/
-#ifdef ECP_FLAG
-#include "EdkIIGlueDxe.h"
-#else
-#include <Library/DebugLib.h>
-#include <Library/TimerLib.h>
-#endif
-#include <PchRegs/PchRegsPcu.h>
-#include <PchRegs.h>
-#include <PlatformBaseAddresses.h>
-#include <PchRegs/PchRegsLpss.h>
-#ifdef ECP_FLAG
-#include "I2CLib.h"
-#else
-#include <Library/I2CLib.h>
-#endif
-#include <Protocol/GlobalNvsArea.h>
-#ifndef ECP_FLAG
-#include <Library/UefiBootServicesTableLib.h>
-#endif
-
-EFI_STATUS ByteReadI2C(
-  IN  UINT8 BusNo,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer
-  )
-{
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
deleted file mode 100644
index d669a4eaf8..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
+++ /dev/null
@@ -1,39 +0,0 @@
-## @file
-# Null instance of Debug Agent Library with empty functions.
-#
-#  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-#
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = I2CLib
-  FILE_GUID                      = 7f62bf44-2ba7-4c2d-9d4a-91c8906ff053
-  MODULE_TYPE                    = BASE
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = I2CLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources.common]
-  I2CLib.c
-
-[LibraryClasses]
-  BaseLib
-  IoLib
-  TimerLib
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-
-[Protocols]
-  gEfiGlobalNvsAreaProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLib.c
deleted file mode 100644
index 104c2ded43..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLib.c
+++ /dev/null
@@ -1,735 +0,0 @@
-/** @file
-  Functions for accessing I2C registers.
-  
-  Copyright (c) 2004  - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                               
---*/
-
-#include <Library/DebugLib.h>
-#include <Library/TimerLib.h>
-#include <PchRegs/PchRegsPcu.h> 
-#include <PchRegs.h>
-#include <PlatformBaseAddresses.h>
-#include <PchRegs/PchRegsLpss.h> 
-#include <Library/I2CLib.h>
-#include <Protocol/GlobalNvsArea.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <I2CRegs.h>
-
-#define GLOBAL_NVS_OFFSET(Field)    (UINTN)((CHAR8*)&((EFI_GLOBAL_NVS_AREA*)0)->Field - (CHAR8*)0)
-
-#define PCIEX_BASE_ADDRESS  0xE0000000
-#define PCI_EXPRESS_BASE_ADDRESS ((VOID *) (UINTN) PCIEX_BASE_ADDRESS)
-#define MmPciAddress( Segment, Bus, Device, Function, Register ) \
-         ((UINTN)PCI_EXPRESS_BASE_ADDRESS + \
-         (UINTN)(Bus << 20) + \
-         (UINTN)(Device << 15) + \
-         (UINTN)(Function << 12) + \
-         (UINTN)(Register) \
-        )
-#define PCI_D31F0_REG_BASE             PCIEX_BASE_ADDRESS + (UINT32) (31 << 15)
-
-typedef struct _LPSS_PCI_DEVICE_INFO {
-  UINTN        Segment;
-  UINTN        BusNum;
-  UINTN        DeviceNum;
-  UINTN        FunctionNum;
-  UINTN        Bar0;
-  UINTN        Bar1;
-} LPSS_PCI_DEVICE_INFO;
-
-LPSS_PCI_DEVICE_INFO  mLpssPciDeviceList[] = {
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_DMAC1, PCI_FUNCTION_NUMBER_PCH_LPSS_DMAC, 0xFE900000, 0xFE908000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C0, 0xFE910000, 0xFE918000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C1, 0xFE920000, 0xFE928000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C2, 0xFE930000, 0xFE938000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C3, 0xFE940000, 0xFE948000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C4, 0xFE950000, 0xFE958000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C5, 0xFE960000, 0xFE968000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C6, 0xFE970000, 0xFE978000}
-};
-
-#define LPSS_PCI_DEVICE_NUMBER  sizeof(mLpssPciDeviceList)/sizeof(LPSS_PCI_DEVICE_INFO)
-
-STATIC UINTN mI2CBaseAddress = 0;
-STATIC UINT16 mI2CSlaveAddress = 0;
-
-UINT16 mI2cMode=B_IC_RESTART_EN | B_IC_SLAVE_DISABLE | B_MASTER_MODE ;
-
-UINTN mI2cNvsBaseAddress[] = {
-        GLOBAL_NVS_OFFSET(LDMA2Addr),
-        GLOBAL_NVS_OFFSET(I2C1Addr),
-        GLOBAL_NVS_OFFSET(I2C2Addr),
-        GLOBAL_NVS_OFFSET(I2C3Addr),
-        GLOBAL_NVS_OFFSET(I2C4Addr),
-        GLOBAL_NVS_OFFSET(I2C5Addr),
-        GLOBAL_NVS_OFFSET(I2C6Addr),
-        GLOBAL_NVS_OFFSET(I2C7Addr)
-      };
-
-/**
-  This function get I2Cx controller base address (BAR0).
-
-  @param I2cControllerIndex  Bus Number of I2C controller.
-
-  @return I2C BAR. 
-**/
-UINTN
-GetI2cBarAddr(
-  IN    UINT8 I2cControllerIndex
-  )
-{
-  EFI_STATUS           Status;
-  EFI_GLOBAL_NVS_AREA_PROTOCOL  *GlobalNvsArea;
-  UINTN  AcpiBaseAddr;
-  UINTN  PciMmBase=0;
-
-  ASSERT(gBS!=NULL);
-
-  Status = gBS->LocateProtocol (
-                  &gEfiGlobalNvsAreaProtocolGuid,
-                  NULL,
-                  &GlobalNvsArea
-                  );
-                  
-  //
-  // PCI mode from PEI ( Global NVS is not ready).
-  //
-  if (EFI_ERROR(Status)) {
-    DEBUG ((EFI_D_INFO, "GetI2cBarAddr() gEfiGlobalNvsAreaProtocolGuid:%r\n", Status));
-    //
-    // Global NVS is not ready.
-    //
-    return 0;
-  }
-
-  AcpiBaseAddr =  *(UINTN*)((CHAR8*)GlobalNvsArea->Area + mI2cNvsBaseAddress[I2cControllerIndex + 1]);
-  
-  //
-  //PCI mode from DXE (global NVS protocal) to LPSS OnReadytoBoot(swith to ACPI).
-  //
-  if(AcpiBaseAddr==0) {
-    PciMmBase = MmPciAddress (
-                  mLpssPciDeviceList[I2cControllerIndex + 1].Segment,
-                  mLpssPciDeviceList[I2cControllerIndex + 1].BusNum,
-                  mLpssPciDeviceList[I2cControllerIndex + 1].DeviceNum,
-                  mLpssPciDeviceList[I2cControllerIndex + 1].FunctionNum,
-                  0
-                  );
-    DEBUG((EFI_D_ERROR, "\nGetI2cBarAddr() I2C Device %x %x %x PciMmBase:%x\n", \
-           mLpssPciDeviceList[I2cControllerIndex + 1].BusNum, \
-           mLpssPciDeviceList[I2cControllerIndex + 1].DeviceNum, \
-           mLpssPciDeviceList[I2cControllerIndex + 1].FunctionNum, PciMmBase));
-
-    if (MmioRead32 (PciMmBase) != 0xFFFFFFFF)    {
-      if((MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_STSCMD)& B_PCH_LPSS_I2C_STSCMD_MSE)) {
-        //
-        // Get the address allocted.
-        //
-        mLpssPciDeviceList[I2cControllerIndex + 1].Bar0=MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR);     
-        mLpssPciDeviceList[I2cControllerIndex + 1].Bar1=MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR1);
-      }
-    }
-    AcpiBaseAddr =mLpssPciDeviceList[I2cControllerIndex+1].Bar0;
-  }
-  
-  //
-  // ACPI mode from BDS: LPSS OnReadytoBoot
-  //
-  else {
-    DEBUG ((EFI_D_INFO, "GetI2cBarAddr() NVS Varialable is updated by this LIB or LPSS  \n"));
-  }
-  
-  DEBUG ((EFI_D_INFO, "GetI2cBarAddr() I2cControllerIndex+1 0x%x AcpiBaseAddr:0x%x \n", (I2cControllerIndex + 1), AcpiBaseAddr));
-  return AcpiBaseAddr;
-}
-
-
-/**
-  This function enables I2C controllers.
-
-  @param I2cControllerIndex  Bus Number of I2C controllers.
-
-  @return Result of the I2C initialization.
-**/
-EFI_STATUS
-ProgramPciLpssI2C (
-  IN  UINT8 I2cControllerIndex
-  )
-{
-  UINT32                        PmcBase;
-  UINTN                         PciMmBase=0;
-  EFI_STATUS                    Status;
-  EFI_GLOBAL_NVS_AREA_PROTOCOL  *GlobalNvsArea;
-
-  UINT32 PmcFunctionDsiable[]= {
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC1,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC2,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC3,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC4,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC5,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC6,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC7
-  };
-
-  DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() Start\n"));
-
-  //
-  // Set the VLV Function Disable Register to ZERO
-  //
-  PmcBase = MmioRead32 (PCI_D31F0_REG_BASE + R_PCH_LPC_PMC_BASE) & B_PCH_LPC_PMC_BASE_BAR;
-  if(MmioRead32(PmcBase+R_PCH_PMC_FUNC_DIS)&PmcFunctionDsiable[I2cControllerIndex]) {
-    DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() End:I2C[%x] is disabled\n",I2cControllerIndex));
-    return EFI_NOT_READY;
-  }
-  
-  DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C()------------I2cControllerIndex=%x,PMC=%x\n",I2cControllerIndex,MmioRead32(PmcBase+R_PCH_PMC_FUNC_DIS)));
-
-  {
-    PciMmBase = MmPciAddress (
-                  mLpssPciDeviceList[I2cControllerIndex+1].Segment,
-                  mLpssPciDeviceList[I2cControllerIndex+1].BusNum,
-                  mLpssPciDeviceList[I2cControllerIndex+1].DeviceNum,
-                  mLpssPciDeviceList[I2cControllerIndex+1].FunctionNum,
-                  0
-                  );
-                  
-    DEBUG((EFI_D_ERROR, "Program Pci Lpss I2C Device  %x %x %x PciMmBase:%x\n", \
-           mLpssPciDeviceList[I2cControllerIndex+1].BusNum, \
-           mLpssPciDeviceList[I2cControllerIndex+1].DeviceNum, \
-           mLpssPciDeviceList[I2cControllerIndex+1].FunctionNum, PciMmBase));
-
-    if (MmioRead32 (PciMmBase) != 0xFFFFFFFF)     {
-      if((MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_STSCMD)& B_PCH_LPSS_I2C_STSCMD_MSE)) {
-        //
-        // Get the address allocted.
-        //
-        mLpssPciDeviceList[I2cControllerIndex+1].Bar0=MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR);     
-        mLpssPciDeviceList[I2cControllerIndex+1].Bar1=MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR1);
-        DEBUG((EFI_D_ERROR, "ProgramPciLpssI2C() bar0:0x%x bar1:0x%x\n",mLpssPciDeviceList[I2cControllerIndex+1].Bar0, mLpssPciDeviceList[I2cControllerIndex+1].Bar1));
-      } else {
-        
-        //
-        // Program BAR 0
-        //
-        ASSERT (((mLpssPciDeviceList[I2cControllerIndex+1].Bar0 & B_PCH_LPSS_I2C_BAR_BA) == mLpssPciDeviceList[I2cControllerIndex+1].Bar0) && (mLpssPciDeviceList[I2cControllerIndex+1].Bar0 != 0));
-        MmioWrite32 ((UINTN) (PciMmBase + R_PCH_LPSS_I2C_BAR), (UINT32) (mLpssPciDeviceList[I2cControllerIndex+1].Bar0 & B_PCH_LPSS_I2C_BAR_BA));
-       
-        //
-        // Program BAR 1
-        //
-        ASSERT (((mLpssPciDeviceList[I2cControllerIndex+1].Bar1 & B_PCH_LPSS_I2C_BAR1_BA) == mLpssPciDeviceList[I2cControllerIndex+1].Bar1) && (mLpssPciDeviceList[I2cControllerIndex+1].Bar1 != 0));
-        MmioWrite32 ((UINTN) (PciMmBase + R_PCH_LPSS_I2C_BAR1), (UINT32) (mLpssPciDeviceList[I2cControllerIndex+1].Bar1 & B_PCH_LPSS_I2C_BAR1_BA));
-        
-        //
-        // Bus Master Enable & Memory Space Enable
-        //
-        MmioOr32 ((UINTN) (PciMmBase + R_PCH_LPSS_I2C_STSCMD), (UINT32) (B_PCH_LPSS_I2C_STSCMD_BME | B_PCH_LPSS_I2C_STSCMD_MSE));
-        ASSERT (MmioRead32 (mLpssPciDeviceList[I2cControllerIndex+1].Bar0) != 0xFFFFFFFF);
-      }
-      
-      //
-      // Release Resets
-      //
-      MmioWrite32 (mLpssPciDeviceList[I2cControllerIndex+1].Bar0 + R_PCH_LPIO_I2C_MEM_RESETS,(B_PCH_LPIO_I2C_MEM_RESETS_FUNC | B_PCH_LPIO_I2C_MEM_RESETS_APB));
-      
-      //
-      // Activate Clocks
-      //
-      MmioWrite32 (mLpssPciDeviceList[I2cControllerIndex+1].Bar0 + R_PCH_LPSS_I2C_MEM_PCP,0x80020003);//No use for A0
-
-      DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() Programmed()\n"));
-    }
-    
-    //
-    // BDS: already switched to ACPI mode
-    //
-    else {
-      ASSERT(gBS!=NULL);
-      Status = gBS->LocateProtocol (
-                      &gEfiGlobalNvsAreaProtocolGuid,
-                      NULL,
-                      &GlobalNvsArea
-                      );
-      if (EFI_ERROR(Status)) {
-        DEBUG ((EFI_D_INFO, "GetI2cBarAddr() gEfiGlobalNvsAreaProtocolGuid:%r\n", Status));
-        //
-        // gEfiGlobalNvsAreaProtocolGuid is not ready.
-        //
-        return 0;
-      }
-      mLpssPciDeviceList[I2cControllerIndex + 1].Bar0 = *(UINTN*)((CHAR8*)GlobalNvsArea->Area + mI2cNvsBaseAddress[I2cControllerIndex + 1]);
-      DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C(): is switched to ACPI 0x:%x \n",mLpssPciDeviceList[I2cControllerIndex + 1].Bar0));
-    }
-  }
-  
-  DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() End\n"));
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Disable I2C Bus.
-
-  @param VOID.
-
-  @return Result of the I2C disabling.
-**/
-RETURN_STATUS
-I2cDisable (
-  VOID
-  )
-{ 
-  //
-  // 0.1 seconds
-  //
-  UINT32 NumTries = 10000;
-  
-  MmioWrite32 ( mI2CBaseAddress + R_IC_ENABLE, 0 );
-  while ( 0 != ( MmioRead32 ( mI2CBaseAddress + R_IC_ENABLE_STATUS) & 1)) {
-    MicroSecondDelay (10);
-    NumTries --;
-    if(0 == NumTries) {
-      return RETURN_NOT_READY;
-    }
-  }
-  
-  return RETURN_SUCCESS;
-}
-
-/**
-  Enable I2C Bus.
-
-  @param VOID.
-
-  @return Result of the I2C disabling.
-**/
-RETURN_STATUS
-I2cEnable (
-  VOID
-  )
-{
-  //
-  // 0.1 seconds
-  //
-  UINT32 NumTries = 10000;
-  
-  MmioWrite32 (mI2CBaseAddress + R_IC_ENABLE, 1);
-  
-  while (0 == (MmioRead32 (mI2CBaseAddress + R_IC_ENABLE_STATUS) & 1)) {
-    MicroSecondDelay (10);
-    NumTries --;
-    if(0 == NumTries){
-       return RETURN_NOT_READY;
-    }
-  }
-  
-  return RETURN_SUCCESS;
-}
-
-/**
-  Enable I2C Bus.
-
-  @param VOID.
-
-  @return Result of the I2C enabling.
-**/
-RETURN_STATUS
-I2cBusFrequencySet (
-  IN UINTN BusClockHertz
-  )
-{
-  DEBUG((EFI_D_INFO,"InputFreq BusClockHertz: %d\r\n",BusClockHertz));
-  
-  //
-  //  Set the 100 KHz clock divider according to SV result and I2C spec
-  //
-  MmioWrite32 ( mI2CBaseAddress + R_IC_SS_SCL_HCNT, (UINT16)0x214 );
-  MmioWrite32 ( mI2CBaseAddress + R_IC_SS_SCL_LCNT, (UINT16)0x272 );
-  
-  //
-  //  Set the 400 KHz clock divider according to SV result and I2C spec
-  //
-  MmioWrite32 ( mI2CBaseAddress + R_IC_FS_SCL_HCNT, (UINT16)0x50 );
-  MmioWrite32 ( mI2CBaseAddress + R_IC_FS_SCL_LCNT, (UINT16)0xAD );
-
-  switch ( BusClockHertz ) {
-    case 100 * 1000:
-      MmioWrite32 ( mI2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x40);//100K
-      mI2cMode = V_SPEED_STANDARD;
-      break;
-    case 400 * 1000:
-      MmioWrite32 ( mI2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x32);//400K
-      mI2cMode = V_SPEED_FAST;
-      break;
-    default:
-      MmioWrite32 ( mI2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x09);//3.4M
-      mI2cMode = V_SPEED_HIGH;
-  }
-
-  //
-  //  Select the frequency counter,
-  //  Enable restart condition,
-  //  Enable master FSM, disable slave FSM.
-  //
-  mI2cMode |= B_IC_RESTART_EN | B_IC_SLAVE_DISABLE | B_MASTER_MODE;
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Initializes the host controller to execute I2C commands.
-
-  @param I2cControllerIndex Index of I2C controller in LPSS device. 0 represents I2C0, which is PCI function 1 of LPSS device.   
-                                
-  @return EFI_SUCCESS       Opcode initialization on the I2C host controller completed.
-  @return EFI_DEVICE_ERROR  Device error, operation failed.
-**/
-EFI_STATUS
-I2CInit (
-  IN  UINT8  I2cControllerIndex,
-  IN  UINT16 SlaveAddress
-  )
-{
-  EFI_STATUS Status=RETURN_SUCCESS;
-  UINT32    NumTries = 0;
-  UINTN    GnvsI2cBarAddr=0;
-  
-  //
-  // Verify the parameters
-  //
-  if ((1023 < SlaveAddress) || (6 < I2cControllerIndex)) {
-    Status =  RETURN_INVALID_PARAMETER;
-    DEBUG((EFI_D_INFO,"I2CInit Exit with RETURN_INVALID_PARAMETER\r\n"));
-    return Status;
-  }
-  MmioWrite32 ( mI2CBaseAddress + R_IC_TAR, (UINT16)SlaveAddress );
-  mI2CSlaveAddress = SlaveAddress;
-
-  //
-  // 1.PEI: program and init ( before pci enumeration).
-  // 2.DXE:update address and re-init ( after pci enumeration).
-  // 3.BDS:update ACPI address and re-init ( after acpi mode is enabled).
-  //
-  if(mI2CBaseAddress == mLpssPciDeviceList[I2cControllerIndex + 1].Bar0) {
-    
-    //
-    // I2CInit is already  called.
-    //
-    GnvsI2cBarAddr=GetI2cBarAddr(I2cControllerIndex);
-    
-    if((GnvsI2cBarAddr == 0)||(GnvsI2cBarAddr == mI2CBaseAddress)) {
-      DEBUG((EFI_D_INFO,"I2CInit Exit with mI2CBaseAddress:%x == [%x].Bar0\r\n",mI2CBaseAddress,I2cControllerIndex+1));
-      return RETURN_SUCCESS;
-    }
-  }
-  
-  Status=ProgramPciLpssI2C(I2cControllerIndex);
-  if(Status!=EFI_SUCCESS) {
-    return Status;
-  }
-
-
-  mI2CBaseAddress = (UINT32) mLpssPciDeviceList[I2cControllerIndex + 1].Bar0;
-  DEBUG ((EFI_D_ERROR, "mI2CBaseAddress = 0x%x \n",mI2CBaseAddress));
-  
-  //
-  // 1 seconds.
-  //
-  NumTries = 10000; 
-  while ((1 == ( MmioRead32 ( mI2CBaseAddress + R_IC_STATUS) & STAT_MST_ACTIVITY ))) {
-    MicroSecondDelay(10);
-    NumTries --;
-    if(0 == NumTries) {
-      DEBUG((EFI_D_INFO, "Try timeout\r\n"));
-      return RETURN_DEVICE_ERROR;
-    }
-  }
-  
-  Status = I2cDisable();
-  DEBUG((EFI_D_INFO, "I2cDisable Status = %r\r\n", Status));
-  I2cBusFrequencySet(400 * 1000);
-
-  MmioWrite32(mI2CBaseAddress + R_IC_INTR_MASK, 0x0);
-  if (0x7f < SlaveAddress )
-    SlaveAddress = ( SlaveAddress & 0x3ff ) | IC_TAR_10BITADDR_MASTER;
-  MmioWrite32 ( mI2CBaseAddress + R_IC_TAR, (UINT16)SlaveAddress );
-  MmioWrite32 ( mI2CBaseAddress + R_IC_RX_TL, 0);
-  MmioWrite32 ( mI2CBaseAddress + R_IC_TX_TL, 0 );
-  MmioWrite32 ( mI2CBaseAddress + R_IC_CON, mI2cMode);
-  Status = I2cEnable();
-
-  DEBUG((EFI_D_INFO, "I2cEnable Status = %r\r\n", Status));
-  MmioRead32 ( mI2CBaseAddress + R_IC_CLR_TX_ABRT );
-  
-  return EFI_SUCCESS;
-}
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex             I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress      Device Address from which the byte value has to be read
-  @param  Offset            Offset from which the data has to be read
-  @param  *Byte             Address to which the value read has to be stored
-  @param  Start               Whether a RESTART is issued before the byte is sent or received
-  @param  End                 Whether STOP is generated after a data byte is sent or received  
-                                  
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS 
-ByteReadI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  )
-{
-
-  EFI_STATUS Status;
-  UINT32 I2cStatus;
-  UINT16 ReceiveData;
-  UINT8 *ReceiveDataEnd;
-  UINT8 *ReceiveRequest;
-  UINT16 RawIntrStat;
-  UINT32 Count=0;
-
-  Status = EFI_SUCCESS;
-
-  ReceiveDataEnd = &ReadBuffer [ReadBytes];
-  if( ReadBytes ) {
-
-    ReceiveRequest = ReadBuffer;
-    DEBUG((EFI_D_INFO,"Read: ---------------%d bytes to RX\r\n",ReceiveDataEnd - ReceiveRequest));
-
-    while ((ReceiveDataEnd > ReceiveRequest) || (ReceiveDataEnd > ReadBuffer)) {
-      
-      //
-      //  Check for NACK
-      //
-      RawIntrStat = (UINT16)MmioRead32 (mI2CBaseAddress + R_IC_RawIntrStat);
-      if ( 0 != ( RawIntrStat & I2C_INTR_TX_ABRT )) {
-        MmioRead32 ( mI2CBaseAddress + R_IC_CLR_TX_ABRT );
-        Status = RETURN_DEVICE_ERROR;
-        DEBUG((EFI_D_INFO,"TX ABRT ,%d bytes hasn't been transferred\r\n",ReceiveDataEnd - ReceiveRequest));
-        break;
-      }
-      
-      //
-      // Determine if another byte was received
-      //
-      I2cStatus = (UINT16)MmioRead32 (mI2CBaseAddress + R_IC_STATUS);
-      if (0 != ( I2cStatus & STAT_RFNE )) {
-        ReceiveData = (UINT16)MmioRead32 ( mI2CBaseAddress + R_IC_DATA_CMD );
-        *ReadBuffer++ = (UINT8)ReceiveData;
-        DEBUG((EFI_D_INFO,"MmioRead32 ,1 byte 0x:%x is received\r\n",ReceiveData));
-      }
-
-      if(ReceiveDataEnd == ReceiveRequest) {
-        MicroSecondDelay ( FIFO_WRITE_DELAY );
-        DEBUG((EFI_D_INFO,"ReceiveDataEnd==ReceiveRequest------------%x\r\n",I2cStatus & STAT_RFNE));
-        Count++;
-        if(Count<1024) {
-          //
-          // To avoid sys hung  without ul-pmc device  on RVP,
-          // waiting the last request to get data and make (ReceiveDataEnd > ReadBuffer) =TRUE.
-          //
-          continue;
-        } else {
-          break;
-        }
-      }
-      
-      //
-      //  Wait until a read request will fit.
-      //
-      if (0 == (I2cStatus & STAT_TFNF)) {
-        DEBUG((EFI_D_INFO,"Wait until a read request will fit\r\n"));
-        MicroSecondDelay (10);
-        continue;
-      }
-      
-      //
-      //  Issue the next read request.
-      //
-      if(End && Start) {
-        MmioWrite32 ( mI2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_RESTART|B_CMD_STOP);
-      } else if (!End && Start) {
-        MmioWrite32 ( mI2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_RESTART);
-      } else if (End && !Start) {
-        MmioWrite32 ( mI2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_STOP);
-      } else if (!End && !Start) {
-        MmioWrite32 ( mI2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD);
-      }
-      MicroSecondDelay (FIFO_WRITE_DELAY);
-
-      ReceiveRequest += 1;
-    }
-  }
-  
-  return Status;
-}
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be written
-  @param  Offset               Offset from which the data has to be read
-  @param  *Byte                Address to which the value written is stored
-  @param  Start               Whether a RESTART is issued before the byte is sent or received
-  @param  End                 Whether STOP is generated after a data byte is sent or received  
-                                    
-  @return  EFI_SUCCESS         IF the byte value has been successfully written
-  @return  EFI_DEVICE_ERROR    Operation Failed, Device Error
-**/
-EFI_STATUS ByteWriteI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  )
-{
-
-  EFI_STATUS Status;
-  UINT32 I2cStatus;
-  UINT8 *TransmitEnd;
-  UINT16 RawIntrStat;
-  UINT32 Count=0;
-
-  Status = EFI_SUCCESS;
-
-  Status=I2CInit(I2cControllerIndex, SlaveAddress);
-  if(Status!=EFI_SUCCESS)
-    return Status;
-
-  TransmitEnd = &WriteBuffer[WriteBytes];
-  if( WriteBytes ) {
-    DEBUG((EFI_D_INFO,"Write: --------------%d bytes to TX\r\n",TransmitEnd - WriteBuffer));
-    while (TransmitEnd > WriteBuffer) {
-      I2cStatus = MmioRead32 (mI2CBaseAddress + R_IC_STATUS);
-      RawIntrStat = (UINT16)MmioRead32 (mI2CBaseAddress + R_IC_RawIntrStat);
-      if (0 != ( RawIntrStat & I2C_INTR_TX_ABRT)) {
-        MmioRead32 ( mI2CBaseAddress + R_IC_CLR_TX_ABRT);
-        Status = RETURN_DEVICE_ERROR;
-        DEBUG((EFI_D_ERROR,"TX ABRT TransmitEnd:0x%x WriteBuffer:0x%x\r\n", TransmitEnd, WriteBuffer));
-        break;
-      }
-      if (0 == (I2cStatus & STAT_TFNF)) {
-        //
-        // If TX not full , will  send cmd  or continue to wait
-        //
-        MicroSecondDelay (FIFO_WRITE_DELAY);
-        continue;
-      }
-
-      if(End && Start) {
-        MmioWrite32 (mI2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++)|B_CMD_RESTART|B_CMD_STOP);
-      } else if (!End && Start) {
-        MmioWrite32 (mI2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++)|B_CMD_RESTART);
-      } else if (End && !Start) {
-        MmioWrite32 (mI2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++)|B_CMD_STOP);
-      } else if (!End && !Start ) {
-        MmioWrite32 (mI2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++));
-      }
-      
-      //
-      // Add a small delay to work around some odd behavior being seen.  Without this delay bytes get dropped.
-      //
-      MicroSecondDelay ( FIFO_WRITE_DELAY );//wait after send cmd
-      
-      //
-      // Time out
-      //
-      while(1) {
-        RawIntrStat = MmioRead16 ( mI2CBaseAddress + R_IC_RawIntrStat );
-        if (0 != ( RawIntrStat & I2C_INTR_TX_ABRT)) {
-          MmioRead16 (mI2CBaseAddress + R_IC_CLR_TX_ABRT);
-          Status = RETURN_DEVICE_ERROR;
-          DEBUG((EFI_D_ERROR,"TX ABRT TransmitEnd:0x%x WriteBuffer:0x%x\r\n", TransmitEnd, WriteBuffer));
-        }
-        if(0 == MmioRead16(mI2CBaseAddress + R_IC_TXFLR)) break;
-
-        MicroSecondDelay (FIFO_WRITE_DELAY);
-        Count++;
-        if(Count<1024) {
-          //
-          // to avoid sys hung without ul-pmc device on RVP.
-          // Waiting the last request to get data and make (ReceiveDataEnd > ReadBuffer) =TRUE.
-          //
-          continue;
-        } else {
-          break;
-        }
-      }//while( 1 )
-    }
-
-  }
-
-  return Status;
-}
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be read
-  @param  Offset               Offset from which the data has to be read
-  @param  ReadBytes            Number of bytes to be read
-  @param  *ReadBuffer          Address to which the value read has to be stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS ByteReadI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer
-  )
-{
-  EFI_STATUS          Status;
-
-  DEBUG ((EFI_D_INFO, "ByteReadI2C:---offset:0x%x\n",Offset));
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress,1,&Offset,TRUE,FALSE);
-  Status = ByteReadI2CBasic(I2cControllerIndex, SlaveAddress,ReadBytes,ReadBuffer,TRUE,TRUE);
-
-  return Status;
-}
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress        Device Address from which the byte value has to be written
-  @param  Offset              Offset from which the data has to be written
-  @param  WriteBytes          Number of bytes to be written
-  @param  *Byte               Address to which the value written is stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS ByteWriteI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer
-  )
-{
-  EFI_STATUS          Status;
-
-  DEBUG ((EFI_D_INFO, "ByteWriteI2C:---offset/bytes/buf:0x%x,0x%x,0x%x,0x%x\n",Offset,WriteBytes,WriteBuffer,*WriteBuffer));
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress,1,&Offset,TRUE,FALSE);
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress,WriteBytes,WriteBuffer,FALSE,TRUE);
-
-  return Status;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLibDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLibDxe.inf
deleted file mode 100644
index cd10f1de93..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLibDxe.inf
+++ /dev/null
@@ -1,39 +0,0 @@
-## @file
-#  Instance of I2C Library.
-#
-#  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-#
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = I2CLib
-  FILE_GUID                      = 7f62bf44-2ba7-4c2d-9d4a-91c8906ff053
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = I2CLib|DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER UEFI_APPLICATION
-  
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources.common]
-  I2CLib.c
-
-[LibraryClasses]
-  BaseLib
-  IoLib
-  TimerLib
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-
-[Protocols]
-  gEfiGlobalNvsAreaProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRegs.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRegs.h
deleted file mode 100644
index 57455162f6..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRegs.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/** @file
-  Register Definitions for I2C Driver/PEIM.
-  
-  Copyright (c) 2004  - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                               
---*/
-
-#ifndef I2C_REGS_H
-#define I2C_REGS_H
-
-//
-// FIFO write delay value.
-//
-#define FIFO_WRITE_DELAY    2
-
-//
-// MMIO Register Definitions.
-//
-#define    R_IC_CON                          ( 0x00) // I2C Control  
-#define     B_IC_RESTART_EN                  BIT5
-#define     B_IC_SLAVE_DISABLE               BIT6
-#define     V_SPEED_STANDARD                 0x02
-#define     V_SPEED_FAST                     0x04
-#define     V_SPEED_HIGH                     0x06
-#define     B_MASTER_MODE                    BIT0
-
-#define    R_IC_TAR                          ( 0x04) // I2C Target Address
-#define     IC_TAR_10BITADDR_MASTER           BIT12
-
-#define    R_IC_SAR                          ( 0x08) // I2C Slave Address
-#define    R_IC_HS_MADDR                     ( 0x0C) // I2C HS MasterMode Code Address
-#define    R_IC_DATA_CMD                     ( 0x10) // I2C Rx/Tx Data Buffer and Command
-
-#define    B_READ_CMD                         BIT8    // 1 = read, 0 = write
-#define    B_CMD_STOP                         BIT9    // 1 = STOP
-#define    B_CMD_RESTART                      BIT10   // 1 = IC_RESTART_EN
-
-#define    V_WRITE_CMD_MASK                  ( 0xFF)
-
-#define    R_IC_SS_SCL_HCNT                  ( 0x14) // Standard Speed I2C Clock SCL High Count
-#define    R_IC_SS_SCL_LCNT                  ( 0x18) // Standard Speed I2C Clock SCL Low Count
-#define    R_IC_FS_SCL_HCNT                  ( 0x1C) // Full Speed I2C Clock SCL High Count
-#define    R_IC_FS_SCL_LCNT                  ( 0x20) // Full Speed I2C Clock SCL Low Count
-#define    R_IC_HS_SCL_HCNT                  ( 0x24) // High Speed I2C Clock SCL High Count
-#define    R_IC_HS_SCL_LCNT                  ( 0x28) // High Speed I2C Clock SCL Low Count
-#define    R_IC_INTR_STAT                    ( 0x2C) // I2C Inetrrupt Status
-#define    R_IC_INTR_MASK                    ( 0x30) // I2C Interrupt Mask
-#define     I2C_INTR_GEN_CALL                 BIT11  // General call received
-#define     I2C_INTR_START_DET                BIT10
-#define     I2C_INTR_STOP_DET                 BIT9
-#define     I2C_INTR_ACTIVITY                 BIT8
-#define     I2C_INTR_TX_ABRT                  BIT6   // Set on NACK
-#define     I2C_INTR_TX_EMPTY                 BIT4
-#define     I2C_INTR_TX_OVER                  BIT3
-#define     I2C_INTR_RX_FULL                  BIT2   // Data bytes in RX FIFO over threshold
-#define     I2C_INTR_RX_OVER                  BIT1
-#define     I2C_INTR_RX_UNDER                 BIT0
-#define    R_IC_RawIntrStat                ( 0x34) // I2C Raw Interrupt Status
-#define    R_IC_RX_TL                        ( 0x38) // I2C Receive FIFO Threshold
-#define    R_IC_TX_TL                        ( 0x3C) // I2C Transmit FIFO Threshold
-#define    R_IC_CLR_INTR                     ( 0x40) // Clear Combined and Individual Interrupts
-#define    R_IC_CLR_RX_UNDER                 ( 0x44) // Clear RX_UNDER Interrupt
-#define    R_IC_CLR_RX_OVER                  ( 0x48) // Clear RX_OVERinterrupt
-#define    R_IC_CLR_TX_OVER                  ( 0x4C) // Clear TX_OVER interrupt
-#define    R_IC_CLR_RD_REQ                   ( 0x50) // Clear RD_REQ interrupt
-#define    R_IC_CLR_TX_ABRT                  ( 0x54) // Clear TX_ABRT interrupt
-#define    R_IC_CLR_RX_DONE                  ( 0x58) // Clear RX_DONE interrupt
-#define    R_IC_CLR_ACTIVITY                 ( 0x5C) // Clear ACTIVITY interrupt
-#define    R_IC_CLR_STOP_DET                 ( 0x60) // Clear STOP_DET interrupt
-#define    R_IC_CLR_START_DET                ( 0x64) // Clear START_DET interrupt
-#define    R_IC_CLR_GEN_CALL                 ( 0x68) // Clear GEN_CALL interrupt
-#define    R_IC_ENABLE                       ( 0x6C) // I2C Enable
-#define    R_IC_STATUS                       ( 0x70) // I2C Status
-
-#define    R_IC_SDA_HOLD                     ( 0x7C) // I2C IC_DEFAULT_SDA_HOLD//16bits
-
-#define     STAT_MST_ACTIVITY                 BIT5   // Master FSM Activity Status.
-#define     STAT_RFF                          BIT4   // RX FIFO is completely full
-#define     STAT_RFNE                         BIT3   // RX FIFO is not empty
-#define     STAT_TFE                          BIT2   // TX FIFO is completely empty
-#define     STAT_TFNF                         BIT1   // TX FIFO is not full
-
-#define    R_IC_TXFLR                        ( 0x74) // Transmit FIFO Level Register
-#define    R_IC_RXFLR                        ( 0x78) // Receive FIFO Level Register
-#define    R_IC_TX_ABRT_SOURCE               ( 0x80) // I2C Transmit Abort Status Register
-#define    R_IC_SLV_DATA_NACK_ONLY           ( 0x84) // Generate SLV_DATA_NACK Register
-#define    R_IC_DMA_CR                       ( 0x88) // DMA Control Register
-#define    R_IC_DMA_TDLR                     ( 0x8C) // DMA Transmit Data Level
-#define    R_IC_DMA_RDLR                     ( 0x90) // DMA Receive Data Level
-#define    R_IC_SDA_SETUP                    ( 0x94) // I2C SDA Setup Register
-#define    R_IC_ACK_GENERAL_CALL             ( 0x98) // I2C ACK General Call Register
-#define    R_IC_ENABLE_STATUS                ( 0x9C) // I2C Enable Status Register
-#define    R_IC_COMP_PARAM                   ( 0xF4) // Component Parameter Register
-#define    R_IC_COMP_VERSION                 ( 0xF8) // Component Version ID
-#define    R_IC_COMP_TYPE                    ( 0xFC) // Component Type
-
-#define    I2C_SS_SCL_HCNT_VALUE_100M        0x1DD
-#define    I2C_SS_SCL_LCNT_VALUE_100M        0x1E4
-#define    I2C_FS_SCL_HCNT_VALUE_100M        0x54
-#define    I2C_FS_SCL_LCNT_VALUE_100M        0x9a
-#define    I2C_HS_SCL_HCNT_VALUE_100M        0x7
-#define    I2C_HS_SCL_LCNT_VALUE_100M        0xE
-
-#define     IC_TAR_10BITADDR_MASTER           BIT12
-#define     FIFO_SIZE                         32
-#define     R_IC_INTR_STAT                    ( 0x2C) // I2c Inetrrupt Status
-#define     R_IC_INTR_MASK                    ( 0x30) // I2c Interrupt Mask
-#define     I2C_INTR_GEN_CALL                 BIT11  // General call received
-#define     I2C_INTR_START_DET                BIT10
-#define     I2C_INTR_STOP_DET                 BIT9
-#define     I2C_INTR_ACTIVITY                 BIT8
-#define     I2C_INTR_TX_ABRT                  BIT6   // Set on NACK
-#define     I2C_INTR_TX_EMPTY                 BIT4
-#define     I2C_INTR_TX_OVER                  BIT3
-#define     I2C_INTR_RX_FULL                  BIT2   // Data bytes in RX FIFO over threshold
-#define     I2C_INTR_RX_OVER                  BIT1
-#define     I2C_INTR_RX_UNDER                 BIT0
-
-#define R_PCH_LPIO_I2C_MEM_RESETS                 0x804 // Software Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_FUNC            BIT1  // Function Clock Domain Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_APB             BIT0  // APB Domain Reset
-#define R_PCH_LPSS_I2C_MEM_PCP                    0x800 // Private Clock Parameters
-
-#endif
\ No newline at end of file
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAccess.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAccess.h
deleted file mode 100644
index bf6ef4c747..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAccess.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/** @file
-  Misc Registers Definition.
-  
-  Copyright (c) 2011  - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                               
---*/
-
-#ifndef _I2C_ACCESS_H_
-#define _I2C_ACCESS_H_
-
-#include "I2CIoLibPei.h"
-
-#define DEFAULT_PCI_BUS_NUMBER_PCH             0
-
-#define PCI_DEVICE_NUMBER_PCH_LPC              31
-#define PCI_FUNCTION_NUMBER_PCH_LPC            0
-
-#define R_PCH_LPC_ACPI_BASE                    0x40            // ABASE, 16bit
-#define R_PCH_LPC_ACPI_BASEADR                 0x400           // ABASE, 16bit
-#define B_PCH_LPC_ACPI_BASE_EN                 BIT1            // Enable Bit
-#define B_PCH_LPC_ACPI_BASE_BAR                0x0000FF80      // Base Address, 128 Bytes
-#define V_PCH_ACPI_PM1_TMR_MAX_VAL             0x1000000       // The timer is 24 bit overflow
-#define B_PCH_ACPI_PM1_TMR_VAL                 0xFFFFFF        // The timer value mask
-
-#define R_PCH_ACPI_PM1_TMR                     0x08            // Power Management 1 Timer
-#define V_PCH_ACPI_PM1_TMR_FREQUENCY           3579545         // Timer Frequency
-
-
-#define PchLpcPciCfg8(Register) I2CLibPeiMmioRead8 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, 0, Register))
-
-#define PCIEX_BASE_ADDRESS                     0xE0000000
-#define PCI_EXPRESS_BASE_ADDRESS               ((VOID *) (UINTN) PCIEX_BASE_ADDRESS)
-
-#define MmPciAddress( Segment, Bus, Device, Function, Register ) \
-  ( (UINTN)PCI_EXPRESS_BASE_ADDRESS + \
-    (UINTN)(Bus << 20) + \
-    (UINTN)(Device << 15) + \
-    (UINTN)(Function << 12) + \
-    (UINTN)(Register) \
-  )
-#endif
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.c
deleted file mode 100644
index d5f8dfd012..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/** @file
-  MicroSecondDelay implementation of ACPI Timer.
-  
-  Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                               
---*/
-
-#include "PiPei.h"
-#include "I2CAccess.h"
-#include "I2CDelayPei.h"
-#include <Library/DebugLib.h>
-#include <Library/PeiServicesTablePointerLib.h>
-#include <Ppi/Stall.h>
-
-/**
-  Stalls the CPU for at least the given number of microseconds.
-  Stalls the CPU for the number of microseconds specified by MicroSeconds.
-
-  @param  MicroSeconds  The minimum number of microseconds to delay.
-
-  @return EFI_STATUS
-
-**/
-EFI_STATUS
-EFIAPI
-MicroSecondDelay (
-  IN      UINTN                     MicroSeconds
-  )
-{
-
-  EFI_PEI_STALL_PPI              *StallPpi;
-  EFI_STATUS                     Status;
-  CONST EFI_PEI_SERVICES         **PeiServices;
-  
-  PeiServices = GetPeiServicesTablePointer();
-
-
-  Status = (**PeiServices).LocatePpi (PeiServices, &gEfiPeiStallPpiGuid, 0, NULL, &StallPpi);
-  ASSERT(!EFI_ERROR(Status));
-
-  StallPpi->Stall (PeiServices, StallPpi, MicroSeconds);
-
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.h
deleted file mode 100644
index 604f1f67c5..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/** @file
-  MicroSecondDelay implementation of ACPI Timer.
-
-  Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef __I2C_DELAY_PEI__
-
-#define __I2C_DELAY_PEI__
-#include "PiPei.h"
-
-/**
-  Stalls the CPU for at least the given number of microseconds.
-
-  Stalls the CPU for the number of microseconds specified by MicroSeconds.
-
-  @param  MicroSeconds  The minimum number of microseconds to delay.
-
-  @return MicroSeconds
-
-**/
-EFI_STATUS
-EFIAPI
-MicroSecondDelay (
-  IN      UINTN                     MicroSeconds
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.c
deleted file mode 100644
index 6a37dbec1d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/** @file
-  Functions for access I2C MMIO register.
-
-  Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-#include <Library/DebugLib.h>
-#include <Library/PeiServicesTablePointerLib.h>
-
-/**
-  Reads an 8-bit MMIO register.
-
-  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 8-bit MMIO register operations are not supported, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-UINT8
-EFIAPI
-I2CLibPeiMmioRead8 (
-  IN UINTN Address
-  )
-{
-  UINT8 Value;
-
-  Value = *(volatile UINT8*)Address;
-  return Value;
-}
-
-/**
-  Reads a 16-bit MMIO register.
-
-  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 16-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 16-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-UINT16
-EFIAPI
-I2CLibPeiMmioRead16 (
-  IN UINTN  Address
-  )
-{
-  UINT16 Value;
-
-  ASSERT ((Address & 1) == 0);
-  Value = *(volatile UINT16*)Address;
-  return Value;
-}
-
-/**
-  Writes a 16-bit MMIO register.
-
-  Writes the 16-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 16-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 16-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write.
-  @param  Value   The value to write to the MMIO register.
-
-  @return Value.
-
-**/
-UINT16
-EFIAPI
-I2CLibPeiMmioWrite16 (
-  IN  UINTN   Address,
-  IN  UINT16  Value
-  )
-{
-  ASSERT ((Address & 1) == 0);
-  *(volatile UINT16*)Address = Value;
-  return Value;
-}
-
-/**
-  Reads a 32-bit MMIO register.
-
-  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioRead32 (
-  IN UINTN Address
-  )
-{
-  UINT32  Value;
-
-  ASSERT ((Address & 3) == 0);
-  Value = *(volatile UINT32*)Address;
-
-  return Value;
-}
-
-/**
-  Writes a 32-bit MMIO register.
-
-  Writes the 32-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write.
-  @param  Value   The value to write to the MMIO register.
-
-  @return Value.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioWrite32 (
-  IN      UINTN                     Address,
-  IN      UINT32                    Value
-  )
-{
-  ASSERT ((Address & 3) == 0);
-  *(volatile UINT32*)Address = Value;
-  return Value;
-}
-
-/**
-  OR a 32-bit MMIO register.
-
-  OR the 32-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write OR.
-  @param  Value   The value to OR to the MMIO register.
-
-  @return Value.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioOr32 (
-  IN      UINTN                     Address,
-  IN      UINT32                    OrData
-  )
-{
-  return I2CLibPeiMmioWrite32 (Address, I2CLibPeiMmioRead32(Address) | OrData);
-}
-
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.h
deleted file mode 100644
index b68bc1ed09..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/** @file
-  Functions for access I2C MMIO register.
-
-  Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef __I2C_IOLIB_PEI__
-
-#define __I2C_IOLIB_PEI__
-#include <PiPei.h>
-
-
-/**
-  Reads an 8-bit MMIO register.
-
-  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 8-bit MMIO register operations are not supported, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-
-UINT8
-EFIAPI
-I2CLibPeiMmioRead8 (
-  IN      UINTN                     Address
-  );
-
-
-/**
-  Reads a 16-bit MMIO register.
-
-  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 16-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 16-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-UINT16
-EFIAPI
-I2CLibPeiMmioRead16 (
-  IN      UINTN                     Address
-  );
-
-
-/**
-  Writes a 16-bit MMIO register.
-
-  Writes the 16-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 16-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 16-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write.
-  @param  Value   The value to write to the MMIO register.
-
-  @return Value.
-
-**/
-UINT16
-EFIAPI
-I2CLibPeiMmioWrite16 (
-  IN      UINTN                     Address,
-  IN      UINT16                    Value
-  );
-
-
-/**
-  Reads a 32-bit MMIO register.
-
-  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioRead32 (
-  IN      UINTN                     Address
-  );
-
-
-/**
-  Writes a 32-bit MMIO register.
-
-  Writes the 32-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write.
-  @param  Value   The value to write to the MMIO register.
-
-  @return Value.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioWrite32 (
-  IN      UINTN                     Address,
-  IN      UINT32                    Value
-  );
-
-
-/**
-  OR a 32-bit MMIO register.
-
-  OR the 32-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write OR.
-  @param  Value   The value to OR to the MMIO register.
-
-  @return Value.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioOr32 (
-  IN      UINTN                     Address,
-  IN      UINT32                    OrData
-  );
-
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.c
deleted file mode 100644
index dd5cceb70d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.c
+++ /dev/null
@@ -1,638 +0,0 @@
-/** @file
-  I2C PEI Lib Instance.
-
-  Copyright (c) 1999- 2015, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "I2CDelayPei.h"
-#include "I2CIoLibPei.h"
-#include "I2CAccess.h"
-#include "I2CLibPei.h"
-#include <PlatformBaseAddresses.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/PeiServicesTablePointerLib.h>
-#include <Library/HobLib.h>
-#include <PchRegs/PchRegsPcu.h> 
-#include <PchRegs/PchRegsLpss.h> 
-
-#define LPSS_PCI_DEVICE_NUMBER  8
-
-#define R_PCH_LPIO_I2C_MEM_RESETS                 0x804 // Software Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_FUNC            BIT1  // Function Clock Domain Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_APB             BIT0  // APB Domain Reset
-#define R_PCH_LPSS_I2C_MEM_PCP                    0x800 // Private Clock Parameters
-
-#define PEI_TEPM_LPSS_DMA_BAR                     0xFE900000
-#define PEI_TEPM_LPSS_I2C0_BAR                    0xFE910000
-#define PCI_CONFIG_SPACE_SIZE                     0x10000
-
-EFI_GUID  mI2CPeiInitGuid = {
-  0x96DED71A, 0xB9E7, 0x4EAD, 0x96, 0x2C, 0x01, 0x69, 0x3C, 0xED, 0x2A, 0x64
-};
-
-
-UINT16 I2CGPIO[]= {
-  //
-  // 19.1.6  I2C0
-  // I2C0_SDA-OD-O -    write 0x2003CC81 to IOBASE + 0x0210
-  // I2C0_SCL-OD-O -    write 0x2003CC81 to IOBASE + 0x0200
-  //
-  0x0210,
-  0x0200,
-
-  //
-  // 19.1.7  I2C1
-  // I2C1_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x01F0
-  // I2C1_SCL-OD-O/I - write 0x2003CC81 to IOBASE + 0x01E0
-  //
-  0x01F0,
-  0x01E0,
-
-  //
-  // 19.1.8  I2C2
-  // I2C2_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x01D0
-  // I2C2_SCL-OD-O/I - write 0x2003CC81 to IOBASE + 0x01B0
-  //
-  0x01D0,
-  0x01B0,
-
-  //
-  // 19.1.9  I2C3
-  // I2C3_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x0190
-  // I2C3_SCL-OD-O/I - write 0x2003CC81 to IOBASE + 0x01C0
-  // 
-  0x0190,
-  0x01C0,
-
-  //
-  // 19.1.10 I2C4
-  // I2C4_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x01A0
-  // I2C4_SCL-OD-O/I - write 0x2003CC81 to IOBASE + 0x0170
-  //
-  0x01A0,
-  0x0170,
-
-  // 
-  // 19.1.11 I2C5
-  // I2C5_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x0150
-  // I2C5_SCL-OD-O/I - write 0x2003CC81 to IOBASE + 0x0140
-  // 
-  0x0150,
-  0x0140,
-
-  //
-  // 19.1.12 I2C6
-  // I2C6_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x0180
-  // I2C6_SCL-OD-O/I -  write 0x2003CC81 to IOBASE + 0x0160
-  // 
-  0x0180,
-  0x0160
-};
-
-/**
-  Constructor of this library.
-
-  @param   VOID
-
-  @return  EFI_SUCCESS
-**/
-EFI_STATUS
-EFIAPI
-IntelI2CPeiLibConstructor (
-  IN EFI_PEI_FILE_HANDLE     FileHandle,
-  IN CONST EFI_PEI_SERVICES  **PeiServices
-  )
-{
-  UINTN Index;
-  
-  for (Index = 0; Index < sizeof(I2CGPIO)/sizeof(UINT16); Index ++) {
-    I2CLibPeiMmioWrite32(IO_BASE_ADDRESS+I2CGPIO[Index], 0x2003CC81);
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Programe all I2C controllers on LPSS. 
-  
-  I2C0 is function 1 of LPSS. I2C1 is function 2 of LPSS, etc..
-
-  @param   VOID
-
-  @return  EFI_SUCCESS
-**/
-EFI_STATUS
-ProgramPciLpssI2C (
-  VOID
-  )
-{
-  UINT32       PmcBase;
-  UINT32       DevID;
-  UINTN        PciMmBase=0;
-  UINTN        Index;
-  UINTN        Bar0;
-  UINTN        Bar1;
-  DEBUG ((EFI_D_INFO, "Pei ProgramPciLpssI2C() Start\n"));
-  
-  //
-  // Set the VLV Function Disable Register to ZERO
-  //
-  PmcBase         = I2CLibPeiMmioRead32(PciD31F0RegBase + R_PCH_LPC_PMC_BASE) & B_PCH_LPC_PMC_BASE_BAR;
-  
-  if(I2CLibPeiMmioRead32(PmcBase + R_PCH_PMC_FUNC_DIS)&
-      (B_PCH_PMC_FUNC_DIS_LPSS2_FUNC1 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC2
-       | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC3 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC4 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC5
-       | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC6 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC7)) {
-    I2CLibPeiMmioWrite32(
-      PmcBase+R_PCH_PMC_FUNC_DIS,
-      I2CLibPeiMmioRead32(PmcBase + R_PCH_PMC_FUNC_DIS)& \
-      ~(B_PCH_PMC_FUNC_DIS_LPSS2_FUNC1 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC2 \
-        | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC3 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC4 \
-        | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC5 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC6|B_PCH_PMC_FUNC_DIS_LPSS2_FUNC7)
-      );
-    DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() enable all I2C controllers\n"));
-  }
-
-  for(Index = 0; Index < LPSS_PCI_DEVICE_NUMBER; Index ++) {
-
-    PciMmBase = MmPciAddress (
-                  0,
-                  DEFAULT_PCI_BUS_NUMBER_PCH,
-                  PCI_DEVICE_NUMBER_PCH_LPSS_I2C,
-                  Index,
-                  0
-                  );
-    DevID =  I2CLibPeiMmioRead32(PciMmBase);
-
-    Bar0 = PEI_TEPM_LPSS_DMA_BAR + (Index * PCI_CONFIG_SPACE_SIZE);
-    Bar1 = Bar0 + 0x8000;
-
-    DEBUG((EFI_D_ERROR, "Program Pci Lpss I2C Device  Function=%x DevID=%08x\n", Index, DevID));
-    
-    //
-    // Check if device present
-    //
-    if (DevID  != 0xFFFFFFFF)  {
-      if(!(I2CLibPeiMmioRead32 (PciMmBase + R_PCH_LPSS_I2C_STSCMD) & B_PCH_LPSS_I2C_STSCMD_MSE)) {
-        //
-        // Program BAR 0
-        //
-        I2CLibPeiMmioWrite32((UINTN) (PciMmBase + R_PCH_LPSS_I2C_BAR), (UINT32)(Bar0 & B_PCH_LPSS_I2C_BAR_BA));
-        
-        DEBUG ((EFI_D_ERROR, "I2CBaseAddress1 = 0x%x \n",I2CLibPeiMmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR)));
-        
-        //
-        // Program BAR 1
-        //
-        I2CLibPeiMmioWrite32 ((UINTN)(PciMmBase + R_PCH_LPSS_I2C_BAR1), (UINT32)(Bar1 & B_PCH_LPSS_I2C_BAR1_BA));
-        DEBUG ((EFI_D_ERROR, "I2CBaseAddress1 = 0x%x \n",I2CLibPeiMmioRead32(PciMmBase+R_PCH_LPSS_I2C_BAR1)));
-        
-        //
-        // Bus Master Enable & Memory Space Enable
-        //
-        I2CLibPeiMmioWrite32((UINTN) (PciMmBase + R_PCH_LPSS_I2C_STSCMD), (UINT32)(B_PCH_LPSS_I2C_STSCMD_BME | B_PCH_LPSS_I2C_STSCMD_MSE));
-      }
-      
-      //
-      // Release Resets
-      //
-      I2CLibPeiMmioWrite32 (Bar0 + R_PCH_LPIO_I2C_MEM_RESETS, (B_PCH_LPIO_I2C_MEM_RESETS_FUNC | B_PCH_LPIO_I2C_MEM_RESETS_APB));
-      
-      //
-      // Activate Clocks
-      //
-      I2CLibPeiMmioWrite32 (Bar0 + R_PCH_LPSS_I2C_MEM_PCP, 0x80020003);//No use for A0
-
-      DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() Programmed()\n"));
-    }
-
-  }
-  
-  DEBUG ((EFI_D_INFO, "Pei ProgramPciLpssI2C() End\n"));
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Disable I2C Bus.
-
-  @param I2cControllerIndex   Index of I2C controller.
-
-  @return EFI_SUCCESS
-**/
-EFI_STATUS
-I2cDisable (
-  IN UINT8 I2cControllerIndex
-  )
-{
-  UINTN  I2CBaseAddress;
-  UINT32 NumTries = 10000;  // 0.1 seconds
-  
-  I2CBaseAddress = (UINT32) PEI_TEPM_LPSS_I2C0_BAR + I2cControllerIndex * PCI_CONFIG_SPACE_SIZE;
-  
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_ENABLE, 0);
-  while (0 != ( I2CLibPeiMmioRead16 (I2CBaseAddress + R_IC_ENABLE_STATUS ) & 1)) {
-    MicroSecondDelay (10);
-    NumTries --;
-    if(0 == NumTries) return EFI_NOT_READY;
-  }
-  
-  return EFI_SUCCESS;
-}
-
-/**
-  Enable I2C Bus.
-
-  @param I2cControllerIndex   Index of I2C controller.
-
-  @return EFI_SUCCESS
-**/
-EFI_STATUS
-I2cEnable (
-  IN UINT8 I2cControllerIndex
-  )
-{
-  UINTN   I2CBaseAddress;
-  UINT32 NumTries = 10000;  // 0.1 seconds
-  
-  I2CBaseAddress = (UINT32) PEI_TEPM_LPSS_I2C0_BAR+ I2cControllerIndex * PCI_CONFIG_SPACE_SIZE;
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_ENABLE, 1);
-  while (0 == ( I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_ENABLE_STATUS ) & 1)) {
-    MicroSecondDelay (10);
-    NumTries --;
-    if(0 == NumTries) return EFI_NOT_READY;
-  }
-  
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Set the I2C controller bus clock frequency.
-
-  @param[in] This           Address of the library's I2C context structure
-  @param[in] PlatformData   Address of the platform configuration data
-  @param[in] BusClockHertz  New I2C bus clock frequency in Hertz
-
-  @retval RETURN_SUCCESS      The bus frequency was set successfully.
-  @retval RETURN_UNSUPPORTED  The controller does not support this frequency.
-
-**/
-EFI_STATUS
-I2cBusFrequencySet (
-  IN UINTN   I2CBaseAddress,
-  IN UINTN   BusClockHertz,
-  IN UINT16  *I2cMode
-  )
-{
-  DEBUG((EFI_D_INFO,"InputFreq BusClockHertz: %d\r\n",BusClockHertz));
-
-  *I2cMode = B_IC_RESTART_EN | B_IC_SLAVE_DISABLE | B_MASTER_MODE;
-
-  //
-  //  Set the 100 KHz clock divider
-  //
-  //  From Table 10 of the I2C specification
-  //
-  //    High: 4.00 uS
-  //    Low:  4.70 uS
-  //
-  I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_SS_SCL_HCNT, (UINT16)0x214 );
-  I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_SS_SCL_LCNT, (UINT16)0x272 );
-  
-  //
-  //    Set the 400 KHz clock divider
-  //
-  //    From Table 10 of the I2C specification
-  //
-  //      High: 0.60 uS
-  //      Low:  1.30 uS
-  //
-  I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_FS_SCL_HCNT, (UINT16)0x50 );
-  I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_FS_SCL_LCNT, (UINT16)0xAD );
-
-  switch ( BusClockHertz ) {
-    case 100 * 1000:
-      I2CLibPeiMmioWrite32 ( I2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x40);//100K
-      *I2cMode |= V_SPEED_STANDARD;
-      break;
-    case 400 * 1000:
-      I2CLibPeiMmioWrite32 ( I2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x32);//400K
-      *I2cMode |= V_SPEED_FAST;
-      break;
-    default:
-      I2CLibPeiMmioWrite32 ( I2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x09);//3.4M
-      *I2cMode |= V_SPEED_HIGH;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Initializes the host controller to execute I2C commands.
-
-  @param I2cControllerIndex Index of I2C controller in LPSS device. 0 represents I2C0, which is PCI function 1 of LPSS device.   
-                                
-  @return EFI_SUCCESS       Opcode initialization on the I2C host controller completed.
-  @return EFI_DEVICE_ERROR  Device error, operation failed.
-**/
-EFI_STATUS
-I2CInit (
-  UINT8 I2cControllerIndex, 
-  UINT16 SlaveAddress
-  )
-{
-  EFI_STATUS   Status;
-  UINT32       NumTries = 0;
-  UINTN        I2CBaseAddress;
-  UINT16       I2cMode;
-  UINTN        PciMmBase=0;
-
-
-  PciMmBase = MmPciAddress (
-                0,
-                DEFAULT_PCI_BUS_NUMBER_PCH,
-                PCI_DEVICE_NUMBER_PCH_LPSS_I2C,
-                (I2cControllerIndex + 1),
-                0
-                );
-
-  I2CBaseAddress = I2CLibPeiMmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR);
-
-  //
-  //  Verify the parameters
-  //
-  if (1023 < SlaveAddress ) {
-    Status =  EFI_INVALID_PARAMETER;
-    DEBUG((EFI_D_INFO,"I2cStartRequest Exit with Status %r\r\n", Status));
-    return Status;
-  }
-
-  if(I2CBaseAddress ==  (PEI_TEPM_LPSS_I2C0_BAR + I2cControllerIndex * PCI_CONFIG_SPACE_SIZE)) {
-    return EFI_SUCCESS;
-  }
-  ProgramPciLpssI2C();
-
-  I2CBaseAddress = (UINT32) (PEI_TEPM_LPSS_I2C0_BAR + I2cControllerIndex * PCI_CONFIG_SPACE_SIZE);
-  DEBUG ((EFI_D_ERROR, "I2CBaseAddress = 0x%x \n",I2CBaseAddress));
-  NumTries = 10000; // 1 seconds
-  while ((1 == ( I2CLibPeiMmioRead32 ( I2CBaseAddress + R_IC_STATUS) & STAT_MST_ACTIVITY ))) {
-    MicroSecondDelay(10);
-    NumTries --;
-    if(0 == NumTries)
-      return EFI_DEVICE_ERROR;
-  }
-
-  Status = I2cDisable (I2cControllerIndex);
-  DEBUG((EFI_D_INFO, "I2cDisable Status = %r\r\n", Status));
-
-  I2cBusFrequencySet(I2CBaseAddress, 400 * 1000, &I2cMode);//Set I2cMode
-
-  I2CLibPeiMmioWrite16(I2CBaseAddress + R_IC_INTR_MASK, 0x0);
-  if (0x7F < SlaveAddress) {
-    SlaveAddress = (SlaveAddress & 0x3ff ) | IC_TAR_10BITADDR_MASTER;
-  }
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_TAR, (UINT16) SlaveAddress );
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_RX_TL, 0);
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_TX_TL, 0 );
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_CON, I2cMode);
-
-  Status = I2cEnable(I2cControllerIndex);
-  DEBUG((EFI_D_INFO, "I2cEnable Status = %r\r\n", Status));
-  I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_CLR_TX_ABRT );
-  
-  return EFI_SUCCESS;
-}
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress        Device Address from which the byte value has to be read
-  @param  Offset              Offset from which the data has to be read
-  @param  *Byte               Address to which the value read has to be stored
-                                
-  @return  EFI_SUCCESS        If the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR   Operation Failed, Device Error
-**/
-EFI_STATUS ByteReadI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  )
-{
-
-  EFI_STATUS Status;
-  UINT32 I2cStatus;
-  UINT16 ReceiveData;
-  UINT8 *ReceiveDataEnd;
-  UINT8 *ReceiveRequest;
-  UINT16 RawIntrStat;
-  UINTN   I2CBaseAddress;
-
-  I2CBaseAddress = (UINT32)(PEI_TEPM_LPSS_I2C0_BAR + I2cControllerIndex * PCI_CONFIG_SPACE_SIZE);
-
-  Status = EFI_SUCCESS;
-
-  I2CInit(I2cControllerIndex, SlaveAddress);
-
-  ReceiveDataEnd = &ReadBuffer [ReadBytes];
-  if(ReadBytes) {
-    ReceiveRequest = ReadBuffer;
-    DEBUG((EFI_D_INFO,"Read: ---------------%d bytes to RX\r\n",ReceiveDataEnd - ReceiveRequest));
-
-    while ((ReceiveDataEnd > ReceiveRequest) || (ReceiveDataEnd > ReadBuffer)) {
-      //
-      // Check for NACK
-      //
-      RawIntrStat = I2CLibPeiMmioRead16 (I2CBaseAddress + R_IC_RawIntrStat );
-      if ( 0 != (RawIntrStat & I2C_INTR_TX_ABRT )) {
-        I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_CLR_TX_ABRT );
-        Status = RETURN_DEVICE_ERROR;
-        DEBUG((EFI_D_INFO,"TX ABRT ,%d bytes hasn't been transferred\r\n",ReceiveDataEnd - ReceiveRequest));
-        break;
-      }
-      
-      //
-      // Determine if another byte was received
-      //
-      I2cStatus = I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_STATUS );
-      if ( 0 != ( I2cStatus & STAT_RFNE )) {
-        ReceiveData = I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_DATA_CMD );
-        *ReadBuffer++ = (UINT8)ReceiveData;
-        DEBUG((EFI_D_INFO,"MmioRead32 ,1 byte 0x:%x is received\r\n",ReceiveData));
-      }
-
-      if(ReceiveDataEnd==ReceiveRequest) {
-        //
-        // Waiting the last request to get data and make (ReceiveDataEnd > ReadBuffer) =TRUE.
-        //
-        continue;
-      }
-      
-      //
-      // Wait until a read request will fit
-      //
-      if ( 0 == ( I2cStatus & STAT_TFNF )) {
-        MicroSecondDelay ( 10 );
-        continue;
-      }
-      
-      //
-      // Issue the next read request
-      //
-      if(End && Start ) {
-        I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_RESTART|B_CMD_STOP);
-      } else if (!End && Start ) {
-        I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_RESTART);
-      } else if (End && !Start ) {
-        I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_STOP);
-      } else if (!End && !Start ) {
-        I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD);
-      }
-      ReceiveRequest += 1;
-    }
-
-  }
-  return Status;
-
-}
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be written
-  @param  Offset               Offset from which the data has to be read
-  @param  *Byte                Address to which the value written is stored
-                                
-  @return  EFI_SUCCESS         IF the byte value has been successfully written
-  @return  EFI_DEVICE_ERROR    Operation Failed, Device Error
-**/
-EFI_STATUS 
-ByteWriteI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  )
-{
-
-  EFI_STATUS Status;
-  UINT32 I2cStatus;
-  UINT8 *TransmitEnd;
-  UINT16 RawIntrStat;
-  UINTN   I2CBaseAddress;
-
-  I2CBaseAddress = (UINT32)PEI_TEPM_LPSS_I2C0_BAR+ I2cControllerIndex * PCI_CONFIG_SPACE_SIZE;
-
-  Status = EFI_SUCCESS;
-
-  I2CInit(I2cControllerIndex, SlaveAddress);
-
-  TransmitEnd = &WriteBuffer [WriteBytes];
-  if( WriteBytes ) {
-
-    DEBUG((EFI_D_INFO,"Write: --------------%d bytes to TX\r\n", TransmitEnd - WriteBuffer));
-
-    while ( TransmitEnd > WriteBuffer) {
-      I2cStatus = I2CLibPeiMmioRead16 (I2CBaseAddress + R_IC_STATUS);
-      RawIntrStat = I2CLibPeiMmioRead16 (I2CBaseAddress + R_IC_RawIntrStat);
-      if ( 0 != (RawIntrStat & I2C_INTR_TX_ABRT)) {
-        I2CLibPeiMmioRead16 (I2CBaseAddress + R_IC_CLR_TX_ABRT);
-        Status = RETURN_DEVICE_ERROR;
-        DEBUG((EFI_D_ERROR,"TX ABRT TransmitEnd:0x%x WriteBuffer:0x%x\r\n", TransmitEnd, WriteBuffer));
-        break;
-      }
-      if (0 == ( I2cStatus & STAT_TFNF)) {
-        continue;
-      }
-      if(End && Start) {
-        I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++) | B_CMD_RESTART | B_CMD_STOP);
-      } else if (!End && Start ) {
-        I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++) | B_CMD_RESTART);
-      } else if (End && !Start ) {
-        I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++) | B_CMD_STOP);
-      } else if (!End && !Start ) {
-        I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++));
-      }
-      
-      // Add a small delay to work around some odd behavior being seen.  Without this delay bytes get dropped.
-      MicroSecondDelay ( FIFO_WRITE_DELAY );
-    }
-
-  }
-  
-  if(EFI_ERROR(Status)) {
-    DEBUG((EFI_D_INFO,"I2cStartRequest Exit with Status %r\r\n",Status));
-  }
-    
-  return Status;
-}
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be read
-  @param  Offset               Offset from which the data has to be read
-  @param  ReadBytes            Number of bytes to be read
-  @param  *ReadBuffer          Address to which the value read has to be stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS 
-ByteReadI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer
-  )
-{
-  EFI_STATUS        Status;
-
-  DEBUG ((EFI_D_ERROR, "ByteReadI2C:---offset:0x%x\n",Offset));
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress, 1, &Offset,TRUE,FALSE);
-  Status = ByteReadI2CBasic(I2cControllerIndex, SlaveAddress, ReadBytes, ReadBuffer, TRUE, TRUE);
-
-  return Status;
-}
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress        Device Address from which the byte value has to be written
-  @param  Offset              Offset from which the data has to be written
-  @param  WriteBytes          Number of bytes to be written
-  @param  *Byte               Address to which the value written is stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS ByteWriteI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer
-  )
-{
-  EFI_STATUS        Status;
-
-  DEBUG ((EFI_D_ERROR, "ByteWriteI2C:---offset/bytes/buf:0x%x,0x%x,0x%x,0x%x\n",Offset,WriteBytes,WriteBuffer,*WriteBuffer));
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress, 1, &Offset, TRUE, FALSE);
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress, WriteBytes, WriteBuffer, FALSE, TRUE);
-
-  return Status;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h
deleted file mode 100644
index 47536aebf7..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h
+++ /dev/null
@@ -1,280 +0,0 @@
-/** @file
-  I2C PEI Lib Instance.
-
-  Copyright (c) 1999- 2015, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef I2C_PEI_REGS_H
-#define I2C_PEI_REGS_H
-
-#include "PiPei.h"
-
-#define R_PCH_LPC_PMC_BASE                        0x44
-#define B_PCH_LPC_PMC_BASE_BAR                    0xFFFFFE00
-#define R_PCH_PMC_FUNC_DIS                        0x34  // Function Disable Register
-#define PCIEX_BASE_ADDRESS                        0xE0000000
-#define PciD31F0RegBase                           PCIEX_BASE_ADDRESS + (UINT32) (31 << 15)
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC7             BIT7  // LPSS SPI Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC6             BIT6  // LPSS HSUART #2 Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC5             BIT5  // LPSS HSUART #1 Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC4             BIT4  // LPSS I2S Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC3             BIT3  // LPSS PCM Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC2             BIT2  // LPSS I2C #2 Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC1             BIT1  // LPSS I2C #1 Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC0             BIT0  // LPSS DMA Disable
-
-
-#define DEFAULT_PCI_BUS_NUMBER_PCH       0
-
-#define R_PCH_LPSS_I2C_STSCMD                     0x04  // Status & Command
-#define B_PCH_LPSS_I2C_STSCMD_RMA                 BIT29 // RMA
-#define B_PCH_LPSS_I2C_STSCMD_RCA                 BIT28 // RCA
-#define B_PCH_LPSS_I2C_STSCMD_CAPLIST             BIT20 // Capability List
-#define B_PCH_LPSS_I2C_STSCMD_INTRSTS             BIT19 // Interrupt Status
-#define B_PCH_LPSS_I2C_STSCMD_INTRDIS             BIT10 // Interrupt Disable
-#define B_PCH_LPSS_I2C_STSCMD_SERREN              BIT8  // SERR# Enable
-#define B_PCH_LPSS_I2C_STSCMD_BME                 BIT2  // Bus Master Enable
-#define B_PCH_LPSS_I2C_STSCMD_MSE                 BIT1  // Memory Space Enable
-
-#define R_PCH_LPSS_I2C_BAR                        0x10  // BAR
-#define B_PCH_LPSS_I2C_BAR_BA                     0xFFFFF000 // Base Address
-#define B_PCH_LPSS_I2C_BAR_SI                     0x00000FF0 // Size Indicator
-#define B_PCH_LPSS_I2C_BAR_PF                     BIT3  // Prefetchable
-#define B_PCH_LPSS_I2C_BAR_TYPE                   (BIT2 | BIT1) // Type
-#define B_PCH_LPSS_I2C_BAR_MS                     BIT0  // Message Space
-
-#define R_PCH_LPSS_I2C_BAR1                       0x14  // BAR 1
-#define B_PCH_LPSS_I2C_BAR1_BA                    0xFFFFF000 // Base Address
-#define B_PCH_LPSS_I2C_BAR1_SI                    0x00000FF0 // Size Indicator
-#define B_PCH_LPSS_I2C_BAR1_PF                    BIT3  // Prefetchable
-#define B_PCH_LPSS_I2C_BAR1_TYPE                  (BIT2 | BIT1) // Type
-#define B_PCH_LPSS_I2C_BAR1_MS                    BIT0  // Message Space
-
-#define NUM_RETRIES         0xFFFF
-
-//
-// LPIO I2C Module Memory Space Registers
-//
-#define R_PCH_LPIO_I2C_MEM_RESETS                 0x804 // Software Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_FUNC            BIT1  // Function Clock Domain Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_APB             BIT0  // APB Domain Reset
-
-#define R_PCH_LPSS_I2C_MEM_PCP                    0x800 // Private Clock Parameters
-
-#define  bit(a)                   1 << (a)
-
-//
-// MMIO Register Definitions
-//
-
-#define  I2C0_REG_SPACE_ADDR_BASE            0xFF138000  //01K
-
-#define    R_IC_CON                          ( 0x00) // I2C Control
-#define     B_IC_RESTART_EN                  BIT5
-#define     B_IC_SLAVE_DISABLE               BIT6
-#define     V_SPEED_STANDARD                 0x02
-#define     V_SPEED_FAST                     0x04
-#define     V_SPEED_HIGH                     0x06
-#define     B_MASTER_MODE                    BIT0
-
-#define    R_IC_TAR                          ( 0x04) // I2C Target Address
-#define     IC_TAR_10BITADDR_MASTER           BIT12
-
-#define    R_IC_SAR                          ( 0x08) // I2C Slave Address
-#define    R_IC_HS_MADDR                     ( 0x0C) // I2C HS MasterMode Code Address
-#define    R_IC_DATA_CMD                     ( 0x10) // I2C Rx/Tx Data Buffer and Command
-
-#define    B_READ_CMD                         BIT8    // 1 = read, 0 = write
-#define    B_CMD_STOP                         BIT9    // 1 = STOP
-#define    B_CMD_RESTART                      BIT10   // 1 = IC_RESTART_EN
-
-#define    V_WRITE_CMD_MASK                  ( 0xFF)
-
-#define    R_IC_SS_SCL_HCNT                  ( 0x14) // Standard Speed I2C Clock SCL High Count
-#define    R_IC_SS_SCL_LCNT                  ( 0x18) // Standard Speed I2C Clock SCL Low Count
-#define    R_IC_FS_SCL_HCNT                  ( 0x1C) // Full Speed I2C Clock SCL High Count
-#define    R_IC_FS_SCL_LCNT                  ( 0x20) // Full Speed I2C Clock SCL Low Count
-#define    R_IC_HS_SCL_HCNT                  ( 0x24) // High Speed I2C Clock SCL High Count
-#define    R_IC_HS_SCL_LCNT                  ( 0x28) // High Speed I2C Clock SCL Low Count
-#define    R_IC_INTR_STAT                    ( 0x2C) // I2C Inetrrupt Status
-#define    R_IC_INTR_MASK                    ( 0x30) // I2C Interrupt Mask
-#define     I2C_INTR_GEN_CALL                 BIT11  // General call received
-#define     I2C_INTR_START_DET                BIT10
-#define     I2C_INTR_STOP_DET                 BIT9
-#define     I2C_INTR_ACTIVITY                 BIT8
-#define     I2C_INTR_TX_ABRT                  BIT6   // Set on NACK
-#define     I2C_INTR_TX_EMPTY                 BIT4
-#define     I2C_INTR_TX_OVER                  BIT3
-#define     I2C_INTR_RX_FULL                  BIT2   // Data bytes in RX FIFO over threshold
-#define     I2C_INTR_RX_OVER                  BIT1
-#define     I2C_INTR_RX_UNDER                 BIT0
-#define    R_IC_RawIntrStat                ( 0x34) // I2C Raw Interrupt Status
-#define    R_IC_RX_TL                        ( 0x38) // I2C Receive FIFO Threshold
-#define    R_IC_TX_TL                        ( 0x3C) // I2C Transmit FIFO Threshold
-#define    R_IC_CLR_INTR                     ( 0x40) // Clear Combined and Individual Interrupts
-#define    R_IC_CLR_RX_UNDER                 ( 0x44) // Clear RX_UNDER Interrupt
-#define    R_IC_CLR_RX_OVER                  ( 0x48) // Clear RX_OVERinterrupt
-#define    R_IC_CLR_TX_OVER                  ( 0x4C) // Clear TX_OVER interrupt
-#define    R_IC_CLR_RD_REQ                   ( 0x50) // Clear RD_REQ interrupt
-#define    R_IC_CLR_TX_ABRT                  ( 0x54) // Clear TX_ABRT interrupt
-#define    R_IC_CLR_RX_DONE                  ( 0x58) // Clear RX_DONE interrupt
-#define    R_IC_CLR_ACTIVITY                 ( 0x5C) // Clear ACTIVITY interrupt
-#define    R_IC_CLR_STOP_DET                 ( 0x60) // Clear STOP_DET interrupt
-#define    R_IC_CLR_START_DET                ( 0x64) // Clear START_DET interrupt
-#define    R_IC_CLR_GEN_CALL                 ( 0x68) // Clear GEN_CALL interrupt
-#define    R_IC_ENABLE                       ( 0x6C) // I2C Enable
-#define    R_IC_STATUS                       ( 0x70) // I2C Status
-
-#define    R_IC_SDA_HOLD                     ( 0x7C) // I2C IC_DEFAULT_SDA_HOLD//16bits
-
-#define     STAT_MST_ACTIVITY                 BIT5   // Master FSM Activity Status.
-#define     STAT_RFF                          BIT4   // RX FIFO is completely full
-#define     STAT_RFNE                         BIT3   // RX FIFO is not empty
-#define     STAT_TFE                          BIT2   // TX FIFO is completely empty
-#define     STAT_TFNF                         BIT1   // TX FIFO is not full
-
-#define    R_IC_TXFLR                        ( 0x74) // Transmit FIFO Level Register
-#define    R_IC_RXFLR                        ( 0x78) // Receive FIFO Level Register
-#define    R_IC_TX_ABRT_SOURCE               ( 0x80) // I2C Transmit Abort Status Register
-#define    R_IC_SLV_DATA_NACK_ONLY           ( 0x84) // Generate SLV_DATA_NACK Register
-#define    R_IC_DMA_CR                       ( 0x88) // DMA Control Register
-#define    R_IC_DMA_TDLR                     ( 0x8C) // DMA Transmit Data Level
-#define    R_IC_DMA_RDLR                     ( 0x90) // DMA Receive Data Level
-#define    R_IC_SDA_SETUP                    ( 0x94) // I2C SDA Setup Register
-#define    R_IC_ACK_GENERAL_CALL             ( 0x98) // I2C ACK General Call Register
-#define    R_IC_ENABLE_STATUS                ( 0x9C) // I2C Enable Status Register
-#define    R_IC_COMP_PARAM                   ( 0xF4) // Component Parameter Register
-#define    R_IC_COMP_VERSION                 ( 0xF8) // Component Version ID
-#define    R_IC_COMP_TYPE                    ( 0xFC) // Component Type
-
-#define I2C_SS_SCL_HCNT_VALUE_100M           0x1DD
-#define I2C_SS_SCL_LCNT_VALUE_100M           0x1E4
-#define I2C_FS_SCL_HCNT_VALUE_100M           0x54
-#define I2C_FS_SCL_LCNT_VALUE_100M           0x9a
-#define I2C_HS_SCL_HCNT_VALUE_100M           0x7
-#define I2C_HS_SCL_LCNT_VALUE_100M           0xE
-
-//
-// FIFO write workaround value.
-//
-#define     FIFO_WRITE_DELAY    2
-#define     IC_TAR_10BITADDR_MASTER           BIT12
-#define     FIFO_SIZE                         32
-#define     R_IC_INTR_STAT                    ( 0x2C) // I2c Inetrrupt Status
-#define     R_IC_INTR_MASK                    ( 0x30) // I2c Interrupt Mask
-#define     I2C_INTR_GEN_CALL                 BIT11  // General call received
-#define     I2C_INTR_START_DET                BIT10
-#define     I2C_INTR_STOP_DET                 BIT9
-#define     I2C_INTR_ACTIVITY                 BIT8
-#define     I2C_INTR_TX_ABRT                  BIT6   // Set on NACK
-#define     I2C_INTR_TX_EMPTY                 BIT4
-#define     I2C_INTR_TX_OVER                  BIT3
-#define     I2C_INTR_RX_FULL                  BIT2   // Data bytes in RX FIFO over threshold
-#define     I2C_INTR_RX_OVER                  BIT1
-#define     I2C_INTR_RX_UNDER                 BIT0
-
-/**
-  Programe all I2C controllers on LPSS. 
-  
-  I2C0 is function 1 of LPSS. I2C1 is function 2 of LPSS, etc..
-
-  @param   VOID
-
-  @return  EFI_SUCCESS
-**/
-EFI_STATUS
-ProgramPciLpssI2C (
-  VOID
-  );
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress        Device Address from which the byte value has to be read
-  @param  Offset              Offset from which the data has to be read
-  @param  *Byte               Address to which the value read has to be stored
-  @param  Start               Whether a RESTART is issued before the byte is sent or received
-  @param  End                 Whether STOP is generated after a data byte is sent or received  
-                                  
-  @return  EFI_SUCCESS        If the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR   Operation Failed, Device Error
-**/
-EFI_STATUS
-ByteReadI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  );
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be written
-  @param  Offset               Offset from which the data has to be read
-  @param  *Byte                Address to which the value written is stored
-  @param  Start               Whether a RESTART is issued before the byte is sent or received
-  @param  End                 Whether STOP is generated after a data byte is sent or received  
-                                  
-  @return  EFI_SUCCESS         IF the byte value has been successfully written
-  @return  EFI_DEVICE_ERROR    Operation Failed, Device Error
-**/
-EFI_STATUS
-ByteWriteI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  );
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be read
-  @param  Offset               Offset from which the data has to be read
-  @param  ReadBytes            Number of bytes to be read
-  @param  *ReadBuffer          Address to which the value read has to be stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS
-ByteReadI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer
-  );
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress        Device Address from which the byte value has to be written
-  @param  Offset              Offset from which the data has to be written
-  @param  WriteBytes          Number of bytes to be written
-  @param  *Byte               Address to which the value written is stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS
-ByteWriteI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.inf
deleted file mode 100644
index a78212a0e7..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.inf
+++ /dev/null
@@ -1,40 +0,0 @@
-## @file
-#  Instance of I2C Library.
-#
-#  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-#
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = I2CLibPei
-  FILE_GUID                      = 8EF61509-890B-4FF2-B352-1C0E9CDDEC8B
-  MODULE_TYPE                    = PEIM
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = LockBoxLib|PEIM
-  CONSTRUCTOR                    = IntelI2CPeiLibConstructor
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources.common]
-  I2CLibPei.c
-  I2CIoLibPei.c
-
-[LibraryClasses]
-  TimerLib
-
-[PPIs]
-  gEfiPeiStallPpiGuid
-
-
-[Packages]
-  MdePkg/MdePkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.c
deleted file mode 100644
index b99c3b0122..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-#include "PiPei.h"
-#include <Library/HobLib.h>
-#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
-#include <Guid/MemoryConfigData.h>
-#include <PlatformFspLib.h>
-
-EFI_STATUS
-PlatformHobCreateFromFsp (
-  IN CONST EFI_PEI_SERVICES     **PeiServices,
-  VOID                          *HobList
-  )
-{
-  VOID       *HobData;
-  VOID       *NewHobData;
-  UINTN      DataSize;
-
-  //
-  // Other hob, todo: put this into FspWrapPlatformLib
-  //
-  if ((HobList = GetNextGuidHob (&gEfiMemoryConfigDataGuid, HobList)) != NULL) {
-    HobData = GET_GUID_HOB_DATA (HobList);
-    DataSize = GET_GUID_HOB_DATA_SIZE(HobList);
-    DEBUG((EFI_D_ERROR, "gEfiMemoryConfigDataGuid Hob found: 0x%x.\n", DataSize));
-
-    NewHobData = BuildGuidHob (&gEfiMemoryConfigDataGuid, DataSize);
-    (*PeiServices)->CopyMem (
-                      NewHobData,
-                      HobData,
-                      DataSize
-                      );
-  }
-
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
deleted file mode 100644
index ddd97c5ad9..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-#
-# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-#    FSP Platform HOB Library
-#
-#
-#
-##
-
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = PlatformFspLib
-  FILE_GUID                      = 1305A712-33A6-4fa7-BA59-AEAC3362931A
-  MODULE_TYPE                    = BASE
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = PlatformFspLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  PlatformFspLib.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
-
-[LibraryClasses]
-  BaseLib
-  DebugLib
-  HobLib
-
-[Guids]
-  gEfiMemoryConfigDataGuid
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/PlatformSerialPortLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/PlatformSerialPortLib.h
deleted file mode 100644
index fe47e8f68d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/PlatformSerialPortLib.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/** @file
-  Header file of Serial port hardware definition.
-
-  Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef __PLATFORM_SERIAL_PORT_LIB_H_
-#define __PLATFORM_SERIAL_PORT_LIB_H_
-
-#include <Base.h>
-#include <Library/BaseLib.h>
-#include <Library/IoLib.h>
-#include <Library/PcdLib.h>
-#include <Library/SerialPortLib.h>
-
-//
-// UART Register Offsets
-//
-#define BAUD_LOW_OFFSET   0x00
-#define BAUD_HIGH_OFFSET  0x01
-#define IER_OFFSET        0x01
-#define LCR_SHADOW_OFFSET 0x01
-#define FCR_SHADOW_OFFSET 0x02
-#define IR_CONTROL_OFFSET 0x02
-#define FCR_OFFSET        0x02
-#define EIR_OFFSET        0x02
-#define BSR_OFFSET        0x03
-#define LCR_OFFSET        0x03
-#define MCR_OFFSET        0x04
-#define LSR_OFFSET        0x05
-#define MSR_OFFSET        0x06
-
-//
-// UART Register Bit Defines
-//
-#define LSR_TXRDY 0x20
-#define LSR_RXDA  0x01
-#define DLAB      0x01
-
-#define UART_DATA    8
-#define UART_STOP    1
-#define UART_PARITY  0
-#define UART_BREAK_SET  0
-
-VOID
-InitializeSio (
-  VOID
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.c
deleted file mode 100644
index f6012593d0..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/** @file
-  Serial I/O Port library functions with no library constructor/destructor
-
-  Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "PlatformSerialPortLib.h"
-
-UINT16 gComBase  = 0x3f8;
-UINTN  gBps      = 115200;
-UINT8  gData     = 8;
-UINT8  gStop     = 1;
-UINT8  gParity   = 0;
-UINT8  gBreakSet = 0;
-
-/**
-  Initialize Serial Port
-
-  The Baud Rate Divisor registers are programmed and the LCR
-  is used to configure the communications format. Hard coded
-  UART config comes from globals in DebugSerialPlatform lib.
-
-  @param None
-
-  @retval None
-
-**/
-RETURN_STATUS
-EFIAPI
-UARTInitialize (
-  VOID
-  )
-{
-  UINTN Divisor;
-  UINT8 OutputData;
-  UINT8 Data;
-
-  //
-  // Map 5..8 to 0..3
-  //
-  Data = (UINT8) (gData - (UINT8) 5);
-
-  //
-  // Calculate divisor for baud generator
-  //
-  Divisor = 115200 / gBps;
-
-  //
-  // Set communications format
-  //
-  OutputData = (UINT8) ((DLAB << 7) | ((gBreakSet << 6) | ((gParity << 3) | ((gStop << 2) | Data))));
-  IoWrite8 (gComBase + LCR_OFFSET, OutputData);
-
-  //
-  // Configure baud rate
-  //
-  IoWrite8 (gComBase + BAUD_HIGH_OFFSET, (UINT8) (Divisor >> 8));
-  IoWrite8 (gComBase + BAUD_LOW_OFFSET, (UINT8) (Divisor & 0xff));
-
-  //
-  // Switch back to bank 0
-  //
-  OutputData = (UINT8) ((~DLAB << 7) | ((gBreakSet << 6) | ((gParity << 3) | ((gStop << 2) | Data))));
-  IoWrite8 (gComBase + LCR_OFFSET, OutputData);
-
-  return RETURN_SUCCESS;
-}
-
-/**
-  Common function to initialize UART Serial device and USB Serial device.
-
-  @param None
-
-  @retval None
-
-**/
-RETURN_STATUS
-EFIAPI
-SerialPortInitialize (
-  VOID
-  )
-{
-
-  UARTInitialize ();
-
-
-  return RETURN_SUCCESS;
-}
-
-/**
-  Write data to serial device.
-
-  If the buffer is NULL, then return 0;
-  if NumberOfBytes is zero, then return 0.
-
-  @param  Buffer           Point of data buffer which need to be writed.
-  @param  NumberOfBytes    Number of output bytes which are cached in Buffer.
-
-  @retval 0                Write data failed.
-  @retval !0               Actual number of bytes writed to serial device.
-
-**/
-UINTN
-EFIAPI
-UARTDbgOut (
-  IN UINT8     *Buffer,
-  IN UINTN     NumberOfBytes
-)
-{
-  UINTN Result;
-  UINT8 Data;
-
-  if (NULL == Buffer) {
-    return 0;
-  }
-
-  Result = NumberOfBytes;
-
-  while (NumberOfBytes--) {
-    //
-    // Wait for the serial port to be ready.
-    //
-    do {
-      Data = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase) + LSR_OFFSET);
-    } while ((Data & LSR_TXRDY) == 0);
-    IoWrite8 ((UINT16) PcdGet64 (PcdSerialRegisterBase), *Buffer++);
-  }
-
-  return Result;
-}
-
-/**
-  Common function to write data to UART Serial device and USB Serial 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
-)
-{
-  if (FeaturePcdGet (PcdStatusCodeUseIsaSerial)) {
-    UARTDbgOut (Buffer, NumberOfBytes);
-  }
-
-  return RETURN_SUCCESS;
-}
-
-/**
-  Read data from serial device and save the datas in buffer.
-
-  If the buffer is NULL, then return 0;
-  if NumberOfBytes is zero, then return 0.
-
-  @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.
-  @retval !0               Actual number of bytes raed to serial device.
-
-**/
-UINTN
-EFIAPI
-UARTDbgIn (
-  OUT UINT8     *Buffer,
-  IN  UINTN     NumberOfBytes
-)
-{
-  UINTN Result;
-  UINT8 Data;
-
-  if (NULL == Buffer) {
-    return 0;
-  }
-
-  Result = NumberOfBytes;
-
-  while (NumberOfBytes--) {
-    //
-    // Wait for the serial port to be ready.
-    //
-    do {
-      Data = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase) + LSR_OFFSET);
-    } while ((Data & LSR_RXDA) == 0);
-
-    *Buffer++ = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase));
-  }
-
-  return Result;
-}
-
-/**
-  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.
-
-**/
-UINTN
-EFIAPI
-SerialPortRead (
-  OUT UINT8     *Buffer,
-  IN  UINTN     NumberOfBytes
-)
-{
-  if (FeaturePcdGet (PcdStatusCodeUseIsaSerial)) {
-    UARTDbgIn (Buffer, NumberOfBytes);
-  }
-
-  return RETURN_SUCCESS;
-}
-
-
-/**
-  Polls a serial device to see if there is any data waiting to be read.
-
-  Polls aserial 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
-  )
-{
-  UINT8  Data;
-
-  //
-  // Read the serial port status.
-  //
-  Data = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase) + LSR_OFFSET);
-
-  return (BOOLEAN) ((Data & LSR_RXDA) != 0);
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.inf
deleted file mode 100644
index 0e7a6d3cfc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.inf
+++ /dev/null
@@ -1,52 +0,0 @@
-#/** @file
-#
-# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-#**/
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SerialPortLib
-  FILE_GUID                      = 15B26F43-A389-4bae-BDE3-4BB0719B7D4F
-  MODULE_TYPE                    = BASE
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = SerialPortLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64
-#
-
-[Sources]
-  SerialPortLib.c
-  SioInit.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-
-[LibraryClasses]
-  BaseLib
-  PcdLib
-  IoLib
-  PciLib
-  TimerLib
-
-[FixedPcd.common]
-  gEfiSerialPortTokenSpaceGuid.PcdSerialBoudRate
-  gEfiSerialPortTokenSpaceGuid.PcdSerialRegisterBase
-
-[FeaturePcd]
-  gEfiSerialPortTokenSpaceGuid.PcdStatusCodeUseIsaSerial
-  gEfiSerialPortTokenSpaceGuid.PcdStatusCodeUseUsbSerial
-  gEfiSerialPortTokenSpaceGuid.PcdStatusCodeUseRam
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.c
deleted file mode 100644
index d9d48539dc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-    SioInit.c
-
-Abstract:
-
-    Functions for LpcSio initialization
-
---*/
-
-#include "PlatformSerialPortLib.h"
-#include "SioInit.h"
-
-typedef struct {
-  UINT8 Register;
-  UINT8 Value;
-} EFI_SIO_TABLE;
-
-EFI_SIO_TABLE mSioTableWpcn381u[] = {
-    {0x29, 0x0A0},
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART0},                                       // Select UART0 device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS >> 8)},       // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
-    {WPCN381U_IRQ1_REGISTER, 0x014},                                                      // Set to IRQ4
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART1},                                       // Select UART1 device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS >> 8)},       // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
-    {WPCN381U_IRQ1_REGISTER, 0x013},                                                      // Set to IRQ3
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_GPIO},                                        // Select GPIO device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS >> 8)},               // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS & 0x00FF)},           // Set Base Address LSB
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {0x21, 0x001},                                                                        // Global Device Enable
-    {0x26, 0x000}
-};
-
-EFI_SIO_TABLE mSioTableWdcp376[] = {
-    {0x29, 0x0A0},
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART0},                                       // Select UART0 device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS >> 8)},       // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
-    {WPCN381U_IRQ1_REGISTER, 0x014},                                                      // Set to IRQ4
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART1},                                       // Select UART1 device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS >> 8)},       // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
-    {WPCN381U_IRQ1_REGISTER, 0x013},                                                      // Set to IRQ3
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_GPIO},                                        // Select GPIO device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS >> 8)},               // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS & 0x00FF)},           // Set Base Address LSB
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {0x21, 0x001},                                                                        // Global Device Enable
-    {0x26, 0x000},
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_PS2K},                                        // Select PS2 Keyboard
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_KB_BASE1_ADDRESS >> 8)},                // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_KB_BASE1_ADDRESS & 0x00FF)},            // Set Base Address LSB
-    {WPCN381U_BASE2_HI_REGISTER, (UINT8)(WPCN381U_KB_BASE2_ADDRESS >> 8)},                // Set Base Address MSB
-    {WPCN381U_BASE2_LO_REGISTER, (UINT8)(WPCN381U_KB_BASE2_ADDRESS & 0x00FF)},            // Set Base Address LSB
-    {WPCN381U_IRQ1_REGISTER, 0x011},                                                      // Set to IRQ1
-    {0xF0, (SIO_KBC_CLOCK << 6)},                                                         // Select KBC Clock Source
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_PS2M},                                        // Select PS2 Mouse
-    {WPCN381U_IRQ1_REGISTER, 0x01c},                                                      // Set to IRQ12
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE}                                 // Enable it with Activation bit
-};
-
-/**
-  Initialization for SIO.
-
-  @param FfsHeader     FV this PEIM was loaded from.
-  @param PeiServices   General purpose services available to every PEIM.
-
-  None
-
-**/
-VOID
-InitializeSio (
-  VOID
-  )
-{
-  UINT16          Index;
-  UINT16          IndexPort;
-  UINT16          DataPort;
-
-  //
-  // Super I/O initialization for Winbond WPCN381U
-  //
-  IndexPort  = WPCN381U_CONFIG_INDEX;
-  DataPort   = WPCN381U_CONFIG_DATA;
-
-  //
-  // Check for Winbond WPCN381U
-  //
-  IoWrite8 (IndexPort, WPCN381U_DEV_ID_REGISTER);   // Winbond WPCN381U Device ID register is 0x20
-
-  if (IoRead8 (DataPort) == WPCN381U_CHIP_ID) {   // Winbond WPCN381U Device ID is 0xF4
-    //
-    // Configure WPCN381U SIO
-    //
-    for (Index = 0; Index < sizeof (mSioTableWpcn381u) / sizeof (EFI_SIO_TABLE); Index++) {
-      IoWrite8 (IndexPort, mSioTableWpcn381u[Index].Register);
-      IoWrite8 (DataPort, mSioTableWpcn381u[Index].Value);
-    }
-  }
-
-  if (IoRead8 (DataPort) == WDCP376_CHIP_ID) {   // Winbond WDCP376 Device ID is 0xF1
-    //
-    // Configure WDCP376 SIO
-    //
-    for (Index = 0; Index < sizeof (mSioTableWdcp376) / sizeof (EFI_SIO_TABLE); Index++) {
-      IoWrite8 (IndexPort, mSioTableWdcp376[Index].Register);
-      IoWrite8 (DataPort, mSioTableWdcp376[Index].Value);
-    }
-  }
-  return;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.h
deleted file mode 100644
index 06fa19b93d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/** @file
-  Header file of Serial port hardware definition.
-
-  Copyright (c) 2012  - 2017, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _SIO_INIT_H_
-#define _SIO_INIT_H_
-
-#define WPCN381U_CONFIG_INDEX               0x2E
-#define WPCN381U_CONFIG_DATA                0x2F
-#define WPCN381U_CONFIG_INDEX1              0x164E
-#define WPCN381U_CONFIG_DATA1               0x164F
-#define WPCN381U_CHIP_ID                    0xF4
-#define WDCP376_CHIP_ID                     0xF1
-
-//
-// SIO Logical Devices Numbers
-//
-#define WPCN381U_LDN_UART0                  0x03   // LDN for Serial Port Controller
-#define WPCN381U_LDN_UART1                  0x02   // LDN for Parallel Port Controller
-#define WPCN381U_LDN_PS2K                   0x06   // LDN for PS2 Keyboard Controller
-#define WPCN381U_LDN_PS2M                   0x05   // LDN for PS2 Mouse Controller
-#define WPCN381U_KB_BASE1_ADDRESS           0x60   // Base Address of KB controller
-#define WPCN381U_KB_BASE2_ADDRESS           0x64   // Base Address of KB controller
-#define SIO_KBC_CLOCK                       0x01   // 0/1/2 - 8/12/16 MHz KBC Clock Source
-#define WPCN381U_LDN_GPIO                   0x07   // LDN for GPIO
-
-//
-// SIO Registers Layout
-//
-#define WPCN381U_LD_SEL_REGISTER            0x07   // Logical Device Select Register Address
-#define WPCN381U_DEV_ID_REGISTER            0x20   // Device Identification Register Address
-#define WPCN381U_ACTIVATE_REGISTER          0x30   // Device Identification Register Address
-#define WPCN381U_BASE1_HI_REGISTER          0x60   // Device BaseAddres Register #1 MSB Address
-#define WPCN381U_BASE1_LO_REGISTER          0x61   // Device BaseAddres Register #1 LSB Address
-#define WPCN381U_BASE2_HI_REGISTER          0x62   // Device BaseAddres Register #1 MSB Address
-#define WPCN381U_BASE2_LO_REGISTER          0x63   // Device Ba1eAddres Register #1 LSB Address
-#define WPCN381U_IRQ1_REGISTER              0x70   // Device IRQ Register #1 Address
-#define WPCN381U_IRQ2_REGISTER              0x71   // Device IRQ Register #2 Address
-
-//
-// SIO Activation Values
-//
-#define WPCN381U_ACTIVATE_VALUE             0x01   // Value to activate Device
-#define WPCN381U_DEACTIVATE_VALUE           0x00   // Value to deactivate Device
-
-//
-// SIO GPIO
-//
-#define WPCN381U_GPIO_BASE_ADDRESS          0x0A20 // SIO GPIO Base Address
-
-//
-// SIO Serial Port Settings
-//
-#define WPCN381U_SERIAL_PORT0_BASE_ADDRESS  0x03F8 // Base Address of Serial Port 0 (COMA / UART0)
-#define WPCN381U_SERIAL_PORT1_BASE_ADDRESS  0x02F8 // Base Address of Serial Port 1 (COMB / UART1)
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.c b/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.c
deleted file mode 100644
index b1fb4adb34..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-
-  LegacyMetronome.c
-
-Abstract:
-
-  This contains the installation function for the driver.
-
---*/
-
-#include "LegacyMetronome.h"
-
-//
-// Handle for the Metronome Architectural Protocol instance produced by this driver
-//
-EFI_HANDLE                  mMetronomeHandle = NULL;
-
-//
-// The Metronome Architectural Protocol instance produced by this driver
-//
-EFI_METRONOME_ARCH_PROTOCOL mMetronome = {
-  WaitForTick,
-  TICK_PERIOD
-};
-
-//
-// The CPU I/O Protocol used to access system hardware
-//
-EFI_CPU_IO_PROTOCOL         *mCpuIo = NULL;
-
-//
-// Worker Functions
-//
-
-/**
-  Write an 8 bit value to an I/O port and save it to the S3 script
-
-  @param Port  IO Port
-  @param Data  Data in IO Port
-
-  @retval None.
-
-**/
-VOID
-ScriptWriteIo8 (
-  UINT16  Port,
-  UINT8   Data
-  )
-{
-  mCpuIo->Io.Write (
-               mCpuIo,
-               EfiCpuIoWidthUint8,
-               Port,
-               1,
-               &Data
-               );
-
-}
-
-/**
-
-  Read the refresh bit from the REFRESH_PORT
-
-  @param None.
-
-  @retval Refresh bit.
-
-**/
-UINT8
-ReadRefresh (
-  VOID
-  )
-{
-  UINT8 Data;
-
-  mCpuIo->Io.Read (
-               mCpuIo,
-               EfiCpuIoWidthUint8,
-               REFRESH_PORT,
-               1,
-               &Data
-               );
-  return (UINT8) (Data & REFRESH_ON);
-}
-
-/**
-
-  Waits for the TickNumber of ticks from a known platform time source.
-
-  @param This                Pointer to the protocol instance.
-  @param TickNumber          Tick Number to be waited
-
-
-  @retval EFI_SUCCESS         If number of ticks occurred.
-  @retval EFI_NOT_FOUND       Could not locate CPU IO protocol
-
-**/
-EFI_STATUS
-EFIAPI
-WaitForTick (
-  IN EFI_METRONOME_ARCH_PROTOCOL  *This,
-  IN UINT32                       TickNumber
-  )
-{
-  //
-  // Wait for TickNumber toggles of the Refresh bit
-  //
-  for (; TickNumber != 0x00; TickNumber--) {
-    while (ReadRefresh () == REFRESH_ON)
-      ;
-    while (ReadRefresh () == REFRESH_OFF)
-      ;
-  }
-
-  return EFI_SUCCESS;
-}
-
-//
-// Driver Entry Point
-//
-/**
-  Install the LegacyMetronome driver.  Loads a Metronome Arch Protocol based
-  on the Port 61 timer.
-
-  @param ImageHandle      Handle for the image of this driver
-  @param SystemTable      Pointer to the EFI System Table
-
-  @retval EFI_SUCCESS     Metronome Architectural Protocol Installed
-
-**/
-EFI_STATUS
-EFIAPI
-InstallLegacyMetronome (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  EFI_STATUS  Status;
-
-  //
-  // Make sure the Metronome Architectural Protocol is not already installed in the system
-  //
-  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiMetronomeArchProtocolGuid);
-
-  //
-  // Get the CPU I/O Protocol that this driver requires
-  // If the CPU I/O Protocol is not found, then ASSERT because the dependency expression
-  // should guarantee that it is present in the handle database.
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiCpuIoProtocolGuid,
-                  NULL,
-                  (void **)&mCpuIo
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // Program port 61 timer 1 as refresh timer. We could use ACPI timer in the
-  // future.
-  //
-  ScriptWriteIo8 (TIMER1_CONTROL_PORT, LOAD_COUNTER1_LSB);
-  ScriptWriteIo8 (TIMER1_COUNT_PORT, COUNTER1_COUNT);
-
-  //
-  // Install on a new handle
-  //
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &mMetronomeHandle,
-                  &gEfiMetronomeArchProtocolGuid,
-                  &mMetronome,
-                  NULL
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-  return Status;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.h b/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.h
deleted file mode 100644
index 9599eca702..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-  LegacyMetronome.h
-
-Abstract:
-
-  Driver implementing the EFI 2.0 metronome protocol using the legacy PORT 61
-  timer.
-
---*/
-
-#ifndef _LEGACY_METRONOME_H
-#define _LEGACY_METRONOME_H
-
-//
-// Statements that include other files
-//
-#include "Protocol/Metronome.h"
-#include "Protocol/CpuIo.h"
-#include "Library/DebugLib.h"
-#include "Library/UefiBootServicesTableLib.h"
-
-
-//
-// Private definitions
-//
-#define TICK_PERIOD         300
-#define REFRESH_PORT        0x61
-#define REFRESH_ON          0x10
-#define REFRESH_OFF         0x00
-#define TIMER1_CONTROL_PORT 0x43
-#define TIMER1_COUNT_PORT   0x41
-#define LOAD_COUNTER1_LSB   0x54
-#define COUNTER1_COUNT      0x12
-
-//
-// Function Prototypes
-//
-/**
-  Waits for the TickNumber of ticks from a known platform time source.
-
-  @param This                 Pointer to the protocol instance.
-  @param TickNumber           Tick Number to be waited
-
-  @retval EFI_SUCCESS         If number of ticks occurred.
-  @retval EFI_NOT_FOUND       Could not locate CPU IO protocol
-
-**/
-EFI_STATUS
-EFIAPI
-WaitForTick (
-  IN EFI_METRONOME_ARCH_PROTOCOL  *This,
-  IN UINT32                       TickNumber
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf b/Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf
deleted file mode 100644
index 173370d652..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-#
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-
-#  Module Name:
-#
-#    LegacyMetronome.inf
-#
-#  Abstract:
-#
-#    Component description file for LegacyMetronome module
-#
-#--*/
-[defines]
-  INF_VERSION	       = 0x00010005
-  BASE_NAME            = LegacyMetronome
-  FILE_GUID            = 07A9330A-F347-11d4-9A49-0090273FC14D
-  MODULE_TYPE          = DXE_DRIVER
-  VERSION_STRING       = 1.0
-  ENTRY_POINT	       = InstallLegacyMetronome
-
-[sources.common]
-  LegacyMetronome.c
-  LegacyMetronome.h
-
-[Packages]
-  MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-
-[LibraryClasses]
-  UefiDriverEntryPoint
-  UefiBootServicesTableLib
-  DevicePathLib
-  UefiLib
-
-[Protocols]
-
-gEfiMetronomeArchProtocolGuid
-gEfiCpuIoProtocolGuid
-
-[Depex]
-gEfiCpuIoProtocolGuid  AND  gEfiBootScriptSaveProtocolGuid
-
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c
deleted file mode 100644
index 26599620ba..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c
+++ /dev/null
@@ -1,252 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-
-    SmmScriptSave.c
-
-Abstract:
-
-    ScriptTableSave module at run time
-
---*/
-
-#include "SmmScriptSave.h"
-
-//
-// internal functions
-//
-
-EFI_STATUS
-BootScriptIoWrite  (
-  IN EFI_SMM_SCRIPT_TABLE     *ScriptTable,
-  IN VA_LIST                  Marker
-  );
-
-EFI_STATUS
-BootScriptPciCfgWrite  (
-  IN EFI_SMM_SCRIPT_TABLE     *ScriptTable,
-  IN VA_LIST                  Marker
-  );
-
-VOID
-SmmCopyMem (
-  IN  UINT8    *Destination,
-  IN  UINT8    *Source,
-  IN  UINTN    ByteCount
-  );
-
-//
-// Function implementations
-//
-EFI_STATUS
-SmmBootScriptWrite (
-  IN OUT EFI_SMM_SCRIPT_TABLE    *ScriptTable,
-  IN UINTN                       Type,
-  IN UINT16                      OpCode,
-  ...
-  )
-{
-  EFI_STATUS    Status;
-  VA_LIST       Marker;
-
-  if (ScriptTable == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Build script according to opcode
-  //
-  switch ( OpCode ) {
-
-    case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:
-      VA_START(Marker, OpCode);
-      Status = BootScriptIoWrite (ScriptTable, Marker);
-      VA_END(Marker);
-      break;
-
-    case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:
-      VA_START(Marker, OpCode);
-      Status = BootScriptPciCfgWrite(ScriptTable, Marker);
-      VA_END(Marker);
-      break;
-
-    default:
-      Status = EFI_SUCCESS;
-      break;
-  }
-
-  return Status;
-}
-
-
-EFI_STATUS
-SmmBootScriptCreateTable (
-  IN OUT EFI_SMM_SCRIPT_TABLE    *ScriptTable,
-  IN UINTN                       Type
-  )
-{
-  BOOT_SCRIPT_POINTERS          Script;
-  UINT8                         *Buffer;
-
-  if (ScriptTable == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Buffer = (UINT8*) ((UINTN)(*ScriptTable));
-
-  //
-  // Fill Table Header
-  //
-  Script.Raw = Buffer;
-  Script.TableInfo->OpCode      = EFI_BOOT_SCRIPT_TABLE_OPCODE;
-  Script.TableInfo->Length      = sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER);
-  Script.TableInfo->TableLength = sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER);
-
-  //
-  // Update current table pointer
-  //
-  *ScriptTable = *ScriptTable + sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER);
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-SmmBootScriptCloseTable (
-  IN EFI_SMM_SCRIPT_TABLE        ScriptTableBase,
-  IN EFI_SMM_SCRIPT_TABLE        ScriptTablePtr,
-  IN UINTN                       Type
-  )
-{
-  BOOT_SCRIPT_POINTERS    Script;
-
-  //
-  // Add final "termination" node to script table
-  //
-  Script.Raw               = (UINT8*) ((UINTN)ScriptTablePtr);
-  Script.Terminate->OpCode = EFI_BOOT_SCRIPT_TERMINATE_OPCODE;
-  Script.Terminate->Length = sizeof (EFI_BOOT_SCRIPT_TERMINATE);
-  ScriptTablePtr          += sizeof (EFI_BOOT_SCRIPT_TERMINATE);
-
-
-  //
-  // Update Table Header
-  //
-  Script.Raw                    = (UINT8*) ((UINTN)ScriptTableBase);
-  Script.TableInfo->OpCode      = EFI_BOOT_SCRIPT_TABLE_OPCODE;
-  Script.TableInfo->Length      = sizeof (EFI_BOOT_SCRIPT_TABLE_HEADER);
-  Script.TableInfo->TableLength = (UINT32)(ScriptTablePtr - ScriptTableBase);
-
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-BootScriptIoWrite  (
-  IN EFI_SMM_SCRIPT_TABLE     *ScriptTable,
-  IN VA_LIST                  Marker
-  )
-{
-  BOOT_SCRIPT_POINTERS    Script;
-  EFI_BOOT_SCRIPT_WIDTH   Width;
-  UINTN                   Address;
-  UINTN                   Count;
-  UINT8                   *Buffer;
-  UINTN                   NodeLength;
-  UINT8                   WidthInByte;
-
-  Width     = VA_ARG(Marker, EFI_BOOT_SCRIPT_WIDTH);
-  Address   = VA_ARG(Marker, UINTN);
-  Count     = VA_ARG(Marker, UINTN);
-  Buffer    = VA_ARG(Marker, UINT8*);
-
-  WidthInByte = (UINT8)(0x01 << (Width & 0x03));
-  Script.Raw  = (UINT8*) ((UINTN)(*ScriptTable));
-  NodeLength  = sizeof (EFI_BOOT_SCRIPT_IO_WRITE) + (WidthInByte * Count);
-
-  //
-  // Build script data
-  //
-  Script.IoWrite->OpCode  = EFI_BOOT_SCRIPT_IO_WRITE_OPCODE;
-  Script.IoWrite->Length  = (UINT8)(NodeLength);
-  Script.IoWrite->Width   = Width;
-  Script.IoWrite->Address = Address;
-  Script.IoWrite->Count   = (UINT32)Count;
-  SmmCopyMem (
-    (UINT8*)(Script.Raw + sizeof (EFI_BOOT_SCRIPT_IO_WRITE)),
-    Buffer,
-    WidthInByte * Count
-    );
-
-  //
-  // Update Script table pointer
-  //
-  *ScriptTable = *ScriptTable + NodeLength;
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-BootScriptPciCfgWrite  (
-  IN EFI_SMM_SCRIPT_TABLE        *ScriptTable,
-  IN VA_LIST                     Marker
-  )
-{
-  BOOT_SCRIPT_POINTERS    Script;
-  EFI_BOOT_SCRIPT_WIDTH   Width;
-  UINT64                  Address;
-  UINTN                   Count;
-  UINT8                   *Buffer;
-  UINTN                   NodeLength;
-  UINT8                   WidthInByte;
-
-  Width     = VA_ARG(Marker, EFI_BOOT_SCRIPT_WIDTH);
-  Address   = VA_ARG(Marker, UINT64);
-  Count     = VA_ARG(Marker, UINTN);
-  Buffer    = VA_ARG(Marker, UINT8*);
-
-  WidthInByte = (UINT8)(0x01 << (Width & 0x03));
-  Script.Raw  = (UINT8*) ((UINTN)(*ScriptTable));
-  NodeLength  = sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE) + (WidthInByte * Count);
-
-  //
-  // Build script data
-  //
-  Script.PciWrite->OpCode  = EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE;
-  Script.PciWrite->Length  = (UINT8)(NodeLength);
-  Script.PciWrite->Width   = Width;
-  Script.PciWrite->Address = Address;
-  Script.PciWrite->Count   = (UINT32)Count;
-  SmmCopyMem (
-    (UINT8*)(Script.Raw + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE)),
-    Buffer,
-    WidthInByte * Count
-    );
-
-  //
-  // Update Script table pointer
-  //
-  *ScriptTable = *ScriptTable + NodeLength;
-  return EFI_SUCCESS;
-}
-
-VOID
-SmmCopyMem (
-  IN  UINT8    *Destination,
-  IN  UINT8    *Source,
-  IN  UINTN    ByteCount
-  )
-{
-  UINTN   Index;
-
-  for (Index = 0; Index < ByteCount; Index++, Destination++, Source++) {
-    *Destination = *Source;
-  }
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.h
deleted file mode 100644
index d3eca8cdc0..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-    SmmScriptSave.h
-
-Abstract:
-
-  This is an implementation of the BootScript at run time.
-
---*/
-
-#ifndef _RUNTIME_SCRIPT_SAVE_H
-#define _RUNTIME_SCRIPT_SAVE_H
-
-#include "Efi.h"
-#include "EfiBootScript.h"
-
-
-typedef EFI_PHYSICAL_ADDRESS     EFI_SMM_SCRIPT_TABLE;
-
-EFI_STATUS
-SmmBootScriptCreateTable (
-  IN OUT EFI_SMM_SCRIPT_TABLE    *ScriptTable,
-  IN UINTN                       Type
-  );
-
-EFI_STATUS
-SmmBootScriptWrite (
-  IN OUT EFI_SMM_SCRIPT_TABLE    *ScriptTable,
-  IN UINTN                       Type,
-  IN UINT16                      OpCode,
-  ...
-  );
-
-EFI_STATUS
-SmmBootScriptCloseTable (
-  IN EFI_SMM_SCRIPT_TABLE        ScriptTableBase,
-  IN EFI_SMM_SCRIPT_TABLE        ScriptTablePtr,
-  IN UINTN                       Type
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.c b/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.c
deleted file mode 100644
index 0dbd6f00e1..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.c
+++ /dev/null
@@ -1,459 +0,0 @@
-/** @file
-  SMM SwDispatch2 Protocol on SMM SwDispatch Protocol Thunk driver.
-
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-
-#include <PiDxe.h>
-#include <FrameworkSmm.h>
-
-#include <Protocol/SmmSwDispatch2.h>
-#include <Protocol/SmmSwDispatch.h>
-#include <Protocol/SmmControl.h>
-#include <Protocol/SmmCpu.h>
-
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/SmmServicesTableLib.h>
-#include <Library/BaseLib.h>
-#include <Library/IoLib.h>
-#include <Library/DebugLib.h>
-
-typedef struct {
-  LIST_ENTRY                     Link;
-  EFI_HANDLE                     DispatchHandle;
-  UINTN                          SwSmiInputValue;
-  UINTN                          DispatchFunction;
-} EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT;
-
-/**
-  Register a child SMI source dispatch function for the specified software SMI.
-
-  This service registers a function (DispatchFunction) which will be called when the software
-  SMI source specified by RegisterContext->SwSmiCpuIndex is detected. On return,
-  DispatchHandle contains a unique handle which may be used later to unregister the function
-  using UnRegister().
-
-  @param[in]  This                  Pointer to the EFI_SMM_SW_DISPATCH2_PROTOCOL instance.
-  @param[in]  DispatchFunction      Function to register for handler when the specified software
-                                    SMI is generated.
-  @param[in, out]  RegisterContext  Pointer to the dispatch function's context.
-                                    The caller fills this context in before calling
-                                    the register function to indicate to the register
-                                    function which Software SMI input value the
-                                    dispatch function should be invoked for.
-  @param[out] DispatchHandle        Handle generated by the dispatcher to track the
-                                    function instance.
-
-  @retval EFI_SUCCESS            The dispatch function has been successfully
-                                 registered and the SMI source has been enabled.
-  @retval EFI_DEVICE_ERROR       The SW driver was unable to enable the SMI source.
-  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The SW SMI input value
-                                 is not within valid range.
-  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or SMM) to manage this
-                                 child.
-  @retval EFI_OUT_OF_RESOURCES   A unique software SMI value could not be assigned
-                                 for this dispatch.
-**/
-EFI_STATUS
-EFIAPI
-SmmSwDispatch2Register (
-  IN  CONST EFI_SMM_SW_DISPATCH2_PROTOCOL  *This,
-  IN        EFI_SMM_HANDLER_ENTRY_POINT2   DispatchFunction,
-  IN  OUT   EFI_SMM_SW_REGISTER_CONTEXT    *RegisterContext,
-  OUT       EFI_HANDLE                     *DispatchHandle
-  );
-
-/**
-  Unregister a child SMI source dispatch function for the specified software SMI.
-
-  This service removes the handler associated with DispatchHandle so that it will no longer be
-  called in response to a software SMI.
-
-  @param[in] This                Pointer to the EFI_SMM_SW_DISPATCH2_PROTOCOL instance.
-  @param[in] DispatchHandle      Handle of dispatch function to deregister.
-
-  @retval EFI_SUCCESS            The dispatch function has been successfully unregistered.
-  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
-**/
-EFI_STATUS
-EFIAPI
-SmmSwDispatch2UnRegister (
-  IN CONST EFI_SMM_SW_DISPATCH2_PROTOCOL  *This,
-  IN       EFI_HANDLE                     DispatchHandle
-  );
-
-EFI_SMM_SW_DISPATCH2_PROTOCOL gSmmSwDispatch2 = {
-  SmmSwDispatch2Register,
-  SmmSwDispatch2UnRegister,
-  0 // MaximumSwiValue
-};
-
-EFI_SMM_SW_DISPATCH_PROTOCOL  *mSmmSwDispatch;
-UINT8                         mSmiTriggerRegister;
-UINT8                         mSmiDataRegister;
-
-EFI_SMM_CPU_PROTOCOL          *mSmmCpuProtocol;
-LIST_ENTRY                    mSmmSwDispatch2ThunkQueue = INITIALIZE_LIST_HEAD_VARIABLE (mSmmSwDispatch2ThunkQueue);
-
-/**
-  This function find SmmSwDispatch2Context by SwSmiInputValue.
-
-  @param SwSmiInputValue The SwSmiInputValue to indentify the SmmSwDispatch2 context
-
-  @return SmmSwDispatch2 context
-**/
-EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT *
-FindSmmSwDispatch2ContextBySwSmiInputValue (
-  IN UINTN   SwSmiInputValue
-  )
-{
-  LIST_ENTRY                            *Link;
-  EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT    *ThunkContext;
-
-  for (Link = mSmmSwDispatch2ThunkQueue.ForwardLink;
-    Link != &mSmmSwDispatch2ThunkQueue;
-    Link = Link->ForwardLink) {
-    ThunkContext = BASE_CR (
-                     Link,
-                     EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT,
-                     Link
-                     );
-    if (ThunkContext->SwSmiInputValue == SwSmiInputValue) {
-      return ThunkContext;
-    }
-  }
-  return NULL;
-}
-
-/**
-  This function find SmmSwDispatch2Context by DispatchHandle.
-
-  @param DispatchHandle The DispatchHandle to indentify the SmmSwDispatch2Thunk context
-
-  @return SmmSwDispatch2Thunk context
-**/
-EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT *
-FindSmmSwDispatch2ContextByDispatchHandle (
-  IN EFI_HANDLE   DispatchHandle
-  )
-{
-  LIST_ENTRY                            *Link;
-  EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT    *ThunkContext;
-
-  for (Link = mSmmSwDispatch2ThunkQueue.ForwardLink;
-       Link != &mSmmSwDispatch2ThunkQueue;
-       Link = Link->ForwardLink) {
-    ThunkContext = BASE_CR (
-                     Link,
-                     EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT,
-                     Link
-                     );
-    if (ThunkContext->DispatchHandle == DispatchHandle) {
-      return ThunkContext;
-    }
-  }
-  return NULL;
-}
-
-/**
-  Framework dispatch function for a Software SMI handler.
-
-  @param  DispatchHandle        The handle of this dispatch function.
-  @param  DispatchContext       The pointer to the dispatch function's context.
-                                The SwSmiInputValue field is filled in
-                                by the software dispatch driver prior to
-                                invoking this dispatch function.
-                                The dispatch function will only be called
-                                for input values for which it is registered.
-
-  @return None
-
-**/
-VOID
-EFIAPI
-FrameworkDispatchFunction (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
-  )
-{
-  EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT    *ThunkContext;
-  EFI_SMM_HANDLER_ENTRY_POINT2          DispatchFunction;
-  EFI_SMM_SW_REGISTER_CONTEXT           RegisterContext;
-  EFI_SMM_SW_CONTEXT                    SwContext;
-  UINTN                                 Size;
-  UINTN                                 Index;
-  EFI_SMM_SAVE_STATE_IO_INFO            IoInfo;
-  EFI_STATUS                            Status;
-
-  //
-  // Search context
-  //
-  ThunkContext = FindSmmSwDispatch2ContextBySwSmiInputValue (DispatchContext->SwSmiInputValue);
-  ASSERT (ThunkContext != NULL);
-  if (ThunkContext == NULL) {
-    return ;
-  }
-
-  //
-  // Construct new context
-  //
-  RegisterContext.SwSmiInputValue = DispatchContext->SwSmiInputValue;
-  Size = sizeof(SwContext);
-  SwContext.CommandPort = IoRead8 (mSmiTriggerRegister);
-  SwContext.DataPort    = IoRead8 (mSmiDataRegister);
-
-  //
-  // Try to find which CPU trigger SWSMI
-  //
-  SwContext.SwSmiCpuIndex = 0;
-  for (Index = 0; Index < gSmst->NumberOfCpus; Index++) {
-    Status = mSmmCpuProtocol->ReadSaveState (
-                                mSmmCpuProtocol,
-                                sizeof(IoInfo),
-                                EFI_SMM_SAVE_STATE_REGISTER_IO,
-                                Index,
-                                &IoInfo
-                                );
-    if (EFI_ERROR (Status)) {
-      continue;
-    }
-    if (IoInfo.IoPort == mSmiTriggerRegister) {
-      //
-      // Great! Find it.
-      //
-      SwContext.SwSmiCpuIndex = Index;
-      break;
-    }
-  }
-
-  //
-  // Dispatch
-  //
-  DispatchFunction = (EFI_SMM_HANDLER_ENTRY_POINT2)ThunkContext->DispatchFunction;
-  DispatchFunction (
-    DispatchHandle,
-    &RegisterContext,
-    &SwContext,
-    &Size
-    );
-  return ;
-}
-
-/**
-  Register a child SMI source dispatch function for the specified software SMI.
-
-  This service registers a function (DispatchFunction) which will be called when the software
-  SMI source specified by RegisterContext->SwSmiCpuIndex is detected. On return,
-  DispatchHandle contains a unique handle which may be used later to unregister the function
-  using UnRegister().
-
-  @param[in]  This                  Pointer to the EFI_SMM_SW_DISPATCH2_PROTOCOL instance.
-  @param[in]  DispatchFunction      Function to register for handler when the specified software
-                                    SMI is generated.
-  @param[in, out]  RegisterContext  Pointer to the dispatch function's context.
-                                    The caller fills this context in before calling
-                                    the register function to indicate to the register
-                                    function which Software SMI input value the
-                                    dispatch function should be invoked for.
-  @param[out] DispatchHandle        Handle generated by the dispatcher to track the
-                                    function instance.
-
-  @retval EFI_SUCCESS            The dispatch function has been successfully
-                                 registered and the SMI source has been enabled.
-  @retval EFI_DEVICE_ERROR       The SW driver was unable to enable the SMI source.
-  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The SW SMI input value
-                                 is not within valid range.
-  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or SMM) to manage this
-                                 child.
-  @retval EFI_OUT_OF_RESOURCES   A unique software SMI value could not be assigned
-                                 for this dispatch.
-**/
-EFI_STATUS
-EFIAPI
-SmmSwDispatch2Register (
-  IN  CONST EFI_SMM_SW_DISPATCH2_PROTOCOL  *This,
-  IN        EFI_SMM_HANDLER_ENTRY_POINT2   DispatchFunction,
-  IN  OUT   EFI_SMM_SW_REGISTER_CONTEXT    *RegisterContext,
-  OUT       EFI_HANDLE                     *DispatchHandle
-  )
-{
-  EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT    *ThunkContext;
-  EFI_SMM_SW_DISPATCH_CONTEXT           DispatchContext;
-  EFI_STATUS                            Status;
-  UINTN                                 Index;
-
-  if (RegisterContext->SwSmiInputValue == (UINTN)-1) {
-    //
-    // If SwSmiInputValue is set to (UINTN) -1 then a unique value will be assigned and returned in the structure.
-    //
-    Status = EFI_NOT_FOUND;
-    for (Index = 1; Index < gSmmSwDispatch2.MaximumSwiValue; Index++) {
-      DispatchContext.SwSmiInputValue = Index;
-      Status = mSmmSwDispatch->Register (
-                                 mSmmSwDispatch,
-                                 FrameworkDispatchFunction,
-                                 &DispatchContext,
-                                 DispatchHandle
-                                 );
-      if (!EFI_ERROR (Status)) {
-        RegisterContext->SwSmiInputValue = Index;
-        break;
-      }
-    }
-    if (RegisterContext->SwSmiInputValue == (UINTN)-1) {
-      return EFI_OUT_OF_RESOURCES;
-    }
-  } else {
-    DispatchContext.SwSmiInputValue = RegisterContext->SwSmiInputValue;
-    Status = mSmmSwDispatch->Register (
-                               mSmmSwDispatch,
-                               FrameworkDispatchFunction,
-                               &DispatchContext,
-                               DispatchHandle
-                               );
-  }
-  if (!EFI_ERROR (Status)) {
-    //
-    // Register
-    //
-    Status = gSmst->SmmAllocatePool (
-                      EfiRuntimeServicesData,
-                      sizeof(*ThunkContext),
-                      (VOID **)&ThunkContext
-                      );
-    ASSERT_EFI_ERROR (Status);
-    if (EFI_ERROR (Status)) {
-      mSmmSwDispatch->UnRegister (mSmmSwDispatch, *DispatchHandle);
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    ThunkContext->SwSmiInputValue  = RegisterContext->SwSmiInputValue;
-    ThunkContext->DispatchFunction = (UINTN)DispatchFunction;
-    ThunkContext->DispatchHandle   = *DispatchHandle;
-    InsertTailList (&mSmmSwDispatch2ThunkQueue, &ThunkContext->Link);
-  }
-
-  return Status;
-}
-
-/**
-  Unregister a child SMI source dispatch function for the specified software SMI.
-
-  This service removes the handler associated with DispatchHandle so that it will no longer be
-  called in response to a software SMI.
-
-  @param[in] This                Pointer to the EFI_SMM_SW_DISPATCH2_PROTOCOL instance.
-  @param[in] DispatchHandle      Handle of dispatch function to deregister.
-
-  @retval EFI_SUCCESS            The dispatch function has been successfully unregistered.
-  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
-**/
-EFI_STATUS
-EFIAPI
-SmmSwDispatch2UnRegister (
-  IN CONST EFI_SMM_SW_DISPATCH2_PROTOCOL  *This,
-  IN       EFI_HANDLE                     DispatchHandle
-  )
-{
-  EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT    *ThunkContext;
-  EFI_STATUS                            Status;
-
-  Status = mSmmSwDispatch->UnRegister (mSmmSwDispatch, DispatchHandle);
-  if (!EFI_ERROR (Status)) {
-    //
-    // Unregister
-    //
-    ThunkContext = FindSmmSwDispatch2ContextByDispatchHandle (DispatchHandle);
-    ASSERT (ThunkContext != NULL);
-    if (ThunkContext != NULL) {
-      RemoveEntryList (&ThunkContext->Link);
-      gSmst->SmmFreePool (ThunkContext);
-    }
-  }
-
-  return Status;
-}
-
-/**
-  Entry Point for this thunk driver.
-
-  @param[in] ImageHandle  Image handle of this driver.
-  @param[in] SystemTable  A Pointer to the EFI System Table.
-
-  @retval EFI_SUCCESS  The entry point is executed successfully.
-  @retval other        Some error occurred when executing this entry point.
-**/
-EFI_STATUS
-EFIAPI
-SmmSwDispatch2ThunkMain (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  EFI_STATUS               Status;
-  EFI_SMM_CONTROL_PROTOCOL *SmmControl;
-  EFI_SMM_CONTROL_REGISTER RegisterInfo;
-
-  //
-  // Locate Framework SMM SwDispatch Protocol
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiSmmSwDispatchProtocolGuid,
-                  NULL,
-                  (VOID **)&mSmmSwDispatch
-                  );
-  ASSERT_EFI_ERROR (Status);
-  gSmmSwDispatch2.MaximumSwiValue = mSmmSwDispatch->MaximumSwiValue;
-  if (gSmmSwDispatch2.MaximumSwiValue == 0x0) {
-    DEBUG ((EFI_D_ERROR, "BUGBUG: MaximumSwiValue is 0, work-around to make it 0xFF\n"));
-    gSmmSwDispatch2.MaximumSwiValue = 0xFF;
-  }
-
-  //
-  // Locate Framework SMM Control Protocol
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiSmmControlProtocolGuid,
-                  NULL,
-                  (VOID **)&SmmControl
-                  );
-
-  ASSERT_EFI_ERROR (Status);
-  Status = SmmControl->GetRegisterInfo (
-                         SmmControl,
-                         &RegisterInfo
-                         );
-  ASSERT_EFI_ERROR (Status);
-  mSmiTriggerRegister = RegisterInfo.SmiTriggerRegister;
-  mSmiDataRegister    = RegisterInfo.SmiDataRegister;
-
-  //
-  // Locate PI SMM CPU protocol
-  //
-  Status = gSmst->SmmLocateProtocol (
-                    &gEfiSmmCpuProtocolGuid,
-                    NULL,
-                    (VOID **)&mSmmCpuProtocol
-                    );
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // Publish PI SMM SwDispatch2 Protocol
-  //
-  ImageHandle = NULL;
-  Status = gSmst->SmmInstallProtocolInterface (
-                    &ImageHandle,
-                    &gEfiSmmSwDispatch2ProtocolGuid,
-                    EFI_NATIVE_INTERFACE,
-                    &gSmmSwDispatch2
-                    );
-  ASSERT_EFI_ERROR (Status);
-  return Status;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf b/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
deleted file mode 100644
index 4f95fc281e..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
+++ /dev/null
@@ -1,54 +0,0 @@
-## @file
-#  Component description file for SMM SwDispatch2 Protocol on SMM SwDispatch Protocol Thunk driver.
-#
-#  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SmmSwDispatch2OnSmmSwDispatchThunk
-  FILE_GUID                      = 1410C6AC-9F4B-495b-9C23-8A5AEB0165E9
-  MODULE_TYPE                    = DXE_SMM_DRIVER
-  VERSION_STRING                 = 1.0
-  PI_SPECIFICATION_VERSION       = 0x0001000A
-  ENTRY_POINT                    = SmmSwDispatch2ThunkMain
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64
-#
-
-[Sources]
-  SmmSwDispatch2OnSmmSwDispatchThunk.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-
-[LibraryClasses]
-  UefiDriverEntryPoint
-  UefiBootServicesTableLib
-  SmmServicesTableLib
-  BaseLib
-  IoLib
-  DebugLib
-
-[Protocols]
-  gEfiSmmControlProtocolGuid               # PROTOCOL ALWAYS_CONSUMED
-  gEfiSmmSwDispatchProtocolGuid            # PROTOCOL ALWAYS_CONSUMED
-  gEfiSmmCpuProtocolGuid                   # PROTOCOL ALWAYS_CONSUMED
-  gEfiSmmSwDispatch2ProtocolGuid           # PROTOCOL ALWAYS_PRODUCED
-
-[Depex]
-  gEfiSmmSwDispatchProtocolGuid AND
-  gEfiSmmControlProtocolGuid AND
-  gEfiSmmCpuProtocolGuid
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.c b/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.c
deleted file mode 100644
index de257b35b5..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/** @file
-  A helper driver to save information to SMRAM after SMRR is enabled.
-
-  This driver is for ECP platforms.
-
-  Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-
-#include <PiSmm.h>
-#include <Library/DebugLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/SmmServicesTableLib.h>
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/IoLib.h>
-#include <Protocol/SmmSwDispatch.h>
-#include <Protocol/SmmReadyToLock.h>
-#include <Protocol/SmmControl.h>
-#include <Guid/Vlv2DeviceRefCodePkgTokenSpace.h>
-
-#define SMM_FROM_SMBASE_DRIVER        0x55
-#define SMM_FROM_CPU_DRIVER_SAVE_INFO 0x81
-
-#define EFI_SMRAM_CPU_NVS_HEADER_GUID \
-  { \
-    0x429501d9, 0xe447, 0x40f4, 0x86, 0x7b, 0x75, 0xc9, 0x3a, 0x1d, 0xb5, 0x4e \
-  }
-
-UINT8    mSmiDataRegister;
-BOOLEAN  mLocked = FALSE;
-EFI_GUID mSmramCpuNvsHeaderGuid = EFI_SMRAM_CPU_NVS_HEADER_GUID;
-
-/**
-  Dispatch function for a Software SMI handler.
-
-  @param  DispatchHandle        The handle of this dispatch function.
-  @param  DispatchContext       The pointer to the dispatch function's context.
-                                The SwSmiInputValue field is filled in
-                                by the software dispatch driver prior to
-                                invoking this dispatch function.
-                                The dispatch function will only be called
-                                for input values for which it is registered.
-
-  @return None
-
-**/
-VOID
-EFIAPI
-SmramSaveInfoHandler (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
-  )
-{
-  ASSERT (DispatchContext != NULL);
-  ASSERT (DispatchContext->SwSmiInputValue == SMM_FROM_SMBASE_DRIVER);
-
-  if (!mLocked && IoRead8 (mSmiDataRegister) == SMM_FROM_CPU_DRIVER_SAVE_INFO) {
-      CopyMem (
-        (VOID *)(UINTN)(PcdGetEx64 (&gEfiVLVTokenSpaceGuid, PcdCpuLockBoxDataAddress)),
-        (VOID *)(UINTN)(PcdGetEx64 (&gEfiVLVTokenSpaceGuid, PcdCpuSmramCpuDataAddress)),
-        (UINTN)(PcdGetEx64 (&gEfiVLVTokenSpaceGuid, PcdCpuLockBoxSize))
-        );
-  }
-}
-
-/**
-  Smm Ready To Lock event notification handler.
-
-  It sets a flag indicating that SMRAM has been locked.
-
-  @param[in] Protocol   Points to the protocol's unique identifier.
-  @param[in] Interface  Points to the interface instance.
-  @param[in] Handle     The handle on which the interface was installed.
-
-  @retval EFI_SUCCESS   Notification handler runs successfully.
- **/
-EFI_STATUS
-EFIAPI
-SmmReadyToLockEventNotify (
-  IN CONST EFI_GUID  *Protocol,
-  IN VOID            *Interface,
-  IN EFI_HANDLE      Handle
-  )
-{
-  mLocked = TRUE;
-  return EFI_SUCCESS;
-}
-
-/**
-  Entry point function of this driver.
-
-  @param[in] ImageHandle  The firmware allocated handle for the EFI image.
-  @param[in] SystemTable  A pointer to the EFI System Table.
-
-  @retval EFI_SUCCESS     The entry point is executed successfully.
-  @retval other           Some error occurs when executing this entry point.
-**/
-EFI_STATUS
-EFIAPI
-SmramSaveInfoHandlerSmmMain (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  EFI_STATUS                    Status;
-  EFI_SMM_SW_DISPATCH_PROTOCOL  *SmmSwDispatch;
-  EFI_SMM_SW_DISPATCH_CONTEXT   SmmSwDispatchContext;
-  EFI_HANDLE                    DispatchHandle;
-  EFI_SMM_CONTROL_PROTOCOL      *SmmControl;
-  EFI_SMM_CONTROL_REGISTER      SmmControlRegister;
-  VOID                          *Registration;
-
-  //
-  // Get SMI data register
-  //
-  Status = SystemTable->BootServices->LocateProtocol (
-                                        &gEfiSmmControlProtocolGuid,
-                                        NULL,
-                                        (VOID **)&SmmControl
-                                        );
-  ASSERT_EFI_ERROR (Status);
-  Status = SmmControl->GetRegisterInfo (SmmControl, &SmmControlRegister);
-  ASSERT_EFI_ERROR (Status);
-  mSmiDataRegister = SmmControlRegister.SmiDataRegister;
-
-  //
-  // Register software SMI handler
-  //
-
-  Status = SystemTable->BootServices->LocateProtocol (
-                                        &gEfiSmmSwDispatchProtocolGuid,
-                                        NULL,
-                                        (VOID **)&SmmSwDispatch
-                                        );
-  ASSERT_EFI_ERROR (Status);
-
-  SmmSwDispatchContext.SwSmiInputValue = SMM_FROM_SMBASE_DRIVER;
-  Status = SmmSwDispatch->Register (
-                            SmmSwDispatch,
-                            &SmramSaveInfoHandler,
-                            &SmmSwDispatchContext,
-                            &DispatchHandle
-                            );
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // Register SMM Ready To Lock Protocol notification
-  //
-  Status = gSmst->SmmRegisterProtocolNotify (
-                    &gEfiSmmReadyToLockProtocolGuid,
-                    SmmReadyToLockEventNotify,
-                    &Registration
-                    );
-  ASSERT_EFI_ERROR (Status);
-
-  return Status;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf b/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
deleted file mode 100644
index ec42c84472..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+++ /dev/null
@@ -1,60 +0,0 @@
-## @file
-#
-#  A helper driver to save information to SMRAM after SMRR is enabled.
-#
-#  Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SmramSaveInfoHandlerSmm
-  FILE_GUID                      = 63296C52-01CF-4eea-A47C-782A14DA6894
-  MODULE_TYPE                    = DXE_SMM_DRIVER
-  VERSION_STRING                 = 1.0
-  PI_SPECIFICATION_VERSION       = 0x0001000A
-
-  ENTRY_POINT                    = SmramSaveInfoHandlerSmmMain
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64
-#
-
-[Sources.common]
-  SmramSaveInfoHandlerSmm.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-
-[LibraryClasses]
-  UefiDriverEntryPoint
-  UefiRuntimeServicesTableLib
-  SmmServicesTableLib
-  BaseLib
-  BaseMemoryLib
-  IoLib
-
-[Protocols]
-  gEfiSmmSwDispatchProtocolGuid      ## CONSUMED
-  gEfiSmmControlProtocolGuid         ## CONSUMED
-  gEfiSmmReadyToLockProtocolGuid     ## CONSUMED
-
-[Pcd.common]
-  gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress
-  gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress
-  gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize
-  
-[Depex]
-  gEfiSmmSwDispatchProtocolGuid AND
-  gEfiSmmControlProtocolGuid
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIHeader/Vacant.bin b/Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIHeader/Vacant.bin
deleted file mode 100644
index 12d359146014baad9277a951b237fd27e819db6e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3928064
zcmeIuF#!Mo0K%aDspo45h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
rFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFz^EdVf>G}

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat b/Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat
deleted file mode 100644
index 200ca05a23..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat
+++ /dev/null
@@ -1,270 +0,0 @@
-@REM @file
-@REM   Windows batch file to build BIOS ROM
-@REM
-@REM Copyright (c) 2006   - 2019, Intel Corporation. All rights reserved.<BR>
-@REM 
-@REM   SPDX-License-Identifier: BSD-2-Clause-Patent
-@REM
-
-@echo off
-SetLocal EnableDelayedExpansion EnableExtensions
-
-set PLATFORM_BIN_PACKAGE=%WORKSPACE%\Vlv2SocBinPkg
-if not exist %PLATFORM_BIN_PACKAGE% (
-  if defined PACKAGES_PATH (
-    for %%i IN (%PACKAGES_PATH%) DO (
-      if exist %%~fi\Vlv2SocBinPkg (
-        set PLATFORM_BIN_PACKAGE=%%~fi\Vlv2SocBinPkg
-        goto PlatformBinPackageFound
-      )
-    )
-  ) else (
-    echo.
-    echo !!! ERROR !!! Cannot find %PLATFORM_NAME% !!!
-    echo.
-    goto BldFail
-  )
-)
-:PlatformBinPackageFound
-
-
-:: Set script defaults
-set exitCode=0
-set BackupRom=1
-set UpdateVBios=1
-set SpiLock=0
-set Stitch_Config=Stitch_Config.txt
-copy /y nul Stitching.log >nul
-
-:: Set default Suffix as:  YYYY_MM_DD_HHMM
-set hour=%time: =0%
-reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International_Temp" /f >nul
-reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f >nul
-for /f "tokens=1" %%i in ("%date%") do set today=%%i
-reg copy "HKCU\Control Panel\International_Temp" "HKCU\Control Panel\International" /f >nul
-reg delete "HKCU\Control Panel\International_Temp" /f >nul
-set IFWI_Suffix=%today%_%hour:~0,2%%time:~3,2%
-
-:: Process input arguments
-if "%~1"=="?"       goto Usage
-if "%~1"=="/?"      goto Usage
-if /i "%~1"=="Help" goto Usage
-
-:OptLoop
-if /i "%~1"=="/nV" (
-    set UpdateVBios=0
-    shift
-    goto OptLoop
-)
-if /i "%~1"=="/nB" (
-    set BackupRom=0
-    shift
-    goto OptLoop
-)
-if /i "%~1"=="/yL" (
-    set SpiLock=1
-    shift
-    goto OptLoop
-)
-
-if /i "%~1"=="/B" (
-    if "%~2"==""  goto Usage
-    if not exist %~2 echo BIOS not found. & goto Usage
-    set BIOS_Names=%~2
-    set BIOS_File_Name=%~n2
-    shift & shift
-    goto OptLoop
-)
-if /i "%~1"=="/C" (
-    if "%~2"==""  goto Usage
-    if not exist %~2 echo ConfigFile not found. & goto Usage
-    set Stitch_Config=%~2
-    shift & shift
-    goto OptLoop
-)
-if /i "%~1"=="/S" (
-    if "%~2"==""  goto Usage
-    set IFWI_Suffix=%~2
-    shift & shift
-    goto OptLoop
-)
-
-if "%BIOS_File_Name:~0,4%"=="MNW2" (
-   set Stitch_Config= MNW2_Stitch_Config.txt
-)
-if "%BIOS_File_Name:~3,4%"=="MNW2" (
-   set Stitch_Config= MNW2_Stitch_Config.txt
-)
-
-:: if no rom specified by user, search in ./ for ROM files
-if "%BIOS_Names%"=="" (
-    set "BIOS_Names= "
-    for /f "tokens=*" %%i in ('dir /b *.rom') do set BIOS_Names=!BIOS_Names! %%i
-    if "!BIOS_Names!"==" " (
-        echo NO .ROM files found !!!
-        goto Usage
-    )
-)
-
-:: Parse the Stitch_Config File
-if not exist %Stitch_Config% (
-    echo Stitch Configuration File %Stitch_Config% not found.
-    goto ScriptFail
-)
-for /f "delims== tokens=1,2" %%i in (%Stitch_Config%) do (
-    if /i "%%i"=="HEADER"      set IFWI_HEADER=%%j
-    if /i "%%i"=="SEC_VERSION" set SEC_VERSION=%%j
-    if /i "%%i"=="Source" (
-        if /i "%%j"=="ALPHA" set Source_Prefix=A_
-        if /i "%%j"=="BF" set Source_Prefix=BF_
-        if /i "%%j"=="BE" set Source_Prefix=BE_
-        if /i "%%j"=="PV" set Source_Prefix=PV_
-        if /i "%%j"=="PR1" set Source_Prefix=PR1_
-    )
-)
-
-if %SpiLock% EQU 1 (
-  set IFWI_HEADER_FILE=IFWIHeader\!IFWI_HEADER!_SPILOCK.bin
-) else (
-  set IFWI_HEADER_FILE=IFWIHeader\!IFWI_HEADER!.bin
-)
-
-:: **********************************************************************
-:: The Main Stitching Loop
-:: **********************************************************************
-echo %date%  %time% >>Stitching.log 2>&1
-echo %date%  %time%
-echo.
-for %%i in (%BIOS_Names%) do (
-
-    REM  ----- Do NOT use :: for comments Inside of code blocks() -------
-    set BIOS_Rom=%%i
-    set BIOS_Name=%%~ni
-    set BIOS_Version=!BIOS_Name:~-7,7!
-
-    REM extract PlatformType from BIOS filename
-    set Platform_Type=!BIOS_Name:~0,4!
-
-    REM Special treat for BayLake FFD8
-    set Temp_Name=!BIOS_Name:~0,7!
-
-
-    REM Capitalize and validate the Platform_Type
-    if /i "!Platform_Type!"=="MNW2" (
-        set Platform_Type=MNW2
-    ) else (
-        echo Error - Unsupported PlatformType: !Platform_Type!
-        goto Usage
-    )
-
-
-    REM search BIOS_Name for Arch substring:  either IA32 or X64
-    if not "!BIOS_Name!"=="!BIOS_Name:_IA32_=!" (
-        set Arch=IA32
-    ) else if not "!BIOS_Name!"=="!BIOS_Name:_X64_=!" (
-        set Arch=X64
-    ) else (
-        echo Error:  Could not determine Architecture for !BIOS_Rom!
-        goto Usage
-    )
-    set IFWI_Prefix=!Platform_Type!_IFWI_%Source_Prefix%!Arch!_!!BIOS_Version!
-
-    REM search BIOS_Name for Build_Target substring: either R or D
-    if not "!BIOS_Name!"=="!BIOS_Name:_R_=!" (
-        set Build_Target=Release
-        set IFWI_Prefix=!IFWI_Prefix!_R
-    ) else if not "!BIOS_Name!"=="!BIOS_Name:_D_=!" (
-        set Build_Target=Debug
-        set IFWI_Prefix=!IFWI_Prefix!_D
-    ) else (
-        echo Error:  Could not determine Build Target for !BIOS_Rom!
-        goto Usage
-    )
-
-    REM Create a BIOS backup before Stitching
-    if %BackupRom% EQU 1 (
-        echo Creating backup of original BIOS rom.
-        copy /y !BIOS_Rom! !BIOS_Rom!.orig >nul
-    )
-
-    echo.  >>Stitching.log
-    echo ********** Stitching !BIOS_Rom! **********  >>Stitching.log
-    echo.  >>Stitching.log
-    echo.
-    echo Stitching IFWI for !BIOS_Rom! ...
-    echo ---------------------------------------------------------------------------
-    echo IFWI  Header: !IFWI_HEADER_FILE!,   SEC version: !SEC_VERSION!,   
-    echo BIOS Version: !BIOS_Version!
-
-    echo Platform Type: !Platform_Type!,     IFWI Prefix: %BIOS_ID%
-    echo ---------------------------------------------------------------------------
-
-    echo -----------------------------
-    echo.
-    echo Generating IFWI... %BIOS_ID%.bin
-    echo.
-
-    copy /b/y !IFWI_HEADER_FILE! + %PLATFORM_BIN_PACKAGE%\SEC\!SEC_VERSION!\VLV_SEC_REGION.bin + %PLATFORM_BIN_PACKAGE%\SEC\!SEC_VERSION!\Vacant.bin + !BIOS_Rom! %BIOS_ID%.bin
-    echo.
-    echo ===========================================================================
-)
-@echo off
-
-::**********************************************************************
-:: end of main loop
-::**********************************************************************
-
-echo.
-echo  -- All specified ROM files Stitched. --
-echo.
-goto Exit
-
-:Usage
-echo.
-echo **************************************************************************************************
-echo This Script is used to Stitch together BIOS, GOP Driver, Microcode Patch and TXE FW
-echo into a single Integrated Firmware Image (IFWI).
-echo.
-echo Usage: IFWIStitch.bat [flags] [/B BIOS.ROM] [/C Stitch_Config] [/S IFWI_Suffix]
-echo.
-echo    This script has NO Required arguments, so that the user can just double click from the GUI.
-echo    However, this requires that the BIOS.ROM file name is formatted correctly.
-echo.
-echo    /nG             Do NOT update the GOP driver.  (applies to all ROM files for this run)
-echo    /nV             Do NOT update the VBIOS.       (applies to all ROM files for this run)
-echo    /nM             Do NOT update the Microcode.   (applies to all ROM files for this run)
-echo    /nB             Do NOT backup BIOS.ROMs. (Default will backup to BIOS.ROM.Orig)
-echo.
-echo    BIOS.ROM:       A single BIOS ROM file to use for stitching
-echo                    (DEFAULT: ALL .ROM files inside the current directory)
-echo    Stitch_Config:  Text file containing version info of each FW component
-echo                    (DEFAULT: Stitch_Config.txt)
-echo    IFWI_Suffix:    Suffix to append to the end of the IFWI filename
-echo                    (DEFAULT: YYYY_MM_DD_HHMM)
-echo.
-echo Examples:
-echo    IFIWStitch.bat                                      : Stitch all ROMs with defaults
-echo    IFIWStitch.bat /B C:/MyRoms/testBIOS.rom            : Stitch single ROM with defaults
-echo    IFIWStitch.bat /B ../testBIOS.rom /S test123        : Stitch single ROM and add custom suffix
-echo    IFIWStitch.bat /nM /nB /B testBIOS.rom /S test456   : Stitch single ROM, keep uCode from .rom,
-echo                                                          don't create backup, and add custom suffix.
-echo ****************************************************************************************************
-pause
-exit /b 1
-
-:ScriptFail
-set exitCode=1
-
-:Exit
-echo  -- See Stitching.log for more info. --
-echo.
-echo %date%  %time%
-echo.
-if "%Platform_Type%"=="MNW2" (
-  echo .
-) else (
-  echo only support MNW2 for this project!
-pause
-)
-exit /b %exitCode%
-EndLocal
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Config.txt b/Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Config.txt
deleted file mode 100644
index 82abe6548f..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Config.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-#
-
-HEADER=IFWI_HEADER
-SEC_VERSION=1.0.2.1060v5
-
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 04/14] Vlv2TbltDevicePkg: Switch from ISA to SIO modules
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (2 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 03/14] Vlv2TbltDevicePkg: Remove unused modules/libraries Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:07   ` Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 05/14] Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol Michael D Kinney
                   ` (10 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

Remove IntelFrameworkModulePkg ISA related modules and replace
with MdeModulePkg SIO modules.

* Retire Wpce791 module
* Retire gEfiLpcWpce791PolicyProtocolGuid and include file
* Retire gEfiLpcWpc83627PolicyProtocolGuid and include file
* Remove production of gEfiLpcWpc83627PolicyProtocolGuid from
  PlatformDxe module
* Add PcuSio module
* Use PciSioSerialDxe module

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Include/Protocol/LpcWpc83627Policy.h      |  92 --
 .../Include/Protocol/LpcWpce791Policy.h       |  55 -
 .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c   | 951 ++++++++++++++++++
 .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h   | 363 +++++++
 .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf |  38 +
 .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  |   4 -
 .../PlatformDxe/PlatformDxe.inf               |   2 -
 .../PlatformDxe/SioPlatformPolicy.c           |  82 --
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |   1 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |   2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |   2 +-
 .../Vlv2TbltDevicePkg/Wpce791/LpcDriver.c     | 340 -------
 .../Vlv2TbltDevicePkg/Wpce791/LpcDriver.h     | 112 ---
 .../Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c    | 366 -------
 .../Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h    | 103 --
 .../Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c  | 126 ---
 .../Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h  | 101 --
 .../Vlv2TbltDevicePkg/Wpce791/Wpce791.inf     |  63 --
 18 files changed, 1354 insertions(+), 1449 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc83627Policy.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpce791Policy.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatformPolicy.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc83627Policy.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc83627Policy.h
deleted file mode 100644
index 62d026f133..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc83627Policy.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  LpcWpc83667Policy.h
-
-Abstract:
-
-  Protocol used for WPC83627 Policy definition.
--------------------------------------------------------------------------------
-   Rev   Date<MM/DD/YYYY>    Name    Description
-  -------------------------------------------------------------------------------
-  R01   < 4/22/2011>         LB     Update driver for Sio83627UGH support.
-  -------------------------------------------------------------------------------
-**/
-
-#ifndef _WPC83627_POLICY_PROTOCOL_H_
-#define _WPC83627_POLICY_PROTOCOL_H_
-
-EFI_FORWARD_DECLARATION (EFI_WPC83627_POLICY_PROTOCOL);
-
-#define EFI_WPC83627_POLICY_PROTOCOL_GUID \
-  { \
-    0xd3ecc567, 0x9fd5, 0x44c1, 0x86, 0xcf, 0x5d, 0xa7, 0xa2, 0x4f, 0x4b, 0x5d \
-  }
-
-#define EFI_WPC83627_COM1_ENABLE          0x01
-#define EFI_WPC83627_COM2_ENABLE          0x01
-
-#define EFI_WPC83627_COM3_ENABLE          0x01
-#define EFI_WPC83627_COM4_ENABLE          0x01
-
-#define EFI_WPC83627_LPT1_ENABLE          0x01
-#define EFI_WPC83627_LPT1_ENABLE          0x01
-#define EFI_WPC83627_FDD_ENABLE           0x01
-#define EFI_WPC83627_FDD_WRITE_ENABLE     0x01
-#define EFI_WPC83627_PS2_KBC_ENABLE       0x01
-#define EFI_WPC83627_ECIR_ENABLE	  0x01
-
-#define EFI_WPC83627_COM1_DISABLE         0x00
-#define EFI_WPC83627_COM2_DISABLE         0x00
-
-#define EFI_WPC83627_COM3_DISABLE         0x00
-#define EFI_WPC83627_COM4_DISABLE         0x00
-
-#define EFI_WPC83627_LPT1_DISABLE         0x00
-#define EFI_WPC83627_FDD_DISABLE          0x00
-#define EFI_WPC83627_FDD_WRITE_PROTECT    0x00
-#define EFI_WPC83627_PS2_KBC_DISABLE      0x00
-#define EFI_WPC83627_ECIR_DISABLE         0x00
-#define EFI_WPC83627_RESERVED_DEFAULT     0x00
-
-typedef struct {
-  UINT16  Com1               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Lpt1               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Floppy             :1;             // 0 = Disable, 1 = Enable
-  UINT16  FloppyWriteProtect :1;             // 0 = Write Protect, 1 = Write Enable
-  UINT16  Port80             :1;             // 0 = Disable, 1 = Enable
-  UINT16  CIR                :1;             // CIR enable or disable
-  UINT16  Ps2Keyboard        :1;             // 0 = Disable, 1 = Enable
-  UINT16  Ps2Mouse           :1;             // 0 = Disable, 1 = Enable
-  UINT16  Com2               :1;             // 0 = Disable, 1 = Enable
-
-  UINT16  Com3               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Com4               :1;             // 0 = Disable, 1 = Enable
-
-  UINT16  Dac                :1;             // 0 = Disable, 1 = Enable
-  UINT16  Rsvd               :6;
-} EFI_WPC83627_DEVICE_ENABLES;
-
-typedef enum {
-  LptModeOutput,
-  LptModeBiDirectional,
-  LptModeEpp,
-  LptModeEcp
-} EFI_LPT_MODE;
-
-typedef struct _EFI_WPC83627_POLICY_PROTOCOL {
-  EFI_WPC83627_DEVICE_ENABLES DeviceEnables;
-  EFI_LPT_MODE              LptMode;
-} EFI_WPC83627_POLICY_PROTOCOL;
-
-extern EFI_GUID gEfiLpcWpc83627PolicyProtocolGuid;
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpce791Policy.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpce791Policy.h
deleted file mode 100644
index 1b2459e54a..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpce791Policy.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  LpcWpce791Policy.h
-
-Abstract:
-
-  Protocol used for WPCE791 Policy definition.
-
-**/
-
-#ifndef _WPCE791_POLICY_PROTOCOL_H_
-#define _WPCE791_POLICY_PROTOCOL_H_
-
-
-#define EFI_WPCE791_POLICY_PROTOCOL_GUID \
-  { \
-    0xab2bee2f, 0xc1a6, 0x4399, 0x85, 0x3d, 0xc0, 0x7c, 0x77, 0x4f, 0xfd, 0xd \
-  }
-
-#define EFI_WPCE791_PS2_KEYBOARD_ENABLE       0x01
-#define EFI_WPCE791_PS2_KEYBOARD_DISABLE      0x00
-
-#define EFI_WPCE791_PS2_MOUSE_ENABLE       0x01
-#define EFI_WPCE791_PS2_MOUSE_DISABLE      0x00
-
-typedef struct {
-  UINT16  Com1               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Lpt1               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Floppy             :1;             // 0 = Disable, 1 = Enable
-  UINT16  FloppyWriteProtect :1;             // 0 = Write Protect, 1 = Write Enable
-  UINT16  Port80             :1;             // 0 = Disable, 1 = Enable
-  UINT16  CIR                :1;             // CIR enable or disable
-  UINT16  Ps2Keyboard        :1;             // 0 = Disable, 1 = Enable
-  UINT16  Ps2Mouse           :1;             // 0 = Disable, 1 = Enable
-  UINT16  Com2               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Dac                :1;             // 0 = Disable, 1 = Enable
-  UINT16  Rsvd               :6;
-} EFI_WPCE791_DEVICE_ENABLES;
-
-typedef struct _EFI_WPCE791_POLICY_PROTOCOL {
-  EFI_WPCE791_DEVICE_ENABLES DeviceEnables;
-} EFI_WPCE791_POLICY_PROTOCOL;
-
-extern EFI_GUID gEfiLpcWpce791PolicyProtocolGuid;
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c
new file mode 100644
index 0000000000..d16b1b0abd
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c
@@ -0,0 +1,951 @@
+/** @file
+  Produces the SIO Protocols for ISA devices integrated in the Platform
+  Controller Unit (PCU).
+
+  Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "PcuSio.h"
+
+//
+//  PCU SIO Driver Global Variables
+//
+EFI_DRIVER_BINDING_PROTOCOL gPcuSioDriverBinding = {
+  PcuSioDriverBindingSupported,
+  PcuSioDriverBindingStart,
+  PcuSioDriverBindingStop,
+  0x10,
+  NULL,
+  NULL
+};
+
+//
+// Super I/O Protocol interfaces
+//
+EFI_SIO_PROTOCOL mSioInterface = {
+  SioRegisterAccess,
+  SioGetResources,
+  SioSetResources,
+  SioPossibleResources,
+  SioModify
+};
+
+//
+// COM 1 UART Controller
+//
+GLOBAL_REMOVE_IF_UNREFERENCED
+SIO_RESOURCES_IO mCom1Resources = {
+  { { ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR }, 0x3F8, 8 },
+  { ACPI_END_TAG_DESCRIPTOR,                    0        }
+};
+
+//
+// Table of SIO Controllers
+//
+GLOBAL_REMOVE_IF_UNREFERENCED
+SIO_DEVICE_INFO mDevicesInfo[] = {
+  {
+    EISA_PNP_ID (0x501),
+    0,
+    { (ACPI_SMALL_RESOURCE_HEADER *) &mCom1Resources }
+  }
+};
+
+//
+// ACPI Device Path Node template
+//
+GLOBAL_REMOVE_IF_UNREFERENCED
+ACPI_HID_DEVICE_PATH mAcpiDeviceNodeTemplate = {
+  {        // Header
+    ACPI_DEVICE_PATH,
+    ACPI_DP,
+    {
+      (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)),
+      (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
+    }
+  },
+  0x0,     // HID
+  0x0      // UID
+};
+
+/**
+  Provides a low level access to the registers for the Super I/O.
+
+  @param[in]     This           Indicates a pointer to the calling context.
+  @param[in]     Write          Specifies the type of the register operation.
+                                If this parameter is TRUE, Value is interpreted
+                                as an input parameter and the operation is a
+                                register write. If this parameter is FALSE,
+                                Value is interpreted as an output parameter and
+                                the operation is a register read.
+  @param[in]     ExitCfgMode    Exit Configuration Mode Indicator. If this
+                                parameter is set to TRUE, the Super I/O driver
+                                will turn off configuration mode of the Super
+                                I/O prior to returning from this function. If
+                                this parameter is set to FALSE, the Super I/O
+                                driver will leave Super I/O in the
+                                configuration mode. The Super I/O driver must
+                                track the current state of the Super I/O and
+                                enable the configuration mode of Super I/O if
+                                necessary prior to register access.
+  @param[in]     Register       Register number.
+  @param[in,out] Value          If Write is TRUE, Value is a pointer to the
+                                buffer containing the byte of data to be
+                                written to the Super I/O register. If Write is
+                                FALSE, Value is a pointer to the destination
+                                buffer for the byte of data to be read from the
+                                Super I/O register.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER The Value is NULL.
+  @retval EFI_INVALID_PARAMETER Invalid Register number.
+
+**/
+EFI_STATUS
+EFIAPI
+SioRegisterAccess (
+  IN CONST EFI_SIO_PROTOCOL    *This,
+  IN       BOOLEAN             Write,
+  IN       BOOLEAN             ExitCfgMode,
+  IN       UINT8               Register,
+  IN OUT   UINT8               *Value
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  Provides an interface to get a list of the current resources consumed by the
+  device in the ACPI Resource Descriptor format.
+
+  GetResources() returns a list of resources currently consumed by the device.
+  The ResourceList is a pointer to the buffer containing resource descriptors
+  for the device. The descriptors are in the format of Small or Large ACPI
+  resource descriptor as defined by ACPI specification (2.0 & 3.0). The buffer
+  of resource descriptors is terminated with the 'End tag' resource descriptor.
+
+  @param[in]  This              Indicates a pointer to the calling context.
+  @param[out] ResourceList      A pointer to an ACPI resource descriptor list
+                                that defines the current resources used by the
+                                device.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER ResourceList is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioGetResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  OUT      ACPI_RESOURCE_HEADER_PTR    *ResourceList
+  )
+{
+  SIO_DEV  *SioDevice;
+
+  if (ResourceList == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  SioDevice = SIO_DEV_FROM_SIO (This);
+  if (SioDevice->DeviceIndex < ARRAY_SIZE (mDevicesInfo)) {
+    *ResourceList = mDevicesInfo[SioDevice->DeviceIndex].Resources;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Sets the resources for the device.
+
+  @param[in] This               Indicates a pointer to the calling context.
+  @param[in] ResourceList       Pointer to the ACPI resource descriptor list.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER ResourceList is invalid.
+  @retval EFI_ACCESS_DENIED     Some of the resources in ResourceList are in
+                                use.
+
+**/
+EFI_STATUS
+EFIAPI
+SioSetResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  IN       ACPI_RESOURCE_HEADER_PTR    ResourceList
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  Provides a collection of resource descriptor lists. Each resource descriptor
+  list in the collection defines a combination of resources that can
+  potentially be used by the device.
+
+  @param[in]  This                  Indicates a pointer to the calling context.
+  @param[out] ResourceCollection    Collection of the resource descriptor
+                                    lists.
+
+  @retval EFI_SUCCESS               The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER     ResourceCollection is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioPossibleResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  OUT      ACPI_RESOURCE_HEADER_PTR    *ResourceCollection
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  Provides an interface for a table based programming of the Super I/O
+  registers.
+
+  The Modify() function provides an interface for table based programming of
+  the Super I/O registers. This function can be used to perform programming of
+  multiple Super I/O registers with a single function call. For each table
+  entry, the Register is read, its content is bitwise ANDed with AndMask, and
+  then ORed with OrMask before being written back to the Register. The Super
+  I/O driver must track the current state of the Super I/O and enable the
+  configuration mode of Super I/O if necessary prior to table processing. Once
+  the table is processed, the Super I/O device has to be returned to the
+  original state.
+
+  @param[in] This               Indicates a pointer to the calling context.
+  @param[in] Command            A pointer to an array of NumberOfCommands
+                                EFI_SIO_REGISTER_MODIFY structures. Each
+                                structure specifies a single Super I/O register
+                                modify operation.
+  @param[in] NumberOfCommands   Number of elements in the Command array.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER Command is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioModify (
+  IN CONST EFI_SIO_PROTOCOL           *This,
+  IN CONST EFI_SIO_REGISTER_MODIFY    *Command,
+  IN       UINTN                      NumberOfCommands
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  Create the child device with a given device index.
+
+  @param[in] This              The EFI_DRIVER_BINDING_PROTOCOL instance.
+  @param[in] Controller        The handle of ISA bus controller.
+  @param[in] PciIo             The pointer to the PCI protocol.
+  @param[in] ParentDevicePath  Device path of the ISA bus controller.
+  @param[in] DeviceIndex       Index of the device supported by this driver.
+
+  @retval EFI_SUCCESS          The child device has been created successfully.
+  @retval Others               Error occurred during the child device creation.
+
+**/
+EFI_STATUS
+SioCreateChildDevice (
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
+  IN EFI_HANDLE                   Controller,
+  IN EFI_PCI_IO_PROTOCOL          *PciIo,
+  IN EFI_DEVICE_PATH_PROTOCOL     *ParentDevicePath,
+  IN UINT32                       DeviceIndex
+  )
+{
+  EFI_STATUS  Status;
+  SIO_DEV     *SioDevice;
+
+  //
+  // Initialize the SIO_DEV structure
+  //
+  SioDevice = AllocateZeroPool (sizeof (SIO_DEV));
+  if (SioDevice == NULL) {
+    DEBUG ((DEBUG_ERROR, "SioCreateChildDevice(): Can not allocate SIO Device structure\n"));
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  SioDevice->Signature   = SIO_DEV_SIGNATURE;
+  SioDevice->Handle      = NULL;
+  SioDevice->PciIo       = PciIo;
+  CopyMem (&SioDevice->Sio, &mSioInterface, sizeof (EFI_SIO_PROTOCOL));
+  SioDevice->DeviceIndex = DeviceIndex;
+
+  //
+  // Construct the child device path
+  //
+  mAcpiDeviceNodeTemplate.HID = mDevicesInfo[DeviceIndex].Hid;
+  mAcpiDeviceNodeTemplate.UID = mDevicesInfo[DeviceIndex].Uid;
+  SioDevice->DevicePath = AppendDevicePathNode (
+                            ParentDevicePath,
+                            (EFI_DEVICE_PATH_PROTOCOL *) &mAcpiDeviceNodeTemplate
+                            );
+  if (SioDevice->DevicePath == NULL) {
+    DEBUG ((DEBUG_ERROR, "SioCreateChildDevice(): Can not allocate SIO Device path\n"));
+    Status = EFI_OUT_OF_RESOURCES;
+    goto Done;
+  }
+
+  //
+  // Create a child handle and install Device Path and Super I/O protocols
+  //
+  Status = gBS->InstallMultipleProtocolInterfaces (
+                  &SioDevice->Handle,
+                  &gEfiDevicePathProtocolGuid,
+                  SioDevice->DevicePath,
+                  &gEfiSioProtocolGuid,
+                  &SioDevice->Sio,
+                  NULL
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "SioCreateChildDevice(): Can not install child protocols %r\n", Status));
+    goto Done;
+  }
+
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiPciIoProtocolGuid,
+                  (VOID **) &PciIo,
+                  This->DriverBindingHandle,
+                  SioDevice->Handle,
+                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "SioCreateChildDevice(): Can not open parent PCI I/O Protocol by child controller %r\n", Status));
+    gBS->UninstallMultipleProtocolInterfaces (
+           SioDevice->Handle,
+           &gEfiDevicePathProtocolGuid,
+           SioDevice->DevicePath,
+           &gEfiSioProtocolGuid,
+           &SioDevice->Sio,
+           NULL
+           );
+  }
+
+Done:
+  if (EFI_ERROR (Status)) {
+    if (SioDevice->DevicePath != NULL) {
+      FreePool (SioDevice->DevicePath);
+    }
+    FreePool (SioDevice);
+  }
+
+  return Status;
+}
+
+/**
+  Create all the ISA child devices on the ISA bus controller (PCI to ISA
+  bridge).
+
+  @param[in] This              The EFI_DRIVER_BINDING_PROTOCOL instance.
+  @param[in] Controller        The handle of ISA bus controller.
+  @param[in] PciIo             The pointer to the PCI protocol.
+  @param[in] ParentDevicePath  Device path of the ISA bus controller.
+
+  @retval The number of child device that is successfully created.
+
+**/
+UINT32
+SioCreateAllChildDevices (
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
+  IN EFI_HANDLE                   Controller,
+  IN EFI_PCI_IO_PROTOCOL          *PciIo,
+  IN EFI_DEVICE_PATH_PROTOCOL     *ParentDevicePath
+  )
+{
+  UINT32        Index;
+  UINT32        ChildDeviceNumber;
+  EFI_STATUS    Status;
+
+  ChildDeviceNumber = 0;
+
+  for (Index = 0; Index < ARRAY_SIZE (mDevicesInfo); Index++) {
+    Status = SioCreateChildDevice (
+               This,
+               Controller,
+               PciIo,
+               ParentDevicePath,
+               Index
+               );
+    if (!EFI_ERROR (Status)) {
+      ChildDeviceNumber++;
+    }
+  }
+
+  return ChildDeviceNumber;
+}
+
+/**
+  Tests to see if this driver supports a given controller. If a child device is
+  provided, it further tests to see if this driver supports creating a handle
+  for the specified child device.
+
+  This function checks to see if the driver specified by This supports the
+  device specified by ControllerHandle. Drivers will typically use the device
+  path attached to ControllerHandle and/or the services from the bus I/O
+  abstraction attached to ControllerHandle to determine if the driver supports
+  ControllerHandle. This function may be called many times during platform
+  initialization. In order to reduce boot times, the tests performed by this
+  function must be very small, and take as little time as possible to execute.
+  This function must not change the state of any hardware devices, and this
+  function must be aware that the device specified by ControllerHandle may
+  already be managed by the same driver or a different driver. This function
+  must match its calls to AllocatePages() with FreePages(), AllocatePool() with
+  FreePool(), and OpenProtocol() with CloseProtocol(). Since ControllerHandle
+  may have been previously started by the same driver, if a protocol is already
+  in the opened state, then it must not be closed with CloseProtocol(). This is
+  required to guarantee the state of ControllerHandle is not modified by this
+  function.
+
+  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                   instance.
+  @param[in]  ControllerHandle     The handle of the controller to test. This
+                                   handle must support a protocol interface
+                                   that supplies an I/O abstraction to the
+                                   driver.
+  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
+                                   device path.  This parameter is ignored by
+                                   device drivers, and is optional for bus
+                                   drivers. For bus drivers, if this parameter
+                                   is not NULL, then the bus driver must
+                                   determine if the bus controller specified by
+                                   ControllerHandle and the child controller
+                                   specified by RemainingDevicePath are both
+                                   supported by this bus driver.
+
+  @retval EFI_SUCCESS              The device specified by ControllerHandle and
+                                   RemainingDevicePath is supported by the
+                                   driver specified by This.
+  @retval EFI_ALREADY_STARTED      The device specified by ControllerHandle and
+                                   RemainingDevicePath is already being managed
+                                   by the driver specified by This.
+  @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle and
+                                   RemainingDevicePath is already being managed
+                                   by a different driver or an application that
+                                   requires exclusive access.
+  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle and
+                                   RemainingDevicePath is not supported by the
+                                   driver specified by This.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingSupported (
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
+  IN EFI_HANDLE                     Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
+  )
+{
+  EFI_STATUS           Status;
+  EFI_PCI_IO_PROTOCOL  *PciIo;
+  PCI_TYPE00           Pci;
+
+  //
+  // Get PciIo protocol instance
+  //
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiPciIoProtocolGuid,
+                  (VOID **)&PciIo,
+                  This->DriverBindingHandle,
+                  Controller,
+                  EFI_OPEN_PROTOCOL_BY_DRIVER
+                  );
+
+  if (EFI_ERROR(Status)) {
+    return Status;
+  }
+
+  Status = PciIo->Pci.Read (
+                        PciIo,
+                        EfiPciIoWidthUint32,
+                        0,
+                        sizeof(Pci) / sizeof(UINT32),
+                        &Pci
+                        );
+
+  if (!EFI_ERROR (Status)) {
+    Status = EFI_UNSUPPORTED;
+    if ((Pci.Hdr.Command & 0x03) == 0x03) {
+      if (Pci.Hdr.ClassCode[2] == PCI_CLASS_BRIDGE) {
+        //
+        // See if this is a standard PCI to ISA Bridge from the Base Code
+        // and Class Code
+        //
+        if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA) {
+          Status = EFI_SUCCESS;
+        }
+        //
+        // See if this is an Intel PCI to ISA bridge in Positive Decode Mode
+        //
+        if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE &&
+            Pci.Hdr.VendorId == 0x8086 && Pci.Hdr.DeviceId == 0x7110) {
+          Status = EFI_SUCCESS;
+        }
+      }
+    }
+  }
+
+  gBS->CloseProtocol (
+         Controller,
+         &gEfiPciIoProtocolGuid,
+         This->DriverBindingHandle,
+         Controller
+         );
+
+  return Status;
+}
+
+/**
+  Starts a device controller or a bus controller.
+
+  The Start() function is designed to be invoked from the EFI boot service
+  ConnectController(). As a result, much of the error checking on the
+  parameters to Start() has been moved into this common boot service. It is
+  legal to call Start() from other locations, but the following calling
+  restrictions must be followed or the system behavior will not be
+  deterministic.
+  1. ControllerHandle must be a valid EFI_HANDLE.
+  2. If RemainingDevicePath is not NULL, then it must be a pointer to a
+     naturally aligned EFI_DEVICE_PATH_PROTOCOL.
+  3. Prior to calling Start(), the Supported() function for the driver
+     specified by This must have been called with the same calling parameters,
+     and Supported() must have returned EFI_SUCCESS.
+
+  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                   instance.
+  @param[in]  ControllerHandle     The handle of the controller to start. This
+                                   handle must support a protocol interface
+                                   that supplies an I/O abstraction to the
+                                   driver.
+  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
+                                   device path.  This parameter is ignored by
+                                   device drivers, and is optional for bus
+                                   drivers. For a bus driver, if this parameter
+                                   is NULL, then handles for all the children
+                                   of Controller are created by this driver. If
+                                   this parameter is not NULL and the first
+                                   Device Path Node is not the End of Device
+                                   Path Node, then only the handle for the
+                                   child device specified by the first Device
+                                   Path Node of RemainingDevicePath is created
+                                   by this driver. If the first Device Path
+                                   Node of RemainingDevicePath is the End of
+                                   Device Path Node, no child handle is created
+                                   by this driver.
+
+  @retval EFI_SUCCESS              The device was started.
+  @retval EFI_DEVICE_ERROR         The device could not be started due to a
+                                   device error.
+  @retval EFI_OUT_OF_RESOURCES     The request could not be completed due to a
+                                   lack of resources.
+  @retval Others                   The driver failed to start the device.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingStart (
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
+  IN EFI_HANDLE                   Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
+  )
+{
+  EFI_STATUS                     Status;
+  EFI_PCI_IO_PROTOCOL            *PciIo;
+  EFI_DEVICE_PATH_PROTOCOL       *ParentDevicePath;
+  UINT64                         Supports;
+  UINT64                         OriginalAttributes;
+  UINT64                         Attributes;
+  BOOLEAN                        Enabled;
+  SIO_BUS_DRIVER_PRIVATE_DATA    *Private;
+  UINT32                         ChildDeviceNumber;
+
+  Enabled            = FALSE;
+  Supports           = 0;
+  OriginalAttributes = 0;
+  Private            = NULL;
+
+  //
+  // Open the PCI I/O Protocol Interface
+  //
+  PciIo = NULL;
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiPciIoProtocolGuid,
+                  (VOID**) &PciIo,
+                  This->DriverBindingHandle,
+                  Controller,
+                  EFI_OPEN_PROTOCOL_BY_DRIVER
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): No PCI I/O Protocol %r\n", Status));
+    return Status;
+  }
+
+  //
+  // Open Device Path Protocol
+  //
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiDevicePathProtocolGuid,
+                  (VOID **) &ParentDevicePath,
+                  This->DriverBindingHandle,
+                  Controller,
+                  EFI_OPEN_PROTOCOL_BY_DRIVER
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): No Device Path Protocol %r\n", Status));
+    gBS->CloseProtocol (
+           Controller,
+           &gEfiPciIoProtocolGuid,
+           This->DriverBindingHandle,
+           Controller
+           );
+    return Status;
+  }
+
+  //
+  // Get supported PCI attributes
+  //
+  Status = PciIo->Attributes (
+                    PciIo,
+                    EfiPciIoAttributeOperationSupported,
+                    0,
+                    &Supports
+                    );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error reading PCI I/O Supported Attributes %r\n", Status));
+    goto Done;
+  }
+  Supports &= (UINT64) (EFI_PCI_IO_ATTRIBUTE_ISA_IO |
+                        EFI_PCI_IO_ATTRIBUTE_ISA_IO_16);
+
+  Status = PciIo->Attributes (
+                    PciIo,
+                    EfiPciIoAttributeOperationGet,
+                    0,
+                    &OriginalAttributes
+                    );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error reading PCI I/O Attributes %r\n", Status));
+    goto Done;
+  }
+
+  Attributes = EFI_PCI_DEVICE_ENABLE |
+               Supports |
+               EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO;
+
+  Status = PciIo->Attributes (
+                    PciIo,
+                    EfiPciIoAttributeOperationEnable,
+                    Attributes,
+                    NULL
+                    );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error enabling PCI I/O  Attributes %r\n", Status));
+    goto Done;
+  }
+
+  Enabled = TRUE;
+
+  //
+  // Store the OriginalAttributes for the restore in BindingStop()
+  //
+  Private = AllocateZeroPool (sizeof (SIO_BUS_DRIVER_PRIVATE_DATA));
+  if (Private == NULL) {
+    Status = EFI_OUT_OF_RESOURCES;
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error allocating SIO private data structure %r\n", Status));
+    goto Done;
+  }
+  Private->PciIo              = PciIo;
+  Private->OriginalAttributes = OriginalAttributes;
+
+  Status = gBS->InstallProtocolInterface (
+                  &Controller,
+                  &gEfiCallerIdGuid,
+                  EFI_NATIVE_INTERFACE,
+                  Private
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error installing gEfiCallerIdGuid %r\n", Status));
+    goto Done;
+  }
+
+  //
+  // Report status code for the start of general controller initialization
+  //
+  REPORT_STATUS_CODE_WITH_DEVICE_PATH (
+    EFI_PROGRESS_CODE,
+    (EFI_IO_BUS_LPC | EFI_IOB_PC_INIT),
+    ParentDevicePath
+    );
+
+  //
+  // Report status code for the start of enabling devices on the bus
+  //
+  REPORT_STATUS_CODE_WITH_DEVICE_PATH (
+    EFI_PROGRESS_CODE,
+    (EFI_IO_BUS_LPC | EFI_IOB_PC_ENABLE),
+    ParentDevicePath
+    );
+
+  //
+  // Create all the children upon the first entrance
+  //
+  ChildDeviceNumber = SioCreateAllChildDevices (
+                        This,
+                        Controller,
+                        PciIo,
+                        ParentDevicePath
+                        );
+  if (ChildDeviceNumber == 0) {
+    Status = EFI_DEVICE_ERROR;
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error creating child SIO devices %r\n", Status));
+    goto Done;
+  }
+
+Done:
+  if (EFI_ERROR (Status)) {
+    if (PciIo != NULL && Enabled) {
+      PciIo->Attributes (
+               PciIo,
+               EfiPciIoAttributeOperationSet,
+               OriginalAttributes,
+               NULL
+               );
+    }
+
+    gBS->CloseProtocol (
+           Controller,
+           &gEfiDevicePathProtocolGuid,
+           This->DriverBindingHandle,
+           Controller
+           );
+
+    gBS->CloseProtocol (
+           Controller,
+           &gEfiPciIoProtocolGuid,
+           This->DriverBindingHandle,
+           Controller
+           );
+
+    if (Private != NULL) {
+      gBS->UninstallMultipleProtocolInterfaces (
+             Controller,
+             &gEfiCallerIdGuid,
+             Private,
+             NULL
+             );
+      FreePool (Private);
+    }
+  }
+
+  return Status;
+}
+
+/**
+  Stops a device controller or a bus controller.
+
+  The Stop() function is designed to be invoked from the EFI boot service
+  DisconnectController(). As a result, much of the error checking on the
+  parameters to Stop() has been moved into this common boot service. It is
+  legal to call Stop() from other locations, but the following calling
+  restrictions must be followed or the system behavior will not be
+  deterministic.
+  1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous
+     call to this same driver's Start() function.
+  2. The first NumberOfChildren handles of ChildHandleBuffer must all be a
+     valid EFI_HANDLE. In addition, all of these handles must have been created
+     in this driver's Start() function, and the Start() function must have
+     called OpenProtocol() on ControllerHandle with an Attribute of
+     EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
+
+  @param[in]  This               A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                 instance.
+  @param[in]  ControllerHandle   A handle to the device being stopped. The
+                                 handle must support a bus specific I/O
+                                 protocol for the driver to use to stop the
+                                 device.
+  @param[in]  NumberOfChildren   The number of child device handles in
+                                 ChildHandleBuffer.
+  @param[in]  ChildHandleBuffer  An array of child handles to be freed. May be
+                                 NULL if NumberOfChildren is 0.
+
+  @retval EFI_SUCCESS            The device was stopped.
+  @retval EFI_DEVICE_ERROR       The device could not be stopped due to a
+                                 device error.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingStop (
+  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
+  IN  EFI_HANDLE                     Controller,
+  IN  UINTN                          NumberOfChildren,
+  IN  EFI_HANDLE                     *ChildHandleBuffer
+  )
+{
+  EFI_STATUS                     Status;
+  SIO_BUS_DRIVER_PRIVATE_DATA    *Private;
+  UINTN                          Index;
+  BOOLEAN                        AllChildrenStopped;
+  EFI_SIO_PROTOCOL               *Sio;
+  SIO_DEV                        *SioDevice;
+  EFI_PCI_IO_PROTOCOL            *PciIo;
+
+  if (NumberOfChildren == 0) {
+    //
+    // Restore PCI attributes
+    //
+    Status = gBS->OpenProtocol (
+                    Controller,
+                    &gEfiCallerIdGuid,
+                    (VOID **) &Private,
+                    This->DriverBindingHandle,
+                    Controller,
+                    EFI_OPEN_PROTOCOL_GET_PROTOCOL
+                    );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+
+    Status = Private->PciIo->Attributes (
+                               Private->PciIo,
+                               EfiPciIoAttributeOperationSet,
+                               Private->OriginalAttributes,
+                               NULL
+                               );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+
+    gBS->UninstallProtocolInterface (
+          Controller,
+          &gEfiCallerIdGuid,
+          Private
+          );
+    FreePool (Private);
+
+    //
+    // Close the bus driver
+    //
+    Status = gBS->CloseProtocol (
+                    Controller,
+                    &gEfiDevicePathProtocolGuid,
+                    This->DriverBindingHandle,
+                    Controller
+                    );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+
+    Status = gBS->CloseProtocol (
+                    Controller,
+                    &gEfiPciIoProtocolGuid,
+                    This->DriverBindingHandle,
+                    Controller
+                    );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+
+    return EFI_SUCCESS;
+  }
+
+  //
+  // Stop all the children
+  //
+  AllChildrenStopped = TRUE;
+
+  for (Index = 0; Index < NumberOfChildren; Index++) {
+    Status = gBS->OpenProtocol (
+                    ChildHandleBuffer[Index],
+                    &gEfiSioProtocolGuid,
+                    (VOID **) &Sio,
+                    This->DriverBindingHandle,
+                    Controller,
+                    EFI_OPEN_PROTOCOL_GET_PROTOCOL
+                    );
+    if (!EFI_ERROR (Status)) {
+      SioDevice = SIO_DEV_FROM_SIO (Sio);
+
+      //
+      // Close the child handle
+      //
+      Status = gBS->CloseProtocol (
+                      Controller,
+                      &gEfiPciIoProtocolGuid,
+                      This->DriverBindingHandle,
+                      ChildHandleBuffer[Index]
+                      );
+      Status = gBS->UninstallMultipleProtocolInterfaces (
+                      ChildHandleBuffer[Index],
+                      &gEfiDevicePathProtocolGuid,
+                      SioDevice->DevicePath,
+                      &gEfiSioProtocolGuid,
+                      &SioDevice->Sio,
+                      NULL
+                      );
+
+      if (!EFI_ERROR (Status)) {
+        FreePool (SioDevice->DevicePath);
+        FreePool (SioDevice);
+      } else {
+        //
+        // Re-open PCI IO Protocol on behalf of the child device
+        // because of failure of destroying the child device handle
+        //
+        gBS->OpenProtocol (
+               Controller,
+               &gEfiPciIoProtocolGuid,
+               (VOID **) &PciIo,
+               This->DriverBindingHandle,
+               ChildHandleBuffer[Index],
+               EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
+               );
+      }
+    }
+
+    if (EFI_ERROR (Status)) {
+      AllChildrenStopped = FALSE;
+    }
+  }
+
+  if (!AllChildrenStopped) {
+    return EFI_DEVICE_ERROR;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  The entry point for the PCU SIO driver.
+
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
+  @param[in] SystemTable    A pointer to the EFI System Table.
+
+  @retval EFI_SUCCESS       The entry point is executed successfully.
+  @retval other             Some error occurs when executing this entry point.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverEntryPoint (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  return EfiLibInstallDriverBinding (
+            ImageHandle, 
+            SystemTable, 
+            &gPcuSioDriverBinding, 
+            ImageHandle
+            );
+}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h
new file mode 100644
index 0000000000..3a47e2c5e2
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h
@@ -0,0 +1,363 @@
+/** @file
+  Produces the SIO Protocols for ISA devices integrated in the Platform
+  Controller Unit (PCU).
+
+  Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef __PCU_SIO_H__
+#define __PCU_SIO_H__
+
+#include <Uefi.h>
+#include <Protocol/DriverBinding.h>
+#include <Protocol/PciIo.h>
+#include <Protocol/DevicePath.h>
+#include <Protocol/SuperIo.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ReportStatusCodeLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/UefiLib.h>
+#include <IndustryStandard/Pci.h>
+
+#pragma pack(1)
+
+typedef struct {
+  EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR  Io;
+  EFI_ACPI_END_TAG_DESCRIPTOR                 End;
+} SIO_RESOURCES_IO;
+
+#pragma pack()
+
+typedef struct {
+  UINT32                    Hid;
+  UINT32                    Uid;
+  ACPI_RESOURCE_HEADER_PTR  Resources;
+} SIO_DEVICE_INFO;
+
+//
+// SIO Bus driver private data structure
+//
+typedef struct {
+  EFI_PCI_IO_PROTOCOL  *PciIo;
+  UINT64               OriginalAttributes;
+} SIO_BUS_DRIVER_PRIVATE_DATA;
+
+//
+// SIO device private data structure
+//
+typedef struct {
+  UINT32                    Signature;
+  EFI_HANDLE                Handle;
+  EFI_PCI_IO_PROTOCOL       *PciIo;
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+  EFI_SIO_PROTOCOL          Sio;
+  UINT32                    DeviceIndex;
+} SIO_DEV;
+#define SIO_DEV_SIGNATURE      SIGNATURE_32 ('S', 'I', 'O', 'D')
+#define SIO_DEV_FROM_SIO(a)    CR (a, SIO_DEV, Sio, SIO_DEV_SIGNATURE)
+
+/**
+  Tests to see if this driver supports a given controller. If a child device is
+  provided, it further tests to see if this driver supports creating a handle
+  for the specified child device.
+
+  This function checks to see if the driver specified by This supports the
+  device specified by ControllerHandle. Drivers will typically use the device
+  path attached to ControllerHandle and/or the services from the bus I/O
+  abstraction attached to ControllerHandle to determine if the driver supports
+  ControllerHandle. This function may be called many times during platform
+  initialization. In order to reduce boot times, the tests performed by this
+  function must be very small, and take as little time as possible to execute.
+  This function must not change the state of any hardware devices, and this
+  function must be aware that the device specified by ControllerHandle may
+  already be managed by the same driver or a different driver. This function
+  must match its calls to AllocatePages() with FreePages(), AllocatePool() with
+  FreePool(), and OpenProtocol() with CloseProtocol(). Since ControllerHandle
+  may have been previously started by the same driver, if a protocol is already
+  in the opened state, then it must not be closed with CloseProtocol(). This is
+  required to guarantee the state of ControllerHandle is not modified by this
+  function.
+
+  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                   instance.
+  @param[in]  ControllerHandle     The handle of the controller to test. This
+                                   handle must support a protocol interface
+                                   that supplies an I/O abstraction to the
+                                   driver.
+  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
+                                   device path.  This parameter is ignored by
+                                   device drivers, and is optional for bus
+                                   drivers. For bus drivers, if this parameter
+                                   is not NULL, then the bus driver must
+                                   determine if the bus controller specified by
+                                   ControllerHandle and the child controller
+                                   specified by RemainingDevicePath are both
+                                   supported by this bus driver.
+
+  @retval EFI_SUCCESS              The device specified by ControllerHandle and
+                                   RemainingDevicePath is supported by the
+                                   driver specified by This.
+  @retval EFI_ALREADY_STARTED      The device specified by ControllerHandle and
+                                   RemainingDevicePath is already being managed
+                                   by the driver specified by This.
+  @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle and
+                                   RemainingDevicePath is already being managed
+                                   by a different driver or an application that
+                                   requires exclusive access.
+  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle and
+                                   RemainingDevicePath is not supported by the
+                                   driver specified by This.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingSupported (
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
+  IN EFI_HANDLE                     Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
+  );
+
+/**
+  Starts a device controller or a bus controller.
+
+  The Start() function is designed to be invoked from the EFI boot service
+  ConnectController(). As a result, much of the error checking on the
+  parameters to Start() has been moved into this common boot service. It is
+  legal to call Start() from other locations, but the following calling
+  restrictions must be followed or the system behavior will not be
+  deterministic.
+  1. ControllerHandle must be a valid EFI_HANDLE.
+  2. If RemainingDevicePath is not NULL, then it must be a pointer to a
+     naturally aligned EFI_DEVICE_PATH_PROTOCOL.
+  3. Prior to calling Start(), the Supported() function for the driver
+     specified by This must have been called with the same calling parameters,
+     and Supported() must have returned EFI_SUCCESS.
+
+  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                   instance.
+  @param[in]  ControllerHandle     The handle of the controller to start. This
+                                   handle must support a protocol interface
+                                   that supplies an I/O abstraction to the
+                                   driver.
+  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
+                                   device path.  This parameter is ignored by
+                                   device drivers, and is optional for bus
+                                   drivers. For a bus driver, if this parameter
+                                   is NULL, then handles for all the children
+                                   of Controller are created by this driver. If
+                                   this parameter is not NULL and the first
+                                   Device Path Node is not the End of Device
+                                   Path Node, then only the handle for the
+                                   child device specified by the first Device
+                                   Path Node of RemainingDevicePath is created
+                                   by this driver. If the first Device Path
+                                   Node of RemainingDevicePath is the End of
+                                   Device Path Node, no child handle is created
+                                   by this driver.
+
+  @retval EFI_SUCCESS              The device was started.
+  @retval EFI_DEVICE_ERROR         The device could not be started due to a
+                                   device error.
+  @retval EFI_OUT_OF_RESOURCES     The request could not be completed due to a
+                                   lack of resources.
+  @retval Others                   The driver failded to start the device.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingStart (
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
+  IN EFI_HANDLE                   Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
+  );
+
+/**
+  Stops a device controller or a bus controller.
+
+  The Stop() function is designed to be invoked from the EFI boot service
+  DisconnectController(). As a result, much of the error checking on the
+  parameters to Stop() has been moved into this common boot service. It is
+  legal to call Stop() from other locations, but the following calling
+  restrictions must be followed or the system behavior will not be
+  deterministic.
+  1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous
+     call to this same driver's Start() function.
+  2. The first NumberOfChildren handles of ChildHandleBuffer must all be a
+     valid EFI_HANDLE. In addition, all of these handles must have been created
+     in this driver's Start() function, and the Start() function must have
+     called OpenProtocol() on ControllerHandle with an Attribute of
+     EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
+
+  @param[in]  This               A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                 instance.
+  @param[in]  ControllerHandle   A handle to the device being stopped. The
+                                 handle must support a bus specific I/O
+                                 protocol for the driver to use to stop the
+                                 device.
+  @param[in]  NumberOfChildren   The number of child device handles in
+                                 ChildHandleBuffer.
+  @param[in]  ChildHandleBuffer  An array of child handles to be freed. May be
+                                 NULL if NumberOfChildren is 0.
+
+  @retval EFI_SUCCESS            The device was stopped.
+  @retval EFI_DEVICE_ERROR       The device could not be stopped due to a
+                                 device error.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingStop (
+  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
+  IN  EFI_HANDLE                     Controller,
+  IN  UINTN                          NumberOfChildren,
+  IN  EFI_HANDLE                     *ChildHandleBuffer
+  );
+
+/**
+  Provides a low level access to the registers for the Super I/O.
+
+  @param[in]     This           Indicates a pointer to the calling context.
+  @param[in]     Write          Specifies the type of the register operation.
+                                If this parameter is TRUE, Value is interpreted
+                                as an input parameter and the operation is a
+                                register write. If this parameter is FALSE,
+                                Value is interpreted as an output parameter and
+                                the operation is a register read.
+  @param[in]     ExitCfgMode    Exit Configuration Mode Indicator. If this
+                                parameter is set to TRUE, the Super I/O driver
+                                will turn off configuration mode of the Super
+                                I/O prior to returning from this function. If
+                                this parameter is set to FALSE, the Super I/O
+                                driver will leave Super I/O in the
+                                configuration mode. The Super I/O driver must
+                                track the current state of the Super I/O and
+                                enable the configuration mode of Super I/O if
+                                necessary prior to register access.
+  @param[in]     Register       Register number.
+  @param[in,out] Value          If Write is TRUE, Value is a pointer to the
+                                buffer containing the byte of data to be
+                                written to the Super I/O register. If Write is
+                                FALSE, Value is a pointer to the destination
+                                buffer for the byte of data to be read from the
+                                Super I/O register.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER The Value is NULL.
+  @retval EFI_INVALID_PARAMETER Invalid Register number.
+
+**/
+EFI_STATUS
+EFIAPI
+SioRegisterAccess (
+  IN CONST EFI_SIO_PROTOCOL    *This,
+  IN       BOOLEAN             Write,
+  IN       BOOLEAN             ExitCfgMode,
+  IN       UINT8               Register,
+  IN OUT   UINT8               *Value
+  );
+
+/**
+  Provides an interface to get a list of the current resources consumed by the
+  device in the ACPI Resource Descriptor format.
+
+  GetResources() returns a list of resources currently consumed by the device.
+  The ResourceList is a pointer to the buffer containing resource descriptors
+  for the device. The descriptors are in the format of Small or Large ACPI
+  resource descriptor as defined by ACPI specification (2.0 & 3.0). The buffer
+  of resource descriptors is terminated with the 'End tag' resource descriptor.
+
+  @param[in]  This              Indicates a pointer to the calling context.
+  @param[out] ResourceList      A pointer to an ACPI resource descriptor list
+                                that defines the current resources used by the
+                                device.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER ResourceList is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioGetResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  OUT      ACPI_RESOURCE_HEADER_PTR    *ResourceList
+  );
+
+/**
+  Sets the resources for the device.
+
+  @param[in] This               Indicates a pointer to the calling context.
+  @param[in] ResourceList       Pointer to the ACPI resource descriptor list.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER ResourceList is invalid.
+  @retval EFI_ACCESS_DENIED     Some of the resources in ResourceList are in
+                                use.
+
+**/
+EFI_STATUS
+EFIAPI
+SioSetResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  IN       ACPI_RESOURCE_HEADER_PTR    ResourceList
+  );
+
+/**
+  Provides a collection of resource descriptor lists. Each resource descriptor
+  list in the collection defines a combination of resources that can
+  potentially be used by the device.
+
+  @param[in]  This                  Indicates a pointer to the calling context.
+  @param[out] ResourceCollection    Collection of the resource descriptor
+                                    lists.
+
+  @retval EFI_SUCCESS               The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER     ResourceCollection is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioPossibleResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  OUT      ACPI_RESOURCE_HEADER_PTR    *ResourceCollection
+  );
+
+/**
+  Provides an interface for a table based programming of the Super I/O
+  registers.
+
+  The Modify() function provides an interface for table based programming of
+  the Super I/O registers. This function can be used to perform programming of
+  multiple Super I/O registers with a single function call. For each table
+  entry, the Register is read, its content is bitwise ANDed with AndMask, and
+  then ORed with OrMask before being written back to the Register. The Super
+  I/O driver must track the current state of the Super I/O and enable the
+  configuration mode of Super I/O if necessary prior to table processing. Once
+  the table is processed, the Super I/O device has to be returned to the
+  original state.
+
+  @param[in] This               Indicates a pointer to the calling context.
+  @param[in] Command            A pointer to an array of NumberOfCommands
+                                EFI_SIO_REGISTER_MODIFY structures. Each
+                                structure specifies a single Super I/O register
+                                modify operation.
+  @param[in] NumberOfCommands   Number of elements in the Command array.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER Command is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioModify (
+  IN CONST EFI_SIO_PROTOCOL           *This,
+  IN CONST EFI_SIO_REGISTER_MODIFY    *Command,
+  IN       UINTN                      NumberOfCommands
+  );
+
+#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
new file mode 100644
index 0000000000..2379f93999
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
@@ -0,0 +1,38 @@
+## @file
+#  Produces the SIO Protocols for ISA devices integrated in the Platform
+#  Controller Unit (PCU).
+#
+# Copyright (c)  1999 - 2019, Intel Corporation. All rights reserved
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = PcuSio
+  FILE_GUID                      = F749DEBC-42E6-4F59-821E-1E94EE9FBBB1
+  MODULE_TYPE                    = UEFI_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = PcuSioDriverEntryPoint
+
+[Sources]
+  PcuSio.h
+  PcuSio.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  UefiDriverEntryPoint
+  UefiBootServicesTableLib
+  DebugLib
+  ReportStatusCodeLib
+  BaseMemoryLib
+  MemoryAllocationLib
+  DevicePathLib
+  UefiLib
+
+[Protocols]
+  gEfiPciIoProtocolGuid  ## TO_START
+  gEfiSioProtocolGuid    ## BY_START
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
index 1d90117af6..89923ffec6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
@@ -154,10 +154,6 @@ VOID
 InitVlvPlatformPolicy (
   );
 
-VOID
-InitSioPlatformPolicy(
-  );
-
 VOID
 PchInitBeforeBoot(
   );
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index e8652f2a84..d3f8fa3833 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -36,7 +36,6 @@ [sources.common]
   Platform.c
   IchRegTable.c
   IdccInfo.c
-  SioPlatformPolicy.c
   IchPlatformPolicy.c
   PciDevice.c
   SlotConfig.c
@@ -105,7 +104,6 @@ [Protocols]
   gEfiSmbiosSlotPopulationGuid
   gObservableProtocolGuid
   gEfiCk505ClockPlatformInfoGuid
-  gEfiLpcWpc83627PolicyProtocolGuid
   gEfiTcoResetProtocolGuid
   gEfiWatchdogTimerDriverProtocolGuid
   gEfiPlatformIdeInitProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatformPolicy.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatformPolicy.c
deleted file mode 100644
index 32bee75f95..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatformPolicy.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-
-  SioPlatformPolicy.c
-
-Abstract:
-
-  Sio Platform Policy Setting.
-
-
---*/
-
-#include "PlatformDxe.h"
-#include <Protocol/LpcWpc83627Policy.h>
-
-
-EFI_WPC83627_POLICY_PROTOCOL  mSio83627PolicyData = {
-  { EFI_WPC83627_COM1_ENABLE,       // Com1
-    EFI_WPC83627_LPT1_ENABLE,       // Lpt1
-    EFI_WPC83627_FDD_DISABLE,       // Floppy
-    EFI_WPC83627_FDD_WRITE_ENABLE,  // FloppyWriteProtect
-    EFI_WPC83627_RESERVED_DEFAULT,  // Port80
-    EFI_WPC83627_ECIR_DISABLE,      // CIR
-    EFI_WPC83627_PS2_KBC_ENABLE,    // Ps2Keyboard
-    EFI_WPC83627_RESERVED_DEFAULT,  // Ps2Mouse
-    EFI_WPC83627_COM2_ENABLE,       // Com2
-    EFI_WPC83627_COM3_ENABLE,       // Com3
-    EFI_WPC83627_COM4_ENABLE,       // Com4
-    EFI_WPC83627_RESERVED_DEFAULT,  // Dac
-    0x00                            // Rsvd
-    },
-  LptModeEcp,                       // LptMode
-};
-
-/**
-
-  Publish the platform SIO policy setting.
-
-  @retval EFI_SUCCESS
-
-**/
-VOID
-InitSioPlatformPolicy(
-  )
-{
-
-  EFI_HANDLE              Handle;
-  EFI_STATUS              Status;
-
-  Handle = NULL;
-
-  if((mSystemConfiguration.Serial) || (mBoardFeatures & B_BOARD_FEATURES_SIO_NO_COM1)) {
-    mSio83627PolicyData.DeviceEnables.Com1 = EFI_WPC83627_COM1_DISABLE;
-  }
-
-  if((mSystemConfiguration.Serial2) || ((mBoardFeatures & B_BOARD_FEATURES_SIO_COM2)==0)) {
-    mSio83627PolicyData.DeviceEnables.Com2 = EFI_WPC83627_COM2_DISABLE;
-  }
-
-  mSio83627PolicyData.LptMode = mSystemConfiguration.ParallelMode;
-  if((!mSystemConfiguration.Parallel) || (mBoardFeatures & B_BOARD_FEATURES_SIO_NO_PARALLEL)) {
-    mSio83627PolicyData.DeviceEnables.Lpt1 = EFI_WPC83627_LPT1_DISABLE;
-  }
-
-  Status = gBS->InstallProtocolInterface (
-                  &Handle,
-                  &gEfiLpcWpc83627PolicyProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &mSio83627PolicyData
-                  );
-  ASSERT_EFI_ERROR(Status);
-
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index 9951aa4a58..786b4f6e91 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -66,7 +66,6 @@ [Protocols]
   gEfiSmbiosSlotPopulationGuid            = { 0xef7bf7d6, 0xf8ff, 0x4a76, { 0x82, 0x47, 0xc0, 0xd0, 0xd1, 0xcc, 0x49, 0xc0 } }
   gObservableProtocolGuid                 = { 0xe227c522, 0xd5fe, 0x4a53, { 0x87, 0xb1, 0x0f, 0xbe, 0x57, 0x0f, 0x98, 0xe9 } }
   gEfiCk505ClockPlatformInfoGuid          = { 0x3c485ea4, 0x449a, 0x46ce, { 0xbb, 0x08, 0x2a, 0x33, 0x6e, 0xa9, 0x6b, 0x4e } }
-  gEfiLpcWpc83627PolicyProtocolGuid       = { 0xd3ecc567, 0x9fd5, 0x44c1, { 0x86, 0xcf, 0x5d, 0xa7, 0xa2, 0x4f, 0x4b, 0x5d } }
   gEfiTcoResetProtocolGuid                = { 0xa6a79162, 0xe325, 0x4c30, { 0xbc, 0xc3, 0x59, 0x37, 0x30, 0x64, 0xef, 0xb3 } }
   gEfiWatchdogTimerDriverProtocolGuid     = { 0xd5b06d16, 0x2ea1, 0x4def, { 0x98, 0xd0, 0xa0, 0x5d, 0x40, 0x72, 0x84, 0x17 } }
   gEfiPlatformIdeInitProtocolGuid         = { 0x377c66a3, 0x8fe7, 0x4ee8, { 0x85, 0xb8, 0xf1, 0xa2, 0x82, 0x56, 0x9e, 0x3b } }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index 87b905c95b..3165be1fca 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -535,7 +535,7 @@ [FV.FVMAIN]
 #
 INF Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 !if $(SOURCE_DEBUG_ENABLE) != TRUE
-INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
+INF  MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf
 !endif
 
 #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index 110efe28c3..03941dd23e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -481,7 +481,7 @@ [FV.FVMAIN]
 #
 INF Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 !if $(SOURCE_DEBUG_ENABLE) != TRUE
-INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
+INF  MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf
 !endif
 
 #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c
deleted file mode 100644
index f98265761b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c
+++ /dev/null
@@ -1,340 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-    LpcDriver.c
-
-Abstract:
-
-    EFI Lpc Driver for a Generic PC Platform
-
-
-
---*/
-
-#include "LpcDriver.h"
-#include "IndustryStandard/Pci22.h"
-
-//
-// This driver is for ACPI(PNP0A03,0)/PCI(0x1f,0)
-//
-
-//
-//  Lpc Driver Global Variables
-//
-
-EFI_DRIVER_BINDING_PROTOCOL gLpcDriver = {
-  LpcDriverSupported,
-  LpcDriverStart,
-  LpcDriverStop,
-  0x10,
-  NULL,
-  NULL
-};
-
-LPC_DEV mLpc = {
-  LPC_DEV_SIGNATURE,
-  NULL,
-  {
-    IsaDeviceEnumerate,
-    IsaDeviceSetPower,
-    IsaGetCurrentResource,
-    IsaGetPossibleResource,
-    IsaSetResource,
-    IsaEnableDevice,
-    IsaInitDevice,
-    LpcInterfaceInit
-  },
-  NULL
-};
-
-BOOLEAN  InitExecuted = FALSE;
-
-/**
-    the entry point of the Lpc driver
-
-**/
-EFI_STATUS
-EFIAPI
-LpcDriverEntryPoint(
-  IN EFI_HANDLE           ImageHandle,
-  IN EFI_SYSTEM_TABLE     *SystemTable
-  )
-{
-
-
-  return EfiLibInstallDriverBinding (ImageHandle, SystemTable, &gLpcDriver, ImageHandle);
-}
-
-/**
-
-  ControllerDriver Protocol Method
-
-**/
-EFI_STATUS
-EFIAPI
-LpcDriverSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN EFI_HANDLE                     Controller,
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
-  )
-{
-  EFI_STATUS                Status;
-  EFI_PCI_IO_PROTOCOL       *PciIo;
-  EFI_DEVICE_PATH_PROTOCOL  *IsaBridgeDevicePath;
-
-  ACPI_HID_DEVICE_PATH      *AcpiNode;
-  PCI_DEVICE_PATH           *PciNode;
-  PCI_TYPE00                Pci;
-
-  //
-  // Get the ISA bridge's Device Path and test it
-  // the following code is specific
-  //
-  Status = gBS->OpenProtocol (
-                  Controller,
-                  &gEfiDevicePathProtocolGuid,
-                  (VOID **)&IsaBridgeDevicePath,
-                  This->DriverBindingHandle,
-                  Controller,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = EFI_SUCCESS;
-  AcpiNode =  (ACPI_HID_DEVICE_PATH *)IsaBridgeDevicePath;
-  if (AcpiNode->Header.Type != ACPI_DEVICE_PATH ||
-      AcpiNode->Header.SubType != ACPI_DP ||
-      DevicePathNodeLength (&AcpiNode->Header) != sizeof(ACPI_HID_DEVICE_PATH) ||
-      AcpiNode -> HID != EISA_PNP_ID(0x0A03) ||
-      AcpiNode -> UID != 0 ) {
-    Status = EFI_UNSUPPORTED;
-  } else {
-    //
-    // Get the next node
-    //
-    IsaBridgeDevicePath = NextDevicePathNode (IsaBridgeDevicePath);
-    PciNode  = (PCI_DEVICE_PATH *)IsaBridgeDevicePath;
-    if (PciNode->Header.Type != HARDWARE_DEVICE_PATH ||
-        PciNode->Header.SubType != HW_PCI_DP ||
-        DevicePathNodeLength (&PciNode->Header) != sizeof (PCI_DEVICE_PATH) ||
-        PciNode -> Function != 0x00 ||
-        PciNode -> Device != 0x1f ) {
-      Status = EFI_UNSUPPORTED;
-    }
-  }
-
-  gBS->CloseProtocol (
-         Controller,
-         &gEfiDevicePathProtocolGuid,
-         This->DriverBindingHandle,
-         Controller
-         );
-
-  if (EFI_ERROR (Status)) {
-    return EFI_UNSUPPORTED;
-  }
-
-  //
-  // Get PciIo protocol instance
-  //
-  Status = gBS->OpenProtocol (
-                  Controller,
-                  &gEfiPciIoProtocolGuid,
-                  (VOID **)&PciIo,
-                  This->DriverBindingHandle,
-                  Controller,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-
-  if (EFI_ERROR(Status)) {
-    return Status;
-  }
-
-  Status = PciIo->Pci.Read (
-                        PciIo,
-                        EfiPciIoWidthUint32,
-                        0,
-                        sizeof(Pci) / sizeof(UINT32),
-                        &Pci
-                        );
-
-  if (!EFI_ERROR (Status)) {
-    Status = EFI_SUCCESS; //TODO: force return success as temp solution EFI_UNSUPPORTED;
-    if ((Pci.Hdr.Command & 0x03) == 0x03) {
-      if (Pci.Hdr.ClassCode[2] == PCI_CLASS_BRIDGE) {
-        //
-        // See if this is a standard PCI to ISA Bridge from the Base Code
-        // and Class Code
-        //
-        if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA) {
-          Status = EFI_SUCCESS;
-        } else {
-        }
-
-        //
-        // See if this is an Intel PCI to ISA bridge in Positive Decode Mode
-        //
-        if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE &&
-            Pci.Hdr.VendorId == 0x8086 &&
-            Pci.Hdr.DeviceId == 0x7110) {
-          Status = EFI_SUCCESS;
-        } else {
-        }
-      } else {
-      }
-    }
-    else {
-    }
-  }
-
-  gBS->CloseProtocol (
-         Controller,
-         &gEfiPciIoProtocolGuid,
-         This->DriverBindingHandle,
-         Controller
-         );
-  return Status;
-}
-
-
-/**
-  Install EFI_ISA_ACPI_PROTOCOL
-
-**/
-EFI_STATUS
-EFIAPI
-LpcDriverStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN EFI_HANDLE                     Controller,
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
-  )
-{
-  EFI_STATUS             Status;
-  EFI_PCI_IO_PROTOCOL    *PciIo;
-
-  //
-  // Get Pci IO
-  //
-  Status = gBS->OpenProtocol (
-                  Controller,
-                  &gEfiPciIoProtocolGuid,
-                  (VOID **)&PciIo,
-                  This->DriverBindingHandle,
-                  Controller,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-
-  if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {
-    return Status;
-  }
-
-  mLpc.PciIo = PciIo;
-
-  //
-  // Install IsaAcpi interface, the Sio interface is not installed!
-  //
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &Controller,
-                  &gEfiIsaAcpiProtocolGuid,
-                  &mLpc.IsaAcpi,
-                  NULL
-                  );
-  return Status;
-}
-
-
-EFI_STATUS
-EFIAPI
-LpcDriverStop (
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN  EFI_HANDLE                     Controller,
-  IN  UINTN                          NumberOfChildren,
-  IN  EFI_HANDLE                     *ChildHandleBuffer
-  )
-{
-  EFI_STATUS             Status;
-  EFI_ISA_ACPI_PROTOCOL  *IsaAcpi;
-  LPC_DEV                *LpcDev;
-
-  //
-  // Get EFI_ISA_ACPI_PROTOCOL interface
-  //
-  Status = gBS->OpenProtocol (
-                  Controller,
-                  &gEfiIsaAcpiProtocolGuid,
-                  (VOID **)&IsaAcpi,
-                  This->DriverBindingHandle,
-                  Controller,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  LpcDev = LPC_ISA_ACPI_FROM_THIS (IsaAcpi);
-
-  //
-  // Uninstall protocol interface: EFI_ISA_ACPI_PROTOCOL
-  //
-  Status = gBS->UninstallProtocolInterface (
-                  Controller,
-                  &gEfiIsaAcpiProtocolGuid,
-                  &LpcDev->IsaAcpi
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  gBS->CloseProtocol (
-         Controller,
-         &gEfiPciIoProtocolGuid,
-         This->DriverBindingHandle,
-         Controller
-         );
-
-  return EFI_SUCCESS;
-}
-
-VOID
-LpcIoRead8 (
-  IN  UINT16  Port,
-  OUT UINT8   *Data
-  )
-{
-  mLpc.PciIo->Io.Read(
-                   mLpc.PciIo,
-                   EfiPciWidthUint8,
-                   EFI_PCI_IO_PASS_THROUGH_BAR,
-                   Port,
-                   1,
-                   Data
-                   );
-}
-
-VOID
-LpcIoWrite8 (
-  IN  UINT16  Port,
-  IN  UINT8   Data
-  )
-{
-  mLpc.PciIo->Io.Write(
-                   mLpc.PciIo,
-                   EfiPciWidthUint8,
-                   EFI_PCI_IO_PASS_THROUGH_BAR,
-                   Port,
-                   1,
-                   &Data
-                   );
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h
deleted file mode 100644
index 5e264485e7..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-    LpcDriver.h
-
-Abstract:
-
-    EFI Lpc Driver for a Generic PC Platform
-
-
-
---*/
-
-#ifndef _LPC_DRIVER_H
-#define _LPC_DRIVER_H
-
- #include "LpcSio.h"
- #include "LpcIsaAcpi.h"
-
-#include "Protocol/IsaAcpi.h"
-#include "Protocol/PciIo.h"
-#include "Protocol/DriverBinding.h"
-#include "Library/UefiBootServicesTableLib.h"
-#include "IsaAcpiDxe/PcatIsaAcpi.h"
-#include "IndustryStandard/Pci22.h"
-#include "Protocol/LpcWpce791Policy.h"
-
-#include <Library/DebugLib.h>
-
-#define ICH_LPC_BRIDGE_BUS_DEV_FUNC 0x1F0000
-
-//
-// LPC device private data structure
-//
-//#define LPC_DEV_SIGNATURE 'W87X'
-#define LPC_DEV_SIGNATURE SIGNATURE_32('X', '7', '8', 'W') //'W87X'
-#define EFI_WPCE791_PS2_KEYBOARD_ENABLE       0x01
-#define EFI_WPCE791_PS2_KEYBOARD_DISABLE      0x00
-
-#define EFI_WPCE791_PS2_MOUSE_ENABLE       0x01
-#define EFI_WPCE791_PS2_MOUSE_DISABLE      0x00
-
-
-
-typedef struct {
-  UINTN                 Signature;
-  EFI_HANDLE            Handle;
-  EFI_ISA_ACPI_PROTOCOL IsaAcpi;
-  EFI_PCI_IO_PROTOCOL   *PciIo;
-
-} LPC_DEV;
-
-#define LPC_ISA_ACPI_FROM_THIS(a) BASE_CR (a, LPC_DEV, IsaAcpi)
-
-//
-// Driver entry point
-//
-EFI_STATUS
-EFIAPI
-LpcDriverEntryPoint (
-  IN EFI_HANDLE           ImageHandle,
-  IN EFI_SYSTEM_TABLE     *SystemTable
-  );
-
-//
-// Prototypes for Driver model protocol interface
-//
-EFI_STATUS
-EFIAPI
-LpcDriverSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN EFI_HANDLE                     Controller,
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
-  );
-
-EFI_STATUS
-EFIAPI
-LpcDriverStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN EFI_HANDLE                     Controller,
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
-  );
-
-EFI_STATUS
-EFIAPI
-LpcDriverStop (
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN  EFI_HANDLE                     Controller,
-  IN  UINTN                          NumberOfChildren,
-  IN  EFI_HANDLE                     *ChildHandleBuffer
-  );
-
-VOID
-LpcIoRead8 (
-  IN  UINT16  Port,
-  OUT UINT8   *Data
-  );
-
-VOID
-LpcIoWrite8 (
-  IN  UINT16  Port,
-  IN  UINT8   Data
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c
deleted file mode 100644
index 9c0b79b15c..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-    LpcIsaAcpi.c
-
-Abstract: IsaAcpi implementation
-
-
-
---*/
-
-#include "LpcDriver.h"
-
-//
-// PS/2 Keyboard Controller
-//
-static EFI_ISA_ACPI_RESOURCE  mLpcWpce791Ps2KeyboardDeviceResources[] = {
-  {EfiIsaAcpiResourceIo,        0, 0x60, 0x64},
-  {EfiIsaAcpiResourceInterrupt, 0, 1,     0},
-  {EfiIsaAcpiResourceEndOfList, 0, 0,     0}
-};
-
-//
-// PS/2 Mouse Controller
-//
-static EFI_ISA_ACPI_RESOURCE  mLpcWpce791Ps2MouseDeviceResources[] = {
-  {EfiIsaAcpiResourceIo,        0, 0x60, 0x64},
-  {EfiIsaAcpiResourceInterrupt, 0, 12,     0},
-  {EfiIsaAcpiResourceEndOfList, 0, 0,     0}
-};
-
-//
-// COM
-//
-static EFI_ISA_ACPI_RESOURCE  mLpcWpce791ComDeviceResources[] = {
-  {EfiIsaAcpiResourceIo,        0, 0x3f8, 0x3ff},
-  {EfiIsaAcpiResourceInterrupt, 0, 4,     0},
-  {EfiIsaAcpiResourceEndOfList, 0, 0,     0}
-};
-
-//
-// Table of ISA Controllers
-//
-EFI_ISA_ACPI_RESOURCE_LIST mLpcWpce791DeviceList[] = {
-  {{EISA_PNP_ID(0x303), 0}, mLpcWpce791Ps2KeyboardDeviceResources }, // PS/2 Keyboard Controller
-  {{EISA_PNP_ID(0xF03), 0}, mLpcWpce791Ps2MouseDeviceResources	  }, // PS/2 Mouse Controller
-  {{EISA_PNP_ID(0x501), 0}, mLpcWpce791ComDeviceResources	      }, // COM
-  {{0,                  0}, NULL                                  }  // End
-};
-
-static ICH_DMA_INIT  mIchDmaInitTable [] = {
-//
-//Register OFFSET,           Value
-//
-
-            0x0D8,           0x000,   // Reset DMA Controller 2
-            0x0D0,           0x000,   // Enable DMA controller 2
-            0x00C,           0x000,   // Reset DMA Controller 1
-            0x008,           0x000,   // Enable DMA controller 1
-
-            //
-            // Channel 4
-            //
-            0x0D6,           0x0c0,   // DMA contr. 2 Cascade mode, addr. increment, disable auto init.
-            0x0D2,           0x000,   // Clear write request register
-            0x0d4,           0x000,   // Enable DREQs for channel
-
-            //
-            // Channel 0
-            //
-            0x00B,           0x040,   // DMA contr. 1 single mode, addr. increment, disable auto init.
-            0x009,           0x000,   // Clear write request register
-            0x00A,           0x000,   // Enable DREQs for channel
-
-            //
-            // Channel 1
-            //
-            0x00B,           0x041,   // DMA contr. 1 single mode, addr. increment, disable auto init.
-            0x009,           0x001,   // Clear write request register
-            0x00A,           0x001,   // Enable DREQs for channel
-
-            //
-            // Channel 2
-            //
-            0x00B,           0x042,   // DMA contr. 1 single mode, addr. increment, disable auto init.
-            0x009,           0x002,   // Clear write request register
-            0x00A,           0x002,   // Enable DREQs for channel
-
-            //
-            // Channel 3
-            //
-            0x00B,           0x043,   // DMA contr. 1 single mode, addr. increment, disable auto init.
-            0x009,           0x003,   // Clear write request register
-            0x00A,           0x003,   // Enable DREQs for channel
-
-            //
-            // Channel 5
-            //
-            0x0D6,           0x041,   // DMA contr. 2 single mode, addr. increment, disable auto init.
-            0x0D2,           0x001,   // Clear write request register
-            0x0D4,           0x001,   // Enable DREQs for channel
-
-            //
-            // Channel 6
-            //
-            0x0D6,           0x042,   // DMA contr. 2 single mode, addr. increment, disable auto init.
-            0x0D2,           0x002,   // Clear write request register
-            0x0D4,           0x002,   // Enable DREQs for channel
-
-            //
-            // Channel 7
-            //
-            0x0D6,           0x043,   // DMA contr. 2 single mode, addr. increment, disable auto init.
-            0x0D2,           0x003,   // Clear write request register
-            0x0D4,           0x003    // Enable DREQs for channel
-
-};
-
-//
-// ISA ACPI Protocol Functions
-//
-/**
-
-  Enumerate the ISA devices on the ISA bus
-
-**/
-VOID
-IsaDeviceLookup (
-  IN  EFI_ISA_ACPI_DEVICE_ID      *Device,
-  OUT EFI_ISA_ACPI_RESOURCE_LIST  **IsaAcpiDevice,
-  OUT EFI_ISA_ACPI_RESOURCE_LIST  **NextIsaAcpiDevice
-  )
-{
-  UINTN  Index;
-
-  *IsaAcpiDevice = NULL;
-  if (NextIsaAcpiDevice != NULL) {
-    *NextIsaAcpiDevice = NULL;
-  }
-  if (Device == NULL) {
-    Index = 0;
-  } else {
-    for(Index = 0; mLpcWpce791DeviceList[Index].Device.HID != 0; Index++) {
-      if (Device->HID == mLpcWpce791DeviceList[Index].Device.HID &&
-          Device->UID == mLpcWpce791DeviceList[Index].Device.UID    ) {
-        break;
-      }
-    }
-    if (mLpcWpce791DeviceList[Index].Device.HID == 0) {
-      return;
-    }
-    *IsaAcpiDevice = &(mLpcWpce791DeviceList[Index]);
-    Index++;
-  }
-  if (NextIsaAcpiDevice != NULL && mLpcWpce791DeviceList[Index].Device.HID != 0){
-    *NextIsaAcpiDevice = &(mLpcWpce791DeviceList[Index]);
-  }
-}
-
-
-/**
-  Enumerate the ISA devices on the ISA bus
-  It is hard code now and future it will get from ACPI table
-
-**/
-EFI_STATUS
-EFIAPI
-IsaDeviceEnumerate (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  OUT    EFI_ISA_ACPI_DEVICE_ID      **Device
-  )
-{
-  EFI_ISA_ACPI_RESOURCE_LIST  *IsaAcpiDevice;
-  EFI_ISA_ACPI_RESOURCE_LIST  *NextIsaAcpiDevice;
-
-  IsaDeviceLookup (*Device, &IsaAcpiDevice, &NextIsaAcpiDevice);
-  if (NextIsaAcpiDevice == NULL) {
-    return EFI_NOT_FOUND;
-  }
-  *Device = &(NextIsaAcpiDevice->Device);
-  return EFI_SUCCESS;
-}
-
-/**
-  Set ISA device power use sio
-
-**/
-EFI_STATUS
-EFIAPI
-IsaDeviceSetPower (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  IN     BOOLEAN                     OnOff
-  )
-{
-  return EFI_UNSUPPORTED;
-}
-
-
-/**
-  Get current Resource of the specific ISA device
-  It is hardcode now and future will get from ACPI table
-
-**/
-EFI_STATUS
-EFIAPI
-IsaGetCurrentResource (
-  IN     EFI_ISA_ACPI_PROTOCOL        *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID       *Device,
-  OUT    EFI_ISA_ACPI_RESOURCE_LIST   **ResourceList
-  )
-{
-  IsaDeviceLookup (Device, ResourceList, NULL);
-  if (*ResourceList == NULL || (*ResourceList)->ResourceItem == NULL) {
-    return EFI_NOT_FOUND;
-  }
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-IsaGetPossibleResource (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  OUT    EFI_ISA_ACPI_RESOURCE_LIST  **ResourceList
-  )
-{
-  //
-  // Not supported yet
-  //
-  return EFI_UNSUPPORTED;
-}
-
-
-EFI_STATUS
-EFIAPI
-IsaSetResource (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  IN     EFI_ISA_ACPI_RESOURCE_LIST  *ResourceList
-  )
-{
-  return EFI_UNSUPPORTED;
-}
-
-EFI_STATUS
-EFIAPI
-IsaEnableDevice (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This,
-  IN    EFI_ISA_ACPI_DEVICE_ID       *Device,
-  IN    BOOLEAN                      Enable
-  )
-{
-
-  return EFI_UNSUPPORTED;
-}
-
-/**
-
-  Clear out Resource List if device is set to disable by platform policy
-
-**/
-VOID
-EmptyResourceList (
-  IN  UINT32      DeviceHid
-  )
-{
-  UINT8     Index;
-  for (Index = 0; mLpcWpce791DeviceList[Index].Device.HID != 0; Index++) {
-    if (DeviceHid == mLpcWpce791DeviceList[Index].Device.HID) {
-      mLpcWpce791DeviceList[Index].ResourceItem = NULL;
-    }
-  }
-  return;
-}
-
-/**
-
-  Clear out Resource List if device is set to disable by platform policy
-
-**/
-VOID
-EmptyResourceListHidUid (
-  IN  UINT32      DeviceHid,
-  IN  UINT32      DeviceUid
-  )
-{
-  UINT8     Index;
-  for (Index = 0; mLpcWpce791DeviceList[Index].Device.HID != 0; Index++) {
-    if ((DeviceHid == mLpcWpce791DeviceList[Index].Device.HID) &&
-        (DeviceUid == mLpcWpce791DeviceList[Index].Device.UID)) {
-      mLpcWpce791DeviceList[Index].ResourceItem = NULL;
-    }
-  }
-  return;
-}
-
-EFI_STATUS
-EFIAPI
-IsaInitDevice (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This,
-  IN    EFI_ISA_ACPI_DEVICE_ID       *Device
-  )
-{
-  EFI_WPCE791_POLICY_PROTOCOL      *LpcWpce791Policy;
-  EFI_STATUS                      Status;
-
-  //
-  // Disable configuration according to platform protocol
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiLpcWpce791PolicyProtocolGuid,
-                  NULL,
-                  (VOID **) &LpcWpce791Policy
-                  );
-  if (!EFI_ERROR(Status)) {
-    if (LpcWpce791Policy->DeviceEnables.Ps2Keyboard == EFI_WPCE791_PS2_KEYBOARD_DISABLE) {
-      EmptyResourceList(EISA_PNP_ID(0x303));
-      DisableLogicalDevice (SIO_KEYBOARD);
-      EmptyResourceList(EISA_PNP_ID(0xF03));
-      DisableLogicalDevice (SIO_KEYBOARD);
-    }
-    if (LpcWpce791Policy->DeviceEnables.Ps2Mouse == EFI_WPCE791_PS2_MOUSE_DISABLE) {
-      EmptyResourceList(EISA_PNP_ID(0xF03));
-      DisableLogicalDevice (SIO_MOUSE);
-    }
-  }
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-LpcInterfaceInit (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This
-  )
-{
-  EFI_PCI_IO_PROTOCOL             *PciIo;
-  UINTN                           Index;
-
-  PciIo = (LPC_ISA_ACPI_FROM_THIS (This))->PciIo;
-
-  //
-  // DMA controller initialize
-  //
-  for (Index=0; Index < (sizeof(mIchDmaInitTable)/sizeof(ICH_DMA_INIT)); Index++) {
-    PciIo->Io.Write (
-                PciIo,
-                EfiPciIoWidthUint8,
-                EFI_PCI_IO_PASS_THROUGH_BAR,
-                mIchDmaInitTable[Index].Register,
-                1,
-                &mIchDmaInitTable[Index].Value
-                );
-  }
-
-  return EFI_SUCCESS;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h
deleted file mode 100644
index 2291fd2c1d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-    LpcIsaAcpi.h
-
-Abstract:
-
-    Isa Acpi interface
-
-
-
---*/
-
-#ifndef _LPC_ISA_ACPI_H
-#define _LPC_ISA_ACPI_H
-
-
-
-#include "Protocol/IsaAcpi.h"
-#include "Library/DevicePathLib.h"
-
-
-typedef struct {
-  UINT8  Register;
-  UINT8  Value;
-} ICH_DMA_INIT;
-
-//
-// Prototypes for the ISA ACPI protocol interface
-//
-EFI_STATUS
-EFIAPI
-IsaDeviceEnumerate (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  OUT    EFI_ISA_ACPI_DEVICE_ID      **Device
-  );
-
-EFI_STATUS
-EFIAPI
-IsaDeviceSetPower (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  IN     BOOLEAN                     OnOff
-  );
-
-EFI_STATUS
-EFIAPI
-IsaGetCurrentResource (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  OUT    EFI_ISA_ACPI_RESOURCE_LIST  **ResourceList
-  );
-
-EFI_STATUS
-EFIAPI
-IsaGetPossibleResource (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  OUT    EFI_ISA_ACPI_RESOURCE_LIST  **ResourceList
-  );
-
-EFI_STATUS
-EFIAPI
-IsaSetResource (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  IN     EFI_ISA_ACPI_RESOURCE_LIST  *ResourceList
-  );
-
-EFI_STATUS
-EFIAPI
-IsaEnableDevice (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This,
-  IN    EFI_ISA_ACPI_DEVICE_ID       *Device,
-  IN    BOOLEAN                      Enable
-  );
-
-EFI_STATUS
-EFIAPI
-IsaInitDevice (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This,
-  IN    EFI_ISA_ACPI_DEVICE_ID       *Device
-  );
-
-EFI_STATUS
-EFIAPI
-LpcInterfaceInit (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This
-);
-
-VOID
-EmptyResourceList (
-  IN    UINT32      DeviceHid
-);
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c
deleted file mode 100644
index f23e48ccf2..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-Module Name:
-
-    LpcSio.c
-
-Abstract: Sio implementation
-
-Revision History
-
---*/
-
-#include "LpcDriver.h"
-#include <Library/S3BootScriptLib.h>
-
-VOID
-WriteRegister (
-  IN  UINT8   Index,
-  IN  UINT8   Data
-  );
-
-typedef struct {
-  UINT8 Register;
-  UINT8 Value;
-} EFI_SIO_TABLE;
-
-EFI_SIO_TABLE mSioTable[] = {
-  //
-  // Init keyboard controller
-  //
-  { REG_LOGICAL_DEVICE, SIO_KEYBOARD },
-  { BASE_ADDRESS_HIGH, 0x00 },
-  { BASE_ADDRESS_LOW, 0x60 },
-  { BASE_ADDRESS_HIGH2, 0x00 },
-  { BASE_ADDRESS_LOW2, 0x64 },
-  { PRIMARY_INTERRUPT_SELECT, 0x01 },
-  { ACTIVATE, 0x1 },
-
-  //
-  // Init Mouse controller
-  //
-  { REG_LOGICAL_DEVICE, SIO_MOUSE },
-  { BASE_ADDRESS_HIGH, 0x00 },
-  { BASE_ADDRESS_LOW, 0x60 },
-  { BASE_ADDRESS_HIGH2, 0x00 },
-  { BASE_ADDRESS_LOW2, 0x64 },
-  { PRIMARY_INTERRUPT_SELECT, 0x0c },
-  { ACTIVATE, 0x1 },
-
-  { REG_LOGICAL_DEVICE, SIO_COM },
-  { BASE_ADDRESS_HIGH, 0x03 },
-  { BASE_ADDRESS_LOW, 0xf8 },
-  { PRIMARY_INTERRUPT_SELECT, 0x04 },
-  { ACTIVATE, 0x1 },
-
-
-};
-
-VOID
-LPCWPCE791SetDefault ()
-{
-  UINT8           Index;
-
-  for (Index = 0; Index < sizeof(mSioTable)/sizeof(EFI_SIO_TABLE); Index++) {
-    WriteRegisterAndSaveToScript (mSioTable[Index].Register, mSioTable[Index].Value);
-  }
-
-  return;
-}
-
-VOID
-DisableLogicalDevice (
-  UINT8       DeviceId
-  )
-{
-  WriteRegisterAndSaveToScript (REG_LOGICAL_DEVICE, DeviceId);
-  WriteRegisterAndSaveToScript (ACTIVATE, 0);
-  WriteRegisterAndSaveToScript (BASE_ADDRESS_HIGH, 0);
-  WriteRegisterAndSaveToScript (BASE_ADDRESS_LOW, 0);
-
-  return;
-}
-
-VOID
-WriteRegister (
-  IN  UINT8   Index,
-  IN  UINT8   Data
-  )
-{
-  LpcIoWrite8(CONFIG_PORT, Index);
-  LpcIoWrite8(DATA_PORT, Data);
-
-  return;
-}
-
-VOID
-WriteRegisterAndSaveToScript (
-  IN  UINT8   Index,
-  IN  UINT8   Data
-  )
-{
-  UINT8  Buffer[2];
-
-  LpcIoWrite8(CONFIG_PORT, Index);
-  LpcIoWrite8(DATA_PORT, Data);
-
-  Buffer[0] = Index;
-  Buffer[1] = Data;
-  S3BootScriptSaveIoWrite (
-    EfiBootScriptWidthUint8,
-    INDEX_PORT,
-    2,
-    Buffer
-    );
-
-  return;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h
deleted file mode 100644
index 52c1499e3d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-    LpcSio.h
-
-Abstract:
-
-    Lpc driver's sio interface
-
-
-
---*/
-
-#ifndef _LPC_SIO_H
-#define _LPC_SIO_H
-
-#include "Protocol/PciRootBridgeIo.h"
-
-#define VARSIOINSTALLED L"VarSIOProcotolInstalled"
-
-//
-// Port address
-//
-#define CONFIG_PORT               0x04E
-#define INDEX_PORT                0x04E
-#define DATA_PORT                 INDEX_PORT + 1
-
-//
-// Logical Device
-//
-#define SIO_COM                   0x3
-#define SIO_MSWC                  0x4
-#define SIO_MOUSE                 0x5
-#define SIO_KEYBOARD              0x6
-#define SIO_SHM                   0xF
-#define SIO_PM1                   0x11
-#define SIO_PM2                   0x12
-#define SIO_PM3                   0x17
-#define SIO_ESHM                  0x1D
-
-//
-// Global register
-//
-#define REG_LOGICAL_DEVICE        0x07
-#define REG_DEVICE_ID             0x20
-#define SIO_CONFIG_1              0x21
-#define REG_CHIP_REV              0x24
-#define SIO_CONFIG_5              0x25
-#define SIO_CONFIG_6              0x26
-#define REG_DEVICE_REV            0x27
-#define SIO_CONFIG_9              0x29
-#define SIO_CONFIG_D              0x2D
-
-#define ACTIVATE                  0x30
-#define BASE_ADDRESS_HIGH         0x60
-#define BASE_ADDRESS_LOW          0x61
-#define BASE_ADDRESS_HIGH2        0x62
-#define BASE_ADDRESS_LOW2         0x63
-#define PRIMARY_INTERRUPT_SELECT  0x70
-#define DMA_CHANNEL_SELECT        0x74
-
-EFI_STATUS
-InitializeLpcSio (
-  IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *RootBridgeIo
-  );
-
-//
-// Prototypes for the sio internal function
-//
-//
-// Internal function
-//
-VOID
-LPCWPCE791SetDefault (
-  VOID
-  );
-
-VOID
-WriteRegisterAndSaveToScript (
-  IN  UINT8   Index,
-  IN  UINT8   Data
-  );
-
-VOID
-FloppyWriteProtect (
-  VOID
-  );
-
-VOID
-DisableLogicalDevice (
-  UINT8       DeviceId
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf
deleted file mode 100644
index 5fd458e265..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-#
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-#  Module Name:
-#
-#    SiO791.inf
-#
-#  Abstract:
-#
-#    Component description file for SIO791 module.
-#
---*/
-
-[defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SIO791
-  FILE_GUID                      = 04A76C80-06B9-445e-B73E-CB8C61A6A964
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  ENTRY_POINT                    = LpcDriverEntryPoint
-
-[sources.common]
- LpcIsaAcpi.h
- LpcSio.h
- LpcDriver.h
- LpcIsaAcpi.c
- LpcSio.c
- LpcDriver.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
-  PcAtChipsetPkg/PcAtChipsetPkg.dec
-
-
-[LibraryClasses]
-  UefiDriverEntryPoint
-  UefiBootServicesTableLib
-  DevicePathLib
-  UefiLib
-  S3BootScriptLib
-  DebugLib
-
-[Ppis]
-
-[Protocols]
-  gEfiPciIoProtocolGuid
-  gEfiIsaAcpiProtocolGuid
-  gEfiLpcWpce791PolicyProtocolGuid
-
-[Guids]
-
-[Depex]
-  TRUE
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 05/14] Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (3 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 04/14] Vlv2TbltDevicePkg: Switch from ISA to SIO modules Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:07   ` Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 06/14] Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol Michael D Kinney
                   ` (9 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

* Remove unused references to CPU I/O Protocol defined in
  IntelFrameworkPkg
* Convert valid usage of CPU I/O Protocol to the CPU I/O 2
  Protocol

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../AcpiPlatform/AcpiPlatform.c               | 47 ---------------
 .../AcpiPlatform/AcpiPlatform.h               |  1 -
 .../AcpiPlatform/AcpiPlatform.inf             |  4 +-
 .../Include/Library/EfiRegTableLib.h          | 40 ++-----------
 .../Library/EfiRegTableLib/EfiRegTableLib.c   | 57 ++-----------------
 .../PciPlatform/PciPlatform.c                 |  7 +--
 .../PciPlatform/PciPlatform.inf               |  1 -
 .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.c   |  8 +--
 .../PlatformDxe/IchRegTable.c                 |  8 +--
 .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  |  4 +-
 .../PlatformDxe/PlatformDxe.h                 |  4 +-
 .../PlatformDxe/PlatformDxe.inf               |  1 -
 .../PlatformGopPolicy/PlatformGopPolicy.inf   |  3 +-
 .../PlatformInitPei/PchInitPeim.c             | 10 +---
 .../PlatformSetupDxe/PlatformSetupDxe.inf     |  1 -
 .../PlatformSetupDxe/SetupInfoRecords.c       |  1 -
 .../Vlv2TbltDevicePkg/PlatformSmm/Platform.c  |  1 -
 .../PlatformSmm/PlatformSmm.inf               |  1 -
 .../SmBiosMiscDxe/MiscOemType0x94Function.c   |  2 -
 .../VlvPlatformInitDxe/IgdOpRegion.c          |  6 +-
 .../VlvPlatformInitDxe/VlvPlatformInitDxe.inf |  4 +-
 21 files changed, 30 insertions(+), 181 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
index 1f4d575b73..cb280764b3 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
@@ -34,7 +34,6 @@ Abstract:
 #include <Guid/GlobalVariable.h>
 #include <Guid/SetupVariable.h>
 #include <Guid/PlatformInfo.h>
-#include <Protocol/CpuIo.h>
 #include <Guid/BoardFeatures.h>
 #include <Protocol/AcpiSupport.h>
 #include <Protocol/AcpiS3Save.h>
@@ -54,7 +53,6 @@ CHAR16    gACPIOSFRModelStringVariableName[] = ACPI_OSFR_MODEL_STRING_VARIABLE_N
 CHAR16    gACPIOSFRRefDataBlockVariableName[] = ACPI_OSFR_REF_DATA_BLOCK_VARIABLE_NAME;
 CHAR16    gACPIOSFRMfgStringVariableName[] = ACPI_OSFR_MFG_STRING_VARIABLE_NAME;
 
-EFI_CPU_IO_PROTOCOL                    *mCpuIo;
 EFI_GLOBAL_NVS_AREA_PROTOCOL            mGlobalNvsArea;
 #ifndef __GNUC__
 #pragma optimize("", off)
@@ -776,7 +774,6 @@ AcpiPlatformEntryPoint (
   EFI_HANDLE                    Handle;
   EFI_PS2_POLICY_PROTOCOL       *Ps2Policy;
   EFI_PEI_HOB_POINTERS          GuidHob;
-  UINT8                         PortData;
   EFI_MP_SERVICES_PROTOCOL      *MpService;
   UINTN                         MaximumNumberOfCPUs;
   UINTN                         NumberOfEnabledCPUs;
@@ -1132,53 +1129,9 @@ AcpiPlatformEntryPoint (
   //
   // SIO related option.
   //
-  Status = gBS->LocateProtocol (&gEfiCpuIoProtocolGuid, NULL, (void **)&mCpuIo);
-  ASSERT_EFI_ERROR (Status);
-
   mGlobalNvsArea.Area->WPCN381U = GLOBAL_NVS_DEVICE_DISABLE;
-
   mGlobalNvsArea.Area->DockedSioPresent = GLOBAL_NVS_DEVICE_DISABLE;
 
-  if (mGlobalNvsArea.Area->DockedSioPresent != GLOBAL_NVS_DEVICE_ENABLE) {
-    //
-    // Check ID for SIO WPCN381U.
-    //
-    Status = mCpuIo->Io.Read (
-                          mCpuIo,
-                          EfiCpuIoWidthUint8,
-                          WPCN381U_CONFIG_INDEX,
-                          1,
-                          &PortData
-                          );
-    ASSERT_EFI_ERROR (Status);
-    if (PortData != 0xFF) {
-      PortData = 0x20;
-      Status = mCpuIo->Io.Write (
-                            mCpuIo,
-                            EfiCpuIoWidthUint8,
-                            WPCN381U_CONFIG_INDEX,
-                            1,
-                            &PortData
-                            );
-      ASSERT_EFI_ERROR (Status);
-      Status = mCpuIo->Io.Read (
-                            mCpuIo,
-                            EfiCpuIoWidthUint8,
-                            WPCN381U_CONFIG_DATA,
-                            1,
-                            &PortData
-                            );
-      ASSERT_EFI_ERROR (Status);
-      if ((PortData == WPCN381U_CHIP_ID) || (PortData == WDCP376_CHIP_ID)) {
-        mGlobalNvsArea.Area->WPCN381U = GLOBAL_NVS_DEVICE_ENABLE;
-        mGlobalNvsArea.Area->OnboardCom = GLOBAL_NVS_DEVICE_ENABLE;
-        mGlobalNvsArea.Area->OnboardComCir = GLOBAL_NVS_DEVICE_DISABLE;
-      }
-    }
-  }
-
-
-
   //
   // Get Ps2 policy to set. Will be use if present.
   //
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
index f45590ea24..b27ca661ff 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
@@ -36,7 +36,6 @@ Abstract:
 #include <IndustryStandard/Acpi.h>
 #include <Protocol/AcpiSystemDescriptionTable.h>
 #include <Protocol/MpService.h>
-#include <Protocol/CpuIo.h>
 #include <IndustryStandard/Acpi30.h>
 #include <IndustryStandard/Acpi20.h>
 #include <Library/HobLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
index 817ad58a81..ce4db9fa85 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
@@ -79,6 +79,4 @@ [Depex]
   gEfiVariableArchProtocolGuid        AND
   gEfiVariableWriteArchProtocolGuid   AND
   gEfiAcpiSupportProtocolGuid AND
-  gEfiMpServiceProtocolGuid AND
-  gEfiCpuIoProtocolGuid
-
+  gEfiMpServiceProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
index 12e44efed0..b295cf46cc 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
@@ -13,7 +13,7 @@ Abstract:
   Definitions and macros for building register tables for chipset
   initialization..
 
-  Components linking this lib must include CpuIo, PciRootBridgeIo, and
+  Components linking this lib must include PciRootBridgeIo and
   BootScriptSave protocols in their DPX.
 
 
@@ -129,10 +129,9 @@ typedef union {
   entries.
 
   No parameter checking is done so the caller must be careful about omitting
-  values for PciRootBridgeIo or CpuIo parameters.  If the regtable does
+  values for PciRootBridgeIo parameters.  If the regtable does
   not contain any PCI accesses, it is safe to omit the PciRootBridgeIo (supply
-  NULL).  If the regtable does not contain any IO or Mem entries, it is safe to
-  omit the CpuIo (supply NULL).
+  NULL).
 
   The RegTableEntry parameter is not checked, but is required.
 
@@ -146,44 +145,13 @@ typedef union {
   @param[in] PciRootBridgeIo  A pointer to the instance of PciRootBridgeIo that is used
                               when processing PCI table entries
 
-  @param[in] CpuIo            A pointer to the instance of CpuIo that is used when processing IO and
-                              MEM table entries
-
   @retval Nothing.
 
 **/
 VOID
 ProcessRegTablePci (
   EFI_REG_TABLE                   * RegTableEntry,
-  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * PciRootBridgeIo,
-  EFI_CPU_IO_PROTOCOL             * CpuIo
-  );
-
-/**
-  Processes register table assuming which may contain IO, MEM, and STALL
-  entries, but must NOT contain any PCI entries.  Any PCI entries cause an
-  ASSERT in a DEBUG build and are skipped in a free build.
-
-  No parameter checking is done.  Both RegTableEntry and CpuIo parameters are
-  required.
-
-  gBS is assumed to have been defined and is used when processing stalls.
-
-  The function processes each entry sequentially until an OP_TERMINATE_TABLE
-  entry is encountered.
-
-  @param[in] RegTableEntry - A pointer to the register table to process
-
-  @param[in] CpuIo - A pointer to the instance of CpuIo that is used when processing IO and
-                  MEM table entries
-
-  @retval Nothing.
-
-**/
-VOID
-ProcessRegTableCpu (
-  EFI_REG_TABLE                   * RegTableEntry,
-  EFI_CPU_IO_PROTOCOL             * CpuIo
+  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * PciRootBridgeIo
   );
 
 #endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.c
index b7d896d9fd..d698f3ada9 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-                                                                                   

+Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   EfiRegTableLib.c
@@ -188,10 +185,9 @@ MemReadModifyWrite (
   entries.
 
   No parameter checking is done so the caller must be careful about omitting
-  values for PciRootBridgeIo or CpuIo parameters.  If the regtable does
+  values for PciRootBridgeIo parameters.  If the regtable does
   not contain any PCI accesses, it is safe to omit the PciRootBridgeIo (supply
-  NULL).  If the regtable does not contain any IO or Mem entries, it is safe to
-  omit the CpuIo (supply NULL).
+  NULL).
 
   The RegTableEntry parameter is not checked, but is required.
 
@@ -205,17 +201,13 @@ MemReadModifyWrite (
   @param PciRootBridgeIo  A pointer to the instance of PciRootBridgeIo that is used
                           when processing PCI table entries
 
-  @param CpuIo            A pointer to the instance of CpuIo that is used when processing IO and
-                          MEM table entries
-
   @retval Nothing.
 
 **/
 VOID
 ProcessRegTablePci (
   EFI_REG_TABLE                       *RegTableEntry,
-  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL     *PciRootBridgeIo,
-  EFI_CPU_IO_PROTOCOL                 *CpuIo
+  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL     *PciRootBridgeIo
   )
 {
   while (OPCODE_BASE (RegTableEntry->Generic.OpCode) != OP_TERMINATE_TABLE) {
@@ -241,42 +233,3 @@ ProcessRegTablePci (
     RegTableEntry++;
   }
 }
-
-/**
-  Processes register table assuming which may contain IO, MEM, and STALL
-  entries, but must NOT contain any PCI entries.  Any PCI entries cause an
-  ASSERT in a DEBUG build and are skipped in a free build.
-
-  No parameter checking is done.  Both RegTableEntry and CpuIo parameters are
-  required.
-
-  gBS is assumed to have been defined and is used when processing stalls.
-
-  The function processes each entry sequentially until an OP_TERMINATE_TABLE
-  entry is encountered.
-
-  @param  RegTableEntry   A pointer to the register table to process
-
-  @param  CpuIo           A pointer to the instance of CpuIo that is used when processing IO and
-                          MEM table entries
-
-  @retval Nothing.
-
-**/
-VOID
-ProcessRegTableCpu (
-  EFI_REG_TABLE                       *RegTableEntry,
-  EFI_CPU_IO_PROTOCOL                 *CpuIo
-  )
-{
-  while (OPCODE_BASE (RegTableEntry->Generic.OpCode) != OP_TERMINATE_TABLE) {
-    switch (OPCODE_BASE (RegTableEntry->Generic.OpCode)) {
-    default:
-      DEBUG ((EFI_D_ERROR, "RegTable ERROR: Unknown RegTable OpCode (%x)\n", OPCODE_BASE (RegTableEntry->Generic.OpCode)));
-      ASSERT (0);
-      break;
-    }
-
-    RegTableEntry++;
-  }
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c
index b135e2646c..b1c01afc16 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -23,7 +21,6 @@ Abstract:
 
 #include <Library/BaseLib.h>
 #include <Library/BaseMemoryLib.h>
-#include <Protocol/CpuIo.h>
 #include <Protocol/PciIo.h>
 #include <Guid/SetupVariable.h>
 #include <Protocol/PciRootBridgeIo.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
index 18012a1d53..685c6103a9 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
@@ -33,7 +33,6 @@ [Guids]
 
 [Protocols]
   gEfiPciPlatformProtocolGuid
-  gEfiCpuIoProtocolGuid
   gEfiFirmwareVolume2ProtocolGuid
   gEfiPciRootBridgeIoProtocolGuid
   gEfiPciIoProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.c
index d35a158181..7f3f58e4d1 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   PlatformCpuInfoDxe.c
@@ -41,7 +39,7 @@ PlatformCpuInfoInit (
       //
       // Write the Platform CPU Info to volatile memory for runtime purposes.
       // This must be done in its own driver because SetVariable protocol is dependent on chipset,
-      // which is dependent on CpuIo, PlatformInfo, and Metronome.
+      // which is dependent on CpuIo2, PlatformInfo, and Metronome.
       //
       Status = gRT->SetVariable(
                       EfiPlatformCpuInfoVariable,
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IchRegTable.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IchRegTable.c
index cac61bffd0..28883c166d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IchRegTable.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IchRegTable.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -129,6 +127,6 @@ InitializeSubsystemIds (
   //
   // Program the SSVID/SSDID
   //
-  ProcessRegTablePci (mSubsystemIdRegs, mPciRootBridgeIo, NULL);
+  ProcessRegTablePci (mSubsystemIdRegs, mPciRootBridgeIo);
 
 }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
index 89923ffec6..7e083e3933 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
@@ -1260,7 +1260,7 @@ UpdateDVMTSetup(
 
 UINT8
 ReadCmosBank1Byte (
-  IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
+  IN  EFI_CPU_IO2_PROTOCOL            *CpuIo,
   IN  UINT8                           Index
   )
 {
@@ -1273,7 +1273,7 @@ ReadCmosBank1Byte (
 
 VOID
 WriteCmosBank1Byte (
-  IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
+  IN  EFI_CPU_IO2_PROTOCOL            *CpuIo,
   IN  UINT8                           Index,
   IN  UINT8                           Data
   )
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
index 621fb08274..5c60f823de 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
@@ -145,13 +145,13 @@ PciBusEvent (
 
 UINT8
 ReadCmosBank1Byte (
-  IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
+  IN  EFI_CPU_IO2_PROTOCOL            *CpuIo,
   IN  UINT8                           Index
   );
 
 VOID
 WriteCmosBank1Byte (
-  IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
+  IN  EFI_CPU_IO2_PROTOCOL            *CpuIo,
   IN  UINT8                           Index,
   IN  UINT8                           Data
   );
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index d3f8fa3833..a81f102bac 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -108,7 +108,6 @@ [Protocols]
   gEfiWatchdogTimerDriverProtocolGuid
   gEfiPlatformIdeInitProtocolGuid
   gEfiGlobalNvsAreaProtocolGuid
-  gEfiCpuIo2ProtocolGuid
   gIgdOpRegionProtocolGuid
   gEdkiiVariableLockProtocolGuid
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
index c00553e224..584355291b 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
@@ -37,9 +37,8 @@ [Guids]
   gEfiNormalSetupGuid
 
 [Protocols]
-  gEfiCpuIoProtocolGuid
   gEfiFirmwareVolume2ProtocolGuid
   gPlatformGOPPolicyGuid
 
 [Depex]
-  gEfiCpuIoProtocolGuid AND gEfiVariableArchProtocolGuid
+  gEfiVariableArchProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PchInitPeim.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PchInitPeim.c
index 38b17156f4..4a51a47e36 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PchInitPeim.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PchInitPeim.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   PchInitPeim.c
@@ -84,9 +81,6 @@ WriteCmosBank1Byte (
 /**
   Turn off system if needed.
 
-  @param PeiServices Pointer to PEI Services
-  @param CpuIo       Pointer to CPU I/O Protocol
-
   @retval None.
 
 **/
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
index ae100df26d..1afd8a254e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
@@ -120,7 +120,6 @@ [Protocols]
   gEfiDiskInfoProtocolGuid                      ## CONSUMED
   gEfiMpServiceProtocolGuid
   gDxePchPlatformPolicyProtocolGuid
-  gEfiCpuIo2ProtocolGuid
   gEfiTdtOperationProtocolGuid
   gEfiSmbiosProtocolGuid                        ## PROTOCOL CONSUMES
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
index fb82cdb984..c767021aed 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
@@ -23,7 +23,6 @@ Revision History:
 #include <Protocol/IdeControllerInit.h>
 #include <Protocol/MpService.h>
 #include <Protocol/PchPlatformPolicy.h>
-#include <Protocol/CpuIo2.h>
 #include <Protocol/Smbios.h>
 #include <IndustryStandard/SmBios.h>
 #include <Library/IoLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
index 14b9250e99..fb9d090ada 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
@@ -16,7 +16,6 @@ Abstract:
 --*/
 
 #include "SmmPlatform.h"
-#include <Protocol/CpuIo2.h>
 
 
 //
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
index 3c4f55cf54..73c3b6f2d0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
@@ -56,7 +56,6 @@ [Protocols]
   gEfiSmmPowerButtonDispatchProtocolGuid
   gEfiSmmSxDispatchProtocolGuid
   gEfiSmmVariableProtocolGuid
-  gEfiCpuIo2ProtocolGuid
 
 [Packages]
   MdePkg/MdePkg.dec
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
index 81b66ce9af..2f25ab802b 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
@@ -19,7 +19,6 @@ Abstract:
 #include "MiscSubclassDriver.h"
 #include <Protocol/DataHub.h>
 #include <Library/HiiLib.h>
-#include <Protocol/CpuIo2.h>
 #include <Library/PrintLib.h>
 #include <Protocol/PciRootBridgeIo.h>
 #include <Protocol/SimpleNetwork.h>
@@ -28,7 +27,6 @@ Abstract:
 #include <Protocol/IdeControllerInit.h>
 #include <Protocol/MpService.h>
 #include <Protocol/PchPlatformPolicy.h>
-#include <Protocol/CpuIo2.h>
 #include <Protocol/I2cBus.h>
 
 #include <Library/IoLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
index 8fe1482106..99db5490b6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
@@ -41,7 +41,7 @@ Abstract:
 #include <Protocol/FirmwareVolume2.h>
 #include <Protocol/PlatformGopPolicy.h>
 #include <Protocol/PciIo.h>
-#include <Protocol/CpuIo.h>
+#include <Protocol/CpuIo2.h>
 #include <Protocol/GlobalNvsArea.h>
 #include <Protocol/DxeSmmReadyToLock.h>
 #include <Protocol/PciRootBridgeIo.h>
@@ -631,7 +631,7 @@ IgdOpRegionInit (
   EFI_STATUS                    Status;
   EFI_GLOBAL_NVS_AREA_PROTOCOL  *GlobalNvsArea;
   UINT32                        DwordData;
-  EFI_CPU_IO_PROTOCOL           *CpuIo;
+  EFI_CPU_IO2_PROTOCOL          *CpuIo;
   UINT16                        Data16;
   UINT16                        AcpiBase;
   VOID                          *gConOutNotifyReg;
@@ -879,7 +879,7 @@ IgdOpRegionInit (
   // Find the CPU I/O Protocol.  ASSERT if not found.
   //
   Status = gBS->LocateProtocol (
-                  &gEfiCpuIoProtocolGuid,
+                  &gEfiCpuIo2ProtocolGuid,
                   NULL,
                   (void **)&CpuIo
                   );
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
index 1e86adadb3..fe81a6e3bd 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
@@ -59,12 +59,12 @@ [Protocols]
   gEfiGlobalNvsAreaProtocolGuid
   gEfiPciIoProtocolGuid
   gEfiFirmwareVolume2ProtocolGuid
-  gEfiCpuIoProtocolGuid
+  gEfiCpuIo2ProtocolGuid
 
 [Depex]
   gDxeVlvPlatformPolicyGuid              AND
   gEfiPciRootBridgeIoProtocolGuid     AND
-  gEfiCpuIoProtocolGuid                      AND
+  gEfiCpuIo2ProtocolGuid                  AND
   gEfiDataHubProtocolGuid                 AND
   gEfiGlobalNvsAreaProtocolGuid       AND
   gEfiFirmwareVolume2ProtocolGuid   AND
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 06/14] Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (4 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 05/14] Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:07   ` [edk2-devel] " Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 07/14] Vlv2TbltDevicePkg: Remove use of BIOS ID tools Michael D Kinney
                   ` (8 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

This platform does not have a PS/2 controller, so remove all
references to the PS/2 Policy Protocol.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
index cb280764b3..13d904b834 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
@@ -37,7 +37,6 @@ Abstract:
 #include <Guid/BoardFeatures.h>
 #include <Protocol/AcpiSupport.h>
 #include <Protocol/AcpiS3Save.h>
-#include <Protocol/Ps2Policy.h>
 #include <Library/CpuIA32.h>
 #include <SetupMode.h>
 #include <Guid/AcpiTableStorage.h>
@@ -772,7 +771,6 @@ AcpiPlatformEntryPoint (
   UINTN                         VarSize;
   UINTN                         SysCfgSize;
   EFI_HANDLE                    Handle;
-  EFI_PS2_POLICY_PROTOCOL       *Ps2Policy;
   EFI_PEI_HOB_POINTERS          GuidHob;
   EFI_MP_SERVICES_PROTOCOL      *MpService;
   UINTN                         MaximumNumberOfCPUs;
@@ -1131,19 +1129,6 @@ AcpiPlatformEntryPoint (
   //
   mGlobalNvsArea.Area->WPCN381U = GLOBAL_NVS_DEVICE_DISABLE;
   mGlobalNvsArea.Area->DockedSioPresent = GLOBAL_NVS_DEVICE_DISABLE;
-
-  //
-  // Get Ps2 policy to set. Will be use if present.
-  //
-  Status =  gBS->LocateProtocol (
-                   &gEfiPs2PolicyProtocolGuid,
-                   NULL,
-                   (VOID **)&Ps2Policy
-                   );
-  if (!EFI_ERROR (Status)) {
-          Status = Ps2Policy->Ps2InitHardware (ImageHandle);
-  }
-
   mGlobalNvsArea.Area->SDIOMode = mSystemConfiguration.LpssSdioMode;
 
   Handle = NULL;
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 07/14] Vlv2TbltDevicePkg: Remove use of BIOS ID tools
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (5 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 06/14] Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:07   ` Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 08/14] Vlv2TbltDevicePkg: Remove use of Data Hub Protocol Michael D Kinney
                   ` (7 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

Remove the use of VLV2 specific BIOS ID tools.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env  |  25 --
 Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env  |  25 --
 .../Intel/Vlv2TbltDevicePkg/BiosIdx64D.env    |  25 --
 .../Intel/Vlv2TbltDevicePkg/BiosIdx64R.env    |  25 --
 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId    | Bin 12236 -> 0 bytes
 .../Intel/Vlv2TbltDevicePkg/GenBiosId.exe     | Bin 384000 -> 0 bytes
 .../Vlv2TbltDevicePkg/Include/Guid/BiosId.h   |  30 --
 .../Include/Library/BiosIdLib.h               |  22 +-
 .../Library/BiosIdLib/BiosIdLib.c             | 279 ++----------------
 .../Library/BiosIdLib/BiosIdLib.inf           |  21 +-
 .../PlatformDxe/PlatformDxe.inf               |   2 +-
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |   1 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |   4 -
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |   4 -
 .../PlatformSetupDxe/PlatformSetupDxe.inf     |   1 +
 .../SmBiosMiscDxe/MiscBiosVendorFunction.c    |   9 +-
 Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat  |   8 +-
 Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh   |  52 +---
 18 files changed, 33 insertions(+), 500 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env
 delete mode 100755 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId.exe
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env b/Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env
deleted file mode 100644
index 85313dfbd7..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env
+++ /dev/null
@@ -1,25 +0,0 @@
-#/** @file
-#  This file is used to define the BIOS ID parameters of the build.
-#  This file is processed by GenBiosId.
-#  The BIOS ID format conforms to "BIOS Revision Identification Specification", Rev. 0.7, 6/27/2001.
-#
-#  BIOS ID string format:
-#    $(BOARD_ID)$(BOARD_REV).$(OEM_ID).$(VERSION_MAJOR).$(BUILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM
-#  All fields must have a fixed length.
-#    Example: "TRFTCRB1.86C.0008.D03.0506081529"
-#
-#  Copyright (c) 2008  - 2015, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#**/
-
-BOARD_REV     = 1
-OEM_ID        = I32
-BUILD_TYPE    = D
-
-BOARD_ID = BLAKCRB
-VERSION_MAJOR = 0084
-VERSION_MINOR = 01
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env b/Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env
deleted file mode 100644
index 4af249dc19..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env
+++ /dev/null
@@ -1,25 +0,0 @@
-#/** @file
-#  This file is used to define the BIOS ID parameters of the build.
-#  This file is processed by GenBiosId.
-#  The BIOS ID format conforms to "BIOS Revision Identification Specification", Rev. 0.7, 6/27/2001.
-#
-#  BIOS ID string format:
-#    $(BOARD_ID)$(BOARD_REV).$(OEM_ID).$(VERSION_MAJOR).$(BUILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM
-#  All fields must have a fixed length.
-#    Example: "TRFTCRB1.86C.0008.D03.0506081529"
-#
-#  Copyright (c) 2008  - 2015, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#**/
-
-BOARD_REV     = 1
-OEM_ID        = I32
-BUILD_TYPE    = R
-
-BOARD_ID = BLAKCRB
-VERSION_MAJOR = 0084
-VERSION_MINOR = 01
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env b/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env
deleted file mode 100644
index a2173b7e44..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env
+++ /dev/null
@@ -1,25 +0,0 @@
-#/** @file
-#  This file is used to define the BIOS ID parameters of the build.
-#  This file is processed by GenBiosId.
-#  The BIOS ID format conforms to "BIOS Revision Identification Specification", Rev. 0.7, 6/27/2001.
-#
-#  BIOS ID string format:
-#    $(BOARD_ID)$(BOARD_REV).$(OEM_ID).$(VERSION_MAJOR).$(BUILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM
-#  All fields must have a fixed length.
-#    Example: "TRFTCRB1.86C.0008.D03.0506081529"
-#
-#  Copyright (c) 2008  - 2015, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#**/
-
-BOARD_REV     = 1
-OEM_ID        = X64
-BUILD_TYPE    = D
-
-VERSION_MAJOR = 0084
-VERSION_MINOR = 01
-BOARD_ID = BBAYCRB 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env b/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env
deleted file mode 100644
index c235177e1b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env
+++ /dev/null
@@ -1,25 +0,0 @@
-#/** @file
-#  This file is used to define the BIOS ID parameters of the build.
-#  This file is processed by GenBiosId.
-#  The BIOS ID format conforms to "BIOS Revision Identification Specification", Rev. 0.7, 6/27/2001.
-#
-#  BIOS ID string format:
-#    $(BOARD_ID)$(BOARD_REV).$(OEM_ID).$(VERSION_MAJOR).$(BUILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM
-#  All fields must have a fixed length.
-#    Example: "TRFTCRB1.86C.0008.D03.0506081529"
-#
-#  Copyright (c) 2008  - 2015, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#**/
-
-BOARD_REV     = 1
-OEM_ID        = X64
-BUILD_TYPE    = R
-
-VERSION_MAJOR = 0084
-VERSION_MINOR = 01
-BOARD_ID = BBAYCRB 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/GenBiosId b/Platform/Intel/Vlv2TbltDevicePkg/GenBiosId
deleted file mode 100755
index ef1578f2bcb8922905e0693035245c4329809aa7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12236
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
Oj(!g3>{OC7S^N)t{R~b3

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/GenBiosId.exe b/Platform/Intel/Vlv2TbltDevicePkg/GenBiosId.exe
deleted file mode 100644
index 323b87c444915b173b7f32d5481c67e4471b047b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 384000
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%0D_cl4iKT8j
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
ZjZG+N4<D9DmnW{lYNQ{GdHj36{y$a{V$uKr

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h
deleted file mode 100644
index e86fc852fc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*++
-
-Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-    BiosId.h
-
-Abstract:
-
-    GUIDs used for Bios ID.
-
---*/
-
-#ifndef _BIOS_ID_H_
-#define _BIOS_ID_H_
-
-
-#define EFI_BIOS_ID_GUID \
-{ 0xC3E36D09, 0x8294, 0x4b97, 0xA8, 0x57, 0xD5, 0x28, 0x8F, 0xE3, 0x3E, 0x28 }
-
-
-extern EFI_GUID gEfiBiosIdGuid;
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/BiosIdLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/BiosIdLib.h
index 484b358264..bd08c9a80f 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/BiosIdLib.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/BiosIdLib.h
@@ -1,12 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   BiosIdLib.h
@@ -66,21 +63,6 @@ typedef struct {
 
 #pragma pack()
 
-/**
-  This function returns BIOS ID by searching HOB or FV.
-
-  @param[in]  BiosIdImage         The BIOS ID got from HOB or FV
-
-  @retval  EFI_SUCCESS            All parameters were valid and BIOS ID has been got.
-  @retval  EFI_NOT_FOUND          BiosId image is not found, and no parameter will be modified.
-  @retval  EFI_INVALID_PARAMETER  The parameter is NULL.
-
-**/
-EFI_STATUS
-GetBiosId (
-  OUT BIOS_ID_IMAGE     *BiosIdImage
-  );
-
 /**
   This function returns the Version & Release Date and Time by getting and converting
   BIOS ID.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.c
index 3f0e20c7a8..f6ab37313c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.c
@@ -1,11 +1,9 @@
 /*++
 
-Copyright (c) 2011  - 2014, Intel Corporation. All rights reserved
-                                                                                   

+Copyright (c) 2011  - 2019, Intel Corporation. All rights reserved
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   BiosIdLib.c
@@ -21,237 +19,8 @@ Abstract:
 
 #include <PiDxe.h>
 #include <Library/BaseLib.h>
-#include <Library/HobLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
 
 #include <Library/BiosIdLib.h>
-#include <Guid/BiosId.h>
-#include <Protocol/FirmwareVolume2.h>
-#include <Protocol/LoadedImage.h>
-
-
-EFI_STATUS
-GetImageFromFv (
-  IN  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv,
-  IN  EFI_GUID           *NameGuid,
-  IN  EFI_SECTION_TYPE   SectionType,
-  OUT VOID               **Buffer,
-  OUT UINTN              *Size
-  )
-{
-  EFI_STATUS                Status;
-  EFI_FV_FILETYPE           FileType;
-  EFI_FV_FILE_ATTRIBUTES    Attributes;
-  UINT32                    AuthenticationStatus;
-
-  //
-  // Read desired section content in NameGuid file
-  //
-  *Buffer     = NULL;
-  *Size       = 0;
-  Status      = Fv->ReadSection (
-                      Fv,
-                      NameGuid,
-                      SectionType,
-                      0,
-                      Buffer,
-                      Size,
-                      &AuthenticationStatus
-                      );
-
-  if (EFI_ERROR (Status) && (SectionType == EFI_SECTION_TE)) {
-    //
-    // Try reading PE32 section, since the TE section does not exist
-    //
-    *Buffer = NULL;
-    *Size   = 0;
-    Status  = Fv->ReadSection (
-                    Fv,
-                    NameGuid,
-                    EFI_SECTION_PE32,
-                    0,
-                    Buffer,
-                    Size,
-                    &AuthenticationStatus
-                    );
-  }
-
-  if (EFI_ERROR (Status) &&
-      ((SectionType == EFI_SECTION_TE) || (SectionType == EFI_SECTION_PE32))) {
-    //
-    // Try reading raw file, since the desired section does not exist
-    //
-    *Buffer = NULL;
-    *Size   = 0;
-    Status  = Fv->ReadFile (
-                    Fv,
-                    NameGuid,
-                    Buffer,
-                    Size,
-                    &FileType,
-                    &Attributes,
-                    &AuthenticationStatus
-                    );
-  }
-
-  return Status;
-}
-
-
-EFI_STATUS
-GetImageEx (
-  IN  EFI_HANDLE         ImageHandle,
-  IN  EFI_GUID           *NameGuid,
-  IN  EFI_SECTION_TYPE   SectionType,
-  OUT VOID               **Buffer,
-  OUT UINTN              *Size,
-  BOOLEAN                WithinImageFv
-  )
-{
-  EFI_STATUS                    Status;
-  EFI_HANDLE                    *HandleBuffer;
-  UINTN                         HandleCount;
-  UINTN                         Index;
-  EFI_LOADED_IMAGE_PROTOCOL     *LoadedImage;
-
-  EFI_FIRMWARE_VOLUME2_PROTOCOL *ImageFv;
-  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
-
-
-  if (ImageHandle == NULL && WithinImageFv) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Status  = EFI_NOT_FOUND;
-  ImageFv = NULL;
-  if (ImageHandle != NULL) {
-    Status = gBS->HandleProtocol (
-                    ImageHandle,
-                    &gEfiLoadedImageProtocolGuid,
-                    (VOID **) &LoadedImage
-                    );
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-    Status = gBS->HandleProtocol (
-                    LoadedImage->DeviceHandle,
-                    &gEfiFirmwareVolume2ProtocolGuid,
-                    (VOID **) &ImageFv
-                    );
-    if (!EFI_ERROR (Status)) {
-      Status = GetImageFromFv (ImageFv, NameGuid, SectionType, Buffer, Size);
-    }
-  }
-
-  if (Status == EFI_SUCCESS || WithinImageFv) {
-    return Status;
-  }
-
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiFirmwareVolume2ProtocolGuid,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuffer
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Find desired image in all Fvs
-  //
-  for (Index = 0; Index < HandleCount; ++Index) {
-    Status = gBS->HandleProtocol (
-                    HandleBuffer[Index],
-                    &gEfiFirmwareVolume2ProtocolGuid,
-                    (VOID**)&Fv
-                    );
-
-    if (EFI_ERROR (Status)) {
-      gBS->FreePool(HandleBuffer);
-      return Status;
-    }
-
-    if (ImageFv != NULL && Fv == ImageFv) {
-      continue;
-    }
-
-    Status = GetImageFromFv (Fv, NameGuid, SectionType, Buffer, Size);
-
-    if (!EFI_ERROR (Status)) {
-      break;
-    }
-  }
-  gBS->FreePool(HandleBuffer);
-
-  //
-  // Not found image
-  //
-  if (Index == HandleCount) {
-    return EFI_NOT_FOUND;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  This function returns BIOS ID by searching HOB or FV.
-
-  @param BiosIdImage             The BIOS ID got from HOB or FV.
-
-  @retval EFI_SUCCESS            All parameters were valid and BIOS ID has been got.
-  @retval EFI_NOT_FOUND          BiosId image is not found, and no parameter will be modified.
-  @retval EFI_INVALID_PARAMETER  The parameter is NULL.
-
-**/
-EFI_STATUS
-GetBiosId (
-  OUT BIOS_ID_IMAGE     *BiosIdImage
-  )
-
-{
-  EFI_STATUS    Status;
-  VOID          *Address = NULL;
-  UINTN         Size = 0;
-
-    DEBUG ((EFI_D_INFO, "Get BIOS ID from FV\n"));
-
-    Status = GetImageEx (
-               NULL,
-               &gEfiBiosIdGuid,
-               EFI_SECTION_RAW,
-               &Address,
-               &Size,
-               FALSE
-               );
-
-    if (Status == EFI_SUCCESS) {
-      //
-      // BiosId image is present in FV
-      //
-      if (Address != NULL) {
-        Size = sizeof (BIOS_ID_IMAGE);
-        gBS->CopyMem (
-              (void *) BiosIdImage,
-              Address,
-              Size
-              );
-        //
-        // GetImage () allocated buffer for Address, now clear it.
-        //
-        gBS->FreePool (Address);
-
-        DEBUG ((EFI_D_INFO, "Get BIOS ID from FV successfully\n"));
-        DEBUG ((EFI_D_INFO, "BIOS ID: %s\n", (CHAR16 *) (&(BiosIdImage->BiosIdString))));
-
-        return EFI_SUCCESS;
-      }
-    }
-  return EFI_NOT_FOUND;
-}
 
 /**
   This function returns the Version & Release Date and Time by getting and converting
@@ -273,47 +42,39 @@ GetBiosVersionDateTime (
   OUT CHAR16    *BiosReleaseTime OPTIONAL
   )
 {
-  EFI_STATUS        Status;
-  BIOS_ID_IMAGE     BiosIdImage;
-
   if ((BiosVersion == NULL) && (BiosReleaseDate == NULL) && (BiosReleaseTime == NULL)) {
     return EFI_INVALID_PARAMETER;
   }
 
-  Status = GetBiosId (&BiosIdImage);
-  if (EFI_ERROR (Status)) {
-    return EFI_NOT_FOUND;
-  }
-
   if (BiosVersion != NULL) {
     //
     // Fill the BiosVersion data from the BIOS ID.
     //
-    StrCpy (BiosVersion, (CHAR16 *) (&(BiosIdImage.BiosIdString)));
+    StrCpy (BiosVersion, L"MNW2MAX1.X64.0084.D01");
   }
 
   if (BiosReleaseDate != NULL) {
     //
     // Fill the build timestamp date from the BIOS ID in the "MM/DD/YY" format.
     //
-    BiosReleaseDate[0] = BiosIdImage.BiosIdString.TimeStamp[2];
-    BiosReleaseDate[1] = BiosIdImage.BiosIdString.TimeStamp[3];
-    BiosReleaseDate[2] = (CHAR16) ((UINT8) ('/'));
+    BiosReleaseDate[0] = L'0';
+    BiosReleaseDate[1] = L'1';
+    BiosReleaseDate[2] = L'/';
 
-    BiosReleaseDate[3] = BiosIdImage.BiosIdString.TimeStamp[4];
-    BiosReleaseDate[4] = BiosIdImage.BiosIdString.TimeStamp[5];
-    BiosReleaseDate[5] = (CHAR16) ((UINT8) ('/'));
+    BiosReleaseDate[3] = L'0';
+    BiosReleaseDate[4] = L'1';
+    BiosReleaseDate[5] = L'/';
 
     //
     // Add 20 for SMBIOS table
     // Current Linux kernel will misjudge 09 as year 0, so using 2009 for SMBIOS table
     //
-    BiosReleaseDate[6] = '2';
-    BiosReleaseDate[7] = '0';
-    BiosReleaseDate[8] = BiosIdImage.BiosIdString.TimeStamp[0];
-    BiosReleaseDate[9] = BiosIdImage.BiosIdString.TimeStamp[1];
+    BiosReleaseDate[6] = L'2';
+    BiosReleaseDate[7] = L'0';
+    BiosReleaseDate[8] = L'1';
+    BiosReleaseDate[9] = L'9';
 
-    BiosReleaseDate[10] = (CHAR16) ((UINT8) ('\0'));
+    BiosReleaseDate[10] = L'\0';
   }
 
   if (BiosReleaseTime != NULL) {
@@ -322,14 +83,14 @@ GetBiosVersionDateTime (
     // Fill the build timestamp time from the BIOS ID in the "HH:MM" format.
     //
 
-    BiosReleaseTime[0] = BiosIdImage.BiosIdString.TimeStamp[6];
-    BiosReleaseTime[1] = BiosIdImage.BiosIdString.TimeStamp[7];
-    BiosReleaseTime[2] = (CHAR16) ((UINT8) (':'));
+    BiosReleaseTime[0] = L'0';
+    BiosReleaseTime[1] = L'0';
+    BiosReleaseTime[2] = L':';
 
-    BiosReleaseTime[3] = BiosIdImage.BiosIdString.TimeStamp[8];
-    BiosReleaseTime[4] = BiosIdImage.BiosIdString.TimeStamp[9];
+    BiosReleaseTime[3] = L'0';
+    BiosReleaseTime[4] = L'0';
 
-    BiosReleaseTime[5] = (CHAR16) ((UINT8) ('\0'));
+    BiosReleaseTime[5] = L'\0';
   }
 
   return  EFI_SUCCESS;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
index 3e53680d08..0d38d73ada 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
@@ -1,11 +1,8 @@
 #/*++
 #
-# Copyright (c)  2010  - 2014, Intel Corporation. All rights reserved
-#                                                                                  

+# Copyright (c)  2010  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-
 #
 #  Module Name:
 #
@@ -34,17 +31,3 @@ [Packages]
   MdeModulePkg/MdeModulePkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-
-[LibraryClasses]
-  HobLib
-
-[Guids]
-  gEfiBiosIdGuid
-
-[Protocols]
-  gEfiLoadedImageProtocolGuid
-  gEfiFirmwareVolume2ProtocolGuid
-
-[Depex]
-  gEfiLoadedImageProtocolGuid AND
-  gEfiFirmwareVolume2ProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index a81f102bac..0c432642e4 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -73,9 +73,9 @@ [LibraryClasses]
   EfiRegTableLib
   BiosIdLib
   BaseCryptLib
+  HobLib
 
 [Guids]
-  gEfiBiosIdGuid
   gEfiPlatformBootModeGuid
   gEfiBoardFeaturesGuid
   gItkDataVarGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index 786b4f6e91..bfde7be398 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -37,7 +37,6 @@ [Guids]
   gProcessorProducerGuid                  = { 0x1bf06aea, 0x5bec, 0x4a8d, { 0x95, 0x76, 0x74, 0x9b, 0x09, 0x56, 0x2d, 0x30 } }
   gEfiPowerOnHobGuid                      = { 0x0468a601, 0xc535, 0x46fd, { 0xa9, 0x5d, 0xbb, 0xab, 0x99, 0x1b, 0x17, 0x8c } }
   gEfiPlatformCpuInfoGuid                 = { 0xbb9c7ab7, 0xb8d9, 0x4bf3, { 0x9c, 0x29, 0x9b, 0xf3, 0x41, 0xe2, 0x17, 0xbc } }
-  gEfiBiosIdGuid                          = { 0xC3E36D09, 0x8294, 0x4b97, { 0xA8, 0x57, 0xD5, 0x28, 0x8F, 0xE3, 0x3E, 0x28 } }
   gEfiPlatformBootModeGuid                = { 0xce845704, 0x1683, 0x4d38, { 0xa4, 0xf9, 0x7d, 0x0b, 0x50, 0x77, 0x57, 0x93 } }
   gEfiBoardFeaturesGuid                   = { 0x94b9e8ae, 0x8877, 0x479a, { 0x98, 0x42, 0xf5, 0x97, 0x4b, 0x82, 0xce, 0xd3 } }
   gItkDataVarGuid                         = { 0x3812723d, 0x7e48, 0x4e29, { 0xbc, 0x27, 0xf5, 0xa3, 0x9a, 0xc9, 0x4e, 0xf1 } }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index 3165be1fca..4c60d0a0f2 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -381,10 +381,6 @@ [FV.FVMAIN]
   INF  MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
   }
 
-FILE FREEFORM = C3E36D09-8294-4b97-A857-D5288FE33E28 {
-    SECTION RAW = $(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/$(DXE_ARCHITECTURE)/BiosId.bin
-  }
-
   #
   # EDK II Related Platform codes
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index 03941dd23e..61e1adcd14 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -327,10 +327,6 @@ [FV.FVMAIN]
   INF  MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
   }
 
-FILE FREEFORM = C3E36D09-8294-4b97-A857-D5288FE33E28 {
-    SECTION RAW = $(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/$(DXE_ARCHITECTURE)/BiosId.bin
-  }
-
   #
   # EDK II Related Platform codes
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
index 1afd8a254e..b745574421 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
@@ -80,6 +80,7 @@ [LibraryClasses]
   BiosIdLib
   CpuIA32Lib
   IoLib
+  HobLib
 
 [Guids]
   ##  This GUID C Name is not required for build since it is from UefiLib and not directly used by this module source.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBiosVendorFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBiosVendorFunction.c
index 1817f456cb..fb4fa820a5 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBiosVendorFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBiosVendorFunction.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscBiosVendorFunction.c
@@ -166,7 +163,6 @@ MISC_SMBIOS_TABLE_FUNCTION(MiscBiosVendor)
   SMBIOS_TABLE_TYPE0    *SmbiosRecord;
   EFI_SMBIOS_HANDLE     SmbiosHandle;
   EFI_MISC_BIOS_VENDOR *ForType0InputData;
-  BIOS_ID_IMAGE         BiosIdImage;
   UINT16                UVerStr[32];
   UINTN                 LoopIndex;
   UINTN                 CopyIndex;
@@ -183,7 +179,6 @@ MISC_SMBIOS_TABLE_FUNCTION(MiscBiosVendor)
   if (RecordData == NULL) {
     return EFI_INVALID_PARAMETER;
   }
-  GetBiosId (&BiosIdImage);
 
   //
   //  Add VLV2 BIOS Version and Release data
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
index 8cf8938a4e..5cae78bb6d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
+++ b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
@@ -137,19 +137,15 @@ if /i "%~1"=="/IA32" (
 :: Required argument(s)
 if "%~1"=="" goto Usage
 
-::Remove the values for Platform_Type and Build_Target from BiosIdX.env and stage in Conf\
 if "%Arch%"=="IA32" (
-    findstr /b /v "BOARD_ID  BUILD_TYPE" %PLATFORM_PACKAGE%\BiosIdR.env > %WORKSPACE%\Conf\BiosId.env
     echo DEFINE X64_CONFIG = FALSE  >> %auto_config_inc%
 ) else if "%Arch%"=="X64" (
-    findstr /b /v "BOARD_ID  BUILD_TYPE" %PLATFORM_PACKAGE%\BiosIdx64R.env > %WORKSPACE%\Conf\BiosId.env
     echo DEFINE X64_CONFIG = TRUE  >> %auto_config_inc%
 )
 
 :: -- Build flags settings for each Platform --
-echo Setting  %1  platform configuration and BIOS ID...
+echo Setting  %1  platform configuration...
 if /i "%~1" == "MNW2" (
-    echo BOARD_ID = MNW2MAX >> %WORKSPACE%\Conf\BiosId.env
     echo DEFINE ENBDT_PF_BUILD = TRUE   >> %auto_config_inc%
     
 ) else (
@@ -160,10 +156,8 @@ set Platform_Type=%~1
 
 if /i "%~2" == "RELEASE" (
     set target=RELEASE
-    echo BUILD_TYPE = R >> %WORKSPACE%\Conf\BiosId.env
 ) else (
     set target=DEBUG
-    echo BUILD_TYPE = D >> %WORKSPACE%\Conf\BiosId.env
 )
 
 ::**********************************************************************
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh
index ec3a325db7..1eefa5de73 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh
+++ b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh
@@ -97,11 +97,6 @@ for (( i=1; i<=$#; ))
         rm -r Build
       fi
       shift
-    elif [ "$(echo $1 | tr 'a-z' 'A-Z')" == "/ECP" ]; then
-      ECP_SOURCE=$WORKSPACE/EdkCompatibilityPkgEcp
-      EDK_SOURCE=$WORKSPACE/EdkCompatibilityPkgEcp
-      echo DEFINE ECP_BUILD_ENABLE = TRUE >> $auto_config_inc
-      shift
     elif [ "$(echo $1 | tr 'a-z' 'A-Z')" == "/X64" ]; then
       Arch=X64
       shift
@@ -113,10 +108,6 @@ for (( i=1; i<=$#; ))
     fi
   done
 
-
-
-
-
 ## Required argument(s)
 if [ "$2" == "" ]; then
   Usage
@@ -203,54 +194,19 @@ fi
 ##**********************************************************************
 ## Build BIOS
 ##**********************************************************************
-echo Skip "Running UniTool..."
-echo "Make GenBiosId Tool..."
-BUILD_PATH=Build/$PLATFORM_PACKAGE/"$TARGET"_"$TOOL_CHAIN_TAG"
-if [ ! -d "$BUILD_PATH/$Arch" ]; then
-  mkdir -p $BUILD_PATH/$Arch
-fi
-if [ -e "$BUILD_PATH/$Arch/BiosId.bin" ]; then
-  rm -f $BUILD_PATH/$Arch/BiosId.bin
-fi
-
-
-./$PLATFORM_PACKAGE/GenBiosId -i Conf/BiosId.env -o $BUILD_PATH/$Arch/BiosId.bin
-
-
 echo "Invoking EDK2 build..."
 build
 
-if [ $SpiLock == "1" ]; then
-  IFWI_HEADER_FILE=./$PLATFORM_PACKAGE/Stitch/IFWIHeader/IFWI_HEADER_SPILOCK.bin
-else
-  IFWI_HEADER_FILE=./$PLATFORM_PACKAGE/Stitch/IFWIHeader/IFWI_HEADER.bin
-fi
-
-echo $IFWI_HEADER_FILE
-
 ##**********************************************************************
 ## Post Build processing and cleanup
 ##**********************************************************************
-
 echo Skip "Running fce..."
 
-echo Skip "Running KeyEnroll..."
+##**********************************************************************
+## Build Capsules
+##**********************************************************************
+build -p %PLATFORM_PACKAGE%\PlatformCapsule.dsc
 
-## Set the Board_Id, Build_Type, Version_Major, and Version_Minor environment variables
-VERSION_MAJOR=$(grep '^VERSION_MAJOR' Conf/BiosId.env | cut -d ' ' -f 3 | cut -c 1-4)
-VERSION_MINOR=$(grep '^VERSION_MINOR' Conf/BiosId.env | cut -d ' ' -f 3 | cut -c 1-2)
-BOARD_ID=$(grep '^BOARD_ID' Conf/BiosId.env | cut -d ' ' -f 3 | cut -c 1-7)
-BIOS_Name="$BOARD_ID"_"$Arch"_"$BUILD_TYPE"_"$VERSION_MAJOR"_"$VERSION_MINOR".ROM
-BIOS_ID="$BOARD_ID"_"$Arch"_"$BUILD_TYPE"_"$VERSION_MAJOR"_"$VERSION_MINOR"_GCC.bin
-SEC_VERSION=1.0.2.1060v5
-cat $IFWI_HEADER_FILE ../Vlv2Binaries/Vlv2SocBinPkg/SEC/$SEC_VERSION/VLV_SEC_REGION.bin ../Vlv2Binaries/Vlv2SocBinPkg/SEC/$SEC_VERSION/Vacant.bin $BUILD_PATH/FV/VLV.fd > ./$PLATFORM_PACKAGE/Stitch/$BIOS_ID
-
-
-echo Skip "Running BIOS_Signing ..."
-
-echo
-echo Build location:     $BUILD_PATH
-echo BIOS ROM Created:   $BIOS_Name
 echo
 echo -------------------- The EDKII BIOS build has successfully completed. --------------------
 echo
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 08/14] Vlv2TbltDevicePkg: Remove use of Data Hub Protocol
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (6 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 07/14] Vlv2TbltDevicePkg: Remove use of BIOS ID tools Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:08   ` [edk2-devel] " Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 09/14] Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI Michael D Kinney
                   ` (6 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

Update all platform code to stop using the Data Hub Protocol
from the IntelFrameworkPkg.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Vlv2TbltDevicePkg/Include/Guid/IdccData.h |  104 -
 .../Vlv2TbltDevicePkg/Include/Guid/ItkData.h  |   18 +-
 .../Vlv2TbltDevicePkg/PlatformDxe/BoardId.c   |   45 +-
 .../PlatformDxe/ClockControl.c                |   80 +-
 .../Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c  |   72 -
 .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  |    1 -
 .../PlatformDxe/PlatformDxe.h                 |    2 -
 .../PlatformDxe/PlatformDxe.inf               |    2 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |    1 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |    6 -
 .../Vlv2TbltDevicePkg/PlatformPkgConfig.dsc   |    1 -
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |    6 -
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |    7 -
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |    7 -
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |    7 -
 .../PlatformSetupDxe/PlatformSetupDxe.h       |    2 -
 .../PlatformSetupDxe/SetupFunctions.c         |   38 +-
 .../PlatformSetupDxe/SetupInfoRecords.c       |  477 +--
 .../SmBiosMiscDxe/CommonHeader.h              |   10 +-
 .../SmBiosMiscDxe/DataHubRecords.h            | 2934 +++++++++++++++++
 .../SmBiosMiscDxe/MiscMemoryDeviceFunction.c  |  318 +-
 .../SmBiosMiscDxe/MiscOemType0x94Function.c   |    1 -
 .../SmBiosMiscDxe/MiscProcessorCacheData.c    |   11 +-
 .../MiscProcessorCacheFunction.c              |  273 +-
 .../MiscProcessorInformationFunction.c        |  203 +-
 .../MiscSubclassDriverDataTable.c             |   14 +-
 .../MiscSubclassDriverEntryPoint.c            |   13 +-
 .../SmBiosMiscDxe/SmBiosMiscDxe.inf           |    3 +-
 .../VlvPlatformInitDxe/IgdOpRegion.c          |    3 -
 .../VlvPlatformInitDxe/VlvPlatformInitDxe.inf |    6 +-
 30 files changed, 3458 insertions(+), 1207 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRecords.h

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h
deleted file mode 100644
index 7e3b965666..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  IdccData.h
-
-Abstract:
-
---*/
-
-#ifndef _IDCCDATAHUB_GUID_H_
-#define _IDCCDATAHUB_GUID_H_
-
-//
-// This GUID is for the IDCC related data found in the Data Hub.
-//
-#define IDCC_DATA_HUB_GUID \
-  { 0x788e1d9f, 0x1eab, 0x47d2, 0xa2, 0xf3, 0x78, 0xca, 0xe8, 0x7d, 0x60, 0x12 }
-
-extern EFI_GUID gIdccDataHubGuid;
-
-#pragma pack(1)
-
-typedef struct {
-  UINT32    Type;
-  UINT32    RecordLength;
-} EFI_IDCC_DATA_HEADER;
-
-typedef struct {
-  EFI_IDCC_DATA_HEADER  IdccHeader;
-  UINT32                Tcontrol;
-} EFI_IDCC_TCONTROL;
-
-typedef struct {
-  UINT32    EntryCount;
-} EFI_IDCC_CLOCK_COMMON;
-
-typedef struct {
-  UINT8     Polarity;
-  UINT8     Percent;
-  UINT32    FpValue;
-} EFI_IDCC_TYPE_2_DATA;
-
-typedef struct {
-  UINT8     SetupVal;
-  UINT32    FpValue;
-} EFI_IDCC_TYPE_3_4_DATA;
-
-typedef struct {
-  EFI_IDCC_DATA_HEADER  IdccHeader;
-  UINT32                ProcessorRatio;
-} EFI_IDCC_PROCESSOR_RATIO;
-
-typedef struct {
-  EFI_IDCC_DATA_HEADER  IdccHeader;
-  UINT32                BoardFormFactor;
-} EFI_IDCC_BOARD_FORM_FACTOR;
-
-typedef struct {
-  EFI_IDCC_DATA_HEADER  IdccHeader;
-  UINT32                ProcessorInfo;
-} EFI_IDCC_PROCESSOR_INFO;
-
-#define EFI_IDCC_PROCESSOR_UNCON    (1 << 0)  // Bit 0: UnCon CPU
-#define EFI_IDCC_PROCESSOR_UNLOCK   (1 << 1)  // Bit 1: UnLock CPU
-#define EFI_IDCC_PROCESSOR_CNR      (1 << 2)  // Bit 2: CNR CPU
-#define EFI_IDCC_PROCESSOR_KNF      (1 << 3)  // Bit 3: KNF CPU
-
-typedef struct {
-  EFI_IDCC_DATA_HEADER  IdccHeader;
-  UINT32    MinFSB;
-  UINT32    MaxFSB;
-  UINT8     StepFSB;
-} EFI_IDCC_FSB_DATA;
-
-#pragma pack()
-
-#define EFI_IDCC_POSITIVE   0
-#define EFI_IDCC_NEGATIVE   1
-
-//
-// Board Form Factor equates.
-//
-#define ATX_FORM_FACTOR		0x00
-#define BTX_FORM_FACTOR		0x01
-
-
-#define EFI_IDCC_TCONTROL_TYPE          1
-#define EFI_IDCC_FSB_TYPE               2
-#define EFI_IDCC_PCI_TYPE               3
-#define EFI_IDCC_PCIE_TYPE              4
-#define EFI_IDCC_PROC_RATIO_TYPE        5
-#define EFI_IDCC_BOARD_FORM_FACTOR_TYPE 6
-#define EFI_IDCC_PROC_INFO_TYPE         7
-#define EFI_IDCC_FSB_DATA_TYPE          8
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/ItkData.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/ItkData.h
index e7bd29e6e4..2dcaac15f3 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/ItkData.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/ItkData.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   ItkData.h
@@ -14,16 +12,8 @@ Abstract:
 
 --*/
 
-#ifndef _ITKDATAHUB_GUID_H_
-#define _ITKDATAHUB_GUID_H_
-
-//
-// This GUID is for the ITK related data found in the Data Hub {E7060843-A336-4d5b-9598-13402F5D7375}
-//
-#define ITK_DATA_HUB_GUID \
-  { 0xe7060843, 0xa336, 0x4d5b, 0x95, 0x98, 0x13, 0x40, 0x2f, 0x5d, 0x73, 0x75 }
-
-extern EFI_GUID gItkDataHubGuid;
+#ifndef _ITKDATA_GUID_H_
+#define _ITKDATA_GUID_H_
 
 //
 // This GUID is for the ITK related data found in a Variable  {3812723D-7E48-4e29-BC27-F5A39AC94EF1}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/BoardId.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/BoardId.c
index 7d774568e3..66c76453a8 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/BoardId.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/BoardId.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -23,13 +21,9 @@ Abstract:
 
 #include "PchRegs.h"
 #include "PlatformDxe.h"
-#include <Guid/IdccData.h>
 #include <Guid/EfiVpdData.h>
-#include <Protocol/DataHub.h>
 
 
-extern EFI_GUID mPlatformDriverGuid;
-
 //
 // Global module data
 //
@@ -52,8 +46,6 @@ InitializeBoardId (
 {
 
   UINT32                        BoardIdBufferSize;
-  EFI_IDCC_BOARD_FORM_FACTOR    IdccBoardFormFactor;
-  EFI_DATA_HUB_PROTOCOL         *DataHub;
   EFI_STATUS                    Status;
   DMI_DATA                      DmiDataVariable;
   UINTN                         Size;
@@ -186,38 +178,5 @@ InitializeBoardId (
          BoardIdBufferSize,
          &mBoardFeatures
          );
-
-  //
-  // Get the Data Hub protocol
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiDataHubProtocolGuid,
-                  NULL,
-                  (VOID **) &DataHub
-                  );
-  if (!(EFI_ERROR(Status))) {
-    //
-    // Fill out data
-    //
-    IdccBoardFormFactor.IdccHeader.Type = EFI_IDCC_BOARD_FORM_FACTOR_TYPE;
-    IdccBoardFormFactor.IdccHeader.RecordLength = sizeof(EFI_IDCC_BOARD_FORM_FACTOR);
-    if ((mBoardFeatures & B_BOARD_FEATURES_FORM_FACTOR_ATX) || (mBoardFeatures & B_BOARD_FEATURES_FORM_FACTOR_MICRO_ATX)) {
-        IdccBoardFormFactor.BoardFormFactor = ATX_FORM_FACTOR; // ATX
-    } else {
-        IdccBoardFormFactor.BoardFormFactor = BTX_FORM_FACTOR; // BTX
-    }
-
-    //
-    // Publish the Board Form Factor value for IDCC
-    //
-    Status = DataHub->LogData (
-                        DataHub,
-                        &gIdccDataHubGuid,
-                        &mPlatformDriverGuid,
-                        EFI_DATA_RECORD_CLASS_DATA,
-                        &IdccBoardFormFactor,
-                        sizeof(EFI_IDCC_BOARD_FORM_FACTOR)
-                        );
-  }
 }
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/ClockControl.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/ClockControl.c
index 1669f0357f..596f55bcbe 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/ClockControl.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/ClockControl.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -75,71 +73,6 @@ EFI_CLOCK_PLATFORM_INFO mAtxClockSettings = {
   sizeof(mAtxSxClocks) / sizeof(mAtxSxClocks[0])
 };
 
-#if defined( RVP_SUPPORT ) && RVP_SUPPORT
-//
-// RVP Clock Settings
-//
-// Static clock table.
-//  This should be used to define any clock settings that are static
-//  (Always On or Always Off).  Dynamic clocks should be set to enabled
-//  in this table.
-//
-//UPSD_TBD Check with Jan if any porting required.
-//
-EFI_STATIC_SIGNALS mRvpStaticClocks[] = {
-  {SrcClk11,  Enabled,  All},     // Not used/not present but leave coding enabled
-  {SrcClk10,  Enabled,  All},     // Not used/not present but leave coding enabled
-  {SrcClk9,   Enabled,  All},     // Not used/not present but leave coding enabled
-  {SrcClk8,   Enabled,  All},     // ICHSATAII
-  {SrcClk7,   Enabled,  All},     // DPL_REFSSCLKIN
-  {SrcClk6,   Enabled,  All},     // 100M_MCH
-  {SrcClk5,   Enabled,  All},     // Mini-PCIe  //TODO PNV: Need to check ICH GPIO38:
-                                                // 0: turn on; 1: turn off
-  {SrcClk4,   Enabled,  All},     // ICHSATA
-  {SrcClk3,   Enabled,  All},     // 100M_ICH
-  {SrcClk2,   Enabled,  All},     // 100M_LAN
-  {SrcClk1,   Enabled,  All},     // 25M_LAN
-  {SrcClk0,   Enabled,  All},     // 96M_DREF
-  {Ref0,      Enabled,  All},
-  {Dot96,     Enabled,  All},
-  {Usb48,     Enabled,  All},
-  {PciClkF5,  Enabled,  All},     // 33M_ICH
-  {PciClk0,   Enabled,  All},     // 33M_RISER
-  {PciClk1,   Enabled,  All},     // 33M_RISER
-  {PciClk2,   Enabled,  All},     // VDD_Clock
-  {PciClk3,   Enabled,  All},     // 33M_S1
-  {PciClk4,   Enabled,  All},     // 33M_PA
-};
-
-//
-// Dynamic clock table
-// This is used to determine if a clock should be left on or turned off based
-// on the presence of a device.  The bridge information is used so the bus
-// number for the device to be detected can be found.
-//
-
-//
-// ClockSxInfo Table
-// This is a list of clocks that need to be set to a known state when the
-// system enters S4 or S5.
-//
-EFI_STATIC_SIGNALS mRvpSxClocks[] = {
-  {SaveClockConfiguration, Disabled, All}
-};
-
-//
-// RVP settings structure
-//
-EFI_CLOCK_PLATFORM_INFO mRvpClockSettings = {
-  mRvpStaticClocks,
-  sizeof(mRvpStaticClocks) / sizeof(mRvpStaticClocks[0]),
-  0,  // No clocks will be turned off mRvpDynamicClocks,
-  0, // No clocks will be turned off sizeof(mRvpDynamicClocks) / sizeof(mRvpDynamicClocks[0]),
-  mRvpSxClocks,
-  sizeof(mRvpSxClocks) / sizeof(mRvpSxClocks[0])
-};
-#endif
-
 VOID
 InitializeClockRouting(
   )
@@ -165,12 +98,6 @@ InitializeClockRouting(
                   );
   if (!EFI_ERROR (Status)) {
 
-#if defined( RVP_SUPPORT ) && RVP_SUPPORT
-    if (BoardIdVar & B_BOARD_FEATURES_RVP) {
-      ClockPolicy = &mRvpClockSettings;
-    }
-#else
-
     //
     // Isolate board type information
     //
@@ -183,9 +110,6 @@ InitializeClockRouting(
         BoardIdVar == B_BOARD_FEATURES_FORM_FACTOR_MICRO_ATX) {
       ClockPolicy = &mAtxClockSettings;
     }
-
-#endif
-
   }
 
   Handle = NULL;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c
deleted file mode 100644
index 3b3e4b4c82..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-
-  IdccInfo.c
-
-Abstract:
-
-  Platform information used by IDCC.
-
-Revision History
-
---*/
-
-#include "PlatformDxe.h"
-
-#include <Guid/IdccData.h>
-
-extern EFI_GUID mPlatformDriverGuid;
-
-
-EFI_STATUS
-WriteIdccInfo (
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DATA_HUB_PROTOCOL     *DataHub;
-  UINT8                     Ratio;
-  EFI_IDCC_PROCESSOR_RATIO  ProcRatio;
-
-  //
-  // Locate the data hub protocol
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiDataHubProtocolGuid,
-                  NULL,
-                  (VOID **) &DataHub
-                  );
-
-  //
-  // Find processor actual ratio
-  //
-  Ratio = 15; //Temporary - some dummy value.
-
-  //
-  // Fill in IDCC Type 5 structure
-  //
-  ProcRatio.IdccHeader.Type = EFI_IDCC_PROC_RATIO_TYPE;
-  ProcRatio.IdccHeader.RecordLength = sizeof(EFI_IDCC_PROCESSOR_RATIO);
-  ProcRatio.ProcessorRatio = Ratio;
-
-  //
-  // Write data to the data hub
-  //
-  Status = DataHub->LogData (
-                      DataHub,
-                      &gIdccDataHubGuid,
-                      &mPlatformDriverGuid,
-                      EFI_DATA_RECORD_CLASS_DATA,
-                      &ProcRatio,
-                      sizeof(EFI_IDCC_PROCESSOR_RATIO)
-                      );
-
-  return Status;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
index 7e083e3933..0bc3f44c49 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
@@ -55,7 +55,6 @@ GPIO_CONF_PAD_INIT mTB_BL_GpioInitData_SC_TRI_Exit_boot_Service[] =
 
 
 EFI_GUID mSystemHiiExportDatabase = EFI_HII_EXPORT_DATABASE_GUID;
-EFI_GUID mPlatformDriverGuid = EFI_PLATFORM_DRIVER_GUID;
 SYSTEM_CONFIGURATION  mSystemConfiguration;
 EFI_HANDLE            mImageHandle;
 BOOLEAN               mMfgMode = FALSE;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
index 5c60f823de..f2f0097efc 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
@@ -43,8 +43,6 @@ Abstract:
 #include <Protocol/CpuIo2.h>
 #include <Guid/GlobalVariable.h>
 #include <Guid/BoardFeatures.h>
-#include <Guid/DataHubRecords.h>
-#include <Protocol/DataHub.h>
 #include <Protocol/PciIo.h>
 #include <Protocol/Speaker.h>
 #include <IndustryStandard/Pci22.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index 0c432642e4..a9ef744ef7 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -35,7 +35,6 @@ [sources.common]
   ClockControl.c
   Platform.c
   IchRegTable.c
-  IdccInfo.c
   IchPlatformPolicy.c
   PciDevice.c
   SlotConfig.c
@@ -80,7 +79,6 @@ [Guids]
   gEfiBoardFeaturesGuid
   gItkDataVarGuid
   gDmiDataGuid
-  gIdccDataHubGuid
   gEfiPciLanInfoGuid
   gEfiNormalSetupGuid
   gEfiGlobalVariableGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index bfde7be398..5b255f4b05 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -41,7 +41,6 @@ [Guids]
   gEfiBoardFeaturesGuid                   = { 0x94b9e8ae, 0x8877, 0x479a, { 0x98, 0x42, 0xf5, 0x97, 0x4b, 0x82, 0xce, 0xd3 } }
   gItkDataVarGuid                         = { 0x3812723d, 0x7e48, 0x4e29, { 0xbc, 0x27, 0xf5, 0xa3, 0x9a, 0xc9, 0x4e, 0xf1 } }
   gDmiDataGuid                            = { 0x70e56c5e, 0x280c, 0x44b0, { 0xa4, 0x97, 0x09, 0x68, 0x1a, 0xbc, 0x37, 0x5e } }
-  gIdccDataHubGuid                        = { 0x788e1d9f, 0x1eab, 0x47d2, { 0xa2, 0xf3, 0x78, 0xca, 0xe8, 0x7d, 0x60, 0x12 } }
   gEfiSetupVariableGuid                   = { 0xec87d643, 0xeba4, 0x4bb5, { 0xa1, 0xe5, 0x3f, 0x3e, 0x36, 0xb2, 0x0d, 0xa9 } }
   gEfiPlatformInfoGuid                    = { 0x1e2acc41, 0xe26a, 0x483d, { 0xaf, 0xc7, 0xa0, 0x56, 0xc3, 0x4e, 0x08, 0x7b } }
   gMfgModeVariableGuid                    = { 0xEF14FD78, 0x0793, 0x4e2b, { 0xAC, 0x6D, 0x06, 0x28, 0x47, 0xE0, 0x17, 0x91 } }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index 4c60d0a0f2..15a4251cf8 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -430,9 +430,6 @@ [FV.FVMAIN]
 
 INF Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
-!if $(DATAHUB_ENABLE) == TRUE
-INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf
-!endif
 INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
 
 INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
@@ -584,9 +581,6 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
 INF Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
-
-
 #
 # FAT file system
 #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
index d5068b514c..7b48d7b44e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
@@ -48,7 +48,6 @@
 DEFINE MICOCODE_CAPSULE_ENABLE = TRUE
 
 DEFINE GOP_DRIVER_ENABLE = TRUE
-DEFINE DATAHUB_ENABLE = TRUE
 DEFINE USB_ENABLE = TRUE
 
 DEFINE ISA_SERIAL_STATUS_CODE_ENABLE = TRUE
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index 61e1adcd14..b8ac61d710 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -376,9 +376,6 @@ [FV.FVMAIN]
 
 INF Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
-!if $(DATAHUB_ENABLE) == TRUE
-INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf
-!endif
 INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
 
 INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
@@ -530,9 +527,6 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
 INF Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
-
-
 #
 # FAT file system
 #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index 25d1beb400..b16883e98c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -984,12 +984,6 @@ [Components.X64]
 
   Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
-!if $(DATAHUB_ENABLE) == TRUE
-  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
-    <PcdsFixedAtBuild>
-      gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
-  }
-!endif
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
   Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
   PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
@@ -1212,7 +1206,6 @@ [Components.X64]
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
   Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index 8a5c42577d..c9335a98c8 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -968,12 +968,6 @@ [Components.IA32]
 
   Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
-!if $(DATAHUB_ENABLE) == TRUE
-  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
-    <PcdsFixedAtBuild>
-      gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
-  }
-!endif
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
   Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
   PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
@@ -1196,7 +1190,6 @@ [Components.IA32]
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
   Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index c0fe0892ac..fd9ddebfd9 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -983,12 +983,6 @@ [Components.X64]
 
   Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
-!if $(DATAHUB_ENABLE) == TRUE
-  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
-    <PcdsFixedAtBuild>
-      gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
-  }
-!endif
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
   Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
   PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
@@ -1211,7 +1205,6 @@ [Components.X64]
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
   Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
index 1ba75175e1..b4a30511ac 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
@@ -25,10 +25,8 @@
 #include <Protocol/DevicePathToText.h>
 #include <Protocol/DevicePath.h>
 #include <Protocol/PlatformDriverOverride.h>
-#include <Protocol/DataHub.h>
 #include <Guid/MdeModuleHii.h>
 #include <Guid/VariableFormat.h>
-#include <Guid/DataHubRecords.h>
 
 #include <Library/BaseLib.h>
 #include <Library/DebugLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupFunctions.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupFunctions.c
index a84b425826..f3bc823056 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupFunctions.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupFunctions.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
     SetupFunctions.c
@@ -52,34 +49,3 @@ SwapEntries (
 
   return;
 }
-
-UINT32
-ConvertBase10ToRaw (
-  IN  EFI_EXP_BASE10_DATA             *Data)
-{
-  UINTN         Index;
-  UINT32        RawData;
-
-  RawData = Data->Value;
-  for (Index = 0; Index < (UINTN) Data->Exponent; Index++) {
-     RawData *= 10;
-  }
-
-  return  RawData;
-}
-
-UINT32
-ConvertBase2ToRaw (
-  IN  EFI_EXP_BASE2_DATA             *Data)
-{
-  UINTN         Index;
-  UINT32        RawData;
-
-  RawData = Data->Value;
-  for (Index = 0; Index < (UINTN) Data->Exponent; Index++) {
-     RawData <<= 1;
-  }
-
-  return  RawData;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
index c767021aed..efd4a723e1 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
@@ -79,9 +79,6 @@ SB_REV  SBRevisionTable[] = {
 
 BOOLEAN                         mSetupInfoDone = FALSE;
 UINT8                           mUseProductKey = 0;
-EFI_EXP_BASE10_DATA             mProcessorFrequency;
-EFI_EXP_BASE10_DATA             mProcessorFsbFrequency;
-
 EFI_GUID                        mProcessorProducerGuid;
 EFI_HII_HANDLE                  mHiiHandle;
 EFI_PLATFORM_CPU_INFO           mPlatformCpuInfo;
@@ -91,50 +88,7 @@ EFI_PLATFORM_INFO_HOB           *mPlatformInfo;
 
 #define memset SetMem
 
-UINT16                mMemorySpeed         = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelASlot0  = 0;
-UINT16                mMemorySpeedChannelASlot0 = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelASlot1  = 0;
-UINT16                mMemorySpeedChannelASlot1 = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelBSlot0  = 0;
-UINT16                mMemorySpeedChannelBSlot0 = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelBSlot1  = 0;
-UINT16                mMemorySpeedChannelBSlot1 = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelCSlot0  = 0;
-UINT16                mMemorySpeedChannelCSlot0 = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelCSlot1  = 0;
-UINT16                mMemorySpeedChannelCSlot1 = 0xffff;
-UINTN                 mMemoryMode          = 0xff;
-
 #define CHARACTER_NUMBER_FOR_VALUE  30
-  typedef struct {
-  EFI_STRING_TOKEN            MemoryDeviceLocator;
-  EFI_STRING_TOKEN            MemoryBankLocator;
-  EFI_STRING_TOKEN            MemoryManufacturer;
-  EFI_STRING_TOKEN            MemorySerialNumber;
-  EFI_STRING_TOKEN            MemoryAssetTag;
-  EFI_STRING_TOKEN            MemoryPartNumber;
-  EFI_INTER_LINK_DATA         MemoryArrayLink;
-  EFI_INTER_LINK_DATA         MemorySubArrayLink;
-  UINT16                      MemoryTotalWidth;
-  UINT16                      MemoryDataWidth;
-  UINT64                      MemoryDeviceSize;
-  EFI_MEMORY_FORM_FACTOR      MemoryFormFactor;
-  UINT8                       MemoryDeviceSet;
-  EFI_MEMORY_ARRAY_TYPE       MemoryType;
-  EFI_MEMORY_TYPE_DETAIL      MemoryTypeDetail;
-  UINT16                      MemorySpeed;
-  EFI_MEMORY_STATE            MemoryState;
-} EFI_MEMORY_ARRAY_LINK;
-
-
-typedef struct {
-  EFI_PHYSICAL_ADDRESS        MemoryArrayStartAddress;
-  EFI_PHYSICAL_ADDRESS        MemoryArrayEndAddress;
-  EFI_INTER_LINK_DATA         PhysicalMemoryArrayLink;
-  UINT16                      MemoryArrayPartitionWidth;
-} EFI_MEMORY_ARRAY_START_ADDRESS;
-
 
 typedef enum {
   PCH_SATA_MODE_IDE = 0,
@@ -421,73 +375,6 @@ VOID UpdateLatestBootTime() {
   HiiSetString(mHiiHandle,STRING_TOKEN(STR_LOG_BOOT_TIME_VALUE), Buffer, NULL);
 }
 
-/**
-  Get Cache Type for the specified Cache. This function is invoked when there is data records
-  available in the Data Hub.
-
-  Get Cache Type function arguments:
-
-  @param  Instance        The instance number of the subclass with the same ProducerName..
-  @param  SubInstance     The instance number of the RecordType for the same Instance.
-  @param  CacheType       Cache type, see definition of EFI_CACHE_TYPE_DATA.
-
-  @retval EFI_STATUS
-
-**/
-EFI_STATUS
-GetCacheType(
-  IN  UINT16                            Instance,
-  IN  UINT16                            SubInstance,
-  IN  EFI_CACHE_TYPE_DATA*              CacheType)
-{
-  EFI_STATUS                  Status;
-  EFI_DATA_HUB_PROTOCOL       *DataHub;
-  EFI_DATA_RECORD_HEADER      *Record;
-  UINT64                      MonotonicCount;
-  EFI_CACHE_VARIABLE_RECORD*  CacheVariableRecord;
-  EFI_SUBCLASS_TYPE1_HEADER   *DataHeader;
-
-  Status = gBS->LocateProtocol (
-                  &gEfiDataHubProtocolGuid,
-                  NULL,
-                  (void **)&DataHub
-                  );
-  ASSERT_EFI_ERROR(Status);
-
-  //
-  // Get all available data records from data hub
-  //
-  MonotonicCount = 0;
-  Record = NULL;
-
-  do {
-    Status = DataHub->GetNextRecord (
-	                    DataHub,
-						&MonotonicCount,
-						NULL,
-						&Record
-						);
-    if (!EFI_ERROR(Status)) {
-      if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
-        DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);
-
-        if(CompareGuid(&Record->DataRecordGuid, &gEfiCacheSubClassGuid) &&
-          (DataHeader->RecordType == CacheTypeRecordType) &&
-          (DataHeader->Instance == Instance) &&
-          (DataHeader->SubInstance == SubInstance)) {
-          CacheVariableRecord     = (EFI_CACHE_VARIABLE_RECORD  *)(DataHeader + 1);
-          if(CacheType){
-            *CacheType = CacheVariableRecord->CacheType;
-            return EFI_SUCCESS;
-          }
-        }
-      }
-    }
-  } while(!EFI_ERROR(Status) && (MonotonicCount != 0));
-
-  return EFI_NOT_FOUND;
-}
-
 /**
   Setup data filter function. This function is invoked when there is data records
   available in the Data Hub.
@@ -504,230 +391,23 @@ VOID
 PrepareSetupInformation (
   )
 {
-
   EFI_STATUS                  Status;
-  EFI_DATA_HUB_PROTOCOL       *DataHub;
-  EFI_DATA_RECORD_HEADER      *Record;
-  UINT8                       *SrcData;
-  EFI_SUBCLASS_TYPE1_HEADER   *DataHeader;
   CHAR16                      *NewString;
-  CHAR16                      *NewString2;
-  CHAR16                      *NewStringToken;
   STRING_REF                  TokenToUpdate;
-  EFI_PROCESSOR_VERSION_DATA  *ProcessorVersion;
-  UINTN                       Index;
-  UINTN                       DataOutput;
-
-  EFI_PROCESSOR_MICROCODE_REVISION_DATA   *CpuUcodeRevisionData;
-  EFI_MEMORY_ARRAY_START_ADDRESS          *MemoryArray;
-  EFI_MEMORY_ARRAY_LINK                   *MemoryArrayLink;
-  UINT64                      MonotonicCount;
-
   CHAR16                      Version[100];         //Assuming that strings are < 100 UCHAR
   CHAR16                      ReleaseDate[100];     //Assuming that strings are < 100 UCHAR
   CHAR16                      ReleaseTime[100];     //Assuming that strings are < 100 UCHAR
 
   NewString = AllocateZeroPool (0x100);
-  NewString2 = AllocateZeroPool (0x100);
   SetMem(Version, sizeof(Version), 0);
   SetMem(ReleaseDate, sizeof(ReleaseDate), 0);
   SetMem(ReleaseTime, sizeof(ReleaseTime), 0);
 
-  //
-  // Get the Data Hub Protocol. Assume only one instance
-  //
-  Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, (void **)&DataHub);
-  ASSERT_EFI_ERROR(Status);
-
-  //
-  // Get all available data records from data hub
-  //
-  MonotonicCount = 0;
-  Record = NULL;
-
-  do {
-    Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record);
-    if (!EFI_ERROR(Status)) {
-      if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
-        DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);
-        SrcData     = (UINT8  *)(DataHeader + 1);
-
-        //
-        // Processor
-        //
-        if (CompareGuid(&Record->DataRecordGuid, &gEfiProcessorSubClassGuid)) {
-          CopyMem (&mProcessorProducerGuid, &Record->ProducerName, sizeof(EFI_GUID));
-          switch (DataHeader->RecordType) {
-            case ProcessorCoreFrequencyRecordType:
-              CopyMem(&mProcessorFrequency, SrcData, sizeof(EFI_EXP_BASE10_DATA));
-              Index = EfiValueToString (
-			            NewString,
-						ConvertBase10ToRaw ((EFI_EXP_BASE10_DATA *)SrcData)/1000000000,
-						PREFIX_ZERO,
-						0
-						);
-              StrCat (NewString, L".");
-              EfiValueToString (
-			    NewString + Index + 1,
-				((ConvertBase10ToRaw ((EFI_EXP_BASE10_DATA *)SrcData)%1000000000)/10000000),
-				PREFIX_ZERO,
-				0
-				);
-              StrCat (NewString, L" GHz");
-              TokenToUpdate = (STRING_REF)STR_PROCESSOR_SPEED_VALUE;
-              HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-              break;
-
-            case ProcessorVersionRecordType:
-              ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *)SrcData;
-              NewStringToken = HiiGetPackageString(&mProcessorProducerGuid, *ProcessorVersion, NULL);
-              TokenToUpdate = (STRING_REF)STR_PROCESSOR_VERSION_VALUE;
-              HiiSetString(mHiiHandle, TokenToUpdate, NewStringToken, NULL);
-              break;
-            case CpuUcodeRevisionDataRecordType:
-              CpuUcodeRevisionData = (EFI_PROCESSOR_MICROCODE_REVISION_DATA *) SrcData;
-              if (CpuUcodeRevisionData->ProcessorMicrocodeRevisionNumber != 0) {
-                EfiValueToHexStr (
-				  NewString,
-                  CpuUcodeRevisionData->ProcessorMicrocodeRevisionNumber,
-                  PREFIX_ZERO,
-                  8
-				  );
-                TokenToUpdate = (STRING_REF)STR_PROCESSOR_MICROCODE_VALUE;
-                HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-              }
-              break;
-            default:
-              break;
-          }
-
-        //
-        // Cache
-        //
-        } else if (CompareGuid(&Record->DataRecordGuid, &gEfiCacheSubClassGuid) &&
-                   (DataHeader->RecordType == CacheSizeRecordType)) {
-          if (DataHeader->SubInstance == EFI_CACHE_L1) {
-            EFI_CACHE_TYPE_DATA              CacheType;
-            if (EFI_SUCCESS == GetCacheType(DataHeader->Instance, DataHeader->SubInstance,&CacheType)){
-              if (CacheType == EfiCacheTypeData) {
-                TokenToUpdate = (STRING_REF)STR_PROCESSOR_L1_DATA_CACHE_VALUE;
-              } else if (CacheType == EfiCacheTypeInstruction) {
-                  TokenToUpdate = (STRING_REF)STR_PROCESSOR_L1_INSTR_CACHE_VALUE;
-              } else {
-                continue;
-              }
-            } else {
-              continue;
-            }
-          }
-          else if (DataHeader->SubInstance == EFI_CACHE_L2) {
-            TokenToUpdate = (STRING_REF)STR_PROCESSOR_L2_CACHE_VALUE;
-          } else {
-            continue;
-          }
-          if (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData)) {
-            DataOutput = ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10;
-            EfiValueToString (NewString, DataOutput, PREFIX_ZERO, 0);
-
-            StrCat (NewString, L" KB");
-            if (DataHeader->SubInstance == EFI_CACHE_L3) {
-              HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-            } else if(DataHeader->SubInstance == EFI_CACHE_L2 && mPlatformCpuInfo.CpuPackage.CoresPerPhysicalPackage > 1){
-			  //
-              // Show XxL2 string
-			  //
-              EfiValueToString (
-			    NewString2,
-                mPlatformCpuInfo.CpuPackage.CoresPerPhysicalPackage,
-                PREFIX_ZERO,
-                0
-				);
-              StrCat(NewString2, L"x ");
-              StrCat(NewString2, NewString);
-              HiiSetString(mHiiHandle, TokenToUpdate, NewString2, NULL);
-            } else {
-              HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-            }
-          }
-
-        //
-        // Memory
-        //
-        } else if (CompareGuid(&Record->DataRecordGuid, &gEfiMemorySubClassGuid)) {
-          switch (DataHeader->RecordType) {
-            case EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER:
-              MemoryArrayLink = (EFI_MEMORY_ARRAY_LINK *)SrcData;
-
-              if (MemoryArrayLink->MemorySpeed > 0) {
-                //
-                // Save the lowest speed memory module
-                //
-                if (MemoryArrayLink->MemorySpeed < mMemorySpeed) {
-                  mMemorySpeed = MemoryArrayLink->MemorySpeed;
-                }
-                switch (DataHeader->SubInstance) {
-                  case 1:
-                    mMemorySpeedChannelASlot0 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelASlot0 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  case 2:
-                    mMemorySpeedChannelASlot1 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelASlot1 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  case 3:
-                    mMemorySpeedChannelBSlot0 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelBSlot0 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  case 4:
-                    mMemorySpeedChannelBSlot1 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelBSlot1 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  case 5:
-                    mMemorySpeedChannelCSlot0 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelCSlot0 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  case 6:
-                    mMemorySpeedChannelCSlot1 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelCSlot1 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  default:
-                    break;
-                  }
-              }
-              break;
-
-            case EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER:
-              MemoryArray = (EFI_MEMORY_ARRAY_START_ADDRESS *)SrcData;
-              if (MemoryArray->MemoryArrayEndAddress - MemoryArray->MemoryArrayStartAddress) {
-              	DataOutput = (UINTN)RShiftU64((MemoryArray->MemoryArrayEndAddress - MemoryArray->MemoryArrayStartAddress + 1), 20);
-              	EfiValueToString (NewString, DataOutput / 1024, PREFIX_ZERO, 0);
-              	if(DataOutput % 1024) {
-              	  StrCat (NewString, L".");
-              	  DataOutput = ((DataOutput % 1024) * 1000) / 1024;
-              	  while(!(DataOutput % 10))
-              	    DataOutput = DataOutput / 10;
-                  EfiValueToString (NewString2, DataOutput, PREFIX_ZERO, 0);
-                  StrCat (NewString, NewString2);
-                }
-                StrCat (NewString, L" GB");
-                TokenToUpdate = (STRING_REF)STR_TOTAL_MEMORY_SIZE_VALUE;
-                HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-              }
-              break;
-
-            default:
-              break;
-          }
-        }
-      }
-    }
-  } while (!EFI_ERROR(Status) && (MonotonicCount != 0));
-
   Status = GetBiosVersionDateTime (
              Version,
-			 ReleaseDate,
-			 ReleaseTime
-			 );
+             ReleaseDate,
+             ReleaseTime
+             );
 
   DEBUG ((EFI_D_ERROR, "GetBiosVersionDateTime :%s %s %s \n", Version, ReleaseDate, ReleaseTime));
   if (!EFI_ERROR (Status)) {
@@ -750,24 +430,7 @@ PrepareSetupInformation (
     HiiSetString(mHiiHandle, TokenToUpdate, BuildDateTime, NULL);
   }
 
-  //
-  // Calculate and update memory speed display in Main Page
-  //
-  //
-  // Update the overall memory speed
-  //
-  if (mMemorySpeed != 0xffff) {
-    EfiValueToString (NewString, mMemorySpeed, PREFIX_ZERO, 0);
-    StrCat (NewString, L" MHz");
-
-    TokenToUpdate = (STRING_REF)STR_SYSTEM_MEMORY_SPEED_VALUE;
-    HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-  }
-
   gBS->FreePool(NewString);
-  gBS->FreePool(NewString2);
-
-  return;
 }
 
 /**
@@ -782,65 +445,23 @@ UpdateAdditionalInformation (
   )
 {
   EFI_STATUS                      Status;
-  UINT64                          MonotonicCount;
-  EFI_DATA_HUB_PROTOCOL           *DataHub;
-  EFI_DATA_RECORD_HEADER          *Record;
-  EFI_SUBCLASS_TYPE1_HEADER       *DataHeader;
   EFI_SMBIOS_PROTOCOL             *Smbios;
   EFI_SMBIOS_HANDLE               SmbiosHandle;
   EFI_SMBIOS_TABLE_HEADER         *SmbiosRecord;
   SMBIOS_TABLE_TYPE0              *Type0Record;
+  SMBIOS_TABLE_TYPE4              *Type4Record;
+  SMBIOS_TABLE_TYPE7              *Type7Record;
+  SMBIOS_TABLE_TYPE17             *Type17Record;
   UINT8                           StrIndex;
   CHAR16                          *BiosVersion = NULL;
+  CHAR16                          *ProcessorVersion = NULL;
   CHAR16                          *IfwiVersion = NULL;
   UINT16                          SearchIndex;
   EFI_STRING_ID                   TokenToUpdate;
-#if defined( RVP_SUPPORT ) && RVP_SUPPORT
-  EFI_MISC_SYSTEM_MANUFACTURER    *SystemManufacturer;
-#endif
-
-  Status = gBS->LocateProtocol (
-                  &gEfiDataHubProtocolGuid,
-                  NULL,
-                  (void **)&DataHub
-                  );
-
-  ASSERT_EFI_ERROR(Status);
-
-  MonotonicCount  = 0;
-  Record = NULL;
-  do {
-    Status = DataHub->GetNextRecord (
-                        DataHub,
-                        &MonotonicCount,
-                        NULL,
-                        &Record
-                        );
-    if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
-      DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);
-
-      if (CompareGuid(&Record->DataRecordGuid, &gEfiMiscSubClassGuid) &&
-          (DataHeader->RecordType == EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER)) {
-#if defined( RVP_SUPPORT ) && RVP_SUPPORT
-        //
-        // System Information
-        //
-        SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER *)(DataHeader + 1);
-
-        //
-        // UUID  (System Information)
-        //
-        SMBIOSString = EfiLibAllocateZeroPool (0x100);
-        GuidToString ( &SystemManufacturer->SystemUuid, SMBIOSString, 0x00 );
-
-        TokenToUpdate = (STRING_REF)STR_SYSTEM_UUID_VALUE;
-        HiiSetString(mHiiHandle, TokenToUpdate, SMBIOSString, NULL);
-
-        gBS->FreePool(SMBIOSString);
-#endif
-      }
-    }
-  } while (!EFI_ERROR(Status) && (MonotonicCount != 0));
+  UINT32                          MicrocodeRevision;
+  CHAR16                          NewString[0x100];
+  UINTN                           TotalMemorySize;
+  UINT16                          MemorySpeed;
 
   Status = gBS->LocateProtocol (
                   &gEfiSmbiosProtocolGuid,
@@ -850,6 +471,8 @@ UpdateAdditionalInformation (
   ASSERT_EFI_ERROR (Status);
 
   SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+  TotalMemorySize = 0;
+  MemorySpeed = 0xffff;
   do {
     Status = Smbios->GetNext (
                        Smbios,
@@ -858,6 +481,70 @@ UpdateAdditionalInformation (
                        &SmbiosRecord,
                        NULL
                        );
+
+
+    if (SmbiosRecord->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) {
+      Type4Record = (SMBIOS_TABLE_TYPE4 *) SmbiosRecord;
+      UnicodeSPrint (NewString, sizeof (NewString), L"%d.%d GHz",
+        Type4Record->CurrentSpeed / 1000,
+        Type4Record->CurrentSpeed % 1000
+        );
+      HiiSetString (mHiiHandle, STR_PROCESSOR_SPEED_VALUE, NewString, NULL);
+
+      StrIndex = Type4Record->ProcessorVersion;
+      GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type4Record + Type4Record->Hdr.Length), StrIndex, &ProcessorVersion);
+      HiiSetString (mHiiHandle, STR_PROCESSOR_VERSION_VALUE, ProcessorVersion, NULL);
+
+      MicrocodeRevision = (UINT32) RShiftU64 (AsmReadMsr64 (EFI_MSR_IA32_BIOS_SIGN_ID), 32);
+      UnicodeSPrint (NewString, sizeof (NewString), L"%8x", MicrocodeRevision);
+      HiiSetString (mHiiHandle, STR_PROCESSOR_MICROCODE_VALUE, NewString, NULL);
+    }
+    if (SmbiosRecord->Type == SMBIOS_TYPE_CACHE_INFORMATION) {
+      Type7Record = (SMBIOS_TABLE_TYPE7 *) SmbiosRecord;
+      UnicodeSPrint (NewString, sizeof (NewString), L"%d KB", Type7Record->InstalledSize);
+      switch (Type7Record->CacheConfiguration & 0x03) {
+      case 0:
+        //
+        // Level 1 Cache
+        //
+        if (Type7Record->SystemCacheType == CacheTypeInstruction) {
+          HiiSetString (mHiiHandle, STR_PROCESSOR_L1_INSTR_CACHE_VALUE, NewString, NULL);
+        }
+        if (Type7Record->SystemCacheType == CacheTypeData) {
+          HiiSetString (mHiiHandle, STR_PROCESSOR_L1_DATA_CACHE_VALUE, NewString, NULL);
+        }
+        break;
+      case 1:
+        //
+        // Level 2 Cache
+        //
+        HiiSetString (mHiiHandle, STR_PROCESSOR_L2_CACHE_VALUE, NewString, NULL);
+        break;
+      default:
+        break;
+      }
+      HiiSetString (mHiiHandle, STR_PROCESSOR_MICROCODE_VALUE, NewString, NULL);
+    }
+    if (SmbiosRecord->Type == EFI_SMBIOS_TYPE_MEMORY_DEVICE) {
+      Type17Record = (SMBIOS_TABLE_TYPE17 *) SmbiosRecord;
+      if (Type17Record->Size > 0) {
+        if ((Type17Record->Size & BIT15) != 0) {
+          //
+          // Size is in KB
+          //
+          TotalMemorySize = TotalMemorySize + Type17Record->Size;
+        } else {
+          //
+          // Size is in MB
+          //
+          TotalMemorySize = TotalMemorySize + (UINTN)LShiftU64 (Type17Record->Size, 10);
+        }
+        if (Type17Record->Speed < MemorySpeed) {
+          MemorySpeed = Type17Record->Speed;
+        }
+      }
+    }
+
     if (SmbiosRecord->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) {
       Type0Record = (SMBIOS_TABLE_TYPE0 *) SmbiosRecord;
       StrIndex = Type0Record->BiosVersion;
@@ -884,6 +571,16 @@ UpdateAdditionalInformation (
     }
   } while (!EFI_ERROR(Status));
 
+  if ((TotalMemorySize % 1024) != 0) {
+    UnicodeSPrint (NewString, sizeof (NewString), L"%d.%d GB", TotalMemorySize / 1024, ((TotalMemorySize % 1024) * 100) / 1024);
+  } else {
+    UnicodeSPrint (NewString, sizeof (NewString), L"%d GB", TotalMemorySize / 1024);
+  }
+  HiiSetString (mHiiHandle, STR_TOTAL_MEMORY_SIZE_VALUE, NewString, NULL);
+
+  UnicodeSPrint (NewString, sizeof (NewString), L"%d MHz", MemorySpeed);
+  HiiSetString(mHiiHandle, STR_SYSTEM_MEMORY_SPEED_VALUE, NewString, NULL);
+
   UpdateLatestBootTime();
 
   return  EFI_SUCCESS;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/CommonHeader.h b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/CommonHeader.h
index e339b31065..f95e6bbc2d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/CommonHeader.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/CommonHeader.h
@@ -3,11 +3,10 @@
 
   This file includes package header files, library classes and protocol, PPI & GUID definitions.
 
-  Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2006  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

 **/
 
 #ifndef __COMMON_HEADER_H_
@@ -15,11 +14,10 @@
 
 
 
-#include <FrameworkDxe.h>
+#include <PiDxe.h>
 #include <IndustryStandard/SmBios.h>
 #include <Protocol/Smbios.h>
 
-#include <Guid/DataHubRecords.h>
 #include <Guid/MdeModuleHii.h>
 
 #include <Library/DebugLib.h>
@@ -36,4 +34,6 @@
 #include <Library/PchPlatformLib.h>
 #include <Library/PrintLib.h>
 
+#include "DataHubRecords.h"
+
 #endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRecords.h b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRecords.h
new file mode 100644
index 0000000000..f57a5a8c0f
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRecords.h
@@ -0,0 +1,2934 @@
+/** @file
+  DataHubRecord.h includes all data hub subclass GUID definitions.
+
+  This file includes all data hub sub class defitions from
+  Cache subclass specification 0.9, DataHub SubClass specification 0.9, Memory SubClass Spec 0.9,
+  Processor Subclass specification 0.9, and Misc SubClass specification 0.9.
+
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#ifndef _DATAHUB_RECORDS_GUID_H_
+#define _DATAHUB_RECORDS_GUID_H_
+
+//
+// Local defintion of STRING_REF
+//
+typedef UINT16  STRING_REF;
+
+//
+// The include is required to retrieve type EFI_EXP_BASE10_DATA
+//
+#include <Guid/StatusCodeDataTypeId.h>
+
+#define EFI_PROCESSOR_SUBCLASS_GUID \
+  { 0x26fdeb7e, 0xb8af, 0x4ccf, {0xaa, 0x97, 0x02, 0x63, 0x3c, 0xe4, 0x8c, 0xa7 } }
+
+extern  EFI_GUID gEfiProcessorSubClassGuid;
+
+
+#define EFI_CACHE_SUBCLASS_GUID \
+  { 0x7f0013a7, 0xdc79, 0x4b22, {0x80, 0x99, 0x11, 0xf7, 0x5f, 0xdc, 0x82, 0x9d } }
+
+extern  EFI_GUID gEfiCacheSubClassGuid;
+
+///
+/// The memory subclass belongs to the data class and is identified as the memory
+/// subclass by the GUID.
+///
+#define EFI_MEMORY_SUBCLASS_GUID \
+  {0x4E8F4EBB, 0x64B9, 0x4e05, {0x9B, 0x18, 0x4C, 0xFE, 0x49, 0x23, 0x50, 0x97} }
+
+extern  EFI_GUID  gEfiMemorySubClassGuid;
+
+#define EFI_MISC_SUBCLASS_GUID \
+  { 0x772484B2, 0x7482, 0x4b91, {0x9F, 0x9A, 0xAD, 0x43, 0xF8, 0x1C, 0x58, 0x81 } }
+
+extern  EFI_GUID  gEfiMiscSubClassGuid;
+
+
+///
+/// Inconsistent with specification here:
+/// In ProcSubclass specification 0.9, the value is 0x0100.
+/// Keep it unchanged from the perspective of binary consistency.
+///
+#define EFI_PROCESSOR_SUBCLASS_VERSION    0x00010000
+
+#pragma pack(1)
+
+typedef struct _USB_PORT_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} USB_PORT_DEVICE_PATH;
+
+//
+// IDE
+//
+typedef struct _IDE_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} IDE_DEVICE_PATH;
+
+//
+// RMC Connector
+//
+typedef struct _RMC_CONN_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} RMC_CONN_DEVICE_PATH;
+
+//
+// RIDE
+//
+typedef struct _RIDE_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} RIDE_DEVICE_PATH;
+
+//
+// Gigabit NIC
+//
+typedef struct _GB_NIC_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciXBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciXBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} GB_NIC_DEVICE_PATH;
+
+//
+// P/S2 Connector
+//
+typedef struct _PS2_CONN_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   LpcBridgeDevicePath;
+  ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} PS2_CONN_DEVICE_PATH;
+
+//
+// Serial Port Connector
+//
+typedef struct _SERIAL_CONN_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   LpcBridgeDevicePath;
+  ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} SERIAL_CONN_DEVICE_PATH;
+
+//
+// Parallel Port Connector
+//
+typedef struct _PARALLEL_CONN_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   LpcBridgeDevicePath;
+  ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} PARALLEL_CONN_DEVICE_PATH;
+
+//
+// Floopy Connector
+//
+typedef struct _FLOOPY_CONN_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   LpcBridgeDevicePath;
+  ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} FLOOPY_CONN_DEVICE_PATH;
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+/// It's implementation-specific to simplify the code logic.
+///
+typedef union _EFI_MISC_PORT_DEVICE_PATH {
+  USB_PORT_DEVICE_PATH              UsbDevicePath;
+  IDE_DEVICE_PATH                   IdeDevicePath;
+  RMC_CONN_DEVICE_PATH              RmcConnDevicePath;
+  RIDE_DEVICE_PATH                  RideDevicePath;
+  GB_NIC_DEVICE_PATH                GbNicDevicePath;
+  PS2_CONN_DEVICE_PATH              Ps2ConnDevicePath;
+  SERIAL_CONN_DEVICE_PATH           SerialConnDevicePath;
+  PARALLEL_CONN_DEVICE_PATH         ParallelConnDevicePath;
+  FLOOPY_CONN_DEVICE_PATH           FloppyConnDevicePath;
+} EFI_MISC_PORT_DEVICE_PATH;
+
+#pragma pack()
+
+///
+/// String Token Definition
+///
+/// Inconsistent with specification here:
+/// The macro isn't defined by any specification.
+/// Keep it unchanged for backward compatibility.
+///
+#define EFI_STRING_TOKEN          UINT16
+
+///
+/// Each data record that is a member of some subclass starts with a standard
+/// header of type EFI_SUBCLASS_TYPE1_HEADER.
+/// This header is only a guideline and applicable only to a data
+/// subclass that is producing SMBIOS data records. A subclass can start with a
+/// different header if needed.
+///
+typedef struct {
+  ///
+  /// The version of the specification to which a specific subclass data record adheres.
+  ///
+  UINT32                            Version;
+  ///
+  /// The size in bytes of this data class header.
+  ///
+  UINT32                            HeaderSize;
+  ///
+  /// The instance number of the subclass with the same ProducerName. This number is
+  /// applicable in cases where multiple subclass instances that were produced by the same
+  /// driver exist in the system. This entry is 1 based; 0 means Reserved and -1 means Not
+  /// Applicable. All data consumer drivers should be able to handle all the possible values
+  /// of Instance, including Not Applicable and Reserved.
+  ///
+  UINT16                            Instance;
+  ///
+  /// The instance number of the RecordType for the same Instance. This number is
+  /// applicable in cases where multiple instances of the RecordType exist for a specific
+  /// Instance. This entry is 1 based; 0 means Reserved and -1 means Not Applicable.
+  /// All data consumer drivers should be able to handle all the possible values of
+  /// SubInstance, including Not Applicable and Reserved.
+  ///
+  UINT16                            SubInstance;
+  ///
+  /// The record number for the data record being specified. The numbering scheme and
+  /// definition is defined in the specific subclass specification.
+  ///
+  UINT32                            RecordType;
+} EFI_SUBCLASS_TYPE1_HEADER;
+
+///
+/// This structure is used to link data records in the same subclasses. A data record is
+/// defined as a link to another data record in the same subclass using this structure.
+///
+typedef struct {
+  ///
+  /// An EFI_GUID that identifies the component that produced this data record. Type
+  /// EFI_GUID is defined in InstallProtocolInterface() in the EFI 1.10 Specification.
+  ///
+  EFI_GUID                          ProducerName;
+  ///
+  /// The instance number of the subclass with the same ProducerName. This number is
+  /// applicable in cases where multiple subclass instances that were produced by the same
+  /// driver exist in the system. This entry is 1 based; 0 means Reserved and -1 means Not
+  /// Applicable. All data consumer drivers should be able to handle all the possible values
+  /// of Instance, including Not Applicable and Reserved.
+  ///
+  UINT16                            Instance;
+  /// The instance number of the RecordType for the same Instance. This number is
+  /// applicable in cases where multiple instances of the RecordType exist for a specific
+  /// Instance. This entry is 1 based; 0 means Reserved and -1 means Not Applicable.
+  /// All data consumer drivers should be able to handle all the possible values of
+  /// SubInstance, including Not Applicable and Reserved.
+  UINT16                            SubInstance;
+} EFI_INTER_LINK_DATA;
+
+//
+// EXP data
+//
+///
+/// This macro provides a calculation for base-10 representations. Value and Exponent are each
+/// INT16. It is signed to cover negative values and is 16 bits wide (15 bits for data and 1 bit
+/// for the sign).
+///
+typedef struct {
+  ///
+  /// The INT16 number by which to multiply the base-10 representation.
+  ///
+  UINT16                            Value;
+  ///
+  /// The INT16 number by which to raise the base-10 calculation.
+  ///
+  UINT16                            Exponent;
+} EFI_EXP_BASE2_DATA;
+
+typedef EFI_EXP_BASE10_DATA        EFI_PROCESSOR_MAX_CORE_FREQUENCY_DATA;
+typedef EFI_EXP_BASE10_DATA        EFI_PROCESSOR_MAX_FSB_FREQUENCY_DATA;
+typedef EFI_EXP_BASE10_DATA        EFI_PROCESSOR_CORE_FREQUENCY_DATA;
+
+///
+/// This data record refers to the list of frequencies that the processor core supports. The list of
+/// supported frequencies is determined by the firmware based on hardware capabilities--for example,
+/// it could be a common subset of all processors and the chipset. The unit of measurement of this data
+/// record is in Hertz. For asynchronous processors, the content of this data record is zero.
+/// The list is terminated by -1 in the Value field of the last element. A Value field of zero means
+/// that the processor/driver supports automatic frequency selection.
+///
+/// Inconsistent with specification here:
+/// According to MiscSubclass 0.9 specification, it should be a pointer since it refers to a list of frequencies.
+///
+typedef EFI_EXP_BASE10_DATA        *EFI_PROCESSOR_CORE_FREQUENCY_LIST_DATA;
+
+///
+/// This data record refers to the list of supported frequencies of the processor external bus. The list of
+/// supported frequencies is determined by the firmware based on hardware capabilities--for example,
+/// it could be a common subset of all processors and the chipset. The unit of measurement of this data
+/// record is in Hertz. For asynchronous processors, the content of this data record is NULL.
+/// The list is terminated by -1 in the Value field of the last element. A Value field of zero means
+/// that the processor/driver supports automatic frequency selection.
+///
+typedef EFI_EXP_BASE10_DATA        *EFI_PROCESSOR_FSB_FREQUENCY_LIST_DATA;
+typedef EFI_EXP_BASE10_DATA        EFI_PROCESSOR_FSB_FREQUENCY_DATA;
+typedef STRING_REF                 EFI_PROCESSOR_VERSION_DATA;
+typedef STRING_REF                 EFI_PROCESSOR_MANUFACTURER_DATA;
+typedef STRING_REF                 EFI_PROCESSOR_SERIAL_NUMBER_DATA;
+typedef STRING_REF                 EFI_PROCESSOR_ASSET_TAG_DATA;
+typedef STRING_REF                 EFI_PROCESSOR_PART_NUMBER_DATA;
+
+typedef struct {
+  UINT32                            ProcessorSteppingId:4;
+  UINT32                            ProcessorModel:     4;
+  UINT32                            ProcessorFamily:    4;
+  UINT32                            ProcessorType:      2;
+  UINT32                            ProcessorReserved1: 2;
+  UINT32                            ProcessorXModel:    4;
+  UINT32                            ProcessorXFamily:   8;
+  UINT32                            ProcessorReserved2: 4;
+} EFI_PROCESSOR_SIGNATURE;
+
+
+///
+/// Inconsistent with specification here:
+/// The name of third field in ProcSubClass specification 0.9 is LogicalProcessorCount.
+/// Keep it unchanged for backward compatibility.
+///
+typedef struct {
+  UINT32                            ProcessorBrandIndex    :8;
+  UINT32                            ProcessorClflush       :8;
+  UINT32                            ProcessorReserved      :8;
+  UINT32                            ProcessorDfltApicId    :8;
+} EFI_PROCESSOR_MISC_INFO;
+
+typedef struct {
+  UINT32                            ProcessorFpu:       1;
+  UINT32                            ProcessorVme:       1;
+  UINT32                            ProcessorDe:        1;
+  UINT32                            ProcessorPse:       1;
+  UINT32                            ProcessorTsc:       1;
+  UINT32                            ProcessorMsr:       1;
+  UINT32                            ProcessorPae:       1;
+  UINT32                            ProcessorMce:       1;
+  UINT32                            ProcessorCx8:       1;
+  UINT32                            ProcessorApic:      1;
+  UINT32                            ProcessorReserved1: 1;
+  UINT32                            ProcessorSep:       1;
+  UINT32                            ProcessorMtrr:      1;
+  UINT32                            ProcessorPge:       1;
+  UINT32                            ProcessorMca:       1;
+  UINT32                            ProcessorCmov:      1;
+  UINT32                            ProcessorPat:       1;
+  UINT32                            ProcessorPse36:     1;
+  UINT32                            ProcessorPsn:       1;
+  UINT32                            ProcessorClfsh:     1;
+  UINT32                            ProcessorReserved2: 1;
+  UINT32                            ProcessorDs:        1;
+  UINT32                            ProcessorAcpi:      1;
+  UINT32                            ProcessorMmx:       1;
+  UINT32                            ProcessorFxsr:      1;
+  UINT32                            ProcessorSse:       1;
+  UINT32                            ProcessorSse2:      1;
+  UINT32                            ProcessorSs:        1;
+  UINT32                            ProcessorReserved3: 1;
+  UINT32                            ProcessorTm:        1;
+  UINT32                            ProcessorReserved4: 2;
+} EFI_PROCESSOR_FEATURE_FLAGS;
+
+///
+/// This data record refers to the unique ID that identifies a set of processors. This data record is 16
+/// bytes in length. The data in this structure is processor specific and reserved values can be defined
+/// for future use. The consumer of this data should not make any assumption and should use this data
+/// with respect to the processor family defined in the Family record number.
+///
+typedef struct {
+  ///
+  /// Identifies the processor.
+  ///
+  EFI_PROCESSOR_SIGNATURE           Signature;
+  ///
+  /// Provides additional processor information.
+  ///
+  EFI_PROCESSOR_MISC_INFO           MiscInfo;
+  ///
+  /// Reserved for future use.
+  ///
+  UINT32                            Reserved;
+  ///
+  /// Provides additional processor information.
+  ///
+  EFI_PROCESSOR_FEATURE_FLAGS       FeatureFlags;
+} EFI_PROCESSOR_ID_DATA;
+
+///
+/// This data record refers to the general classification of the processor. This data record is 4 bytes in
+/// length.
+///
+typedef enum {
+  EfiProcessorOther    = 1,
+  EfiProcessorUnknown  = 2,
+  EfiCentralProcessor  = 3,
+  EfiMathProcessor     = 4,
+  EfiDspProcessor      = 5,
+  EfiVideoProcessor    = 6
+} EFI_PROCESSOR_TYPE_DATA;
+
+///
+/// This data record refers to the family of the processor as defined by the DMTF.
+/// This data record is 4 bytes in length.
+///
+typedef enum {
+  EfiProcessorFamilyOther                  = 0x01,
+  EfiProcessorFamilyUnknown                = 0x02,
+  EfiProcessorFamily8086                   = 0x03,
+  EfiProcessorFamily80286                  = 0x04,
+  EfiProcessorFamilyIntel386               = 0x05,
+  EfiProcessorFamilyIntel486               = 0x06,
+  EfiProcessorFamily8087                   = 0x07,
+  EfiProcessorFamily80287                  = 0x08,
+  EfiProcessorFamily80387                  = 0x09,
+  EfiProcessorFamily80487                  = 0x0A,
+  EfiProcessorFamilyPentium                = 0x0B,
+  EfiProcessorFamilyPentiumPro             = 0x0C,
+  EfiProcessorFamilyPentiumII              = 0x0D,
+  EfiProcessorFamilyPentiumMMX             = 0x0E,
+  EfiProcessorFamilyCeleron                = 0x0F,
+  EfiProcessorFamilyPentiumIIXeon          = 0x10,
+  EfiProcessorFamilyPentiumIII             = 0x11,
+  EfiProcessorFamilyM1                     = 0x12,
+  EfiProcessorFamilyM2                     = 0x13,
+  EfiProcessorFamilyM1Reserved2            = 0x14,
+  EfiProcessorFamilyM1Reserved3            = 0x15,
+  EfiProcessorFamilyM1Reserved4            = 0x16,
+  EfiProcessorFamilyM1Reserved5            = 0x17,
+  EfiProcessorFamilyAmdDuron               = 0x18,
+  EfiProcessorFamilyK5                     = 0x19,
+  EfiProcessorFamilyK6                     = 0x1A,
+  EfiProcessorFamilyK6_2                   = 0x1B,
+  EfiProcessorFamilyK6_3                   = 0x1C,
+  EfiProcessorFamilyAmdAthlon              = 0x1D,
+  EfiProcessorFamilyAmd29000               = 0x1E,
+  EfiProcessorFamilyK6_2Plus               = 0x1F,
+  EfiProcessorFamilyPowerPC                = 0x20,
+  EfiProcessorFamilyPowerPC601             = 0x21,
+  EfiProcessorFamilyPowerPC603             = 0x22,
+  EfiProcessorFamilyPowerPC603Plus         = 0x23,
+  EfiProcessorFamilyPowerPC604             = 0x24,
+  EfiProcessorFamilyPowerPC620             = 0x25,
+  EfiProcessorFamilyPowerPCx704            = 0x26,
+  EfiProcessorFamilyPowerPC750             = 0x27,
+  EfiProcessorFamilyAlpha3                 = 0x30,
+  EfiProcessorFamilyAlpha21064             = 0x31,
+  EfiProcessorFamilyAlpha21066             = 0x32,
+  EfiProcessorFamilyAlpha21164             = 0x33,
+  EfiProcessorFamilyAlpha21164PC           = 0x34,
+  EfiProcessorFamilyAlpha21164a            = 0x35,
+  EfiProcessorFamilyAlpha21264             = 0x36,
+  EfiProcessorFamilyAlpha21364             = 0x37,
+  EfiProcessorFamilyMips                   = 0x40,
+  EfiProcessorFamilyMIPSR4000              = 0x41,
+  EfiProcessorFamilyMIPSR4200              = 0x42,
+  EfiProcessorFamilyMIPSR4400              = 0x43,
+  EfiProcessorFamilyMIPSR4600              = 0x44,
+  EfiProcessorFamilyMIPSR10000             = 0x45,
+  EfiProcessorFamilySparc                  = 0x50,
+  EfiProcessorFamilySuperSparc             = 0x51,
+  EfiProcessorFamilymicroSparcII           = 0x52,
+  EfiProcessorFamilymicroSparcIIep         = 0x53,
+  EfiProcessorFamilyUltraSparc             = 0x54,
+  EfiProcessorFamilyUltraSparcII           = 0x55,
+  EfiProcessorFamilyUltraSparcIIi          = 0x56,
+  EfiProcessorFamilyUltraSparcIII          = 0x57,
+  ///
+  /// Inconsistent with specification here:
+  /// This field in ProcSubClass specification 0.9 is defined as EfiProcessorFamilyUltraSparcIIi.
+  /// Change it to EfiProcessorFamilyUltraSparcIIIi to avoid build break.
+  ///
+  EfiProcessorFamilyUltraSparcIIIi         = 0x58,
+  EfiProcessorFamily68040                  = 0x60,
+  EfiProcessorFamily68xxx                  = 0x61,
+  EfiProcessorFamily68000                  = 0x62,
+  EfiProcessorFamily68010                  = 0x63,
+  EfiProcessorFamily68020                  = 0x64,
+  EfiProcessorFamily68030                  = 0x65,
+  EfiProcessorFamilyHobbit                 = 0x70,
+  EfiProcessorFamilyCrusoeTM5000           = 0x78,
+  EfiProcessorFamilyCrusoeTM3000           = 0x79,
+  EfiProcessorFamilyEfficeonTM8000         = 0x7A,
+  EfiProcessorFamilyWeitek                 = 0x80,
+  EfiProcessorFamilyItanium                = 0x82,
+  EfiProcessorFamilyAmdAthlon64            = 0x83,
+  EfiProcessorFamilyAmdOpteron             = 0x84,
+  EfiProcessorFamilyAmdSempron             = 0x85,
+  EfiProcessorFamilyAmdTurion64Mobile      = 0x86,
+  EfiProcessorFamilyDualCoreAmdOpteron     = 0x87,
+  EfiProcessorFamilyAmdAthlon64X2DualCore  = 0x88,
+  EfiProcessorFamilyAmdTurion64X2Mobile    = 0x89,
+  EfiProcessorFamilyPARISC                 = 0x90,
+  EfiProcessorFamilyPaRisc8500             = 0x91,
+  EfiProcessorFamilyPaRisc8000             = 0x92,
+  EfiProcessorFamilyPaRisc7300LC           = 0x93,
+  EfiProcessorFamilyPaRisc7200             = 0x94,
+  EfiProcessorFamilyPaRisc7100LC           = 0x95,
+  EfiProcessorFamilyPaRisc7100             = 0x96,
+  EfiProcessorFamilyV30                    = 0xA0,
+  EfiProcessorFamilyPentiumIIIXeon         = 0xB0,
+  EfiProcessorFamilyPentiumIIISpeedStep    = 0xB1,
+  EfiProcessorFamilyPentium4               = 0xB2,
+  EfiProcessorFamilyIntelXeon              = 0xB3,
+  EfiProcessorFamilyAS400                  = 0xB4,
+  EfiProcessorFamilyIntelXeonMP            = 0xB5,
+  EfiProcessorFamilyAMDAthlonXP            = 0xB6,
+  EfiProcessorFamilyAMDAthlonMP            = 0xB7,
+  EfiProcessorFamilyIntelItanium2          = 0xB8,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelPentiumM          = 0xB9,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelCeleronD          = 0xBA,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelPentiumD          = 0xBB,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelPentiumEx         = 0xBC,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelCoreSolo          = 0xBD,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyReserved               = 0xBE,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelCore2             = 0xBF,
+  EfiProcessorFamilyIBM390                 = 0xC8,
+  EfiProcessorFamilyG4                     = 0xC9,
+  EfiProcessorFamilyG5                     = 0xCA,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification  0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyG6                     = 0xCB,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyzArchitectur           = 0xCC,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyViaC7M                 = 0xD2,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyViaC7D                 = 0xD3,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyViaC7                  = 0xD4,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyViaEden                = 0xD5,
+  EfiProcessorFamilyi860                   = 0xFA,
+  EfiProcessorFamilyi960                   = 0xFB,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIndicatorFamily2       = 0xFE,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyReserved1              = 0xFF
+} EFI_PROCESSOR_FAMILY_DATA;
+
+typedef enum {
+  EfiProcessorFamilySh3           = 0x104,
+  EfiProcessorFamilySh4           = 0x105,
+  EfiProcessorFamilyArm           = 0x118,
+  EfiProcessorFamilyStrongArm     = 0x119,
+  EfiProcessorFamily6x86          = 0x12C,
+  EfiProcessorFamilyMediaGx       = 0x12D,
+  EfiProcessorFamilyMii           = 0x12E,
+  EfiProcessorFamilyWinChip       = 0x140,
+  EfiProcessorFamilyDsp           = 0x15E,
+  EfiProcessorFamilyVideo         = 0x1F4
+} EFI_PROCESSOR_FAMILY2_DATA;
+
+///
+/// This data record refers to the core voltage of the processor being defined. The unit of measurement
+/// of this data record is in volts.
+///
+typedef EFI_EXP_BASE10_DATA         EFI_PROCESSOR_VOLTAGE_DATA;
+
+///
+/// This data record refers to the base address of the APIC of the processor being defined. This data
+/// record is a physical address location.
+///
+typedef EFI_PHYSICAL_ADDRESS        EFI_PROCESSOR_APIC_BASE_ADDRESS_DATA;
+
+///
+/// This data record refers to the ID of the APIC of the processor being defined. This data record is a
+/// 4-byte entry.
+///
+typedef UINT32                      EFI_PROCESSOR_APIC_ID_DATA;
+
+///
+/// This data record refers to the version number of the APIC of the processor being defined. This data
+/// record is a 4-byte entry.
+///
+typedef UINT32                      EFI_PROCESSOR_APIC_VERSION_NUMBER_DATA;
+
+typedef enum {
+  EfiProcessorIa32Microcode    = 1,
+  EfiProcessorIpfPalAMicrocode = 2,
+  EfiProcessorIpfPalBMicrocode = 3
+} EFI_PROCESSOR_MICROCODE_TYPE;
+
+///
+/// This data record refers to the revision of the processor microcode that is loaded in the processor.
+/// This data record is a 4-byte entry.
+///
+typedef struct {
+  ///
+  /// Identifies what type of microcode the data is.
+  ///
+  EFI_PROCESSOR_MICROCODE_TYPE      ProcessorMicrocodeType;
+  ///
+  /// Indicates the revision number of this microcode.
+  ///
+  UINT32                            ProcessorMicrocodeRevisionNumber;
+} EFI_PROCESSOR_MICROCODE_REVISION_DATA;
+
+///
+/// This data record refers to the status of the processor.
+///
+typedef struct {
+  UINT32       CpuStatus                 :3; ///< Indicates the status of the processor.
+  UINT32       Reserved1                 :3; ///< Reserved for future use. Should be set to zero.
+  UINT32       SocketPopulated           :1; ///< Indicates if the processor is socketed or not.
+  UINT32       Reserved2                 :1; ///< Reserved for future use. Should be set to zero.
+  UINT32       ApicEnable                :1; ///< Indicates if the APIC is enabled or not.
+  UINT32       BootApplicationProcessor  :1; ///< Indicates if this processor is the boot processor.
+  UINT32       Reserved3                 :22;///< Reserved for future use. Should be set to zero.
+} EFI_PROCESSOR_STATUS_DATA;
+
+typedef enum {
+  EfiCpuStatusUnknown        = 0,
+  EfiCpuStatusEnabled        = 1,
+  EfiCpuStatusDisabledByUser = 2,
+  EfiCpuStatusDisabledbyBios = 3,
+  EfiCpuStatusIdle           = 4,
+  EfiCpuStatusOther          = 7
+} EFI_CPU_STATUS;
+
+typedef enum {
+  EfiProcessorSocketOther            = 1,
+  EfiProcessorSocketUnknown          = 2,
+  EfiProcessorSocketDaughterBoard    = 3,
+  EfiProcessorSocketZIF              = 4,
+  EfiProcessorSocketReplacePiggyBack = 5,
+  EfiProcessorSocketNone             = 6,
+  EfiProcessorSocketLIF              = 7,
+  EfiProcessorSocketSlot1            = 8,
+  EfiProcessorSocketSlot2            = 9,
+  EfiProcessorSocket370Pin           = 0xA,
+  EfiProcessorSocketSlotA            = 0xB,
+  EfiProcessorSocketSlotM            = 0xC,
+  EfiProcessorSocket423              = 0xD,
+  EfiProcessorSocketA462             = 0xE,
+  EfiProcessorSocket478              = 0xF,
+  EfiProcessorSocket754              = 0x10,
+  EfiProcessorSocket940              = 0x11,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorSocket939              = 0x12,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorSocketmPGA604          = 0x13,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorSocketLGA771           = 0x14,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorSocketLGA775           = 0x15
+
+} EFI_PROCESSOR_SOCKET_TYPE_DATA;
+
+typedef STRING_REF                  EFI_PROCESSOR_SOCKET_NAME_DATA;
+
+///
+/// Inconsistent with specification here:
+/// In ProcSubclass specification 0.9, the naming is EFI_PROCESSOR_CACHE_ASSOCIATION_DATA.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef EFI_INTER_LINK_DATA         EFI_CACHE_ASSOCIATION_DATA;
+
+///
+/// This data record refers to the health status of the processor.
+///
+/// Inconsistent with specification here:
+/// In ProcSubclass specification 0.9, the naming is EFI_PROCESSOR_HEALTH_STATUS_DATA.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef enum {
+  EfiProcessorHealthy        = 1,
+  EfiProcessorPerfRestricted = 2,
+  EfiProcessorFuncRestricted = 3
+} EFI_PROCESSOR_HEALTH_STATUS;
+
+///
+/// This data record refers to the package number of this processor. Multiple logical processors can
+/// exist in a system and each logical processor can be correlated to the physical processor using this
+/// record type.
+///
+typedef UINTN                       EFI_PROCESSOR_PACKAGE_NUMBER_DATA;
+
+typedef UINT8                       EFI_PROCESSOR_CORE_COUNT_DATA;
+typedef UINT8                       EFI_PROCESSOR_ENABLED_CORE_COUNT_DATA;
+typedef UINT8                       EFI_PROCESSOR_THREAD_COUNT_DATA;
+
+typedef struct {
+  UINT16  Reserved              :1;
+  UINT16  Unknown               :1;
+  UINT16  Capable64Bit          :1;
+  UINT16  Reserved2             :13;
+} EFI_PROCESSOR_CHARACTERISTICS_DATA;
+
+///
+/// Inconsistent with specification here:
+/// In ProcSubclass specification 0.9, the enumeration type data structure is NOT defined.
+/// The equivalent in specification is
+///      #define EFI_PROCESSOR_FREQUENCY_RECORD_NUMBER           0x00000001
+///      #define EFI_PROCESSOR_BUS_FREQUENCY_RECORD_NUMBER       0x00000002
+///      #define EFI_PROCESSOR_VERSION_RECORD_NUMBER             0x00000003
+///      #define EFI_PROCESSOR_MANUFACTURER_RECORD_NUMBER        0x00000004
+///      #define EFI_PROCESSOR_SERIAL_NUMBER_RECORD_NUMBER       0x00000005
+///      #define EFI_PROCESSOR_ID_RECORD_NUMBER                  0x00000006
+///      #define EFI_PROCESSOR_TYPE_RECORD_NUMBER                0x00000007
+///      #define EFI_PROCESSOR_FAMILY_RECORD_NUMBER              0x00000008
+///      #define EFI_PROCESSOR_VOLTAGE_RECORD_NUMBER             0x00000009
+///      #define EFI_PROCESSOR_APIC_BASE_ADDRESS_RECORD_NUMBER   0x0000000A
+///      #define EFI_PROCESSOR_APIC_ID_RECORD_NUMBER             0x0000000B
+///      #define EFI_PROCESSOR_APIC_VER_NUMBER_RECORD_NUMBER     0x0000000C
+///      #define EFI_PROCESSOR_MICROCODE_REVISION_RECORD_NUMBER  0x0000000D
+///      #define EFI_PROCESSOR_STATUS_RECORD_NUMBER              0x0000000E
+///      #define EFI_PROCESSOR_SOCKET_TYPE_RECORD_NUMBER         0x0000000F
+///      #define EFI_PROCESSOR_SOCKET_NAME_RECORD_NUMBER         0x00000010
+///      #define EFI_PROCESSOR_CACHE_ASSOCIATION_RECORD_NUMBER   0x00000011
+///      #define EFI_PROCESSOR_MAX_FREQUENCY_RECORD_NUMBER       0x00000012
+///      #define EFI_PROCESSOR_ASSET_TAG_RECORD_NUMBER           0x00000013
+///      #define EFI_PROCESSOR_MAX_FSB_FREQUENCY_RECORD_NUMBER   0x00000014
+///      #define EFI_PROCESSOR_PACKAGE_NUMBER_RECORD_NUMBER      0x00000015
+///      #define EFI_PROCESSOR_FREQUENCY_LIST_RECORD_NUMBER      0x00000016
+///      #define EFI_PROCESSOR_FSB_FREQUENCY_LIST_RECORD_NUMBER  0x00000017
+///      #define EFI_PROCESSOR_HEALTH_STATUS_RECORD_NUMBER       0x00000018
+///
+/// Keep the definition unchanged for backward compatibility.
+typedef enum {
+  ProcessorCoreFrequencyRecordType     = 1,
+  ProcessorFsbFrequencyRecordType      = 2,
+  ProcessorVersionRecordType           = 3,
+  ProcessorManufacturerRecordType      = 4,
+  ProcessorSerialNumberRecordType      = 5,
+  ProcessorIdRecordType                = 6,
+  ProcessorTypeRecordType              = 7,
+  ProcessorFamilyRecordType            = 8,
+  ProcessorVoltageRecordType           = 9,
+  ProcessorApicBaseAddressRecordType   = 10,
+  ProcessorApicIdRecordType            = 11,
+  ProcessorApicVersionNumberRecordType = 12,
+  CpuUcodeRevisionDataRecordType       = 13,
+  ProcessorStatusRecordType            = 14,
+  ProcessorSocketTypeRecordType        = 15,
+  ProcessorSocketNameRecordType        = 16,
+  CacheAssociationRecordType           = 17,
+  ProcessorMaxCoreFrequencyRecordType  = 18,
+  ProcessorAssetTagRecordType          = 19,
+  ProcessorMaxFsbFrequencyRecordType   = 20,
+  ProcessorPackageNumberRecordType     = 21,
+  ProcessorCoreFrequencyListRecordType = 22,
+  ProcessorFsbFrequencyListRecordType  = 23,
+  ProcessorHealthStatusRecordType      = 24,
+  ProcessorCoreCountRecordType         = 25,
+  ProcessorEnabledCoreCountRecordType  = 26,
+  ProcessorThreadCountRecordType       = 27,
+  ProcessorCharacteristicsRecordType   = 28,
+  ProcessorFamily2RecordType           = 29,
+  ProcessorPartNumberRecordType        = 30,
+} EFI_CPU_VARIABLE_RECORD_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In ProcSubclass specification 0.9, the union type data structure is NOT defined.
+/// It's implementation-specific to simplify the code logic.
+///
+typedef union {
+  EFI_PROCESSOR_CORE_FREQUENCY_LIST_DATA  ProcessorCoreFrequencyList;
+  EFI_PROCESSOR_FSB_FREQUENCY_LIST_DATA   ProcessorFsbFrequencyList;
+  EFI_PROCESSOR_SERIAL_NUMBER_DATA        ProcessorSerialNumber;
+  EFI_PROCESSOR_CORE_FREQUENCY_DATA       ProcessorCoreFrequency;
+  EFI_PROCESSOR_FSB_FREQUENCY_DATA        ProcessorFsbFrequency;
+  EFI_PROCESSOR_MAX_CORE_FREQUENCY_DATA   ProcessorMaxCoreFrequency;
+  EFI_PROCESSOR_MAX_FSB_FREQUENCY_DATA    ProcessorMaxFsbFrequency;
+  EFI_PROCESSOR_VERSION_DATA              ProcessorVersion;
+  EFI_PROCESSOR_MANUFACTURER_DATA         ProcessorManufacturer;
+  EFI_PROCESSOR_ID_DATA                   ProcessorId;
+  EFI_PROCESSOR_TYPE_DATA                 ProcessorType;
+  EFI_PROCESSOR_FAMILY_DATA               ProcessorFamily;
+  EFI_PROCESSOR_VOLTAGE_DATA              ProcessorVoltage;
+  EFI_PROCESSOR_APIC_BASE_ADDRESS_DATA    ProcessorApicBase;
+  EFI_PROCESSOR_APIC_ID_DATA              ProcessorApicId;
+  EFI_PROCESSOR_APIC_VERSION_NUMBER_DATA  ProcessorApicVersionNumber;
+  EFI_PROCESSOR_MICROCODE_REVISION_DATA   CpuUcodeRevisionData;
+  EFI_PROCESSOR_STATUS_DATA               ProcessorStatus;
+  EFI_PROCESSOR_SOCKET_TYPE_DATA          ProcessorSocketType;
+  EFI_PROCESSOR_SOCKET_NAME_DATA          ProcessorSocketName;
+  EFI_PROCESSOR_ASSET_TAG_DATA            ProcessorAssetTag;
+  EFI_PROCESSOR_PART_NUMBER_DATA          ProcessorPartNumber;
+  EFI_PROCESSOR_HEALTH_STATUS             ProcessorHealthStatus;
+  EFI_PROCESSOR_PACKAGE_NUMBER_DATA       ProcessorPackageNumber;
+  EFI_PROCESSOR_CORE_COUNT_DATA           ProcessorCoreCount;
+  EFI_PROCESSOR_ENABLED_CORE_COUNT_DATA   ProcessorEnabledCoreCount;
+  EFI_PROCESSOR_THREAD_COUNT_DATA         ProcessorThreadCount;
+  EFI_PROCESSOR_CHARACTERISTICS_DATA      ProcessorCharacteristics;
+  EFI_PROCESSOR_FAMILY2_DATA              ProcessorFamily2;
+} EFI_CPU_VARIABLE_RECORD;
+
+typedef struct {
+  EFI_SUBCLASS_TYPE1_HEADER         DataRecordHeader;
+  EFI_CPU_VARIABLE_RECORD           VariableRecord;
+} EFI_CPU_DATA_RECORD;
+
+#define EFI_CACHE_SUBCLASS_VERSION    0x00010000
+
+typedef EFI_EXP_BASE2_DATA          EFI_CACHE_SIZE_DATA;
+///
+/// Inconsistent with specification here:
+/// In CacheSubclass specification 0.9, the naming is EFI_CACHE_MAXIMUM_SIZE_DATA.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef EFI_EXP_BASE2_DATA          EFI_MAXIMUM_CACHE_SIZE_DATA;
+typedef EFI_EXP_BASE10_DATA         EFI_CACHE_SPEED_DATA;
+typedef STRING_REF                  EFI_CACHE_SOCKET_DATA;
+
+typedef struct {
+  UINT32                            Other         :1;
+  UINT32                            Unknown       :1;
+  UINT32                            NonBurst      :1;
+  UINT32                            Burst         :1;
+  UINT32                            PipelineBurst :1;
+  ///
+  /// Inconsistent between CacheSubclass 0.9 and SMBIOS specifications here:
+  /// In CacheSubclass specification 0.9, the sequence of Asynchronous and Synchronous fileds
+  /// are opposite to SMBIOS specification.
+  ///
+  UINT32                            Asynchronous  :1;
+  UINT32                            Synchronous   :1;
+  UINT32                            Reserved      :25;
+} EFI_CACHE_SRAM_TYPE_DATA;
+
+typedef EFI_CACHE_SRAM_TYPE_DATA    EFI_CACHE_SRAM_INSTALL_DATA;
+
+typedef enum {
+  EfiCacheErrorOther     = 1,
+  EfiCacheErrorUnknown   = 2,
+  EfiCacheErrorNone      = 3,
+  EfiCacheErrorParity    = 4,
+  EfiCacheErrorSingleBit = 5,
+  EfiCacheErrorMultiBit  = 6
+} EFI_CACHE_ERROR_TYPE_DATA;
+
+typedef enum {
+  EfiCacheTypeOther       = 1,
+  EfiCacheTypeUnknown     = 2,
+  EfiCacheTypeInstruction = 3,
+  EfiCacheTypeData        = 4,
+  EfiCacheTypeUnified     = 5
+} EFI_CACHE_TYPE_DATA;
+
+typedef enum {
+  EfiCacheAssociativityOther        = 1,
+  EfiCacheAssociativityUnknown      = 2,
+  EfiCacheAssociativityDirectMapped = 3,
+  EfiCacheAssociativity2Way         = 4,
+  EfiCacheAssociativity4Way         = 5,
+  EfiCacheAssociativityFully        = 6,
+  EfiCacheAssociativity8Way         = 7,
+  EfiCacheAssociativity16Way        = 8
+} EFI_CACHE_ASSOCIATIVITY_DATA;
+
+///
+/// Inconsistent with specification here:
+/// In CacheSubclass 0.9 specification. It defines the field type as UINT16.
+/// In fact, it should be UINT32 type because it refers to a 32bit width data.
+///
+typedef struct {
+  UINT32                            Level           :3;
+  UINT32                            Socketed        :1;
+  UINT32                            Reserved2       :1;
+  UINT32                            Location        :2;
+  UINT32                            Enable          :1;
+  UINT32                            OperationalMode :2;
+  UINT32                            Reserved1       :22;
+} EFI_CACHE_CONFIGURATION_DATA;
+
+#define EFI_CACHE_L1            1
+#define EFI_CACHE_L2            2
+#define EFI_CACHE_L3            3
+#define EFI_CACHE_L4            4
+#define EFI_CACHE_LMAX          EFI_CACHE_L4
+
+#define EFI_CACHE_SOCKETED      1
+#define EFI_CACHE_NOT_SOCKETED  0
+
+typedef enum {
+  EfiCacheInternal = 0,
+  EfiCacheExternal = 1,
+  EfiCacheReserved = 2,
+  EfiCacheUnknown  = 3
+} EFI_CACHE_LOCATION;
+
+#define EFI_CACHE_ENABLED       1
+#define EFI_CACHE_DISABLED      0
+
+typedef enum {
+  EfiCacheWriteThrough = 0,
+  EfiCacheWriteBack    = 1,
+  EfiCacheDynamicMode  = 2,
+  EfiCacheUnknownMode  = 3
+} EFI_CACHE_OPERATIONAL_MODE;
+
+
+///
+/// Inconsistent with specification here:
+/// In CacheSubclass specification 0.9, the enumeration type data structure is NOT defined.
+/// The equivalent in specification is
+///      #define EFI_CACHE_SIZE_RECORD_NUMBER                    0x00000001
+///      #define EFI_CACHE_MAXIMUM_SIZE_RECORD_NUMBER            0x00000002
+///      #define EFI_CACHE_SPEED_RECORD_NUMBER                   0x00000003
+///      #define EFI_CACHE_SOCKET_RECORD_NUMBER                  0x00000004
+///      #define EFI_CACHE_SRAM_SUPPORT_RECORD_NUMBER            0x00000005
+///      #define EFI_CACHE_SRAM_INSTALL_RECORD_NUMBER            0x00000006
+///      #define EFI_CACHE_ERROR_SUPPORT_RECORD_NUMBER           0x00000007
+///      #define EFI_CACHE_TYPE_RECORD_NUMBER                    0x00000008
+///      #define EFI_CACHE_ASSOCIATIVITY_RECORD_NUMBER           0x00000009
+///      #define EFI_CACHE_CONFIGURATION_RECORD_NUMBER           0x0000000A
+/// Keep the definition unchanged for backward compatibility.
+///
+typedef enum {
+  CacheSizeRecordType              = 1,
+  MaximumSizeCacheRecordType       = 2,
+  CacheSpeedRecordType             = 3,
+  CacheSocketRecordType            = 4,
+  CacheSramTypeRecordType          = 5,
+  CacheInstalledSramTypeRecordType = 6,
+  CacheErrorTypeRecordType         = 7,
+  CacheTypeRecordType              = 8,
+  CacheAssociativityRecordType     = 9,
+  CacheConfigRecordType            = 10
+} EFI_CACHE_VARIABLE_RECORD_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In CacheSubclass specification 0.9, the union type data structure is NOT defined.
+/// It's implementation-specific to simplify the code logic.
+///
+typedef union {
+  EFI_CACHE_SIZE_DATA                         CacheSize;
+  EFI_MAXIMUM_CACHE_SIZE_DATA                 MaximumCacheSize;
+  EFI_CACHE_SPEED_DATA                        CacheSpeed;
+  EFI_CACHE_SOCKET_DATA                       CacheSocket;
+  EFI_CACHE_SRAM_TYPE_DATA                    CacheSramType;
+  EFI_CACHE_SRAM_TYPE_DATA                    CacheInstalledSramType;
+  EFI_CACHE_ERROR_TYPE_DATA                   CacheErrorType;
+  EFI_CACHE_TYPE_DATA                         CacheType;
+  EFI_CACHE_ASSOCIATIVITY_DATA                CacheAssociativity;
+  EFI_CACHE_CONFIGURATION_DATA                CacheConfig;
+  EFI_CACHE_ASSOCIATION_DATA                  CacheAssociation;
+} EFI_CACHE_VARIABLE_RECORD;
+
+typedef struct {
+   EFI_SUBCLASS_TYPE1_HEADER        DataRecordHeader;
+   EFI_CACHE_VARIABLE_RECORD        VariableRecord;
+} EFI_CACHE_DATA_RECORD;
+
+#define EFI_MEMORY_SUBCLASS_VERSION     0x0100
+#define EFI_MEMORY_SIZE_RECORD_NUMBER   0x00000001
+
+typedef enum _EFI_MEMORY_REGION_TYPE {
+  EfiMemoryRegionMemory             = 0x01,
+  EfiMemoryRegionReserved           = 0x02,
+  EfiMemoryRegionAcpi               = 0x03,
+  EfiMemoryRegionNvs                = 0x04
+} EFI_MEMORY_REGION_TYPE;
+
+///
+/// This data record refers to the size of a memory region. The regions that are
+/// described can refer to physical memory, memory-mapped I/O, or reserved BIOS memory regions.
+/// The unit of measurement of this data record is in bytes.
+///
+typedef struct {
+  ///
+  /// A zero-based value that indicates which processor(s) can access the memory region.
+  /// A value of 0xFFFF indicates the region is accessible by all processors.
+  ///
+  UINT32                            ProcessorNumber;
+  ///
+  /// A zero-based value that indicates the starting bus that can access the memory region.
+  ///
+  UINT16                            StartBusNumber;
+  ///
+  /// A zero-based value that indicates the ending bus that can access the memory region.
+  /// A value of 0xFF for a PCI system indicates the region is accessible by all buses and
+  /// is global in scope. An example of the EndBusNumber not being 0xFF is a system
+  /// with two or more peer-to-host PCI bridges.
+  ///
+  UINT16                            EndBusNumber;
+  ///
+  /// The type of memory region from the operating system's point of view.
+  /// MemoryRegionType values are equivalent to the legacy INT 15 AX = E820 BIOS
+  /// command values.
+  ///
+  EFI_MEMORY_REGION_TYPE            MemoryRegionType;
+  ///
+  /// The size of the memory region in bytes.
+  ///
+  EFI_EXP_BASE2_DATA                MemorySize;
+  ///
+  /// The starting physical address of the memory region.
+  ///
+  EFI_PHYSICAL_ADDRESS              MemoryStartAddress;
+} EFI_MEMORY_SIZE_DATA;
+
+
+#define EFI_MEMORY_ARRAY_LOCATION_RECORD_NUMBER    0x00000002
+
+typedef enum _EFI_MEMORY_ARRAY_LOCATION {
+  EfiMemoryArrayLocationOther                 = 0x01,
+  EfiMemoryArrayLocationUnknown               = 0x02,
+  EfiMemoryArrayLocationSystemBoard           = 0x03,
+  EfiMemoryArrayLocationIsaAddonCard          = 0x04,
+  EfiMemoryArrayLocationEisaAddonCard         = 0x05,
+  EfiMemoryArrayLocationPciAddonCard          = 0x06,
+  EfiMemoryArrayLocationMcaAddonCard          = 0x07,
+  EfiMemoryArrayLocationPcmciaAddonCard       = 0x08,
+  EfiMemoryArrayLocationProprietaryAddonCard  = 0x09,
+  EfiMemoryArrayLocationNuBus                 = 0x0A,
+  EfiMemoryArrayLocationPc98C20AddonCard      = 0xA0,
+  EfiMemoryArrayLocationPc98C24AddonCard      = 0xA1,
+  EfiMemoryArrayLocationPc98EAddonCard        = 0xA2,
+  EfiMemoryArrayLocationPc98LocalBusAddonCard = 0xA3
+} EFI_MEMORY_ARRAY_LOCATION;
+
+typedef enum _EFI_MEMORY_ARRAY_USE {
+  EfiMemoryArrayUseOther                      = 0x01,
+  EfiMemoryArrayUseUnknown                    = 0x02,
+  EfiMemoryArrayUseSystemMemory               = 0x03,
+  EfiMemoryArrayUseVideoMemory                = 0x04,
+  EfiMemoryArrayUseFlashMemory                = 0x05,
+  EfiMemoryArrayUseNonVolatileRam             = 0x06,
+  EfiMemoryArrayUseCacheMemory                = 0x07
+} EFI_MEMORY_ARRAY_USE;
+
+typedef enum _EFI_MEMORY_ERROR_CORRECTION {
+  EfiMemoryErrorCorrectionOther               = 0x01,
+  EfiMemoryErrorCorrectionUnknown             = 0x02,
+  EfiMemoryErrorCorrectionNone                = 0x03,
+  EfiMemoryErrorCorrectionParity              = 0x04,
+  EfiMemoryErrorCorrectionSingleBitEcc        = 0x05,
+  EfiMemoryErrorCorrectionMultiBitEcc         = 0x06,
+  EfiMemoryErrorCorrectionCrc                 = 0x07
+} EFI_MEMORY_ERROR_CORRECTION;
+
+///
+/// This data record refers to the physical memory array. This data record is a structure.
+/// The type definition structure for EFI_MEMORY_ARRAY_LOCATION_DATA is in SMBIOS 2.3.4:
+/// - Table 3.3.17.1, Type 16, Offset 0x4
+/// - Table 3.3.17.2, Type 16, Offset 0x5
+/// - Table 3.3.17.3, Type 16, with the following offsets:
+///     -- Offset 0x6
+///     -- Offset 0x7
+///     -- Offset 0xB
+///     -- Offset 0xD
+///
+typedef struct {
+  ///
+  /// The physical location of the memory array.
+  ///
+  EFI_MEMORY_ARRAY_LOCATION         MemoryArrayLocation;
+  ///
+  /// The memory array usage.
+  ///
+  EFI_MEMORY_ARRAY_USE              MemoryArrayUse;
+  ///
+  /// The primary error correction or detection supported by this memory array.
+  ///
+  EFI_MEMORY_ERROR_CORRECTION       MemoryErrorCorrection;
+  ///
+  /// The maximum memory capacity size in kilobytes. If capacity is unknown, then
+  /// values of MaximumMemoryCapacity.Value = 0x00 and
+  /// MaximumMemoryCapacity.Exponent = 0x8000 are used.
+  ///
+  EFI_EXP_BASE2_DATA                MaximumMemoryCapacity;
+  ///
+  /// The number of memory slots or sockets that are available for memory devices
+  /// in this array.
+  ///
+  UINT16                            NumberMemoryDevices;
+} EFI_MEMORY_ARRAY_LOCATION_DATA;
+
+
+#define EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER    0x00000003
+
+typedef enum _EFI_MEMORY_FORM_FACTOR {
+  EfiMemoryFormFactorOther                    = 0x01,
+  EfiMemoryFormFactorUnknown                  = 0x02,
+  EfiMemoryFormFactorSimm                     = 0x03,
+  EfiMemoryFormFactorSip                      = 0x04,
+  EfiMemoryFormFactorChip                     = 0x05,
+  EfiMemoryFormFactorDip                      = 0x06,
+  EfiMemoryFormFactorZip                      = 0x07,
+  EfiMemoryFormFactorProprietaryCard          = 0x08,
+  EfiMemoryFormFactorDimm                     = 0x09,
+  EfiMemoryFormFactorTsop                     = 0x0A,
+  EfiMemoryFormFactorRowOfChips               = 0x0B,
+  EfiMemoryFormFactorRimm                     = 0x0C,
+  EfiMemoryFormFactorSodimm                   = 0x0D,
+  EfiMemoryFormFactorSrimm                    = 0x0E,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiMemoryFormFactorFbDimm                   = 0x0F
+} EFI_MEMORY_FORM_FACTOR;
+
+typedef enum _EFI_MEMORY_ARRAY_TYPE {
+  EfiMemoryTypeOther                          = 0x01,
+  EfiMemoryTypeUnknown                        = 0x02,
+  EfiMemoryTypeDram                           = 0x03,
+  EfiMemoryTypeEdram                          = 0x04,
+  EfiMemoryTypeVram                           = 0x05,
+  EfiMemoryTypeSram                           = 0x06,
+  EfiMemoryTypeRam                            = 0x07,
+  EfiMemoryTypeRom                            = 0x08,
+  EfiMemoryTypeFlash                          = 0x09,
+  EfiMemoryTypeEeprom                         = 0x0A,
+  EfiMemoryTypeFeprom                         = 0x0B,
+  EfiMemoryTypeEprom                          = 0x0C,
+  EfiMemoryTypeCdram                          = 0x0D,
+  EfiMemoryType3Dram                          = 0x0E,
+  EfiMemoryTypeSdram                          = 0x0F,
+  EfiMemoryTypeSgram                          = 0x10,
+  EfiMemoryTypeRdram                          = 0x11,
+  EfiMemoryTypeDdr                            = 0x12,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiMemoryTypeDdr2                           = 0x13,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiMemoryTypeDdr2FbDimm                     = 0x14
+} EFI_MEMORY_ARRAY_TYPE;
+
+typedef struct {
+  UINT32                            Reserved        :1;
+  UINT32                            Other           :1;
+  UINT32                            Unknown         :1;
+  UINT32                            FastPaged       :1;
+  UINT32                            StaticColumn    :1;
+  UINT32                            PseudoStatic    :1;
+  UINT32                            Rambus          :1;
+  UINT32                            Synchronous     :1;
+  UINT32                            Cmos            :1;
+  UINT32                            Edo             :1;
+  UINT32                            WindowDram      :1;
+  UINT32                            CacheDram       :1;
+  UINT32                            Nonvolatile     :1;
+  UINT32                            Reserved1       :19;
+} EFI_MEMORY_TYPE_DETAIL;
+
+typedef enum {
+  EfiMemoryStateEnabled      = 0,
+  EfiMemoryStateUnknown      = 1,
+  EfiMemoryStateUnsupported  = 2,
+  EfiMemoryStateError        = 3,
+  EfiMemoryStateAbsent       = 4,
+  EfiMemoryStateDisabled     = 5,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiMemoryStatePartial      = 6
+} EFI_MEMORY_STATE;
+
+///
+/// This data record describes a memory device. This data record is a structure.
+/// The type definition structure for EFI_MEMORY_ARRAY_LINK_DATA is in SMBIOS 2.3.4.
+///
+typedef struct {
+  ///
+  /// A string that identifies the physically labeled socket or board position where the
+  /// memory device is located.
+  ///
+  STRING_REF                        MemoryDeviceLocator;
+  ///
+  /// A string denoting the physically labeled bank where the memory device is located.
+  ///
+  STRING_REF                        MemoryBankLocator;
+  ///
+  /// A string denoting the memory manufacturer.
+  ///
+  STRING_REF                        MemoryManufacturer;
+  ///
+  /// A string denoting the serial number of the memory device.
+  ///
+  STRING_REF                        MemorySerialNumber;
+  ///
+  /// The asset tag of the memory device.
+  ///
+  STRING_REF                        MemoryAssetTag;
+  ///
+  /// A string denoting the part number of the memory device.
+  ///
+  STRING_REF                        MemoryPartNumber;
+  ///
+  /// A link to a memory array structure set.
+  ///
+  EFI_INTER_LINK_DATA               MemoryArrayLink;
+  ///
+  /// A link to a memory array structure set.
+  ///
+  EFI_INTER_LINK_DATA               MemorySubArrayLink;
+  ///
+  /// The total width in bits of this memory device. If there are no error correcting bits,
+  /// then the total width equals the data width. If the width is unknown, then set the field
+  /// to 0xFFFF.
+  ///
+  UINT16                            MemoryTotalWidth;
+  ///
+  /// The data width in bits of the memory device. A data width of 0x00 and a total width
+  /// of 0x08 indicate that the device is used solely for error correction.
+  ///
+  UINT16                            MemoryDataWidth;
+  ///
+  /// The size in bytes of the memory device. A value of 0x00 denotes that no device is
+  /// installed, while a value of all Fs denotes that the size is not known.
+  ///
+  EFI_EXP_BASE2_DATA                MemoryDeviceSize;
+  ///
+  /// The form factor of the memory device.
+  ///
+  EFI_MEMORY_FORM_FACTOR            MemoryFormFactor;
+  ///
+  /// A memory device set that must be populated with all devices of the same type and
+  /// size. A value of 0x00 indicates that the device is not part of any set. A value of 0xFF
+  /// indicates that the attribute is unknown. Any other value denotes the set number.
+  ///
+  UINT8                             MemoryDeviceSet;
+  ///
+  /// The memory type in the socket.
+  ///
+  EFI_MEMORY_ARRAY_TYPE             MemoryType;
+  ///
+  /// The memory type details.
+  ///
+  EFI_MEMORY_TYPE_DETAIL            MemoryTypeDetail;
+  ///
+  /// The memory speed in megahertz (MHz). A value of 0x00 denotes that
+  /// the speed is unknown.
+  /// Inconsistent with specification here:
+  /// In MemSubclass specification 0.9, the naming is MemoryTypeSpeed.
+  /// Keep it unchanged for backward compatibilty.
+  ///
+  EFI_EXP_BASE10_DATA               MemorySpeed;
+  ///
+  /// The memory state.
+  ///
+  EFI_MEMORY_STATE                  MemoryState;
+} EFI_MEMORY_ARRAY_LINK_DATA;
+
+
+#define EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER    0x00000004
+
+///
+/// This data record refers to a specified physical memory array associated with
+/// a given memory range.
+///
+typedef struct {
+  ///
+  /// The starting physical address in bytes of memory mapped to a specified physical
+  /// memory array.
+  ///
+  EFI_PHYSICAL_ADDRESS              MemoryArrayStartAddress;
+  ///
+  /// The last physical address in bytes of memory mapped to a specified physical memory
+  /// array.
+  ///
+  EFI_PHYSICAL_ADDRESS              MemoryArrayEndAddress;
+  ///
+  /// See Physical Memory Array (Type 16) for physical memory array structures.
+  ///
+  EFI_INTER_LINK_DATA               PhysicalMemoryArrayLink;
+  ///
+  /// The number of memory devices that form a single row of memory for the address
+  /// partition.
+  ///
+  UINT16                            MemoryArrayPartitionWidth;
+} EFI_MEMORY_ARRAY_START_ADDRESS_DATA;
+
+
+#define EFI_MEMORY_DEVICE_START_ADDRESS_RECORD_NUMBER    0x00000005
+
+///
+/// This data record refers to a physical memory device that is associated with
+/// a given memory range.
+///
+typedef struct {
+  ///
+  /// The starting physical address that is associated with the device.
+  ///
+  EFI_PHYSICAL_ADDRESS              MemoryDeviceStartAddress;
+  ///
+  /// The ending physical address that is associated with the device.
+  ///
+  EFI_PHYSICAL_ADDRESS              MemoryDeviceEndAddress;
+  ///
+  /// A link to the memory device data structure.
+  ///
+  EFI_INTER_LINK_DATA               PhysicalMemoryDeviceLink;
+  ///
+  /// A link to the memory array data structure.
+  ///
+  EFI_INTER_LINK_DATA               PhysicalMemoryArrayLink;
+  ///
+  /// The position of the memory device in a row. A value of 0x00 is reserved and a value
+  /// of 0xFF indicates that the position is unknown.
+  ///
+  UINT8                             MemoryDevicePartitionRowPosition;
+  ///
+  /// The position of the device in an interleave.
+  ///
+  UINT8                             MemoryDeviceInterleavePosition;
+  ///
+  /// The maximum number of consecutive rows from the device that are accessed in a
+  /// single interleave transfer. A value of 0x00 indicates that the device is not interleaved
+  /// and a value of 0xFF indicates that the interleave configuration is unknown.
+  ///
+  UINT8                             MemoryDeviceInterleaveDataDepth;
+} EFI_MEMORY_DEVICE_START_ADDRESS_DATA;
+
+
+//
+//  Memory. Channel Device Type -  SMBIOS Type 37
+//
+
+#define EFI_MEMORY_CHANNEL_TYPE_RECORD_NUMBER    0x00000006
+
+typedef enum _EFI_MEMORY_CHANNEL_TYPE {
+  EfiMemoryChannelTypeOther                   = 1,
+  EfiMemoryChannelTypeUnknown                 = 2,
+  EfiMemoryChannelTypeRambus                  = 3,
+  EfiMemoryChannelTypeSyncLink                = 4
+} EFI_MEMORY_CHANNEL_TYPE;
+
+///
+/// This data record refers the type of memory that is associated with the channel. This data record is a
+/// structure.
+/// The type definition structure for EFI_MEMORY_CHANNEL_TYPE_DATA is in SMBIOS 2.3.4,
+/// Table 3.3.38, Type 37, with the following offsets:
+///   - Offset 0x4
+///   - Offset 0x5
+///   - Offset 0x6
+///
+typedef struct {
+  ///
+  /// The type of memory that is associated with the channel.
+  ///
+  EFI_MEMORY_CHANNEL_TYPE           MemoryChannelType;
+  ///
+  /// The maximum load that is supported by the channel.
+  ///
+  UINT8                             MemoryChannelMaximumLoad;
+  ///
+  /// The number of memory devices on this channel.
+  ///
+  UINT8                             MemoryChannelDeviceCount;
+} EFI_MEMORY_CHANNEL_TYPE_DATA;
+
+#define EFI_MEMORY_CHANNEL_DEVICE_RECORD_NUMBER    0x00000007
+
+///
+/// This data record refers to the memory device that is associated with the memory channel. This data
+/// record is a structure.
+/// The type definition structure for EFI_MEMORY_CHANNEL_DEVICE_DATA is in SMBIOS 2.3.4,
+/// Table 3.3.38, Type 37, with the following offsets:
+///   - Offset 0x7
+///   - Offset 0x8
+///
+typedef struct {
+  ///
+  /// A number between one and MemoryChannelDeviceCount plus an arbitrary base.
+  ///
+  UINT8                             DeviceId;
+  ///
+  /// The Link of the associated memory device. See Memory Device (Type 17) for
+  /// memory devices.
+  ///
+  EFI_INTER_LINK_DATA               DeviceLink;
+  ///
+  /// The number of load units that this device consumes.
+  ///
+  UINT8                             MemoryChannelDeviceLoad;
+} EFI_MEMORY_CHANNEL_DEVICE_DATA;
+
+//
+//  Memory. Controller Information - SMBIOS Type 5
+//
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+#define EFI_MEMORY_CONTROLLER_INFORMATION_RECORD_NUMBER    0x00000008
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef enum {
+  EfiErrorDetectingMethodOther   = 1,
+  EfiErrorDetectingMethodUnknown = 2,
+  EfiErrorDetectingMethodNone    = 3,
+  EfiErrorDetectingMethodParity  = 4,
+  EfiErrorDetectingMethod32Ecc   = 5,
+  EfiErrorDetectingMethod64Ecc   = 6,
+  EfiErrorDetectingMethod128Ecc  = 7,
+  EfiErrorDetectingMethodCrc     = 8
+} EFI_MEMORY_ERROR_DETECT_METHOD_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  UINT8                             Other                 :1;
+  UINT8                             Unknown               :1;
+  UINT8                             None                  :1;
+  UINT8                             SingleBitErrorCorrect :1;
+  UINT8                             DoubleBitErrorCorrect :1;
+  UINT8                             ErrorScrubbing        :1;
+  UINT8                             Reserved              :2;
+} EFI_MEMORY_ERROR_CORRECT_CAPABILITY;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef enum {
+  EfiMemoryInterleaveOther      = 1,
+  EfiMemoryInterleaveUnknown    = 2,
+  EfiMemoryInterleaveOneWay     = 3,
+  EfiMemoryInterleaveTwoWay     = 4,
+  EfiMemoryInterleaveFourWay    = 5,
+  EfiMemoryInterleaveEightWay   = 6,
+  EfiMemoryInterleaveSixteenWay = 7
+} EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  UINT16                            Other    :1;
+  UINT16                            Unknown  :1;
+  UINT16                            SeventyNs:1;
+  UINT16                            SixtyNs  :1;
+  UINT16                            FiftyNs  :1;
+  UINT16                            Reserved :11;
+} EFI_MEMORY_SPEED_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  UINT16                            Other       :1;
+  UINT16                            Unknown     :1;
+  UINT16                            Standard    :1;
+  UINT16                            FastPageMode:1;
+  UINT16                            EDO         :1;
+  UINT16                            Parity      :1;
+  UINT16                            ECC         :1;
+  UINT16                            SIMM        :1;
+  UINT16                            DIMM        :1;
+  UINT16                            BurstEdo    :1;
+  UINT16                            SDRAM       :1;
+  UINT16                            Reserved    :5;
+} EFI_MEMORY_SUPPORTED_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  UINT8                             Five    :1;
+  UINT8                             Three   :1;
+  UINT8                             Two     :1;
+  UINT8                             Reserved:5;
+} EFI_MEMORY_MODULE_VOLTAGE_TYPE;
+
+///
+/// EFI_MEMORY_CONTROLLER_INFORMATION is obsolete
+/// Use EFI_MEMORY_CONTROLLER_INFORMATION_DATA instead
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  EFI_MEMORY_ERROR_DETECT_METHOD_TYPE ErrorDetectingMethod;
+  EFI_MEMORY_ERROR_CORRECT_CAPABILITY ErrorCorrectingCapability;
+  EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE  MemorySupportedInterleave;
+  EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE  MemoryCurrentInterleave;
+  UINT8                               MaxMemoryModuleSize;
+  EFI_MEMORY_SPEED_TYPE               MemorySpeedType;
+  EFI_MEMORY_SUPPORTED_TYPE           MemorySupportedType;
+  EFI_MEMORY_MODULE_VOLTAGE_TYPE      MemoryModuleVoltage;
+  UINT8                               NumberofMemorySlot;
+  EFI_MEMORY_ERROR_CORRECT_CAPABILITY EnabledCorrectingCapability;
+  UINT16                              *MemoryModuleConfigHandles;
+} EFI_MEMORY_CONTROLLER_INFORMATION;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  EFI_MEMORY_ERROR_DETECT_METHOD_TYPE   ErrorDetectingMethod;
+  EFI_MEMORY_ERROR_CORRECT_CAPABILITY   ErrorCorrectingCapability;
+  EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE    MemorySupportedInterleave;
+  EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE    MemoryCurrentInterleave;
+  UINT8                                 MaxMemoryModuleSize;
+  EFI_MEMORY_SPEED_TYPE                 MemorySpeedType;
+  EFI_MEMORY_SUPPORTED_TYPE             MemorySupportedType;
+  EFI_MEMORY_MODULE_VOLTAGE_TYPE        MemoryModuleVoltage;
+  UINT8                                 NumberofMemorySlot;
+  EFI_MEMORY_ERROR_CORRECT_CAPABILITY   EnabledCorrectingCapability;
+  EFI_INTER_LINK_DATA                   MemoryModuleConfig[1];
+} EFI_MEMORY_CONTROLLER_INFORMATION_DATA;
+
+///
+/// Memory. Error Information - SMBIOS Type 18
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 18.
+///
+#define EFI_MEMORY_32BIT_ERROR_INFORMATION_RECORD_NUMBER    0x00000009
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 18.
+///
+typedef enum {
+  EfiMemoryErrorOther             = 1,
+  EfiMemoryErrorUnknown           = 2,
+  EfiMemoryErrorOk                = 3,
+  EfiMemoryErrorBadRead           = 4,
+  EfiMemoryErrorParity            = 5,
+  EfiMemoryErrorSigleBit          = 6,
+  EfiMemoryErrorDoubleBit         = 7,
+  EfiMemoryErrorMultiBit          = 8,
+  EfiMemoryErrorNibble            = 9,
+  EfiMemoryErrorChecksum          = 10,
+  EfiMemoryErrorCrc               = 11,
+  EfiMemoryErrorCorrectSingleBit  = 12,
+  EfiMemoryErrorCorrected         = 13,
+  EfiMemoryErrorUnCorrectable     = 14
+} EFI_MEMORY_ERROR_TYPE;
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 18.
+///
+typedef enum {
+  EfiMemoryGranularityOther               = 1,
+  EfiMemoryGranularityOtherUnknown        = 2,
+  EfiMemoryGranularityDeviceLevel         = 3,
+  EfiMemoryGranularityMemPartitionLevel   = 4
+} EFI_MEMORY_ERROR_GRANULARITY_TYPE;
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 18.
+///
+typedef enum {
+  EfiMemoryErrorOperationOther            = 1,
+  EfiMemoryErrorOperationUnknown          = 2,
+  EfiMemoryErrorOperationRead             = 3,
+  EfiMemoryErrorOperationWrite            = 4,
+  EfiMemoryErrorOperationPartialWrite     = 5
+} EFI_MEMORY_ERROR_OPERATION_TYPE;
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 18.
+///
+typedef struct {
+  EFI_MEMORY_ERROR_TYPE               MemoryErrorType;
+  EFI_MEMORY_ERROR_GRANULARITY_TYPE   MemoryErrorGranularity;
+  EFI_MEMORY_ERROR_OPERATION_TYPE     MemoryErrorOperation;
+  UINT32                              VendorSyndrome;
+  UINT32                              MemoryArrayErrorAddress;
+  UINT32                              DeviceErrorAddress;
+  UINT32                              DeviceErrorResolution;
+} EFI_MEMORY_32BIT_ERROR_INFORMATION;
+
+///
+/// Memory. Error Information - SMBIOS Type 33.
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 33.
+///
+#define EFI_MEMORY_64BIT_ERROR_INFORMATION_RECORD_NUMBER    0x0000000A
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 33.
+///
+typedef struct {
+  EFI_MEMORY_ERROR_TYPE             MemoryErrorType;
+  EFI_MEMORY_ERROR_GRANULARITY_TYPE MemoryErrorGranularity;
+  EFI_MEMORY_ERROR_OPERATION_TYPE   MemoryErrorOperation;
+  UINT32                            VendorSyndrome;
+  UINT64                            MemoryArrayErrorAddress;
+  UINT64                            DeviceErrorAddress;
+  UINT32                            DeviceErrorResolution;
+} EFI_MEMORY_64BIT_ERROR_INFORMATION;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It is implementation-specific to simplify the code logic.
+///
+typedef union _EFI_MEMORY_SUBCLASS_RECORDS {
+  EFI_MEMORY_SIZE_DATA                 SizeData;
+  EFI_MEMORY_ARRAY_LOCATION_DATA       ArrayLocationData;
+  EFI_MEMORY_ARRAY_LINK_DATA           ArrayLink;
+  EFI_MEMORY_ARRAY_START_ADDRESS_DATA  ArrayStartAddress;
+  EFI_MEMORY_DEVICE_START_ADDRESS_DATA DeviceStartAddress;
+  EFI_MEMORY_CHANNEL_TYPE_DATA         ChannelTypeData;
+  EFI_MEMORY_CHANNEL_DEVICE_DATA       ChannelDeviceData;
+  EFI_MEMORY_CONTROLLER_INFORMATION    MemoryControllerInfo;
+  EFI_MEMORY_32BIT_ERROR_INFORMATION   Memory32bitErrorInfo;
+  EFI_MEMORY_64BIT_ERROR_INFORMATION   Memory64bitErrorInfo;
+} EFI_MEMORY_SUBCLASS_RECORDS;
+
+typedef struct {
+  EFI_SUBCLASS_TYPE1_HEADER         Header;
+  EFI_MEMORY_SUBCLASS_RECORDS       Record;
+} EFI_MEMORY_SUBCLASS_DRIVER_DATA;
+
+#define EFI_MISC_SUBCLASS_VERSION     0x0100
+
+#pragma pack(1)
+
+//
+// Last PCI Bus Number
+//
+#define EFI_MISC_LAST_PCI_BUS_RECORD_NUMBER    0x00000001
+
+typedef struct {
+  UINT8                             LastPciBus;
+} EFI_MISC_LAST_PCI_BUS_DATA;
+
+//
+// Misc. BIOS Vendor - SMBIOS Type 0
+//
+#define EFI_MISC_BIOS_VENDOR_RECORD_NUMBER    0x00000002
+
+typedef struct {
+  UINT64                            Reserved1                         :2;
+  UINT64                            Unknown                           :1;
+  UINT64                            BiosCharacteristicsNotSupported   :1;
+  UINT64                            IsaIsSupported                    :1;
+  UINT64                            McaIsSupported                    :1;
+  UINT64                            EisaIsSupported                   :1;
+  UINT64                            PciIsSupported                    :1;
+  UINT64                            PcmciaIsSupported                 :1;
+  UINT64                            PlugAndPlayIsSupported            :1;
+  UINT64                            ApmIsSupported                    :1;
+  UINT64                            BiosIsUpgradable                  :1;
+  UINT64                            BiosShadowingAllowed              :1;
+  UINT64                            VlVesaIsSupported                 :1;
+  UINT64                            EscdSupportIsAvailable            :1;
+  UINT64                            BootFromCdIsSupported             :1;
+  UINT64                            SelectableBootIsSupported         :1;
+  UINT64                            RomBiosIsSocketed                 :1;
+  UINT64                            BootFromPcmciaIsSupported         :1;
+  UINT64                            EDDSpecificationIsSupported       :1;
+  UINT64                            JapaneseNecFloppyIsSupported      :1;
+  UINT64                            JapaneseToshibaFloppyIsSupported  :1;
+  UINT64                            Floppy525_360IsSupported          :1;
+  UINT64                            Floppy525_12IsSupported           :1;
+  UINT64                            Floppy35_720IsSupported           :1;
+  UINT64                            Floppy35_288IsSupported           :1;
+  UINT64                            PrintScreenIsSupported            :1;
+  UINT64                            Keyboard8042IsSupported           :1;
+  UINT64                            SerialIsSupported                 :1;
+  UINT64                            PrinterIsSupported                :1;
+  UINT64                            CgaMonoIsSupported                :1;
+  UINT64                            NecPc98                           :1;
+  UINT64                            AcpiIsSupported                   :1;
+  UINT64                            UsbLegacyIsSupported              :1;
+  UINT64                            AgpIsSupported                    :1;
+  UINT64                            I20BootIsSupported                :1;
+  UINT64                            Ls120BootIsSupported              :1;
+  UINT64                            AtapiZipDriveBootIsSupported      :1;
+  UINT64                            Boot1394IsSupported               :1;
+  UINT64                            SmartBatteryIsSupported           :1;
+  UINT64                            BiosBootSpecIsSupported           :1;
+  UINT64                            FunctionKeyNetworkBootIsSupported :1;
+  UINT64                            Reserved                          :22;
+} EFI_MISC_BIOS_CHARACTERISTICS;
+
+typedef struct {
+  UINT64                            BiosReserved  :16;
+  UINT64                            SystemReserved:16;
+  UINT64                            Reserved      :32;
+} EFI_MISC_BIOS_CHARACTERISTICS_EXTENSION;
+
+typedef struct {
+  STRING_REF                        BiosVendor;
+  STRING_REF                        BiosVersion;
+  STRING_REF                        BiosReleaseDate;
+  EFI_PHYSICAL_ADDRESS              BiosStartingAddress;
+  EFI_EXP_BASE2_DATA                BiosPhysicalDeviceSize;
+  EFI_MISC_BIOS_CHARACTERISTICS     BiosCharacteristics1;
+  EFI_MISC_BIOS_CHARACTERISTICS_EXTENSION
+                                    BiosCharacteristics2;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 0.
+  ///
+  UINT8                             BiosMajorRelease;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 0.
+  ///
+  UINT8                             BiosMinorRelease;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 0.
+  ///
+  UINT8                             BiosEmbeddedFirmwareMajorRelease;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 0.
+  ///
+  UINT8                             BiosEmbeddedFirmwareMinorRelease;
+} EFI_MISC_BIOS_VENDOR_DATA;
+
+//
+// Misc. System Manufacturer - SMBIOS Type 1
+//
+#define EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER    0x00000003
+
+typedef enum {
+  EfiSystemWakeupTypeReserved        = 0,
+  EfiSystemWakeupTypeOther           = 1,
+  EfiSystemWakeupTypeUnknown         = 2,
+  EfiSystemWakeupTypeApmTimer        = 3,
+  EfiSystemWakeupTypeModemRing       = 4,
+  EfiSystemWakeupTypeLanRemote       = 5,
+  EfiSystemWakeupTypePowerSwitch     = 6,
+  EfiSystemWakeupTypePciPme          = 7,
+  EfiSystemWakeupTypeAcPowerRestored = 8
+} EFI_MISC_SYSTEM_WAKEUP_TYPE;
+
+typedef struct {
+  STRING_REF                        SystemManufacturer;
+  STRING_REF                        SystemProductName;
+  STRING_REF                        SystemVersion;
+  STRING_REF                        SystemSerialNumber;
+  EFI_GUID                          SystemUuid;
+  EFI_MISC_SYSTEM_WAKEUP_TYPE       SystemWakeupType;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 1.
+  ///
+  STRING_REF                        SystemSKUNumber;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 1.
+  ///
+  STRING_REF                        SystemFamily;
+} EFI_MISC_SYSTEM_MANUFACTURER_DATA;
+
+//
+// Misc. Base Board Manufacturer - SMBIOS Type 2
+//
+#define EFI_MISC_BASE_BOARD_MANUFACTURER_RECORD_NUMBER    0x00000004
+
+typedef struct {
+  UINT32                            Motherboard           :1;
+  UINT32                            RequiresDaughterCard  :1;
+  UINT32                            Removable             :1;
+  UINT32                            Replaceable           :1;
+  UINT32                            HotSwappable          :1;
+  UINT32                            Reserved              :27;
+} EFI_BASE_BOARD_FEATURE_FLAGS;
+
+typedef enum {
+  EfiBaseBoardTypeUnknown                = 1,
+  EfiBaseBoardTypeOther                  = 2,
+  EfiBaseBoardTypeServerBlade            = 3,
+  EfiBaseBoardTypeConnectivitySwitch     = 4,
+  EfiBaseBoardTypeSystemManagementModule = 5,
+  EfiBaseBoardTypeProcessorModule        = 6,
+  EfiBaseBoardTypeIOModule               = 7,
+  EfiBaseBoardTypeMemoryModule           = 8,
+  EfiBaseBoardTypeDaughterBoard          = 9,
+  EfiBaseBoardTypeMotherBoard            = 0xA,
+  EfiBaseBoardTypeProcessorMemoryModule  = 0xB,
+  EfiBaseBoardTypeProcessorIOModule      = 0xC,
+  EfiBaseBoardTypeInterconnectBoard      = 0xD
+} EFI_BASE_BOARD_TYPE;
+
+typedef struct {
+  STRING_REF                        BaseBoardManufacturer;
+  STRING_REF                        BaseBoardProductName;
+  STRING_REF                        BaseBoardVersion;
+  STRING_REF                        BaseBoardSerialNumber;
+  STRING_REF                        BaseBoardAssetTag;
+  STRING_REF                        BaseBoardChassisLocation;
+  EFI_BASE_BOARD_FEATURE_FLAGS      BaseBoardFeatureFlags;
+  EFI_BASE_BOARD_TYPE               BaseBoardType;
+  EFI_INTER_LINK_DATA               BaseBoardChassisLink;
+  UINT32                            BaseBoardNumberLinks;
+  EFI_INTER_LINK_DATA               LinkN;
+} EFI_MISC_BASE_BOARD_MANUFACTURER_DATA;
+
+//
+// Misc. System/Chassis Enclosure - SMBIOS Type 3
+//
+#define EFI_MISC_CHASSIS_MANUFACTURER_RECORD_NUMBER    0x00000005
+
+typedef enum {
+  EfiMiscChassisTypeOther               = 0x1,
+  EfiMiscChassisTypeUnknown             = 0x2,
+  EfiMiscChassisTypeDeskTop             = 0x3,
+  EfiMiscChassisTypeLowProfileDesktop   = 0x4,
+  EfiMiscChassisTypePizzaBox            = 0x5,
+  EfiMiscChassisTypeMiniTower           = 0x6,
+  EfiMiscChassisTypeTower               = 0x7,
+  EfiMiscChassisTypePortable            = 0x8,
+  EfiMiscChassisTypeLapTop              = 0x9,
+  EfiMiscChassisTypeNotebook            = 0xA,
+  EfiMiscChassisTypeHandHeld            = 0xB,
+  EfiMiscChassisTypeDockingStation      = 0xC,
+  EfiMiscChassisTypeAllInOne            = 0xD,
+  EfiMiscChassisTypeSubNotebook         = 0xE,
+  EfiMiscChassisTypeSpaceSaving         = 0xF,
+  EfiMiscChassisTypeLunchBox            = 0x10,
+  EfiMiscChassisTypeMainServerChassis   = 0x11,
+  EfiMiscChassisTypeExpansionChassis    = 0x12,
+  EfiMiscChassisTypeSubChassis          = 0x13,
+  EfiMiscChassisTypeBusExpansionChassis = 0x14,
+  EfiMiscChassisTypePeripheralChassis   = 0x15,
+  EfiMiscChassisTypeRaidChassis         = 0x16,
+  EfiMiscChassisTypeRackMountChassis    = 0x17,
+  EfiMiscChassisTypeSealedCasePc        = 0x18,
+  EfiMiscChassisMultiSystemChassis      = 0x19
+} EFI_MISC_CHASSIS_TYPE;
+
+typedef struct {
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass 0.9 specification, it has the incorrect field name "EFI_MISC_CHASSIS_TYPE".
+  /// Change it to "ChassisType" to pass build.
+  ///
+  UINT32                            ChassisType       :16;
+  UINT32                            ChassisLockPresent:1;
+  UINT32                            Reserved          :15;
+} EFI_MISC_CHASSIS_STATUS;
+
+typedef enum {
+  EfiChassisStateOther           = 0x01,
+  EfiChassisStateUnknown         = 0x02,
+  EfiChassisStateSafe            = 0x03,
+  EfiChassisStateWarning         = 0x04,
+  EfiChassisStateCritical        = 0x05,
+  EfiChassisStateNonRecoverable  = 0x06
+} EFI_MISC_CHASSIS_STATE;
+
+typedef enum {
+  EfiChassisSecurityStatusOther                          = 0x01,
+  EfiChassisSecurityStatusUnknown                        = 0x02,
+  EfiChassisSecurityStatusNone                           = 0x03,
+  EfiChassisSecurityStatusExternalInterfaceLockedOut     = 0x04,
+  EfiChassisSecurityStatusExternalInterfaceLockedEnabled = 0x05
+} EFI_MISC_CHASSIS_SECURITY_STATE;
+
+typedef struct {
+  UINT32                            RecordType :1;
+  UINT32                            Type       :7;
+  UINT32                            Reserved   :24;
+} EFI_MISC_ELEMENT_TYPE;
+
+typedef struct {
+  EFI_MISC_ELEMENT_TYPE             ChassisElementType;
+  EFI_INTER_LINK_DATA               ChassisElementStructure;
+  EFI_BASE_BOARD_TYPE               ChassisBaseBoard;
+  UINT32                            ChassisElementMinimum;
+  UINT32                            ChassisElementMaximum;
+} EFI_MISC_ELEMENTS;
+
+typedef struct {
+  STRING_REF                        ChassisManufacturer;
+  STRING_REF                        ChassisVersion;
+  STRING_REF                        ChassisSerialNumber;
+  STRING_REF                        ChassisAssetTag;
+  EFI_MISC_CHASSIS_STATUS           ChassisType;
+  EFI_MISC_CHASSIS_STATE            ChassisBootupState;
+  EFI_MISC_CHASSIS_STATE            ChassisPowerSupplyState;
+  EFI_MISC_CHASSIS_STATE            ChassisThermalState;
+  EFI_MISC_CHASSIS_SECURITY_STATE   ChassisSecurityState;
+  UINT32                            ChassisOemDefined;
+  UINT32                            ChassisHeight;
+  UINT32                            ChassisNumberPowerCords;
+  UINT32                            ChassisElementCount;
+  UINT32                            ChassisElementRecordLength;
+  EFI_MISC_ELEMENTS                 ChassisElements;
+} EFI_MISC_CHASSIS_MANUFACTURER_DATA;
+
+//
+// Misc. Port Connector Information - SMBIOS Type 8
+//
+#define EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_RECORD_NUMBER    0x00000006
+
+typedef enum {
+  EfiPortConnectorTypeNone                   = 0x00,
+  EfiPortConnectorTypeCentronics             = 0x01,
+  EfiPortConnectorTypeMiniCentronics         = 0x02,
+  EfiPortConnectorTypeProprietary            = 0x03,
+  EfiPortConnectorTypeDB25Male               = 0x04,
+  EfiPortConnectorTypeDB25Female             = 0x05,
+  EfiPortConnectorTypeDB15Male               = 0x06,
+  EfiPortConnectorTypeDB15Female             = 0x07,
+  EfiPortConnectorTypeDB9Male                = 0x08,
+  EfiPortConnectorTypeDB9Female              = 0x09,
+  EfiPortConnectorTypeRJ11                   = 0x0A,
+  EfiPortConnectorTypeRJ45                   = 0x0B,
+  EfiPortConnectorType50PinMiniScsi          = 0x0C,
+  EfiPortConnectorTypeMiniDin                = 0x0D,
+  EfiPortConnectorTypeMicriDin               = 0x0E,
+  EfiPortConnectorTypePS2                    = 0x0F,
+  EfiPortConnectorTypeInfrared               = 0x10,
+  EfiPortConnectorTypeHpHil                  = 0x11,
+  EfiPortConnectorTypeUsb                    = 0x12,
+  EfiPortConnectorTypeSsaScsi                = 0x13,
+  EfiPortConnectorTypeCircularDin8Male       = 0x14,
+  EfiPortConnectorTypeCircularDin8Female     = 0x15,
+  EfiPortConnectorTypeOnboardIde             = 0x16,
+  EfiPortConnectorTypeOnboardFloppy          = 0x17,
+  EfiPortConnectorType9PinDualInline         = 0x18,
+  EfiPortConnectorType25PinDualInline        = 0x19,
+  EfiPortConnectorType50PinDualInline        = 0x1A,
+  EfiPortConnectorType68PinDualInline        = 0x1B,
+  EfiPortConnectorTypeOnboardSoundInput      = 0x1C,
+  EfiPortConnectorTypeMiniCentronicsType14   = 0x1D,
+  EfiPortConnectorTypeMiniCentronicsType26   = 0x1E,
+  EfiPortConnectorTypeHeadPhoneMiniJack      = 0x1F,
+  EfiPortConnectorTypeBNC                    = 0x20,
+  EfiPortConnectorType1394                   = 0x21,
+  EfiPortConnectorTypePC98                   = 0xA0,
+  EfiPortConnectorTypePC98Hireso             = 0xA1,
+  EfiPortConnectorTypePCH98                  = 0xA2,
+  EfiPortConnectorTypePC98Note               = 0xA3,
+  EfiPortConnectorTypePC98Full               = 0xA4,
+  EfiPortConnectorTypeOther                  = 0xFF
+} EFI_MISC_PORT_CONNECTOR_TYPE;
+
+typedef enum {
+  EfiPortTypeNone                      = 0x00,
+  EfiPortTypeParallelXtAtCompatible    = 0x01,
+  EfiPortTypeParallelPortPs2           = 0x02,
+  EfiPortTypeParallelPortEcp           = 0x03,
+  EfiPortTypeParallelPortEpp           = 0x04,
+  EfiPortTypeParallelPortEcpEpp        = 0x05,
+  EfiPortTypeSerialXtAtCompatible      = 0x06,
+  EfiPortTypeSerial16450Compatible     = 0x07,
+  EfiPortTypeSerial16550Compatible     = 0x08,
+  EfiPortTypeSerial16550ACompatible    = 0x09,
+  EfiPortTypeScsi                      = 0x0A,
+  EfiPortTypeMidi                      = 0x0B,
+  EfiPortTypeJoyStick                  = 0x0C,
+  EfiPortTypeKeyboard                  = 0x0D,
+  EfiPortTypeMouse                     = 0x0E,
+  EfiPortTypeSsaScsi                   = 0x0F,
+  EfiPortTypeUsb                       = 0x10,
+  EfiPortTypeFireWire                  = 0x11,
+  EfiPortTypePcmciaTypeI               = 0x12,
+  EfiPortTypePcmciaTypeII              = 0x13,
+  EfiPortTypePcmciaTypeIII             = 0x14,
+  EfiPortTypeCardBus                   = 0x15,
+  EfiPortTypeAccessBusPort             = 0x16,
+  EfiPortTypeScsiII                    = 0x17,
+  EfiPortTypeScsiWide                  = 0x18,
+  EfiPortTypePC98                      = 0x19,
+  EfiPortTypePC98Hireso                = 0x1A,
+  EfiPortTypePCH98                     = 0x1B,
+  EfiPortTypeVideoPort                 = 0x1C,
+  EfiPortTypeAudioPort                 = 0x1D,
+  EfiPortTypeModemPort                 = 0x1E,
+  EfiPortTypeNetworkPort               = 0x1F,
+  EfiPortType8251Compatible            = 0xA0,
+  EfiPortType8251FifoCompatible        = 0xA1,
+  EfiPortTypeOther                     = 0xFF
+} EFI_MISC_PORT_TYPE;
+
+typedef struct {
+  STRING_REF                        PortInternalConnectorDesignator;
+  STRING_REF                        PortExternalConnectorDesignator;
+  EFI_MISC_PORT_CONNECTOR_TYPE      PortInternalConnectorType;
+  EFI_MISC_PORT_CONNECTOR_TYPE      PortExternalConnectorType;
+  EFI_MISC_PORT_TYPE                PortType;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this type of field is defined as EFI_DEVICE_PATH_PROTOCOL,
+  /// which causes the implementation some complexity. Keep it unchanged for backward
+  /// compatibility.
+  ///
+  EFI_MISC_PORT_DEVICE_PATH         PortPath;
+} EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA;
+
+//
+// Misc. System Slots - SMBIOS Type 9
+//
+#define EFI_MISC_SYSTEM_SLOT_DESIGNATION_RECORD_NUMBER    0x00000007
+
+typedef enum {
+  EfiSlotTypeOther                        = 0x01,
+  EfiSlotTypeUnknown                      = 0x02,
+  EfiSlotTypeIsa                          = 0x03,
+  EfiSlotTypeMca                          = 0x04,
+  EfiSlotTypeEisa                         = 0x05,
+  EfiSlotTypePci                          = 0x06,
+  EfiSlotTypePcmcia                       = 0x07,
+  EfiSlotTypeVlVesa                       = 0x08,
+  EfiSlotTypeProprietary                  = 0x09,
+  EfiSlotTypeProcessorCardSlot            = 0x0A,
+  EfiSlotTypeProprietaryMemoryCardSlot    = 0x0B,
+  EfiSlotTypeIORiserCardSlot              = 0x0C,
+  EfiSlotTypeNuBus                        = 0x0D,
+  EfiSlotTypePci66MhzCapable              = 0x0E,
+  EfiSlotTypeAgp                          = 0x0F,
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, its naming should be EfiSlotTypeAgp2X
+  /// rather than EfiSlotTypeApg2X.
+  ///
+  EfiSlotTypeAgp2X                        = 0x10,
+  EfiSlotTypeAgp4X                        = 0x11,
+  EfiSlotTypePciX                         = 0x12,
+  EfiSlotTypeAgp8x                        = 0x13,
+  EfiSlotTypePC98C20                      = 0xA0,
+  EfiSlotTypePC98C24                      = 0xA1,
+  EfiSlotTypePC98E                        = 0xA2,
+  EfiSlotTypePC98LocalBus                 = 0xA3,
+  EfiSlotTypePC98Card                     = 0xA4,
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, these fields aren't defined.
+  /// They're introduced for SmBios 2.6 specification type 9.
+  ///
+  EfiSlotTypePciExpress                   = 0xA5,
+  EfiSlotTypePciExpressX1                 = 0xA6,
+  EfiSlotTypePciExpressX2                 = 0xA7,
+  EfiSlotTypePciExpressX4                 = 0xA8,
+  EfiSlotTypePciExpressX8                 = 0xA9,
+  EfiSlotTypePciExpressX16                = 0xAA
+} EFI_MISC_SLOT_TYPE;
+
+typedef enum {
+  EfiSlotDataBusWidthOther      = 0x01,
+  EfiSlotDataBusWidthUnknown    = 0x02,
+  EfiSlotDataBusWidth8Bit       = 0x03,
+  EfiSlotDataBusWidth16Bit      = 0x04,
+  EfiSlotDataBusWidth32Bit      = 0x05,
+  EfiSlotDataBusWidth64Bit      = 0x06,
+  EfiSlotDataBusWidth128Bit     = 0x07,
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, these fields aren't defined.
+  /// They're introduced for SmBios 2.6 specification type 9.
+  ///
+  EfiSlotDataBusWidth1xOrx1     = 0x8,
+  EfiSlotDataBusWidth2xOrx2     = 0x9,
+  EfiSlotDataBusWidth4xOrx4     = 0xA,
+  EfiSlotDataBusWidth8xOrx8     = 0xB,
+  EfiSlotDataBusWidth12xOrx12   = 0xC,
+  EfiSlotDataBusWidth16xOrx16   = 0xD,
+  EfiSlotDataBusWidth32xOrx32   = 0xE
+} EFI_MISC_SLOT_DATA_BUS_WIDTH;
+
+typedef enum {
+  EfiSlotUsageOther     = 1,
+  EfiSlotUsageUnknown   = 2,
+  EfiSlotUsageAvailable = 3,
+  EfiSlotUsageInUse     = 4
+} EFI_MISC_SLOT_USAGE;
+
+typedef enum {
+  EfiSlotLengthOther   = 1,
+  EfiSlotLengthUnknown = 2,
+  EfiSlotLengthShort   = 3,
+  EfiSlotLengthLong    = 4
+} EFI_MISC_SLOT_LENGTH;
+
+typedef struct {
+  UINT32                            CharacteristicsUnknown  :1;
+  UINT32                            Provides50Volts         :1;
+  UINT32                            Provides33Volts         :1;
+  UINT32                            SharedSlot              :1;
+  UINT32                            PcCard16Supported       :1;
+  UINT32                            CardBusSupported        :1;
+  UINT32                            ZoomVideoSupported      :1;
+  UINT32                            ModemRingResumeSupported:1;
+  UINT32                            PmeSignalSupported      :1;
+  UINT32                            HotPlugDevicesSupported :1;
+  UINT32                            SmbusSignalSupported    :1;
+  UINT32                            Reserved                :21;
+} EFI_MISC_SLOT_CHARACTERISTICS;
+
+typedef struct {
+  STRING_REF                        SlotDesignation;
+  EFI_MISC_SLOT_TYPE                SlotType;
+  EFI_MISC_SLOT_DATA_BUS_WIDTH      SlotDataBusWidth;
+  EFI_MISC_SLOT_USAGE               SlotUsage;
+  EFI_MISC_SLOT_LENGTH              SlotLength;
+  UINT16                            SlotId;
+  EFI_MISC_SLOT_CHARACTERISTICS     SlotCharacteristics;
+  EFI_DEVICE_PATH_PROTOCOL          SlotDevicePath;
+} EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA;
+
+//
+// Misc. Onboard Device - SMBIOS Type 10
+//
+#define EFI_MISC_ONBOARD_DEVICE_RECORD_NUMBER    0x00000008
+
+typedef enum {
+  EfiOnBoardDeviceTypeOther          = 1,
+  EfiOnBoardDeviceTypeUnknown        = 2,
+  EfiOnBoardDeviceTypeVideo          = 3,
+  EfiOnBoardDeviceTypeScsiController = 4,
+  EfiOnBoardDeviceTypeEthernet       = 5,
+  EfiOnBoardDeviceTypeTokenRing      = 6,
+  EfiOnBoardDeviceTypeSound          = 7
+} EFI_MISC_ONBOARD_DEVICE_TYPE;
+
+typedef struct {
+  UINT32                            DeviceType    :16;
+  UINT32                            DeviceEnabled :1;
+  UINT32                            Reserved      :15;
+} EFI_MISC_ONBOARD_DEVICE_STATUS;
+
+typedef struct {
+  STRING_REF                        OnBoardDeviceDescription;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, the name is OnBoardDeviceType.
+  /// Keep it unchanged for backward compatibilty.
+  ///
+  EFI_MISC_ONBOARD_DEVICE_STATUS    OnBoardDeviceStatus;
+  EFI_DEVICE_PATH_PROTOCOL          OnBoardDevicePath;
+} EFI_MISC_ONBOARD_DEVICE_DATA;
+
+//
+// Misc. BIOS Language Information - SMBIOS Type 11
+//
+#define EFI_MISC_OEM_STRING_RECORD_NUMBER    0x00000009
+
+typedef struct {
+  STRING_REF                        OemStringRef[1];
+} EFI_MISC_OEM_STRING_DATA;
+
+//
+// Misc. System Options - SMBIOS Type 12
+//
+typedef struct {
+  STRING_REF                        SystemOptionStringRef[1];
+} EFI_MISC_SYSTEM_OPTION_STRING_DATA;
+
+#define EFI_MISC_SYSTEM_OPTION_STRING_RECORD_NUMBER    0x0000000A
+
+//
+// Misc. Number of Installable Languages - SMBIOS Type 13
+//
+#define EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_RECORD_NUMBER    0x0000000B
+
+typedef struct {
+  UINT32                            AbbreviatedLanguageFormat :1;
+  UINT32                            Reserved                  :31;
+} EFI_MISC_LANGUAGE_FLAGS;
+
+typedef struct {
+  UINT16                            NumberOfInstallableLanguages;
+  EFI_MISC_LANGUAGE_FLAGS           LanguageFlags;
+  UINT16                            CurrentLanguageNumber;
+} EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA;
+
+//
+// Misc. System Language String
+//
+#define EFI_MISC_SYSTEM_LANGUAGE_STRING_RECORD_NUMBER    0x0000000C
+
+typedef struct {
+  UINT16                            LanguageId;
+  STRING_REF                        SystemLanguageString;
+} EFI_MISC_SYSTEM_LANGUAGE_STRING_DATA;
+
+//
+// Group Associations - SMBIOS Type 14
+//
+#define EFI_MISC_GROUP_NAME_RECORD_NUMBER    0x0000000D
+
+typedef struct {
+  STRING_REF                        GroupName;
+  UINT16                            NumberGroupItems;
+  UINT16                            GroupId;
+} EFI_MISC_GROUP_NAME_DATA;
+
+//
+// Group Item Set Element
+//
+#define EFI_MISC_GROUP_ITEM_SET_RECORD_NUMBER    0x0000000E
+
+typedef struct {
+  EFI_GUID                          SubClass;
+  EFI_INTER_LINK_DATA               GroupLink;
+  UINT16                            GroupId;
+  UINT16                            GroupElementId;
+} EFI_MISC_GROUP_ITEM_SET_DATA;
+
+//
+//  Misc. Pointing Device Type - SMBIOS Type 21
+//
+#define EFI_MISC_POINTING_DEVICE_TYPE_RECORD_NUMBER    0x0000000F
+
+typedef enum {
+  EfiPointingDeviceTypeOther         = 0x01,
+  EfiPointingDeviceTypeUnknown       = 0x02,
+  EfiPointingDeviceTypeMouse         = 0x03,
+  EfiPointingDeviceTypeTrackBall     = 0x04,
+  EfiPointingDeviceTypeTrackPoint    = 0x05,
+  EfiPointingDeviceTypeGlidePoint    = 0x06,
+  EfiPointingDeviceTouchPad          = 0x07,
+  EfiPointingDeviceTouchScreen       = 0x08,
+  EfiPointingDeviceOpticalSensor     = 0x09
+} EFI_MISC_POINTING_DEVICE_TYPE;
+
+typedef enum {
+  EfiPointingDeviceInterfaceOther              = 0x01,
+  EfiPointingDeviceInterfaceUnknown            = 0x02,
+  EfiPointingDeviceInterfaceSerial             = 0x03,
+  EfiPointingDeviceInterfacePs2                = 0x04,
+  EfiPointingDeviceInterfaceInfrared           = 0x05,
+  EfiPointingDeviceInterfaceHpHil              = 0x06,
+  EfiPointingDeviceInterfaceBusMouse           = 0x07,
+  EfiPointingDeviceInterfaceADB                = 0x08,
+  EfiPointingDeviceInterfaceBusMouseDB9        = 0xA0,
+  EfiPointingDeviceInterfaceBusMouseMicroDin   = 0xA1,
+  EfiPointingDeviceInterfaceUsb                = 0xA2
+} EFI_MISC_POINTING_DEVICE_INTERFACE;
+
+typedef struct {
+  EFI_MISC_POINTING_DEVICE_TYPE       PointingDeviceType;
+  EFI_MISC_POINTING_DEVICE_INTERFACE  PointingDeviceInterface;
+  UINT16                              NumberPointingDeviceButtons;
+  EFI_DEVICE_PATH_PROTOCOL            PointingDevicePath;
+} EFI_MISC_POINTING_DEVICE_TYPE_DATA;
+
+//
+// Portable Battery - SMBIOS Type 22
+//
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the name is EFI_MISC_BATTERY_LOCATION_RECORD_NUMBER.
+/// Keep it unchanged for backward compatibilty.
+///
+#define EFI_MISC_PORTABLE_BATTERY_RECORD_NUMBER   0x00000010
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_BATTERY_DEVICE_CHEMISTRY.
+/// And all field namings are also different with specification.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef enum {
+  EfiPortableBatteryDeviceChemistryOther = 1,
+  EfiPortableBatteryDeviceChemistryUnknown = 2,
+  EfiPortableBatteryDeviceChemistryLeadAcid = 3,
+  EfiPortableBatteryDeviceChemistryNickelCadmium = 4,
+  EfiPortableBatteryDeviceChemistryNickelMetalHydride = 5,
+  EfiPortableBatteryDeviceChemistryLithiumIon = 6,
+  EfiPortableBatteryDeviceChemistryZincAir = 7,
+  EfiPortableBatteryDeviceChemistryLithiumPolymer = 8
+} EFI_MISC_PORTABLE_BATTERY_DEVICE_CHEMISTRY;
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_BATTERY_LOCATION_DATA.
+/// Also, the name and the order of the fields vary with specifications.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef struct {
+  STRING_REF                        Location;
+  STRING_REF                        Manufacturer;
+  STRING_REF                        ManufactureDate;
+  STRING_REF                        SerialNumber;
+  STRING_REF                        DeviceName;
+  EFI_MISC_PORTABLE_BATTERY_DEVICE_CHEMISTRY
+                                    DeviceChemistry;
+  UINT16                            DesignCapacity;
+  UINT16                            DesignVoltage;
+  STRING_REF                        SBDSVersionNumber;
+  UINT8                             MaximumError;
+  UINT16                            SBDSSerialNumber;
+  UINT16                            SBDSManufactureDate;
+  STRING_REF                        SBDSDeviceChemistry;
+  UINT8                             DesignCapacityMultiplier;
+  UINT32                            OEMSpecific;
+  UINT8                             BatteryNumber; // Temporary
+  BOOLEAN                           Valid; // Is entry valid - Temporary
+} EFI_MISC_PORTABLE_BATTERY;
+
+
+//
+// Misc. Reset Capabilities - SMBIOS Type 23
+//
+#define EFI_MISC_RESET_CAPABILITIES_RECORD_NUMBER    0x00000011
+
+typedef struct {
+  UINT32                            Status              :1;
+  UINT32                            BootOption          :2;
+  UINT32                            BootOptionOnLimit   :2;
+  UINT32                            WatchdogTimerPresent:1;
+  UINT32                            Reserved            :26;
+} EFI_MISC_RESET_CAPABILITIES_TYPE;
+
+typedef struct {
+  EFI_MISC_RESET_CAPABILITIES_TYPE  ResetCapabilities;
+  UINT16                            ResetCount;
+  UINT16                            ResetLimit;
+  UINT16                            ResetTimerInterval;
+  UINT16                            ResetTimeout;
+} EFI_MISC_RESET_CAPABILITIES;
+
+typedef struct {
+    EFI_MISC_RESET_CAPABILITIES     ResetCapabilities;
+    UINT16                          ResetCount;
+    UINT16                          ResetLimit;
+    UINT16                          ResetTimerInterval;
+    UINT16                          ResetTimeout;
+} EFI_MISC_RESET_CAPABILITIES_DATA;
+
+//
+// Misc. Hardware Security - SMBIOS Type 24
+//
+#define EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA_RECORD_NUMBER    0x00000012
+
+///
+/// Inconsistent with specification here:
+/// The MiscSubclass specification 0.9 only mentions the possible value of each field in
+/// EFI_MISC_HARDWARE_SECURITY_SETTINGS.
+/// It's implementation-specific in order to to simplify the code logic.
+///
+typedef enum {
+  EfiHardwareSecurityStatusDisabled       = 0,
+  EfiHardwareSecurityStatusEnabled        = 1,
+  EfiHardwareSecurityStatusNotImplemented = 2,
+  EfiHardwareSecurityStatusUnknown        = 3
+} EFI_MISC_HARDWARE_SECURITY_STATUS;
+
+typedef struct {
+  UINT32 FrontPanelResetStatus       :2;
+  UINT32 AdministratorPasswordStatus :2;
+  UINT32 KeyboardPasswordStatus      :2;
+  UINT32 PowerOnPasswordStatus       :2;
+  UINT32 Reserved                    :24;
+} EFI_MISC_HARDWARE_SECURITY_SETTINGS;
+
+typedef struct {
+  EFI_MISC_HARDWARE_SECURITY_SETTINGS HardwareSecuritySettings;
+} EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA;
+
+//
+// System Power Controls - SMBIOS Type 25
+//
+#define EFI_MISC_SCHEDULED_POWER_ON_MONTH_RECORD_NUMBER    0x00000013
+
+typedef struct {
+  UINT16                            ScheduledPoweronMonth;
+  UINT16                            ScheduledPoweronDayOfMonth;
+  UINT16                            ScheduledPoweronHour;
+  UINT16                            ScheduledPoweronMinute;
+  UINT16                            ScheduledPoweronSecond;
+} EFI_MISC_SCHEDULED_POWER_ON_MONTH_DATA;
+
+//
+// Voltage Probe - SMBIOS Type 26
+//
+#define EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_RECORD_NUMBER    0x00000014
+
+typedef struct {
+  UINT32                            VoltageProbeSite        :5;
+  UINT32                            VoltageProbeStatus      :3;
+  UINT32                            Reserved                :24;
+} EFI_MISC_VOLTAGE_PROBE_LOCATION;
+
+typedef struct {
+  STRING_REF                        VoltageProbeDescription;
+  EFI_MISC_VOLTAGE_PROBE_LOCATION   VoltageProbeLocation;
+  EFI_EXP_BASE10_DATA               VoltageProbeMaximumValue;
+  EFI_EXP_BASE10_DATA               VoltageProbeMinimumValue;
+  EFI_EXP_BASE10_DATA               VoltageProbeResolution;
+  EFI_EXP_BASE10_DATA               VoltageProbeTolerance;
+  EFI_EXP_BASE10_DATA               VoltageProbeAccuracy;
+  EFI_EXP_BASE10_DATA               VoltageProbeNominalValue;
+  EFI_EXP_BASE10_DATA               MDLowerNoncriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperNoncriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDLowerCriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperCriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDLowerNonrecoverableThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperNonrecoverableThreshold;
+  UINT32                            VoltageProbeOemDefined;
+} EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_DATA;
+
+//
+// Cooling Device - SMBIOS Type 27
+//
+#define EFI_MISC_COOLING_DEVICE_TEMP_LINK_RECORD_NUMBER    0x00000015
+
+typedef struct {
+  UINT32                            CoolingDevice       :5;
+  UINT32                            CoolingDeviceStatus :3;
+  UINT32                            Reserved            :24;
+} EFI_MISC_COOLING_DEVICE_TYPE;
+
+typedef struct {
+  EFI_MISC_COOLING_DEVICE_TYPE      CoolingDeviceType;
+  EFI_INTER_LINK_DATA               CoolingDeviceTemperatureLink;
+  UINT8                             CoolingDeviceUnitGroup;
+  UINT16                            CoolingDeviceNominalSpeed;
+  UINT32                            CoolingDeviceOemDefined;
+} EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA;
+
+//
+// Temperature Probe - SMBIOS Type 28
+//
+#define EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_RECORD_NUMBER    0x00000016
+
+typedef struct {
+  UINT32                            TemperatureProbeSite   :5;
+  UINT32                            TemperatureProbeStatus :3;
+  UINT32                            Reserved               :24;
+} EFI_MISC_TEMPERATURE_PROBE_LOCATION;
+
+typedef struct {
+  STRING_REF                        TemperatureProbeDescription;
+  EFI_MISC_TEMPERATURE_PROBE_LOCATION
+                                    TemperatureProbeLocation;
+  ///
+  /// Inconsistent with specification here:
+  /// MiscSubclass 0.9 specification defines the fields type as EFI_EXP_BASE10_DATA.
+  /// In fact, they should be UINT16 type because they refer to 16bit width data.
+  /// Keeping this inconsistency for backward compatibility.
+  ///
+  UINT16                            TemperatureProbeMaximumValue;
+  UINT16                            TemperatureProbeMinimumValue;
+  UINT16                            TemperatureProbeResolution;
+  UINT16                            TemperatureProbeTolerance;
+  UINT16                            TemperatureProbeAccuracy;
+  UINT16                            TemperatureProbeNominalValue;
+  UINT16                            MDLowerNoncriticalThreshold;
+  UINT16                            MDUpperNoncriticalThreshold;
+  UINT16                            MDLowerCriticalThreshold;
+  UINT16                            MDUpperCriticalThreshold;
+  UINT16                            MDLowerNonrecoverableThreshold;
+  UINT16                            MDUpperNonrecoverableThreshold;
+  UINT32                            TemperatureProbeOemDefined;
+} EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA;
+
+//
+// Electrical Current Probe - SMBIOS Type 29
+//
+
+#define EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_RECORD_NUMBER    0x00000017
+
+typedef struct {
+  UINT32                            ElectricalCurrentProbeSite    :5;
+  UINT32                            ElectricalCurrentProbeStatus  :3;
+  UINT32                            Reserved                      :24;
+} EFI_MISC_ELECTRICAL_CURRENT_PROBE_LOCATION;
+
+typedef struct {
+  STRING_REF                        ElectricalCurrentProbeDescription;
+  EFI_MISC_ELECTRICAL_CURRENT_PROBE_LOCATION
+                                    ElectricalCurrentProbeLocation;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeMaximumValue;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeMinimumValue;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeResolution;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeTolerance;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeAccuracy;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeNominalValue;
+  EFI_EXP_BASE10_DATA               MDLowerNoncriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperNoncriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDLowerCriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperCriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDLowerNonrecoverableThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperNonrecoverableThreshold;
+  UINT32                            ElectricalCurrentProbeOemDefined;
+} EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_DATA;
+
+//
+// Out-of-Band Remote Access - SMBIOS Type 30
+//
+
+#define EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_RECORD_NUMBER    0x00000018
+
+typedef struct  {
+  UINT32                            InboundConnectionEnabled  :1;
+  UINT32                            OutboundConnectionEnabled :1;
+  UINT32                            Reserved                  :30;
+} EFI_MISC_REMOTE_ACCESS_CONNECTIONS;
+
+typedef struct {
+  STRING_REF                         RemoteAccessManufacturerNameDescription;
+  EFI_MISC_REMOTE_ACCESS_CONNECTIONS RemoteAccessConnections;
+} EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_DATA;
+
+//
+// Misc. BIS Entry Point - SMBIOS Type 31
+//
+#define EFI_MISC_BIS_ENTRY_POINT_RECORD_NUMBER    0x00000019
+
+typedef struct {
+  EFI_PHYSICAL_ADDRESS              BisEntryPoint;
+} EFI_MISC_BIS_ENTRY_POINT_DATA;
+
+//
+// Misc. Boot Information - SMBIOS Type 32
+//
+#define EFI_MISC_BOOT_INFORMATION_STATUS_RECORD_NUMBER    0x0000001A
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_BOOT_INFORMATION_STATUS_TYPE.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef enum {
+  EfiBootInformationStatusNoError                  = 0x00,
+  EfiBootInformationStatusNoBootableMedia          = 0x01,
+  EfiBootInformationStatusNormalOSFailedLoading    = 0x02,
+  EfiBootInformationStatusFirmwareDetectedFailure  = 0x03,
+  EfiBootInformationStatusOSDetectedFailure        = 0x04,
+  EfiBootInformationStatusUserRequestedBoot        = 0x05,
+  EfiBootInformationStatusSystemSecurityViolation  = 0x06,
+  EfiBootInformationStatusPreviousRequestedImage   = 0x07,
+  EfiBootInformationStatusWatchdogTimerExpired     = 0x08,
+  EfiBootInformationStatusStartReserved            = 0x09,
+  EfiBootInformationStatusStartOemSpecific         = 0x80,
+  EfiBootInformationStatusStartProductSpecific     = 0xC0
+} EFI_MISC_BOOT_INFORMATION_STATUS_DATA_TYPE;
+
+typedef struct {
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, the field name is EFI_MISC_BOOT_INFORMATION_STATUS_TYPE.
+  /// Keep it unchanged for backward compatibilty.
+  ///
+  EFI_MISC_BOOT_INFORMATION_STATUS_DATA_TYPE BootInformationStatus;
+  UINT8                                      BootInformationData[9];
+} EFI_MISC_BOOT_INFORMATION_STATUS_DATA;
+
+//
+// Management Device - SMBIOS Type 34
+//
+#define EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_RECORD_NUMBER    0x0000001B
+
+typedef enum {
+  EfiManagementDeviceTypeOther      = 0x01,
+  EfiManagementDeviceTypeUnknown    = 0x02,
+  EfiManagementDeviceTypeLm75       = 0x03,
+  EfiManagementDeviceTypeLm78       = 0x04,
+  EfiManagementDeviceTypeLm79       = 0x05,
+  EfiManagementDeviceTypeLm80       = 0x06,
+  EfiManagementDeviceTypeLm81       = 0x07,
+  EfiManagementDeviceTypeAdm9240    = 0x08,
+  EfiManagementDeviceTypeDs1780     = 0x09,
+  EfiManagementDeviceTypeMaxim1617  = 0x0A,
+  EfiManagementDeviceTypeGl518Sm    = 0x0B,
+  EfiManagementDeviceTypeW83781D    = 0x0C,
+  EfiManagementDeviceTypeHt82H791   = 0x0D
+} EFI_MISC_MANAGEMENT_DEVICE_TYPE;
+
+typedef enum {
+  EfiManagementDeviceAddressTypeOther   = 1,
+  EfiManagementDeviceAddressTypeUnknown = 2,
+  EfiManagementDeviceAddressTypeIOPort  = 3,
+  EfiManagementDeviceAddressTypeMemory  = 4,
+  EfiManagementDeviceAddressTypeSmbus   = 5
+} EFI_MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE;
+
+typedef struct {
+  STRING_REF                        ManagementDeviceDescription;
+  EFI_MISC_MANAGEMENT_DEVICE_TYPE   ManagementDeviceType;
+  UINTN                             ManagementDeviceAddress;
+  EFI_MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE
+                                    ManagementDeviceAddressType;
+} EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_DATA;
+
+//
+// Management Device Component - SMBIOS Type 35
+//
+
+#define EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_RECORD_NUMBER    0x0000001C
+
+typedef struct {
+  STRING_REF                        ManagementDeviceComponentDescription;
+  EFI_INTER_LINK_DATA               ManagementDeviceLink;
+  EFI_INTER_LINK_DATA               ManagementDeviceComponentLink;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this field is NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 35.
+  ///
+  EFI_INTER_LINK_DATA               ManagementDeviceThresholdLink;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this field is NOT defined.
+  /// It's implementation-specific to simplify the code logic.
+  ///
+  UINT8                             ComponentType;
+} EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA;
+
+//
+// IPMI Data Record - SMBIOS Type 38
+//
+typedef enum {
+  EfiIpmiOther = 0,
+  EfiIpmiKcs   = 1,
+  EfiIpmiSmic  = 2,
+  EfiIpmiBt    = 3
+} EFI_MISC_IPMI_INTERFACE_TYPE;
+
+typedef struct {
+  UINT16                            IpmiSpecLeastSignificantDigit:4;
+  UINT16                            IpmiSpecMostSignificantDigit: 4;
+  UINT16                            Reserved:                     8;
+} EFI_MISC_IPMI_SPECIFICATION_REVISION;
+
+typedef struct {
+  EFI_MISC_IPMI_INTERFACE_TYPE      IpmiInterfaceType;
+  EFI_MISC_IPMI_SPECIFICATION_REVISION
+                                    IpmiSpecificationRevision;
+  UINT16                            IpmiI2CSlaveAddress;
+  UINT16                            IpmiNvDeviceAddress;
+  UINT64                            IpmiBaseAddress;
+  EFI_DEVICE_PATH_PROTOCOL          IpmiDevicePath;
+} EFI_MISC_IPMI_INTERFACE_TYPE_DATA;
+
+#define EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER    0x0000001D
+///
+/// The definition above is *NOT* defined in MiscSubclass specifications 0.9.
+/// It's defined for backward compatibility.
+///
+#define EFI_MISC_IPMI_INTERFACE_TYPE_DATA_RECORD_NUMBER EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER
+
+///
+/// System Power supply Record - SMBIOS Type 39
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the type of all fields are UINT32.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef struct {
+  UINT16                            PowerSupplyHotReplaceable:1;
+  UINT16                            PowerSupplyPresent       :1;
+  UINT16                            PowerSupplyUnplugged     :1;
+  UINT16                            InputVoltageRangeSwitch  :4;
+  UINT16                            PowerSupplyStatus        :3;
+  UINT16                            PowerSupplyType          :4;
+  UINT16                            Reserved                 :2;
+} EFI_MISC_POWER_SUPPLY_CHARACTERISTICS;
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_POWER_SUPPLY_UNIT_GROUP_DATA.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef struct {
+  UINT16                                 PowerUnitGroup;
+  STRING_REF                             PowerSupplyLocation;
+  STRING_REF                             PowerSupplyDeviceName;
+  STRING_REF                             PowerSupplyManufacturer;
+  STRING_REF                             PowerSupplySerialNumber;
+  STRING_REF                             PowerSupplyAssetTagNumber;
+  STRING_REF                             PowerSupplyModelPartNumber;
+  STRING_REF                             PowerSupplyRevisionLevel;
+  UINT16                                 PowerSupplyMaxPowerCapacity;
+  EFI_MISC_POWER_SUPPLY_CHARACTERISTICS  PowerSupplyCharacteristics;
+  EFI_INTER_LINK_DATA                    PowerSupplyInputVoltageProbeLink;
+  EFI_INTER_LINK_DATA                    PowerSupplyCoolingDeviceLink;
+  EFI_INTER_LINK_DATA                    PowerSupplyInputCurrentProbeLink;
+} EFI_MISC_SYSTEM_POWER_SUPPLY_DATA;
+
+#define EFI_MISC_SYSTEM_POWER_SUPPLY_RECORD_NUMBER    0x0000001E
+
+///
+/// OEM Data Record - SMBIOS Type 0x80-0xFF
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the structure name is EFI_SMBIOS_STRUCTURE_HDR.
+/// Due to this, the structure is commonly used by vendors to construct SmBios type 0x80~0xFF table,
+/// Keep it unchanged for backward compatibilty.
+///
+typedef struct {
+  UINT8                             Type;
+  UINT8                             Length;
+  UINT16                            Handle;
+} SMBIOS_STRUCTURE_HDR;
+
+typedef struct {
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, the field name is EFI_SMBIOS_STRUCTURE_HDR.
+  /// Keep it unchanged for backward compatibilty.
+  ///
+  SMBIOS_STRUCTURE_HDR              Header;
+  UINT8                             RawData[1];
+} EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA;
+
+#define EFI_MISC_SMBIOS_STRUCT_ENCAP_RECORD_NUMBER    0x0000001F
+
+///
+/// Misc. System Event Log  - SMBIOS Type 15
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 specification type 15.
+///
+#define EFI_MISC_SYSTEM_EVENT_LOG_RECORD_NUMBER    0x00000020
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 specification type 15.
+///
+typedef struct {
+  UINT16                            LogAreaLength;
+  UINT16                            LogHeaderStartOffset;
+  UINT16                            LogDataStartOffset;
+  UINT8                             AccessMethod;
+  UINT8                             LogStatus;
+  UINT32                            LogChangeToken;
+  UINT32                            AccessMethodAddress;
+  UINT8                             LogHeaderFormat;
+  UINT8                             NumberOfSupportedLogType;
+  UINT8                             LengthOfLogDescriptor;
+} EFI_MISC_SYSTEM_EVENT_LOG_DATA;
+
+//
+// Access Method.
+//  0x00~0x04:  as following definition
+//  0x05~0x7f:  Available for future assignment.
+//  0x80~0xff:  BIOS Vendor/OEM-specific.
+//
+#define ACCESS_INDEXIO_1INDEX8BIT_DATA8BIT    0x00
+#define ACCESS_INDEXIO_2INDEX8BIT_DATA8BIT    0X01
+#define ACCESS_INDEXIO_1INDEX16BIT_DATA8BIT   0X02
+#define ACCESS_MEMORY_MAPPED                  0x03
+#define ACCESS_GPNV                           0x04
+
+///
+/// Management Device Threshold Data Record - SMBIOS Type 36
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 specification type 36.
+///
+#define EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD_RECORD_NUMBER    0x00000021
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 specification type 36.
+///
+typedef struct {
+  UINT16                            LowerThresNonCritical;
+  UINT16                            UpperThresNonCritical;
+  UINT16                            LowerThresCritical;
+  UINT16                            UpperThresCritical;
+  UINT16                            LowerThresNonRecover;
+  UINT16                            UpperThresNonRecover;
+} EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD;
+
+//
+// Declare the following strutures alias to use them more conviniently.
+//
+typedef EFI_MISC_LAST_PCI_BUS_DATA                        EFI_MISC_LAST_PCI_BUS;
+typedef EFI_MISC_BIOS_VENDOR_DATA                         EFI_MISC_BIOS_VENDOR;
+typedef EFI_MISC_SYSTEM_MANUFACTURER_DATA                 EFI_MISC_SYSTEM_MANUFACTURER;
+typedef EFI_MISC_BASE_BOARD_MANUFACTURER_DATA             EFI_MISC_BASE_BOARD_MANUFACTURER;
+typedef EFI_MISC_CHASSIS_MANUFACTURER_DATA                EFI_MISC_CHASSIS_MANUFACTURER;
+typedef EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA  EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR;
+typedef EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA             EFI_MISC_SYSTEM_SLOT_DESIGNATION;
+typedef EFI_MISC_ONBOARD_DEVICE_DATA                      EFI_MISC_ONBOARD_DEVICE;
+typedef EFI_MISC_POINTING_DEVICE_TYPE_DATA                EFI_MISC_ONBOARD_DEVICE_TYPE_DATA;
+typedef EFI_MISC_OEM_STRING_DATA                          EFI_MISC_OEM_STRING;
+typedef EFI_MISC_SYSTEM_OPTION_STRING_DATA                EFI_MISC_SYSTEM_OPTION_STRING;
+typedef EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA     EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES;
+typedef EFI_MISC_SYSTEM_LANGUAGE_STRING_DATA              EFI_MISC_SYSTEM_LANGUAGE_STRING;
+typedef EFI_MISC_SYSTEM_EVENT_LOG_DATA                    EFI_MISC_SYSTEM_EVENT_LOG;
+typedef EFI_MISC_BIS_ENTRY_POINT_DATA                     EFI_MISC_BIS_ENTRY_POINT;
+typedef EFI_MISC_BOOT_INFORMATION_STATUS_DATA             EFI_MISC_BOOT_INFORMATION_STATUS;
+typedef EFI_MISC_SYSTEM_POWER_SUPPLY_DATA                 EFI_MISC_SYSTEM_POWER_SUPPLY;
+typedef EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA         EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION;
+typedef EFI_MISC_SCHEDULED_POWER_ON_MONTH_DATA            EFI_MISC_SCHEDULED_POWER_ON_MONTH;
+typedef EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_DATA           EFI_MISC_VOLTAGE_PROBE_DESCRIPTION;
+typedef EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA            EFI_MISC_COOLING_DEVICE_TEMP_LINK;
+typedef EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA       EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION;
+typedef EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_DATA
+                                                          EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION;
+typedef EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_DATA       EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION;
+typedef EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_DATA EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION;
+typedef EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA
+                                                          EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It is implementation-specific to simplify the code logic.
+///
+typedef union {
+  EFI_MISC_LAST_PCI_BUS_DATA                         LastPciBus;
+  EFI_MISC_BIOS_VENDOR_DATA                          MiscBiosVendor;
+  EFI_MISC_SYSTEM_MANUFACTURER_DATA                  MiscSystemManufacturer;
+  EFI_MISC_BASE_BOARD_MANUFACTURER_DATA              MiscBaseBoardManufacturer;
+  EFI_MISC_CHASSIS_MANUFACTURER_DATA                 MiscChassisManufacturer;
+  EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA   MiscPortInternalConnectorDesignator;
+  EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA              MiscSystemSlotDesignation;
+  EFI_MISC_ONBOARD_DEVICE_DATA                       MiscOnboardDevice;
+  EFI_MISC_OEM_STRING_DATA                           MiscOemString;
+  EFI_MISC_SYSTEM_OPTION_STRING_DATA                 MiscOptionString;
+  EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA      NumberOfInstallableLanguages;
+  EFI_MISC_SYSTEM_LANGUAGE_STRING_DATA               MiscSystemLanguageString;
+  EFI_MISC_SYSTEM_EVENT_LOG_DATA                     MiscSystemEventLog;
+  EFI_MISC_GROUP_NAME_DATA                           MiscGroupNameData;
+  EFI_MISC_GROUP_ITEM_SET_DATA                       MiscGroupItemSetData;
+  EFI_MISC_POINTING_DEVICE_TYPE_DATA                 MiscPointingDeviceTypeData;
+  EFI_MISC_RESET_CAPABILITIES_DATA                   MiscResetCapablilitiesData;
+  EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA           MiscHardwareSecuritySettingsData;
+  EFI_MISC_SCHEDULED_POWER_ON_MONTH_DATA             MiscScheduledPowerOnMonthData;
+  EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_DATA            MiscVoltagePorbeDescriptionData;
+  EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA             MiscCoolingDeviceTempLinkData;
+  EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA        MiscTemperatureProbeDescriptionData;
+  EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_DATA MiscElectricalCurrentProbeDescriptionData;
+  EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_DATA
+                                                     MiscRemoteAccessManufacturerDescriptionData;
+  EFI_MISC_BIS_ENTRY_POINT_DATA                      MiscBisEntryPoint;
+  EFI_MISC_BOOT_INFORMATION_STATUS_DATA              MiscBootInformationStatus;
+  EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_DATA        MiscMangementDeviceDescriptionData;
+  EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA
+                                                     MiscmangementDeviceComponentDescriptionData;
+  EFI_MISC_IPMI_INTERFACE_TYPE_DATA                  MiscIpmiInterfaceTypeData;
+  EFI_MISC_SYSTEM_POWER_SUPPLY_DATA                  MiscPowerSupplyInfo;
+  EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA          MiscSmbiosStructEncapsulation;
+  EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD               MiscManagementDeviceThreshold;
+} EFI_MISC_SUBCLASS_RECORDS;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It is implementation-specific to simplify the code logic.
+///
+typedef struct {
+  EFI_SUBCLASS_TYPE1_HEADER         Header;
+  EFI_MISC_SUBCLASS_RECORDS         Record;
+} EFI_MISC_SUBCLASS_DRIVER_DATA;
+#pragma pack()
+
+///
+/// Inconsistent with specification here:
+/// In DataHubSubclass specification 0.9 page 16, the following symbol is NOT defined.
+/// But value is meaningful, 0 means Reserved.
+///
+#define EFI_SUBCLASS_INSTANCE_RESERVED       0
+///
+/// Inconsistent with specification here:
+/// In DataHubSubclass specification 0.9 page 16, the following symbol is NOT defined.
+/// But value is meaningful, -1 means Not Applicable.
+///
+#define EFI_SUBCLASS_INSTANCE_NON_APPLICABLE 0xFFFF
+
+#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryDeviceFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryDeviceFunction.c
index 3872312c30..3e74ec31db 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryDeviceFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryDeviceFunction.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2006  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscMemoryDeviceFunction.c
@@ -22,8 +19,6 @@ Abstract:
 
 #include "CommonHeader.h"
 #include "MiscSubclassDriver.h"
-#include <Protocol/DataHub.h>
-#include <Guid/DataHubRecords.h>
 #include <Protocol/MemInfo.h>
 
 
@@ -46,13 +41,6 @@ enum {
 };
 
 
-typedef struct {
-  EFI_PHYSICAL_ADDRESS        MemoryArrayStartAddress;
-  EFI_PHYSICAL_ADDRESS        MemoryArrayEndAddress;
-  EFI_INTER_LINK_DATA         PhysicalMemoryArrayLink;
-  UINT16                      MemoryArrayPartitionWidth;
-} EFI_MEMORY_ARRAY_START_ADDRESS;
-
 /**
   This function makes boot time changes to the contents of the
   MiscBiosVendor (Type 0).
@@ -108,6 +96,7 @@ MISC_SMBIOS_TABLE_FUNCTION( MiscMemoryDevice )
     EFI_STATUS                      Status;
     STRING_REF                      TokenToGet;
     SMBIOS_TABLE_TYPE17             *SmbiosRecord;
+    SMBIOS_TABLE_TYPE19             *SmbiosRecord19;
     EFI_SMBIOS_HANDLE               SmbiosHandle;
     EFI_MEMORY_ARRAY_LINK_DATA      *ForType17InputData;
     UINT16                          DdrFreq=0;
@@ -117,6 +106,7 @@ MISC_SMBIOS_TABLE_FUNCTION( MiscMemoryDevice )
 
     UINT8                           Dimm;
     UINT8                           NumSlots;
+    UINT64                          TotalMemorySize;
     STRING_REF                      DevLocator[] = {
       STRING_TOKEN(STR_MISC_MEM_DEV_LOCATOR0), STRING_TOKEN(STR_MISC_MEM_DEV_LOCATOR1)
     };
@@ -183,137 +173,193 @@ MISC_SMBIOS_TABLE_FUNCTION( MiscMemoryDevice )
           break;
     }
 
-    for (Dimm = 0; Dimm < NumSlots; Dimm++) {
-    //
-    // Memory Device Locator
-    //
-    TokenToGet = DevLocator[Dimm];
-    MemDevice = SmbiosMiscGetString (TokenToGet);
-    MemDeviceStrLen = StrLen(MemDevice);
-    if (MemDeviceStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    TokenToGet = DevLocator[Dimm];
-    MemDevice = SmbiosMiscGetString (TokenToGet);
-    MemDeviceStrLen = StrLen(MemDevice);
-    if (MemDeviceStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Memory Bank Locator
-    //
-    TokenToGet = BankLocator[Dimm];
-    MemBankLocator = SmbiosMiscGetString (TokenToGet);
-    MemBankLocatorStrLen = StrLen(MemBankLocator);
-    if (MemBankLocatorStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Memory Manufacturer
-    //
-    TokenToGet = STRING_TOKEN (STR_MISC_MEM_MANUFACTURER);
-    MemManufacturer = SmbiosMiscGetString (TokenToGet);
-    MemManufacturerStrLen = StrLen(MemManufacturer);
-    if (MemManufacturerStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Memory Serial Number
-    //
-    TokenToGet = STRING_TOKEN (STR_MISC_MEM_SERIAL_NO);
-    MemSerialNumber = SmbiosMiscGetString (TokenToGet);
-    MemSerialNumberStrLen = StrLen(MemSerialNumber);
-    if (MemSerialNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Memory Asset Tag Number
-    //
-    TokenToGet = STRING_TOKEN (STR_MISC_MEM_ASSET_TAG);
-    MemAssetTag = SmbiosMiscGetString (TokenToGet);
-    MemAssetTagStrLen = StrLen(MemAssetTag);
-    if (MemAssetTagStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Memory Part Number
-    //
-    TokenToGet = STRING_TOKEN (STR_MISC_MEM_PART_NUMBER);
-    MemPartNumber = SmbiosMiscGetString (TokenToGet);
-    MemPartNumberStrLen = StrLen(MemPartNumber);
-    if (MemPartNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Two zeros following the last string.
-    //
-    SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE17) + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1 + MemAssetTagStrLen+1 + MemPartNumberStrLen + 1 + 1);
-    ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE17) +  MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1 + MemAssetTagStrLen+1 + MemPartNumberStrLen + 1 + 1);
-
-    SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_MEMORY_DEVICE;
-    SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE17);
-
-    //
-    // Make handle chosen by smbios protocol.add automatically.
-    //
-    SmbiosRecord->Hdr.Handle = 0;
-
-    //
-    // Memory Array Handle will be the 3rd optional string following the formatted structure.
-    //
     GetType16Hndl( Smbios, &Type16Handle);
-    SmbiosRecord->MemoryArrayHandle = Type16Handle;
+    TotalMemorySize = 0;
+    for (Dimm = 0; Dimm < NumSlots; Dimm++) {
+      //
+      // Memory Device Locator
+      //
+      TokenToGet = DevLocator[Dimm];
+      MemDevice = SmbiosMiscGetString (TokenToGet);
+      MemDeviceStrLen = StrLen(MemDevice);
+      if (MemDeviceStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
 
-    //
-    // Memory Size
-    //
-    if ((MemInfoHob->MemInfoData.dimmSize[Dimm])!=0){
-    SmbiosRecord->TotalWidth = 32;
-    SmbiosRecord->DataWidth = 32;
-    SmbiosRecord->Size = MemInfoHob->MemInfoData.dimmSize[Dimm];
-    SmbiosRecord->Speed = DdrFreq;
-    SmbiosRecord->ConfiguredMemoryClockSpeed = DdrFreq;
-    SmbiosRecord->FormFactor = EfiMemoryFormFactorDimm;
-    }
+      TokenToGet = DevLocator[Dimm];
+      MemDevice = SmbiosMiscGetString (TokenToGet);
+      MemDeviceStrLen = StrLen(MemDevice);
+      if (MemDeviceStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Memory Bank Locator
+      //
+      TokenToGet = BankLocator[Dimm];
+      MemBankLocator = SmbiosMiscGetString (TokenToGet);
+      MemBankLocatorStrLen = StrLen(MemBankLocator);
+      if (MemBankLocatorStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Memory Manufacturer
+      //
+      TokenToGet = STRING_TOKEN (STR_MISC_MEM_MANUFACTURER);
+      MemManufacturer = SmbiosMiscGetString (TokenToGet);
+      MemManufacturerStrLen = StrLen(MemManufacturer);
+      if (MemManufacturerStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Memory Serial Number
+      //
+      TokenToGet = STRING_TOKEN (STR_MISC_MEM_SERIAL_NO);
+      MemSerialNumber = SmbiosMiscGetString (TokenToGet);
+      MemSerialNumberStrLen = StrLen(MemSerialNumber);
+      if (MemSerialNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Memory Asset Tag Number
+      //
+      TokenToGet = STRING_TOKEN (STR_MISC_MEM_ASSET_TAG);
+      MemAssetTag = SmbiosMiscGetString (TokenToGet);
+      MemAssetTagStrLen = StrLen(MemAssetTag);
+      if (MemAssetTagStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Memory Part Number
+      //
+      TokenToGet = STRING_TOKEN (STR_MISC_MEM_PART_NUMBER);
+      MemPartNumber = SmbiosMiscGetString (TokenToGet);
+      MemPartNumberStrLen = StrLen(MemPartNumber);
+      if (MemPartNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Two zeros following the last string.
+      //
+      SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE17) + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1 + MemAssetTagStrLen+1 + MemPartNumberStrLen + 1 + 1);
+      ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE17) +  MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1 + MemAssetTagStrLen+1 + MemPartNumberStrLen + 1 + 1);
+
+      SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_MEMORY_DEVICE;
+      SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE17);
+
+      //
+      // Make handle chosen by smbios protocol.add automatically.
+      //
+      SmbiosRecord->Hdr.Handle = 0;
+
+      //
+      // Memory Array Handle will be the 3rd optional string following the formatted structure.
+      //
+      SmbiosRecord->MemoryArrayHandle = Type16Handle;
+
+      //
+      // Memory Size
+      //
+      if ((MemInfoHob->MemInfoData.dimmSize[Dimm])!=0){
+        SmbiosRecord->TotalWidth = 32;
+        SmbiosRecord->DataWidth = 32;
+        SmbiosRecord->Size = MemInfoHob->MemInfoData.dimmSize[Dimm];
+        SmbiosRecord->Speed = DdrFreq;
+        SmbiosRecord->ConfiguredMemoryClockSpeed = DdrFreq;
+        SmbiosRecord->FormFactor = EfiMemoryFormFactorDimm;
+      }
 
-    SmbiosRecord->DeviceSet =(UINT8) ForType17InputData->MemoryDeviceSet;
-    SmbiosRecord->DeviceLocator= 1;
-    SmbiosRecord->BankLocator = 2;
+      SmbiosRecord->DeviceSet =(UINT8) ForType17InputData->MemoryDeviceSet;
+      SmbiosRecord->DeviceLocator= 1;
+      SmbiosRecord->BankLocator = 2;
 
 
-    SmbiosRecord->Manufacturer = 3;
-    SmbiosRecord->SerialNumber= 4;
-    SmbiosRecord->AssetTag= 5;
-    SmbiosRecord->PartNumber= 6;
-    SmbiosRecord->Attributes = (UINT8) ForType17InputData->MemoryState;
-    SmbiosRecord->MemoryType = MemoryType;
+      SmbiosRecord->Manufacturer = 3;
+      SmbiosRecord->SerialNumber= 4;
+      SmbiosRecord->AssetTag= 5;
+      SmbiosRecord->PartNumber= 6;
+      SmbiosRecord->Attributes = (UINT8) ForType17InputData->MemoryState;
+      SmbiosRecord->MemoryType = MemoryType;
 
-    OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
-    UnicodeStrToAsciiStr(MemDevice, OptionalStrStart);
-    UnicodeStrToAsciiStr(MemBankLocator, OptionalStrStart + MemDeviceStrLen + 1);
-    UnicodeStrToAsciiStr(MemManufacturer, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1);
-    UnicodeStrToAsciiStr(MemSerialNumber, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1);
-    UnicodeStrToAsciiStr(MemAssetTag, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1);
-    UnicodeStrToAsciiStr(MemPartNumber, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1+ MemAssetTagStrLen+1 );
+      OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
+      UnicodeStrToAsciiStr(MemDevice, OptionalStrStart);
+      UnicodeStrToAsciiStr(MemBankLocator, OptionalStrStart + MemDeviceStrLen + 1);
+      UnicodeStrToAsciiStr(MemManufacturer, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1);
+      UnicodeStrToAsciiStr(MemSerialNumber, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1);
+      UnicodeStrToAsciiStr(MemAssetTag, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1);
+      UnicodeStrToAsciiStr(MemPartNumber, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1+ MemAssetTagStrLen+1 );
+
+      //
+      // Now we have got the full smbios record, call smbios protocol to add this record.
+      //
+      SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+      Status = Smbios-> Add(
+                          Smbios,
+                          NULL,
+                          &SmbiosHandle,
+                          (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord
+                          );
+
+      if ((SmbiosRecord->Size & BIT15) != 0) {
+        //
+        // Size is in KB
+        //
+        TotalMemorySize = TotalMemorySize + LShiftU64 (SmbiosRecord->Size, 10);
+      } else {
+        //
+        // Size is in MB
+        //
+        TotalMemorySize = TotalMemorySize + LShiftU64 (SmbiosRecord->Size, 20);
+      }
+
+      FreePool(SmbiosRecord);
+    }
+
+    //
+    // Allocate and zero SMBIOS TYPE 19 Record
+    //
+    SmbiosRecord19 = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE19));
+    ASSERT (SmbiosRecord19 != NULL);
+
+    //
+    // Fill in SMBIOS type 19 information
+    //
+    SmbiosRecord19->Hdr.Type = SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS;
+    SmbiosRecord19->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE19);
+    SmbiosRecord19->Hdr.Handle = 0;
+
+    SmbiosRecord19->MemoryArrayHandle       = Type16Handle;
+    SmbiosRecord19->PartitionWidth          = NumSlots;
+    if (TotalMemorySize <= SIZE_4TB) {
+      SmbiosRecord19->StartingAddress         = 0x0;
+      //
+      // Convert bytes to KB
+      //
+      SmbiosRecord19->EndingAddress           = (UINT32)RShiftU64 (TotalMemorySize, 10) - 1;
+      SmbiosRecord19->ExtendedStartingAddress = 0;
+      SmbiosRecord19->ExtendedEndingAddress   = 0;
+    } else {
+      SmbiosRecord19->StartingAddress         = 0xffffffff;
+      SmbiosRecord19->EndingAddress           = 0xffffffff;
+      SmbiosRecord19->ExtendedStartingAddress = 0;
+      SmbiosRecord19->ExtendedEndingAddress   = TotalMemorySize - 1;
+    }
 
     //
-    // Now we have got the full smbios record, call smbios protocol to add this record.
+    // Add SMBIOS type 19 record to SMBIOS table.
     //
     SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
-    Status = Smbios-> Add(
-                        Smbios,
-                        NULL,
-                        &SmbiosHandle,
-                        (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord
-                        );
-    FreePool(SmbiosRecord);
-    }
+    Smbios->Add(
+              Smbios,
+              NULL,
+              &SmbiosHandle,
+              (EFI_SMBIOS_TABLE_HEADER *)SmbiosRecord19
+              );
+
     return Status;
 }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
index 2f25ab802b..97a782e362 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
@@ -17,7 +17,6 @@ Abstract:
 #include "CommonHeader.h"
 
 #include "MiscSubclassDriver.h"
-#include <Protocol/DataHub.h>
 #include <Library/HiiLib.h>
 #include <Library/PrintLib.h>
 #include <Protocol/PciRootBridgeIo.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheData.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheData.c
index 6af7f56107..44f2530ac3 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheData.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheData.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c) 2012 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2012 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscBiosProcessorCache.c
@@ -28,6 +25,4 @@ Abstract:
 //
 // Static (possibly build generated) Processor cache data.
 //
-MISC_SMBIOS_TABLE_DATA(EFI_CACHE_VARIABLE_RECORD, MiscProcessorCache) = {
-0
-};
+MISC_SMBIOS_TABLE_DATA(UINTN, MiscProcessorCache) = 0;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheFunction.c
index ca121525a0..c64e87e20b 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheFunction.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2006  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscProcessorCacheFunction.c
@@ -20,170 +17,144 @@ Abstract:
 --*/
 #include "CommonHeader.h"
 #include "MiscSubclassDriver.h"
-#include <Protocol/DataHub.h>
-#include <Guid/DataHubRecords.h>
-
-UINT32
-ConvertBase2ToRaw (
-  IN  EFI_EXP_BASE2_DATA             *Data)
-{
-  UINTN         Index;
-  UINT32        RawData;
-
-  RawData = Data->Value;
-  for (Index = 0; Index < (UINTN) Data->Exponent; Index++) {
-     RawData <<= 1;
-  }
-
-  return  RawData;
-}
-
+#include <Register/Cpuid.h>
 
 MISC_SMBIOS_TABLE_FUNCTION(MiscProcessorCache)
 {
 	EFI_SMBIOS_HANDLE     SmbiosHandle;
-	SMBIOS_TABLE_TYPE7            *SmbiosRecordL1;
-	SMBIOS_TABLE_TYPE7            *SmbiosRecordL2;
+	SMBIOS_TABLE_TYPE7            *SmbiosRecord;
 
 	EFI_CACHE_SRAM_TYPE_DATA      CacheSramType;
 	CHAR16                          *SocketDesignation;
 	CHAR8                           *OptionalStrStart;
 	UINTN                           SocketStrLen;
 	STRING_REF                      TokenToGet;
-	EFI_DATA_HUB_PROTOCOL           *DataHub;
-	UINT64                          MonotonicCount;
-	EFI_DATA_RECORD_HEADER          *Record;
-	EFI_SUBCLASS_TYPE1_HEADER       *DataHeader;
-	UINT8                           *SrcData;
-	EFI_STATUS                      Status;
+  UINT32                          SubIndex;
+  CPUID_CACHE_PARAMS_EAX          CacheParamsEax;
+  CPUID_CACHE_PARAMS_EBX          CacheParamsEbx;
+  UINT32                          RegisterEcx;
+  CPUID_CACHE_PARAMS_EDX          CacheParamsEdx;
+  UINT8                           SystemCacheType;
+  UINTN                           Size;
 
 	//
-	// Memory Device LOcator
+	// Memory Device Locator
 	//
-	DEBUG ((EFI_D_ERROR, "type 7\n"));
-
 	TokenToGet = STRING_TOKEN (STR_SOCKET_DESIGNATION);
 	SocketDesignation = SmbiosMiscGetString (TokenToGet);
 	SocketStrLen = StrLen(SocketDesignation);
 	if (SocketStrLen > SMBIOS_STRING_MAX_LENGTH) {
-	return EFI_UNSUPPORTED;
+	  return EFI_UNSUPPORTED;
 	}
 
-	SmbiosRecordL1 = AllocatePool(sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);
-	ASSERT (SmbiosRecordL1 != NULL);
-	ZeroMem(SmbiosRecordL1, sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);
-
-	SmbiosRecordL2 = AllocatePool(sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);
-	ASSERT (SmbiosRecordL2 != NULL);
-	ZeroMem(SmbiosRecordL2, sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);
-
-	//
-	// Get the Data Hub Protocol. Assume only one instance
-	//
-	Status = gBS->LocateProtocol (
-	                &gEfiDataHubProtocolGuid,
-	                NULL,
-	                (VOID **)&DataHub
-	                );
-	ASSERT_EFI_ERROR(Status);
-
-	MonotonicCount = 0;
-	Record = NULL;
-
-	do {
-	Status = DataHub->GetNextRecord (
-	                    DataHub,
-	                    &MonotonicCount,
-	                    NULL,
-	                    &Record
-	                    );
-		if (!EFI_ERROR(Status)) {
-			if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
-				DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);
-				SrcData     = (UINT8  *)(DataHeader + 1);
-				if (CompareGuid(&Record->DataRecordGuid, &gEfiCacheSubClassGuid) && (DataHeader->RecordType == CacheSizeRecordType)) {
-          			if (DataHeader->SubInstance == EFI_CACHE_L1) {
-						SmbiosRecordL1->InstalledSize += (UINT16) (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10);
-						SmbiosRecordL1->MaximumCacheSize = SmbiosRecordL1->InstalledSize;
-          			}
-         			 else if (DataHeader->SubInstance == EFI_CACHE_L2) {
-						SmbiosRecordL2->InstalledSize += (UINT16) (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10);
-						SmbiosRecordL2->MaximumCacheSize = SmbiosRecordL2->InstalledSize;
-          			} else {
-           				 continue;
-          			}
-		  		}
-	      	}
-    	}
-	} while (!EFI_ERROR(Status) && (MonotonicCount != 0));
-
-	//
-	//Filling SMBIOS type 7 information for different cache levels.
-	//
-
-	SmbiosRecordL1->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;
-	SmbiosRecordL1->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE7);
-	SmbiosRecordL1->Hdr.Handle = 0;
-
-	SmbiosRecordL1->Associativity = CacheAssociativity8Way;
-	SmbiosRecordL1->SystemCacheType = CacheTypeUnknown;
-	SmbiosRecordL1->SocketDesignation = 0x01;
-	SmbiosRecordL1->CacheSpeed = 0;
-	SmbiosRecordL1->CacheConfiguration = 0x0180;
-	ZeroMem (&CacheSramType, sizeof (EFI_CACHE_SRAM_TYPE_DATA));
-	CacheSramType.Synchronous = 1;
-	CopyMem(&SmbiosRecordL1->SupportedSRAMType, &CacheSramType, 2);
-	CopyMem(&SmbiosRecordL1->CurrentSRAMType, &CacheSramType, 2);
-	SmbiosRecordL1->ErrorCorrectionType = EfiCacheErrorSingleBit;
-
-
-	SmbiosRecordL2->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;
-	SmbiosRecordL2->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE7);
-	SmbiosRecordL2->Hdr.Handle = 0;
-
-	SmbiosRecordL2->Associativity = CacheAssociativity16Way;
-	SmbiosRecordL2->SystemCacheType = CacheTypeInstruction;
-	SmbiosRecordL2->SocketDesignation = 0x01;
-	SmbiosRecordL2->CacheSpeed = 0;
-	SmbiosRecordL2->CacheConfiguration = 0x0281;
-	ZeroMem (&CacheSramType, sizeof (EFI_CACHE_SRAM_TYPE_DATA));
-	CacheSramType.Synchronous = 1;
-	CopyMem(&SmbiosRecordL2->SupportedSRAMType, &CacheSramType, 2);
-	CopyMem(&SmbiosRecordL2->CurrentSRAMType, &CacheSramType, 2);
-	SmbiosRecordL2->ErrorCorrectionType = EfiCacheErrorSingleBit;
-
-
-
-	//
-	//Adding SMBIOS type 7 records to SMBIOS table.
-	//
-	SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
-	OptionalStrStart = (CHAR8 *)(SmbiosRecordL1 + 1);
-	UnicodeStrToAsciiStr(SocketDesignation, OptionalStrStart);
-
-	Smbios-> Add(
-	           Smbios,
-	           NULL,
-	           &SmbiosHandle,
-	           (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecordL1
-	           );
-
-	//
-	//VLV2 incorporates two SLM modules (quad cores) in the SoC. 2 cores share BIU/L2 cache
-	//
-	SmbiosRecordL2->InstalledSize = (SmbiosRecordL2->InstalledSize)/2;
-	SmbiosRecordL2->MaximumCacheSize = SmbiosRecordL2->InstalledSize;
-	SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
-
-	OptionalStrStart = (CHAR8 *)(SmbiosRecordL2 + 1);
-	UnicodeStrToAsciiStr(SocketDesignation, OptionalStrStart);
-
-	Smbios-> Add(
-	           Smbios,
-	           NULL,
-	           &SmbiosHandle,
-	           (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecordL2
-	           );
-
+  //
+  // Retrieve cache level information using CPUID
+  //
+  for (SubIndex = 0; ; SubIndex++) {
+    AsmCpuidEx (
+      CPUID_CACHE_PARAMS,
+      SubIndex,
+      &CacheParamsEax.Uint32,
+      &CacheParamsEbx.Uint32,
+      &RegisterEcx,
+      &CacheParamsEdx.Uint32
+      );
+    //
+    // Terminate loop when CacheType is CPUID_CACHE_PARAMS_CACHE_TYPE_NULL
+    //
+    if (CacheParamsEax.Bits.CacheType == CPUID_CACHE_PARAMS_CACHE_TYPE_NULL) {
+      break;
+    }
+
+    //
+    // Allocate and zero SMBIOS TYPE 7 Record
+    //
+	  SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);
+	  ASSERT (SmbiosRecord != NULL);
+
+    //
+    // Compute cache size in bytes
+    //
+    Size = (CacheParamsEbx.Bits.Ways + 1) *
+           (CacheParamsEbx.Bits.LinePartitions + 1) *
+           (CacheParamsEbx.Bits.LineSize + 1) *
+           (RegisterEcx + 1);
+    DEBUG ((DEBUG_INFO, "MiscProcessorCache(): Cache Type = %d  Cache Level = %d  Size = %x\n", CacheParamsEax.Bits.CacheType, CacheParamsEax.Bits.CacheLevel, Size));
+
+    //
+    // Determine SMBIOS SystemCacheType
+    //
+    switch (CacheParamsEax.Bits.CacheType) {
+    case 1:
+      SystemCacheType = CacheTypeData;
+      break;
+    case 2:
+      SystemCacheType = CacheTypeInstruction;
+      break;
+    case 3:
+      SystemCacheType = CacheTypeUnified;
+      break;
+    default:
+      SystemCacheType = CacheTypeUnknown;
+    }
+
+    //
+    // Update cache sizes in KB
+    //
+    switch (CacheParamsEax.Bits.CacheLevel) {
+    case 1:
+      SmbiosRecord->InstalledSize      = (UINT16)(Size >> 10);
+      SmbiosRecord->MaximumCacheSize   = SmbiosRecord->InstalledSize;
+      SmbiosRecord->SystemCacheType    = SystemCacheType;
+      SmbiosRecord->Associativity      = CacheAssociativity8Way;
+      SmbiosRecord->CacheConfiguration = 0x0180;
+      break;
+    case 2:
+      SmbiosRecord->InstalledSize      = (UINT16)(Size >> 10);
+      SmbiosRecord->MaximumCacheSize   = SmbiosRecord->InstalledSize;
+      SmbiosRecord->SystemCacheType    = SystemCacheType;
+      SmbiosRecord->Associativity      = CacheAssociativity16Way;
+      SmbiosRecord->CacheConfiguration = 0x0281;
+	    //
+	    //VLV2 incorporates two SLM modules (quad cores) in the SoC.
+      // 2 cores share BIU/L2 cache
+	    //
+	    SmbiosRecord->InstalledSize    = SmbiosRecord->InstalledSize / 2;
+	    SmbiosRecord->MaximumCacheSize = SmbiosRecord->InstalledSize;
+      break;
+    default:
+      DEBUG ((DEBUG_ERROR, "MiscProcessorCache(): Unexpected cache level %d\n", CacheParamsEax.Bits.CacheLevel));
+      break;
+    }
+
+	  //
+	  //Filling SMBIOS type 7 information for different cache levels.
+	  //
+	  SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;
+	  SmbiosRecord->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE7);
+	  SmbiosRecord->Hdr.Handle = 0;
+
+	  SmbiosRecord->SocketDesignation = 0x01;
+	  SmbiosRecord->CacheSpeed = 0;
+	  ZeroMem (&CacheSramType, sizeof (EFI_CACHE_SRAM_TYPE_DATA));
+	  CacheSramType.Synchronous = 1;
+	  CopyMem(&SmbiosRecord->SupportedSRAMType, &CacheSramType, 2);
+	  CopyMem(&SmbiosRecord->CurrentSRAMType, &CacheSramType, 2);
+	  SmbiosRecord->ErrorCorrectionType = EfiCacheErrorSingleBit;
+
+	  //
+	  // Adding SMBIOS type 7 records to SMBIOS table.
+	  //
+	  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+	  OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
+	  UnicodeStrToAsciiStr(SocketDesignation, OptionalStrStart);
+
+	  Smbios->Add(
+	            Smbios,
+	            NULL,
+	            &SmbiosHandle,
+	            (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord
+	            );
+  }
 	return EFI_SUCCESS;
 }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorInformationFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorInformationFunction.c
index e01693ede7..e71a03ceac 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorInformationFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorInformationFunction.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2006  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscProcessorInformationFunction.c
@@ -23,9 +20,9 @@ Abstract:
 #include "MiscSubclassDriver.h"
 
 #include <Protocol/MpService.h>
-#include <Protocol/DataHub.h>
-#include <Guid/DataHubRecords.h>
 #include <Library/CpuIA32.h>
+#include <Library/TimerLib.h>
+#include <Register/Cpuid.h>
 
 #define EfiProcessorFamilyIntelAtomProcessor    0x2B
 
@@ -75,33 +72,6 @@ GetCacheHandle (
   *Handle = 0xFFFF;
 }
 
-
-/**
-  This function makes boot time changes to the contents of the
-  MiscProcessorInformation (Type 4).
-
-  @param  RecordData                 Pointer to copy of RecordData from the Data Table.
-
-  @retval EFI_SUCCESS                All parameters were valid.
-  @retval EFI_UNSUPPORTED            Unexpected RecordType value.
-  @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
-
-**/
-UINT32
-ConvertBase10ToRaw (
-  IN  EFI_EXP_BASE10_DATA             *Data)
-{
-  UINTN         Index;
-  UINT32        RawData;
-
-  RawData = Data->Value;
-  for (Index = 0; Index < (UINTN) Data->Exponent; Index++) {
-     RawData *= 10;
-  }
-
-  return  RawData;
-}
-
 #define BSEL_CR_OVERCLOCK_CONTROL	0xCD
 #define	FUSE_BSEL_MASK				0x03
 
@@ -137,6 +107,96 @@ DetermineiFsbFromMsr (
 
 }
 
+CHAR16 *
+CpuidSocVendorBrandString (
+  VOID
+  )
+{
+  UINT32  MaximumExtendedFunction;
+  //
+  // Array to store brand string from 3 brand string leafs with
+  // 4 32-bit brand string values per leaf and an extra value to
+  // null terminate the string.
+  //
+  UINT32  BrandString[3 * 4 + 1];
+  CHAR8   *AsciiBrandString;
+  CHAR16  *UnicodeBrandString;
+  UINTN   Length;
+
+  AsmCpuid (CPUID_EXTENDED_FUNCTION, &MaximumExtendedFunction, NULL, NULL, NULL);
+
+  ZeroMem (&BrandString, sizeof (BrandString));
+  if (CPUID_BRAND_STRING1 <= MaximumExtendedFunction) {
+    AsmCpuid (
+      CPUID_BRAND_STRING1,
+      &BrandString[0],
+      &BrandString[1],
+      &BrandString[2],
+      &BrandString[3]
+      );
+  }
+  if (CPUID_BRAND_STRING2 <= MaximumExtendedFunction) {
+    AsmCpuid (
+      CPUID_BRAND_STRING2,
+      &BrandString[4],
+      &BrandString[5],
+      &BrandString[6],
+      &BrandString[7]
+      );
+  }
+  if (CPUID_BRAND_STRING3 <= MaximumExtendedFunction) {
+    AsmCpuid (
+      CPUID_BRAND_STRING3,
+      &BrandString[8],
+      &BrandString[9],
+      &BrandString[10],
+      &BrandString[11]
+      );
+  }
+
+  //
+  // Skip spaces at the beginning of the brand string
+  //
+  for (AsciiBrandString = (CHAR8 *)BrandString; *AsciiBrandString == ' '; AsciiBrandString++);
+
+  DEBUG ((DEBUG_INFO, "Processor Brand String = %a\n", AsciiBrandString));
+
+  //
+  // Convert ASCII brand string to an allocated Unicode brand string
+  //
+  Length = AsciiStrLen (AsciiBrandString) + 1;
+  UnicodeBrandString = AllocatePool (Length * sizeof (CHAR16));
+  AsciiStrToUnicodeStrS (AsciiBrandString, UnicodeBrandString, Length);
+
+  DEBUG ((DEBUG_INFO, "Processor Unicode Brand String = %s\n", UnicodeBrandString));
+
+  return UnicodeBrandString;
+}
+
+UINT64
+MeasureTscFrequency (
+  VOID
+  )
+{
+  EFI_TPL  CurrentTpl;
+  UINT64   BeginValue;
+  UINT64   EndValue;
+  UINT64   Frequency;
+
+  //
+  // Wait for 10000us = 10ms for the calculation
+  // It needs a precise timer to calculate the ticks
+  //
+  CurrentTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);
+  BeginValue = AsmReadTsc ();
+  MicroSecondDelay (10000);
+  EndValue   = AsmReadTsc ();
+  gBS->RestoreTPL (CurrentTpl);
+  Frequency = MultU64x32 (EndValue - BeginValue, 1000);
+  Frequency = DivU64x32 (Frequency, 10);
+  return Frequency;
+}
+
 MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
 {
     CHAR8                           *OptionalStrStart;
@@ -152,7 +212,7 @@ MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
     UINTN                           SocketStrLen=0;
     UINTN                           AssetTagStrLen=0;
     UINTN                           PartNumberStrLen=0;
-    UINTN                           ProcessorVoltage=0xAE;
+    UINTN                           ProcessorVoltage=(BIT7 | 9);
     UINT32                          Eax01;
     UINT32                          Ebx01;
     UINT32                          Ecx01;
@@ -169,17 +229,8 @@ MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
     UINTN                           NumberOfProcessors=0;
     UINT64                          Frequency = 0;
     EFI_MP_SERVICES_PROTOCOL        *MpService;
-    EFI_DATA_HUB_PROTOCOL           *DataHub;
-    UINT64                          MonotonicCount;
-    EFI_DATA_RECORD_HEADER          *Record;
-    EFI_SUBCLASS_TYPE1_HEADER       *DataHeader;
-    UINT8                           *SrcData;
-    EFI_PROCESSOR_VERSION_DATA      *ProcessorVersion;
-    CHAR16                          *NewStringToken;
-    STRING_REF                      TokenToUpdate;
     PROCESSOR_ID_DATA               *ProcessorId = NULL;
 
-
     //
     // First check for invalid parameters.
     //
@@ -194,59 +245,6 @@ MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
       return EFI_INVALID_PARAMETER;
     }
 
-    //
-    // Get the Data Hub Protocol. Assume only one instance
-    //
-    Status = gBS->LocateProtocol (
-                    &gEfiDataHubProtocolGuid,
-                    NULL,
-                    (VOID **)&DataHub
-                    );
-    ASSERT_EFI_ERROR(Status);
-
-    MonotonicCount = 0;
-    Record = NULL;
-
-    do {
-      Status = DataHub->GetNextRecord (
-                          DataHub,
-                          &MonotonicCount,
-                          NULL,
-                          &Record
-                          );
-       if (!EFI_ERROR(Status)) {
-         if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
-
-            DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);
-            SrcData     = (UINT8  *)(DataHeader + 1);
-
-            //
-            // Processor
-            //
-            if (CompareGuid(&Record->DataRecordGuid, &gEfiProcessorSubClassGuid)) {
-              CopyMem (&mProcessorProducerGuid, &Record->ProducerName, sizeof(EFI_GUID));
-              switch (DataHeader->RecordType) {
-                case ProcessorVoltageRecordType:
-                  ProcessorVoltage = (((EFI_EXP_BASE10_DATA *)SrcData)->Value)/100 + 0x80;
-                  break;
-                case ProcessorCoreFrequencyRecordType:
-                  DEBUG ((EFI_D_ERROR, "ProcessorCoreFrequencyRecordType SrcData1 =%d\n", ConvertBase10ToRaw((EFI_EXP_BASE10_DATA *)SrcData)/1000000));
-                  Frequency = (ConvertBase10ToRaw((EFI_EXP_BASE10_DATA *)SrcData)/1000000);
-                  break;
-                case ProcessorVersionRecordType:
-                  ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *)SrcData;
-                  NewStringToken = HiiGetPackageString(&mProcessorProducerGuid, *ProcessorVersion, NULL);
-                  TokenToUpdate = (STRING_REF)STR_MISC_PROCESSOR_VERSION;
-                  HiiSetString(mHiiHandle, TokenToUpdate, NewStringToken, NULL);
-                  break;
-                default:
-                  break;
-              }
-            }
-          }
-        }
-    } while (!EFI_ERROR(Status) && (MonotonicCount != 0));
-
     //
     // Token to get for Socket Name
     //
@@ -270,8 +268,7 @@ MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
     //
     // Token to get for Processor Version
     //
-    TokenToGet = STRING_TOKEN (STR_MISC_PROCESSOR_VERSION);
-    Version = SmbiosMiscGetString (TokenToGet);
+    Version = CpuidSocVendorBrandString ();
     VersionStrLen = StrLen(Version);
     if (VersionStrLen > SMBIOS_STRING_MAX_LENGTH) {
         return EFI_UNSUPPORTED;
@@ -372,10 +369,12 @@ MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
     SmbiosRecord -> ProcessorFamily2 = ForType4InputData-> VariableRecord.ProcessorFamily;
 
     //
-    // Processor speed
+    // Processor speed in MHz
     //
-    SmbiosRecord-> CurrentSpeed = *(UINT16*) & Frequency;
-    SmbiosRecord-> MaxSpeed = *(UINT16*) & Frequency;
+    Frequency = MeasureTscFrequency ();
+    Frequency = DivU64x32 (Frequency, 1000000);
+    SmbiosRecord-> CurrentSpeed = (UINT16)Frequency;
+    SmbiosRecord-> MaxSpeed = (UINT16)Frequency;
 
     //
     // Processor Characteristics
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c
index 93347a1a04..4c8e00801f 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c
@@ -1,21 +1,17 @@
 /** @file
 
-Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscSubclassDriverDataTable.c
 
 Abstract:
 
-  Create the mMiscSubclassDataTable structure, and it is used to report
-  any generate data to the DataHub.
-
+  Create the mMiscSubclassDataTable structure used to produce
+  SMBIOS records.
 
 **/
 
@@ -31,7 +27,7 @@ MISC_SMBIOS_TABLE_EXTERNS(EFI_MISC_BIOS_VENDOR_DATA, MiscBiosVendor, MiscBiosVen
 MISC_SMBIOS_TABLE_EXTERNS(EFI_MISC_SYSTEM_MANUFACTURER_DATA, MiscSystemManufacturer, MiscSystemManufacturer);
 MISC_SMBIOS_TABLE_EXTERNS(EFI_MISC_BASE_BOARD_MANUFACTURER_DATA, MiscBaseBoardManufacturer, MiscBaseBoardManufacturer);
 MISC_SMBIOS_TABLE_EXTERNS(EFI_MISC_CHASSIS_MANUFACTURER_DATA, MiscChassisManufacturer, MiscChassisManufacturer);
-MISC_SMBIOS_TABLE_EXTERNS(EFI_CACHE_VARIABLE_RECORD, MiscProcessorCache, MiscProcessorCache); //type 7
+MISC_SMBIOS_TABLE_EXTERNS(UINTN, MiscProcessorCache, MiscProcessorCache); //type 7
 MISC_SMBIOS_TABLE_EXTERNS(EFI_CPU_DATA_RECORD, MiscProcessorInformation, MiscProcessorInformation); //type 4
 MISC_SMBIOS_TABLE_EXTERNS(EFI_MEMORY_ARRAY_LOCATION_DATA, MiscPhysicalMemoryArray,MiscPhysicalMemoryArray);
 MISC_SMBIOS_TABLE_EXTERNS(EFI_MEMORY_ARRAY_LINK_DATA, MiscMemoryDevice, MiscMemoryDevice);
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverEntryPoint.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverEntryPoint.c
index e70732f5c2..cb677a0aa6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverEntryPoint.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverEntryPoint.c
@@ -1,20 +1,17 @@
 /** @file
 
-Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscSubclassDriverEntryPoint.c
 
 Abstract:
 
-  This driver parses the mMiscSubclassDataTable structure and reports
-  any generated data to the DataHub.
+  This driver parses the mMiscSubclassDataTable structure to
+  produce SMBIOS records.
 
 
 **/
@@ -99,7 +96,7 @@ Error:
 
 /**
   Standard EFI driver point.  This driver parses the mMiscSubclassDataTable
-  structure and reports any generated data to the DataHub.
+  structure to produce SMBIOS records.
 
   @param ImageHandle   - Handle for the image of this driver
   @param SystemTable   - Pointer to the EFI System Table
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
index 99b1a18185..92b51b1743 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
@@ -86,6 +86,7 @@ [Packages]
   MdePkg/MdePkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   NetworkPkg/NetworkPkg.dec
+  UefiCpuPkg/UefiCpuPkg.dec
 
 [LibraryClasses]
   HiiLib
@@ -105,6 +106,7 @@ [LibraryClasses]
   PchPlatformLib
   NetLib
   HobLib
+  TimerLib
   
 [Guids]
   gEfiNormalSetupGuid
@@ -114,7 +116,6 @@ [Guids]
 [Protocols]
   gEfiSmbiosProtocolGuid                        # PROTOCOL ALWAYS_CONSUMED
   gEfiDxeSmmReadyToLockProtocolGuid             # PROTOCOL ALWAYS_CONSUMED
-  gEfiDataHubProtocolGuid
   gEfiMpServiceProtocolGuid
   gMemInfoProtocolGuid
   gEfiTdtOperationProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
index 99db5490b6..dad27f130d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
@@ -35,8 +35,6 @@ Abstract:
 #include <PiDxe.h>
 #include <PchRegs.h>
 
-#include <Guid/DataHubRecords.h>
-
 #include <Protocol/IgdOpRegion.h>
 #include <Protocol/FirmwareVolume2.h>
 #include <Protocol/PlatformGopPolicy.h>
@@ -66,7 +64,6 @@ extern DXE_VLV_PLATFORM_POLICY_PROTOCOL  *DxePlatformSaPolicy;
 //
 
 IGD_OPREGION_PROTOCOL mIgdOpRegion;
-EFI_GUID              mMiscSubClass = EFI_MISC_SUBCLASS_GUID;
 EFI_EVENT             mConOutEvent;
 EFI_EVENT             mSetGOPverEvent;
 VOID                  *mConOutReg;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
index fe81a6e3bd..2aec0d1a9a 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
@@ -3,9 +3,8 @@
 #/*++
 #
 #  Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
-#                                                                                  
-
-# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
 #
 #  Module Name:
 #
@@ -65,7 +64,6 @@ [Depex]
   gDxeVlvPlatformPolicyGuid              AND
   gEfiPciRootBridgeIoProtocolGuid     AND
   gEfiCpuIo2ProtocolGuid                  AND
-  gEfiDataHubProtocolGuid                 AND
   gEfiGlobalNvsAreaProtocolGuid       AND
   gEfiFirmwareVolume2ProtocolGuid   AND
   gEfiHiiDatabaseProtocolGuid
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 09/14] Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (7 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 08/14] Vlv2TbltDevicePkg: Remove use of Data Hub Protocol Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:08   ` Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 10/14] Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe Michael D Kinney
                   ` (5 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

* Switch from Intel Framework SMBUS PPI to the PI Spec
  SMBUS2 PPI.
* Remove unused SmbusLib.  Use SmbusLibNull instead.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Include/Guid/PlatformInfo.h               |   9 +-
 .../BoardClkGens/BoardClkGens.c               |  23 +-
 .../BoardClkGens/BoardClkGens.h               |   8 +-
 .../MultiPlatformLib/BoardGpios/BoardGpios.c  |  12 +-
 .../MultiPlatformLib/BoardGpios/BoardGpios.h  |   7 +-
 .../MultiPlatformLib/MultiPlatformLib.h       |   4 -
 .../MultiPlatformLib/MultiPlatformLib.inf     |   2 +-
 .../Library/SmbusLib/CommonHeader.h           |  26 -
 .../Library/SmbusLib/SmbusLib.c               | 873 ------------------
 .../Library/SmbusLib/SmbusLib.inf             |  46 -
 .../Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c  | 319 -------
 .../PlatformInitPei/PlatformEarlyInit.h       |  10 +-
 .../PlatformPei/CommonHeader.h                |   1 -
 .../PlatformPei/PlatformPei.inf               |   1 -
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |   2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |   2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |   2 +-
 17 files changed, 24 insertions(+), 1323 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/CommonHeader.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/PlatformInfo.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/PlatformInfo.h
index cac31e2a40..afd4b6f4f0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/PlatformInfo.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/PlatformInfo.h
@@ -1,13 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
-
 Module Name:
 
   PlatformInfo.h
@@ -27,7 +23,6 @@ Abstract:
 #include <Library/HobLib.h>
 #include <Library/IoLib.h>
 #include <Library/DebugLib.h>
-#include <Library/SmbusLib.h>
 #include <IndustryStandard/SmBus.h>
 #endif
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c
index 919032c2df..4356f7b366 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c
@@ -1,12 +1,10 @@
 /** @file
   Clock generator setting for multiplatform.
 
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 **/
 
 #include <BoardClkGens.h>
@@ -44,7 +42,7 @@ CLOCK_GENERATOR_DETAILS   mSupportedClockGeneratorTable[] =
 EFI_STATUS
 ConfigureClockGenerator (
   IN     EFI_PEI_SERVICES              **PeiServices,
-  IN     EFI_PEI_SMBUS_PPI                 *SmbusPpi,
+  IN     EFI_PEI_SMBUS2_PPI            *SmbusPpi,
   IN     CLOCK_GENERATOR_TYPE          ClockType,
   IN     UINT8                         ClockAddress,
   IN     UINTN                         ConfigurationTableLength,
@@ -76,7 +74,6 @@ ConfigureClockGenerator (
   Length = sizeof (Buffer);
   Command = 0;
   Status = SmbusPpi->Execute (
-    PeiServices,
     SmbusPpi,
     SlaveAddress,
     Command,
@@ -116,7 +113,6 @@ ConfigureClockGenerator (
   Buffer[30] = 0x00;
 
   Status = SmbusPpi->Execute (
-    PeiServices,
     SmbusPpi,
     SlaveAddress,
     Command,
@@ -127,7 +123,6 @@ ConfigureClockGenerator (
     );
 #else
   Status = SmbusPpi->Execute (
-    PeiServices,
     SmbusPpi,
     SlaveAddress,
     Command,
@@ -142,7 +137,6 @@ ConfigureClockGenerator (
     Command = 4;
     Length = 1;
   Status = SmbusPpi->Execute (
-    PeiServices,
     SmbusPpi,
     SlaveAddress,
     Command,
@@ -164,7 +158,6 @@ ConfigureClockGenerator (
     Length = sizeof (Buffer);
       Command = 0;
       Status =  SmbusPpi->Execute (
-        PeiServices,
         SmbusPpi,
         SlaveAddress,
         Command,
@@ -201,7 +194,7 @@ ConfigureClockGenerator (
 UINT8
 ReadClockGeneratorID (
   IN     EFI_PEI_SERVICES              **PeiServices,
-  IN     EFI_PEI_SMBUS_PPI                 *SmbusPpi,
+  IN     EFI_PEI_SMBUS2_PPI            *SmbusPpi,
   IN     UINT8                         ClockAddress
   )
 {
@@ -217,7 +210,6 @@ ReadClockGeneratorID (
   Length = sizeof (Buffer);
   Command = 0;
   SmbusPpi->Execute (
-    PeiServices,
     SmbusPpi,
     SlaveAddress,
     Command,
@@ -289,7 +281,7 @@ ConfigurePlatformClocks (
   //
   Status = (**PeiServices).LocatePpi (
                              (CONST EFI_PEI_SERVICES **) PeiServices,
-                             &gEfiPeiSmbusPpiGuid,
+                             &gEfiPeiSmbus2PpiGuid,
                              0,
                              NULL,
                              &SmbusPpi
@@ -300,8 +292,7 @@ ConfigurePlatformClocks (
   SlaveAddress.SmbusDeviceAddress = ClockAddress >> 1;
   Length = 1;
   Command = 0x87;   //Control Register 7 Vendor ID Check
-  Status = ((EFI_PEI_SMBUS_PPI *) SmbusPpi)->Execute (
-                                               PeiServices,
+  Status = ((EFI_PEI_SMBUS2_PPI *) SmbusPpi)->Execute (
                                                SmbusPpi,
                                                SlaveAddress,
                                                Command,
@@ -405,7 +396,7 @@ ConfigurePlatformClocks (
 static EFI_PEI_NOTIFY_DESCRIPTOR    mNotifyList[] = {
   {
     EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
-    &gEfiPeiSmbusPpiGuid,
+    &gEfiPeiSmbus2PpiGuid,
     ConfigurePlatformClocks
   }
 };
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h
index e153933d72..fe0ed24af7 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h
@@ -3,11 +3,10 @@
 
   This file includes package header files, library classes.
 
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

 **/
 
 #ifndef _BOARD_CLK_GEN_H_
@@ -17,8 +16,7 @@
 #include <Library/HobLib.h>
 #include <Library/IoLib.h>
 #include <Library/DebugLib.h>
-#include <Library/SmbusLib.h>
-#include <Ppi/Smbus.h>
+#include <Ppi/Smbus2.h>
 #include <IndustryStandard/SmBus.h>
 #include <Guid/PlatformInfo.h>
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c
index 5790d045fc..a9e2c8c060 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c
@@ -1,12 +1,10 @@
 /** @file
   Gpio setting for multiplatform..
 
-  Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 **/
 
 #include <BoardGpios.h>
@@ -25,8 +23,6 @@
 //AlpineValley platform code end
 //
 
-EFI_GUID  gPeiSmbusPpiGuid               = EFI_PEI_SMBUS_PPI_GUID;
-
 /**
   @param None
 
@@ -66,7 +62,7 @@ ConfigurePlatformSysCtrlGpio (
 
   Status = (**PeiServices).LocatePpi (
                             (const EFI_PEI_SERVICES **)PeiServices,
-                            &gPeiSmbusPpiGuid,
+                            &gEfiPeiSmbus2PpiGuid,
                             0,
                             NULL,
                             (void **)&SmbusPpi
@@ -92,7 +88,7 @@ ConfigurePlatformSysCtrlGpio (
 static EFI_PEI_NOTIFY_DESCRIPTOR    mNotifyList[] = {
   {
     EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
-    &gEfiPeiSmbusPpiGuid,
+    &gEfiPeiSmbus2PpiGuid,
     ConfigurePlatformSysCtrlGpio
   }
 };
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h
index 0e19819b22..594616d63a 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h
@@ -3,11 +3,10 @@
 
   This file includes package header files, library classes.
 
-  Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

 **/
 
 #ifndef _BOARDGPIOS_H_
@@ -20,7 +19,7 @@
 #include <Library/IoLib.h>
 #include <Library/HobLib.h>
 #include <Guid/PlatformInfo.h>
-#include <Ppi/Smbus.h>
+#include <Ppi/Smbus2.h>
 #include <Ppi/ReadOnlyVariable2.h>
 #include <Guid/SetupVariable.h>
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
index 3fa9f7b129..13097fbc74 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
@@ -26,7 +26,6 @@
 
 #include <PiDxe.h>
 #include <Library/BaseLib.h>
-#include <FrameworkPei.h>
 
 #include "PlatformBaseAddresses.h"
 #include "PchAccess.h"
@@ -37,7 +36,6 @@
 #include <Ppi/Stall.h>
 #include <Guid/SetupVariable.h>
 #include <Ppi/AtaController.h>
-#include <Ppi/FindFv.h>
 #include <Ppi/BootInRecoveryMode.h>
 #include <Ppi/ReadOnlyVariable2.h>
 #include <Ppi/Capsule.h>
@@ -50,7 +48,6 @@
 #include <Library/BaseLib.h>
 #include <IndustryStandard/Pci22.h>
 #include <Ppi/Speaker.h>
-#include <Guid/FirmwareFileSystem.h>
 #include <Guid/MemoryTypeInformation.h>
 #include <Ppi/Reset.h>
 #include <Ppi/EndOfPeiPhase.h>
@@ -58,7 +55,6 @@
 #include <Guid/GlobalVariable.h>
 #include <Ppi/RecoveryModule.h>
 #include <Ppi/DeviceRecoveryModule.h>
-#include <Guid/Capsule.h>
 #include <Guid/RecoveryDevice.h>
 #include <Ppi/MasterBootMode.h>
 #include <Guid/PlatformInfo.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
index a4942a097c..7a084bea3c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
@@ -54,7 +54,6 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
 
 [LibraryClasses]
@@ -64,6 +63,7 @@ [LibraryClasses]
 
 [Ppis]
   gEfiPeiReadOnlyVariable2PpiGuid
+  gEfiPeiSmbus2PpiGuid
 
 [Pcd.common]
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/CommonHeader.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/CommonHeader.h
deleted file mode 100644
index d34dd942d3..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/CommonHeader.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/**@file
-  Common header file shared by all source files.
-
-  This file includes package header files, library classes.
-
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-**/
-
-#ifndef __COMMON_HEADER_H_
-#define __COMMON_HEADER_H_
-
-
-#include <Base.h>
-#include <PchAccess.h>
-
-#include <Library/SmbusLib.h>
-#include <Library/IoLib.h>
-#include <Library/PciLib.h>
-#include <Library/DebugLib.h>
-#include <Library/PcdLib.h>
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.c
deleted file mode 100644
index 4052724812..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.c
+++ /dev/null
@@ -1,873 +0,0 @@
-/** @file
-  Intel ICH9 SMBUS library implementation built upon I/O library.
-
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-
-#include "CommonHeader.h"
-
-/**
-  Gets Io port base address of Smbus Host Controller.
-
-  This internal function depends on a feature flag named PcdIchSmbusFixedIoPortBaseAddress
-  to retrieve Smbus Io port base. If that feature flag is true, it will get Smbus Io port base
-  address from a preset Pcd entry named PcdIchSmbusIoPortBaseAddress; otherwise, it will always
-  read Pci configuration space to get that value in each Smbus bus transaction.
-
-  @return The Io port base address of Smbus host controller.
-
-**/
-UINTN
-InternalGetSmbusIoPortBaseAddress (
-  VOID
-  )
-{
-  UINTN     IoPortBaseAddress;
-
-  IoPortBaseAddress = (UINTN) MmioRead32 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SMBUS, PCI_FUNCTION_NUMBER_PCH_SMBUS, R_PCH_SMBUS_BASE)) & B_PCH_SMBUS_BASE_BAR;
-
-  //
-  // Make sure that the IO port base address has been properly set.
-  //
-  ASSERT (IoPortBaseAddress != 0);
-
-  return IoPortBaseAddress;
-}
-
-/**
-  Acquires the ownership of SMBUS.
-
-  This internal function reads the host state register.
-  If the SMBUS is not available, RETURN_TIMEOUT is returned;
-  Otherwise, it performs some basic initializations and returns
-  RETURN_SUCCESS.
-
-  @param  IoPortBaseAddress The Io port base address of Smbus Host controller.
-
-  @retval RETURN_SUCCESS    The SMBUS command was executed successfully.
-  @retval RETURN_TIMEOUT    A timeout occurred while executing the SMBUS command.
-
-**/
-RETURN_STATUS
-InternalSmBusAcquire (
-  UINTN                     IoPortBaseAddress
-  )
-{
-  UINT8   HostStatus;
-
-  HostStatus = IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS);
-  if ((HostStatus & B_PCH_SMBUS_IUS) != 0) {
-    return RETURN_TIMEOUT;
-  } else if ((HostStatus & B_PCH_SMBUS_HBSY) != 0) {
-    //
-    // Clear host status register and exit.
-    //
-    IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS, B_PCH_SMBUS_HSTS_ALL);
-    return RETURN_TIMEOUT;
-  }
-  //
-  // Clear out any odd status information (Will Not Clear In Use).
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS, HostStatus);
-
-  return RETURN_SUCCESS;
-}
-
-/**
-  Starts the SMBUS transaction and waits until the end.
-
-  This internal function start the SMBUS transaction and waits until the transaction
-  of SMBUS is over by polling the INTR bit of Host status register.
-  If the SMBUS is not available, RETURN_TIMEOUT is returned;
-  Otherwise, it performs some basic initializations and returns
-  RETURN_SUCCESS.
-
-  @param  IoPortBaseAddress   The Io port base address of Smbus Host controller.
-  @param  HostControl         The Host control command to start SMBUS transaction.
-
-  @retval RETURN_SUCCESS      The SMBUS command was executed successfully.
-  @retval RETURN_CRC_ERROR    The checksum is not correct (PEC is incorrect).
-  @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected
-                              in the Host Status Register bit.  Device errors are
-                              a result of a transaction collision, illegal command field,
-                              unclaimed cycle (host initiated), or bus errors (collisions).
-
-**/
-RETURN_STATUS
-InternalSmBusStart (
-  IN  UINTN                   IoPortBaseAddress,
-  IN  UINT8                   HostControl
-  )
-{
-  UINT8   HostStatus;
-  UINT8   AuxiliaryStatus;
-
-  //
-  // Set Host Control Register (Initiate Operation, Interrupt disabled).
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HCTL, (UINT8)(HostControl + B_PCH_SMBUS_START));
-
-  do {
-    //
-    // Poll INTR bit of Host Status Register.
-    //
-    HostStatus = IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS);
-  } while ((HostStatus & (B_PCH_SMBUS_INTR | B_PCH_SMBUS_ERRORS | B_PCH_SMBUS_BYTE_DONE_STS)) == 0);
-
-  if ((HostStatus & B_PCH_SMBUS_ERRORS) == 0) {
-    return RETURN_SUCCESS;
-  }
-
-  //
-  // Clear error bits of Host Status Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS, B_PCH_SMBUS_ERRORS);
-
-  //
-  // Read Auxiliary Status Register to judge CRC error.
-  //
-  AuxiliaryStatus = IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_AUXS);
-  if ((AuxiliaryStatus & B_PCH_SMBUS_CRCE) != 0) {
-    return RETURN_CRC_ERROR;
-  }
-
-  return RETURN_DEVICE_ERROR;
-}
-
-/**
-  Executes an SMBUS quick, byte or word command.
-
-  This internal function executes an SMBUS quick, byte or word commond.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-
-  @param  HostControl     The value of Host Control Register to set.
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Value           The byte/word write to the SMBUS.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The byte/word read from the SMBUS.
-
-**/
-UINT16
-InternalSmBusNonBlock (
-  IN  UINT8                     HostControl,
-  IN  UINTN                     SmBusAddress,
-  IN  UINT16                    Value,
-  OUT RETURN_STATUS             *Status
-  )
-{
-  RETURN_STATUS                 ReturnStatus;
-  UINTN                         IoPortBaseAddress;
-  UINT8                         AuxiliaryControl;
-
-  IoPortBaseAddress = InternalGetSmbusIoPortBaseAddress ();
-
-  //
-  // Try to acquire the ownership of ICH SMBUS.
-  //
-  ReturnStatus = InternalSmBusAcquire (IoPortBaseAddress);
-  if (RETURN_ERROR (ReturnStatus)) {
-    goto Done;
-  }
-
-  //
-  // Set the appropriate Host Control Register and auxiliary Control Register.
-  //
-  AuxiliaryControl = 0;
-  if (SMBUS_LIB_PEC (SmBusAddress)) {
-    AuxiliaryControl |= B_PCH_SMBUS_AAC;
-    HostControl      |= B_PCH_SMBUS_PEC_EN;
-  }
-
-  //
-  // Set Host Command Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HCMD, (UINT8) SMBUS_LIB_COMMAND (SmBusAddress));
-
-  //
-  // Write value to Host Data 0 and Host Data 1 Registers.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HD0, (UINT8) Value);
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HD1, (UINT8) (Value >> 8));
-
-  //
-  // Set Auxiliary Control Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_AUXC, AuxiliaryControl);
-
-  //
-  // Set SMBUS slave address for the device to send/receive from.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_TSA, (UINT8) SmBusAddress);
-
-  //
-  // Start the SMBUS transaction and wait for the end.
-  //
-  ReturnStatus = InternalSmBusStart (IoPortBaseAddress, HostControl);
-
-  //
-  // Read value from Host Data 0 and Host Data 1 Registers.
-  //
-  Value = (UINT16)(IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HD1) << 8);
-  Value = (UINT16)(Value | IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HD0));
-
-  //
-  // Clear Host Status Register and Auxiliary Status Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS, B_PCH_SMBUS_HSTS_ALL);
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_AUXS, B_PCH_SMBUS_CRCE);
-
-Done:
-  if (Status != NULL) {
-    *Status = ReturnStatus;
-  }
-
-  return Value;
-}
-
-/**
-  Executes an SMBUS quick read command.
-
-  Executes an SMBUS quick read command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address field of SmBusAddress is required.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If PEC is set in SmBusAddress, then ASSERT().
-  If Command in SmBusAddress is not zero, then ASSERT().
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-**/
-VOID
-EFIAPI
-SmBusQuickRead (
-  IN  UINTN                     SmBusAddress,
-  OUT RETURN_STATUS             *Status       OPTIONAL
-  )
-{
-  ASSERT (!SMBUS_LIB_PEC (SmBusAddress));
-  ASSERT (SMBUS_LIB_COMMAND (SmBusAddress)   == 0);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress)  == 0);
-
-  InternalSmBusNonBlock (
-    V_PCH_SMBUS_SMB_CMD_QUICK,
-    SmBusAddress | B_PCH_SMBUS_RW_SEL_READ,
-    0,
-    Status
-    );
-}
-
-/**
-  Executes an SMBUS quick write command.
-
-  Executes an SMBUS quick write command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address field of SmBusAddress is required.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If PEC is set in SmBusAddress, then ASSERT().
-  If Command in SmBusAddress is not zero, then ASSERT().
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-**/
-VOID
-EFIAPI
-SmBusQuickWrite (
-  IN  UINTN                     SmBusAddress,
-  OUT RETURN_STATUS             *Status       OPTIONAL
-  )
-{
-  ASSERT (!SMBUS_LIB_PEC (SmBusAddress));
-  ASSERT (SMBUS_LIB_COMMAND (SmBusAddress)   == 0);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  InternalSmBusNonBlock (
-    V_PCH_SMBUS_SMB_CMD_QUICK,
-    SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-    0,
-    Status
-    );
-}
-
-/**
-  Executes an SMBUS receive byte command.
-
-  Executes an SMBUS receive byte command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address field of SmBusAddress is required.
-  The byte received from the SMBUS is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Command in SmBusAddress is not zero, then ASSERT().
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The byte received from the SMBUS.
-
-**/
-UINT8
-EFIAPI
-SmBusReceiveByte (
-  IN  UINTN          SmBusAddress,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT8 ValueReturn = 0;
-
-  ASSERT (SMBUS_LIB_COMMAND (SmBusAddress)   == 0);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = (UINT8) InternalSmBusNonBlock (
-                   V_PCH_SMBUS_SMB_CMD_BYTE,
-                   SmBusAddress | B_PCH_SMBUS_RW_SEL_READ,
-                   0,
-                   Status
-                   );
-  return ValueReturn;
-
-  }
-
-/**
-  Executes an SMBUS send byte command.
-
-  Executes an SMBUS send byte command on the SMBUS device specified by SmBusAddress.
-  The byte specified by Value is sent.
-  Only the SMBUS slave address field of SmBusAddress is required.  Value is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Command in SmBusAddress is not zero, then ASSERT().
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Value           The 8-bit value to send.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The parameter of Value.
-
-**/
-UINT8
-EFIAPI
-SmBusSendByte (
-  IN  UINTN          SmBusAddress,
-  IN  UINT8          Value,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT8 ValueReturn = 0;
-
-  ASSERT (SMBUS_LIB_COMMAND (SmBusAddress)   == 0);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = (UINT8) InternalSmBusNonBlock (
-                          V_PCH_SMBUS_SMB_CMD_BYTE,
-                          SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                          Value,
-                          Status
-                          );
-  return ValueReturn;
-
-  }
-
-/**
-  Executes an SMBUS read data byte command.
-
-  Executes an SMBUS read data byte command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  The 8-bit value read from the SMBUS is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The byte read from the SMBUS.
-
-**/
-UINT8
-EFIAPI
-SmBusReadDataByte (
-  IN  UINTN          SmBusAddress,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT8 ValueReturn = 0;
-
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-   ValueReturn = (UINT8) InternalSmBusNonBlock (
-                           V_PCH_SMBUS_SMB_CMD_BYTE_DATA,
-                           SmBusAddress | B_PCH_SMBUS_RW_SEL_READ,
-                           0,
-                           Status
-                           );
-  return ValueReturn;
-}
-
-/**
-  Executes an SMBUS write data byte command.
-
-  Executes an SMBUS write data byte command on the SMBUS device specified by SmBusAddress.
-  The 8-bit value specified by Value is written.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  Value is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Value           The 8-bit value to write.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The parameter of Value.
-
-**/
-UINT8
-EFIAPI
-SmBusWriteDataByte (
-  IN  UINTN          SmBusAddress,
-  IN  UINT8          Value,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT8 ValueReturn = 0;
-
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = (UINT8) InternalSmBusNonBlock (
-                          V_PCH_SMBUS_SMB_CMD_BYTE_DATA,
-                          SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                          Value,
-                          Status
-                          );
-  return ValueReturn;
-
-}
-
-/**
-  Executes an SMBUS read data word command.
-
-  Executes an SMBUS read data word command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  The 16-bit value read from the SMBUS is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The byte read from the SMBUS.
-
-**/
-UINT16
-EFIAPI
-SmBusReadDataWord (
-  IN  UINTN          SmBusAddress,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT16 ValueReturn = 0;
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = InternalSmBusNonBlock (
-                  V_PCH_SMBUS_SMB_CMD_WORD_DATA,
-                  SmBusAddress | B_PCH_SMBUS_RW_SEL_READ,
-                  0,
-                  Status
-                  );
-  return ValueReturn;
-
-}
-
-/**
-  Executes an SMBUS write data word command.
-
-  Executes an SMBUS write data word command on the SMBUS device specified by SmBusAddress.
-  The 16-bit value specified by Value is written.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  Value is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Value           The 16-bit value to write.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The parameter of Value.
-
-**/
-UINT16
-EFIAPI
-SmBusWriteDataWord (
-  IN  UINTN          SmBusAddress,
-  IN  UINT16         Value,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT16 ValueReturn = 0;
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = InternalSmBusNonBlock (
-                  V_PCH_SMBUS_SMB_CMD_WORD_DATA,
-                  SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                  Value,
-                  Status
-                  );
-  return ValueReturn;
-}
-
-/**
-  Executes an SMBUS process call command.
-
-  Executes an SMBUS process call command on the SMBUS device specified by SmBusAddress.
-  The 16-bit value specified by Value is written.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  The 16-bit value returned by the process call command is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Value           The 16-bit value to write.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The 16-bit value returned by the process call command.
-
-**/
-UINT16
-EFIAPI
-SmBusProcessCall (
-  IN  UINTN          SmBusAddress,
-  IN  UINT16         Value,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT16 ValueReturn = 0;
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = InternalSmBusNonBlock (
-                  V_PCH_SMBUS_SMB_CMD_PROCESS_CALL,
-                  SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                  Value,
-                  Status
-                  );
-  return ValueReturn;
-}
-
-/**
-  Executes an SMBUS block command.
-
-  Executes an SMBUS block read, block write and block write-block read command
-  on the SMBUS device specified by SmBusAddress.
-  Bytes are read from the SMBUS and stored in Buffer.
-  The number of bytes read is returned, and will never return a value larger than 32-bytes.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
-  SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes.
-
-  @param  HostControl     The value of Host Control Register to set.
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  WriteBuffer     Pointer to the buffer of bytes to write to the SMBUS.
-  @param  ReadBuffer      Pointer to the buffer of bytes to read from the SMBUS.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The number of bytes read from the SMBUS.
-
-**/
-UINTN
-InternalSmBusBlock (
-  IN  UINT8                     HostControl,
-  IN  UINTN                     SmBusAddress,
-  IN  UINT8                     *WriteBuffer,
-  OUT UINT8                     *ReadBuffer,
-  OUT RETURN_STATUS             *Status
-  )
-{
-  RETURN_STATUS                 ReturnStatus;
-  UINTN                         Index;
-  UINTN                         BytesCount;
-  UINTN                         IoPortBaseAddress;
-  UINT8                         AuxiliaryControl;
-
-  IoPortBaseAddress = InternalGetSmbusIoPortBaseAddress ();
-
-  BytesCount = SMBUS_LIB_LENGTH (SmBusAddress);
-
-  //
-  // Try to acquire the ownership of ICH SMBUS.
-  //
-  ReturnStatus = InternalSmBusAcquire (IoPortBaseAddress);
-  if (RETURN_ERROR (ReturnStatus)) {
-    goto Done;
-  }
-
-  //
-  // Set the appropriate Host Control Register and auxiliary Control Register.
-  //
-  AuxiliaryControl = B_PCH_SMBUS_E32B;
-  if (SMBUS_LIB_PEC (SmBusAddress)) {
-    AuxiliaryControl |= B_PCH_SMBUS_AAC;
-    HostControl      |= B_PCH_SMBUS_PEC_EN;
-  }
-
-  //
-  // Set Host Command Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HCMD, (UINT8) SMBUS_LIB_COMMAND (SmBusAddress));
-
-  //
-  // Set Auxiliary Control Regiester.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_AUXC, AuxiliaryControl);
-
-  //
-  // Clear byte pointer of 32-byte buffer.
-  //
-  IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HCTL);
-
-  if (WriteBuffer != NULL) {
-    //
-    // Write the number of block to Host Block Data Byte Register.
-    //
-    IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HD0, (UINT8) BytesCount);
-
-    //
-    // Write data block to Host Block Data Register.
-    //
-    for (Index = 0; Index < BytesCount; Index++) {
-      IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HBD, WriteBuffer[Index]);
-    }
-  }
-
-  //
-  // Set SMBUS slave address for the device to send/receive from.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_TSA, (UINT8) SmBusAddress);
-
-  //
-  // Start the SMBUS transaction and wait for the end.
-  //
-  ReturnStatus = InternalSmBusStart (IoPortBaseAddress, HostControl);
-  if (RETURN_ERROR (ReturnStatus)) {
-    goto Done;
-  }
-
-  if (ReadBuffer != NULL) {
-    //
-    // Read the number of block from host block data byte register.
-    //
-    BytesCount = IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HD0);
-
-    //
-    // Write data block from Host Block Data Register.
-    //
-    for (Index = 0; Index < BytesCount; Index++) {
-      ReadBuffer[Index] = IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HBD);
-    }
-  }
-
-Done:
-  //
-  // Clear Host Status Register and Auxiliary Status Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS, B_PCH_SMBUS_HSTS_ALL);
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_AUXS, B_PCH_SMBUS_CRCE);
-
-  if (Status != NULL) {
-    *Status = ReturnStatus;
-  }
-
-  return BytesCount;
-}
-
-/**
-  Executes an SMBUS read block command.
-
-  Executes an SMBUS read block command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  Bytes are read from the SMBUS and stored in Buffer.
-  The number of bytes read is returned, and will never return a value larger than 32-bytes.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
-  SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If Buffer is NULL, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Buffer          Pointer to the buffer to store the bytes read from the SMBUS.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The number of bytes read.
-
-**/
-UINTN
-EFIAPI
-SmBusReadBlock (
-  IN  UINTN          SmBusAddress,
-  OUT VOID           *Buffer,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINTN BytesCount = 0;
-
-  ASSERT (Buffer != NULL);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-
-  BytesCount = InternalSmBusBlock (
-                 V_PCH_SMBUS_SMB_CMD_BLOCK,
-                 SmBusAddress | B_PCH_SMBUS_RW_SEL_READ,
-                 NULL,
-                 Buffer,
-                 Status
-                 );
-  return BytesCount;
-
-}
-
-/**
-  Executes an SMBUS write block command.
-
-  Executes an SMBUS write block command on the SMBUS device specified by SmBusAddress.
-  The SMBUS slave address, SMBUS command, and SMBUS length fields of SmBusAddress are required.
-  Bytes are written to the SMBUS from Buffer.
-  The number of bytes written is returned, and will never return a value larger than 32-bytes.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is zero or greater than 32, then ASSERT().
-  If Buffer is NULL, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Buffer          Pointer to the buffer to store the bytes read from the SMBUS.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The number of bytes written.
-
-**/
-UINTN
-EFIAPI
-SmBusWriteBlock (
-  IN  UINTN          SmBusAddress,
-  OUT VOID           *Buffer,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINTN	BytesCount = 0;
-
-  ASSERT (Buffer != NULL);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) >= 1);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) <= 32);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-
- BytesCount = InternalSmBusBlock (
-
-                V_PCH_SMBUS_SMB_CMD_BLOCK,
-                SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                Buffer,
-                NULL,
-                Status
-                );
-
-  return BytesCount;
-}
-
-/**
-  Executes an SMBUS block process call command.
-
-  Executes an SMBUS block process call command on the SMBUS device specified by SmBusAddress.
-  The SMBUS slave address, SMBUS command, and SMBUS length fields of SmBusAddress are required.
-  Bytes are written to the SMBUS from WriteBuffer.  Bytes are then read from the SMBUS into ReadBuffer.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  It is the caller's responsibility to make sure ReadBuffer is large enough for the total number of bytes read.
-  SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes.
-  If Length in SmBusAddress is zero or greater than 32, then ASSERT().
-  If WriteBuffer is NULL, then ASSERT().
-  If ReadBuffer is NULL, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  WriteBuffer     Pointer to the buffer of bytes to write to the SMBUS.
-  @param  ReadBuffer      Pointer to the buffer of bytes to read from the SMBUS.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The number of bytes written.
-
-**/
-UINTN
-EFIAPI
-SmBusBlockProcessCall (
-  IN  UINTN          SmBusAddress,
-  IN  VOID           *WriteBuffer,
-  OUT VOID           *ReadBuffer,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINTN BytesCount = 0;
-
-  ASSERT (WriteBuffer != NULL);
-  ASSERT (ReadBuffer  != NULL);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) >= 1);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) <= 32);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  BytesCount = InternalSmBusBlock (
-                 V_PCH_SMBUS_SMB_CMD_BLOCK_PROCESS,
-                 SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                 WriteBuffer,
-                 ReadBuffer,
-                 Status
-                 );
-  return BytesCount;
-
-  }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
deleted file mode 100644
index b13e3de0cc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+++ /dev/null
@@ -1,46 +0,0 @@
-## @file
-# Component description file for Intel Ich9 Smbus Library.
-#
-# SMBUS Library that layers on top of the I/O Library to directly
-#  access a standard SMBUS host controller.
-# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SmbusLib
-  FILE_GUID                      = 0558CAEA-FEF3-4b6d-915E-8742EFE6DEE1
-  MODULE_TYPE                    = BASE
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = SmbusLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  SmbusLib.c
-
-[Packages]
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  MdePkg/MdePkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-
-[LibraryClasses]
-  PcdLib
-  DebugLib
-  PciLib
-  IoLib
-
-[Pcd.common]
-  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c
deleted file mode 100644
index 3fda6313d0..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c
+++ /dev/null
@@ -1,319 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-
-  Dimm.c
-
-Abstract:
-
-  PPI for reading SPD modules on DIMMs.
-
---*/
-
-
-//
-// Header Files
-//
-#include "Platformearlyinit.h"
-
-#define DIMM_SOCKETS     4  // Total number of DIMM sockets allowed on
-                            //   the platform
-#define DIMM_SEGMENTS    1  // Total number of Segments Per DIMM.
-#define MEMORY_CHANNELS  2  // Total number of memory channels
-                            //   populated on the system board
-//
-// Prototypes
-//
-
-EFI_STATUS
-EFIAPI
-GetDimmState (
-  IN      EFI_PEI_SERVICES        **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI   *This,
-  IN      UINT8                   Dimm,
-  OUT     PEI_PLATFORM_DIMM_STATE *State
-  );
-
-EFI_STATUS
-EFIAPI
-SetDimmState (
-  IN      EFI_PEI_SERVICES        **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI   *This,
-  IN      UINT8                   Dimm,
-  IN      PEI_PLATFORM_DIMM_STATE *State
-  );
-
-EFI_STATUS
-EFIAPI
-ReadSpd (
-  IN      EFI_PEI_SERVICES      **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI *This,
-  IN      UINT8                 Dimm,
-  IN      UINT8                 Offset,
-  IN      UINTN                 Count,
-  IN OUT  UINT8                 *Buffer
-  );
-
-static PEI_PLATFORM_DIMM_PPI mGchDimmPpi = {
-  DIMM_SOCKETS,
-  DIMM_SEGMENTS,
-  MEMORY_CHANNELS,
-  GetDimmState,
-  SetDimmState,
-  ReadSpd
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiPlatformDimm = {
-  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
-  &gPeiPlatformDimmPpiGuid,
-  &mGchDimmPpi
-};
-
-
-//
-// Functions
-//
-
-/**
-  This function returns the current state of a single DIMM.  Present indicates
-  that the DIMM slot is physically populated.  Disabled indicates that the DIMM
-  should not be used.
-
-  @param PeiServices   PEI services table pointer
-  @param This          PPI pointer
-  @param Dimm          DIMM to read from
-  @param State         Pointer to a return buffer to be updated with the current state
-                       of the DIMM
-
-  @retval EFI_SUCCESS         The function completed successfully.
-
-**/
-EFI_STATUS
-EFIAPI
-GetDimmState (
-  IN      EFI_PEI_SERVICES        **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI   *This,
-  IN      UINT8                   Dimm,
-  OUT     PEI_PLATFORM_DIMM_STATE *State
-  )
-{
-  EFI_STATUS                    Status;
-  UINT8                         Buffer;
-
-  PEI_ASSERT (PeiServices, (Dimm < This->DimmSockets));
-
-  //
-  // A failure here does not necessarily mean that no DIMM is present.
-  // Read a single byte.  All we care about is the return status.
-  //
-  Status = ReadSpd (
-             PeiServices,
-             This,
-             Dimm,
-             0,
-             1,
-             &Buffer
-             );
-
-  if (EFI_ERROR (Status)) {
-    State->Present = 0;
-  } else {
-    State->Present = 1;
-  }
-
-  //
-  // BUGBUG: Update to check platform variable when it is available
-  //
-  State->Disabled = 0;
-  State->Reserved = 0;
-
-  return EFI_SUCCESS;
-}
-
-/**
-
-  This function updates the state of a single DIMM.
-
-  @param PeiServices          PEI services table pointer
-  @param This                 PPI pointer
-  @param Dimm                 DIMM to set state for
-  @param State                Pointer to the state information to set.
-
-  @retval EFI_SUCCESS         The function completed successfully.
-  @retval EFI_UNSUPPORTED     The function is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SetDimmState (
-  IN      EFI_PEI_SERVICES        **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI   *This,
-  IN      UINT8                   Dimm,
-  IN      PEI_PLATFORM_DIMM_STATE *State
-  )
-{
-  return EFI_UNSUPPORTED;
-}
-
-/**
-  This function reads SPD information from a DIMM.
-
-  PeiServices   PEI services table pointer
-  This          PPI pointer
-  Dimm          DIMM to read from
-  Offset        Offset in DIMM
-  Count         Number of bytes
-  Buffer        Return buffer
-
-  @param EFI_SUCCESS              The function completed successfully.
-  @param EFI_DEVICE_ERROR         The DIMM being accessed reported a device error,
-                                  does not have an SPD module, or is not installed in
-                                  the system.
-  @retval EFI_TIMEOUT             Time out trying to read the SPD module.
-  @retval EFI_INVALID_PARAMETER   A parameter was outside the legal limits.
-
-**/
-EFI_STATUS
-EFIAPI
-ReadSpd (
-  IN      EFI_PEI_SERVICES      **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI *This,
-  IN      UINT8                 Dimm,
-  IN      UINT8                 Offset,
-  IN      UINTN                 Count,
-  IN OUT  UINT8                 *Buffer
-  )
-{
-  EFI_STATUS                Status;
-  PEI_SMBUS_PPI             *Smbus;
-  UINTN                     Index;
-  UINTN                     Index1;
-  EFI_SMBUS_DEVICE_ADDRESS  SlaveAddress;
-  EFI_SMBUS_DEVICE_COMMAND  Command;
-  UINTN                     Length;
-
-  Status = (**PeiServices).LocatePpi (
-                             PeiServices,
-                             &gPeiSmbusPpiGuid,   // GUID
-                             0,                   // INSTANCE
-                             NULL,                // EFI_PEI_PPI_DESCRIPTOR
-                             &Smbus               // PPI
-                             );
-  ASSERT_PEI_ERROR (PeiServices, Status);
-
-  switch (Dimm) {
-  case 0:
-    SlaveAddress.SmbusDeviceAddress = SMBUS_ADDR_CH_A_1 >> 1;
-    break;
-  case 1:
-    SlaveAddress.SmbusDeviceAddress = SMBUS_ADDR_CH_A_2 >> 1;
-    break;
-  case 2:
-    SlaveAddress.SmbusDeviceAddress = SMBUS_ADDR_CH_B_1 >> 1;
-    break;
-  case 3:
-    SlaveAddress.SmbusDeviceAddress = SMBUS_ADDR_CH_B_2 >> 1;
-    break;
-  default:
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Index = Count % 4;
-  if (Index != 0) {
-    //
-    // read the first serveral bytes to speed up following reading
-    //
-    for (Index1 = 0; Index1 < Index; Index1++) {
-      Length = 1;
-      Command = Offset + Index1;
-      Status = Smbus->Execute (
-                        PeiServices,
-                        Smbus,
-                        SlaveAddress,
-                        Command,
-                        EfiSmbusReadByte,
-                        FALSE,
-                        &Length,
-                        &Buffer[Index1]
-                        );
-      if (EFI_ERROR(Status)) {
-        return Status;
-      }
-    }
-  }
-
-  //
-  // Now collect all the remaining bytes on 4 bytes block
-  //
-  for (; Index < Count; Index += 2) {
-    Command = Index + Offset;
-    Length = 2;
-    Status = Smbus->Execute (
-                      PeiServices,
-                      Smbus,
-                      SlaveAddress,
-                      Command,
-                      EfiSmbusReadWord,
-                      FALSE,
-                      &Length,
-                      &Buffer[Index]
-                      );
-    if (EFI_ERROR(Status)) {
-      return Status;
-    }
-
-    Index += 2;
-    Command = Index + Offset;
-    Length = 2;
-    Status = Smbus->Execute (
-                      PeiServices,
-                      Smbus,
-                      SlaveAddress,
-                      Command,
-                      EfiSmbusReadWord,
-                      FALSE,
-                      &Length,
-                      &Buffer[Index]
-                      );
-    if (EFI_ERROR(Status)) {
-      return Status;
-    }
-  }
-  return EFI_SUCCESS;
-}
-
-/**
-  This function initializes the PEIM.  It simply installs the DIMM PPI.
-
-  @param FfsHeader       Not used by this function
-  @param PeiServices     Pointer to PEI services table
-
-  @retval EFI_SUCCESS    The function completed successfully.
-
-**/
-EFI_STATUS
-EFIAPI
-PeimInitializeDimm (
-  IN EFI_PEI_SERVICES           **PeiServices,
-  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
-  IN VOID                       *SmbusPpi
-  )
-{
-  EFI_STATUS                    Status;
-
-  Status = (**PeiServices).InstallPpi (
-                             PeiServices,
-                             &mPpiPlatformDimm
-                             );
-  ASSERT_PEI_ERROR (PeiServices, Status);
-
-  return EFI_SUCCESS;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
index 9631d49a84..6a2ecf8fb4 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
@@ -59,7 +59,7 @@ Abstract:
 #include <Ppi/Speaker.h>
 #include <Guid/MemoryTypeInformation.h>
 #include <Ppi/Cache.h>
-#include <Ppi/Smbus.h>
+#include <Ppi/Smbus2.h>
 #include <Library/PchPlatformLib.h>
 #include <Ppi/SmbusPolicy.h>
 #include <Ppi/Reset.h>
@@ -1454,14 +1454,6 @@ SetDxeCacheMode (
   IN  CONST EFI_PEI_SERVICES    **PeiServices
   );
 
-EFI_STATUS
-GPIO_initialization (
-  IN EFI_PEI_SERVICES                   **PeiServices,
-  IN EFI_PEI_NOTIFY_DESCRIPTOR          *NotifyDescriptor,
-  IN VOID                               *SmbusPpi
-  );
-
-
 BOOLEAN
 IsRtcUipAlwaysSet (
   IN CONST EFI_PEI_SERVICES       **PeiServices
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
index a533f3918c..c18cabb2f2 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
@@ -42,7 +42,6 @@
 #include <Library/PciLib.h>
 #include <Library/ReportStatusCodeLib.h>
 #include <Library/PcdLib.h>
-#include <Library/SmbusLib.h>
 #include <Library/TimerLib.h>
 #include <Library/PrintLib.h>
 #include <Library/ResetSystemLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
index 28a5274c40..d3969f2344 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
@@ -72,7 +72,6 @@ [LibraryClasses]
   DebugLib
   HobLib
   IoLib
-  MultiPlatformLib
   MtrrLib
   PerformanceLib
   MonoStatusCodeLib
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index b16883e98c..3910281c49 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -171,7 +171,7 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmbusLib|MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf
   SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index c9335a98c8..2ae594e5be 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -169,7 +169,7 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmbusLib|MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf
   SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index fd9ddebfd9..5cdc9bebc8 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -171,7 +171,7 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmbusLib|MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf
   SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 10/14] Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (8 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 09/14] Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:08   ` Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 11/14] Vlv2TbltDevicePkg: Update boot mode/state behaviors Michael D Kinney
                   ` (4 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

Switch from Intel Framework BDS module and libraries to the
MdeModulePkg BdsDxe module and libraries.

Update FLASH map for full 8MB FLASH size

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Library/FmpDeviceLib/FmpDeviceLib.c       |   12 +-
 .../DxePlatformBootManagerLib/BdsPlatform.c   | 1409 ++++++
 .../DxePlatformBootManagerLib/BdsPlatform.h   |  253 +
 .../DxePlatformBootManagerLib.inf             |   95 +
 .../DxePlatformBootManagerLib/MemoryTest.c    |   83 +
 .../PlatformBootOption.c                      |  559 ++
 .../Library/PlatformBdsLib/BdsPlatform.c      | 3092 ------------
 .../Library/PlatformBdsLib/BdsPlatform.h      |  516 --
 .../Library/PlatformBdsLib/PlatformBdsLib.inf |  128 -
 .../PlatformBdsLib/PlatformBdsStrings.uni     |   30 -
 .../Library/PlatformBdsLib/PlatformData.c     |  306 --
 .../Library/GenericBdsLib/BdsBoot.c           | 4490 -----------------
 .../Library/GenericBdsLib/BdsConnect.c        |  429 --
 .../Library/GenericBdsLib/BdsConsole.c        | 1061 ----
 .../Library/GenericBdsLib/BdsMisc.c           | 1575 ------
 .../Library/GenericBdsLib/DevicePath.c        |   27 -
 .../Library/GenericBdsLib/GenericBdsLib.inf   |  143 -
 .../Library/GenericBdsLib/GenericBdsLib.uni   |   19 -
 .../GenericBdsLib/GenericBdsStrings.uni       |   30 -
 .../Library/GenericBdsLib/InternalBdsLib.h    |  173 -
 .../Library/GenericBdsLib/String.c            |   26 -
 .../Library/GenericBdsLib/String.h            |   42 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |   26 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |   53 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |   22 +-
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |   22 +-
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |   22 +-
 .../Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c |   33 -
 .../Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf   |   32 -
 29 files changed, 2477 insertions(+), 12231 deletions(-)
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/MemoryTest.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/PlatformBootOption.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsStrings.uni
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformData.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/DevicePath.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.uni
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsStrings.uni
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c
index a863d69381..57185d8d09 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c
@@ -32,11 +32,11 @@ typedef struct {
 } UPDATE_CONFIG_DATA;
 
 UPDATE_CONFIG_DATA mUpdateConfigData[] = {
-  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00000000, 0x00040000, 0x00000000 },
-  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x000C0000, 0x00050000, 0x000C0000 },
-  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00110000, 0x00210000, 0x00110000 },
-  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00320000, 0x00070000, 0x00320000 },
-  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00390000, 0x00070000, 0x00390000 }
+  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00400000, 0x00040000, 0x00400000 },
+  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x004C0000, 0x00050000, 0x004C0000 },
+  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00510000, 0x00210000, 0x00510000 },
+  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00720000, 0x00070000, 0x00720000 },
+  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00790000, 0x00070000, 0x00790000 }
 };
 
 /**
@@ -95,7 +95,7 @@ FmpDeviceGetSize (
   if (Size == NULL) {
     return EFI_INVALID_PARAMETER;
   }
-  *Size = PcdGet32 (PcdBiosRomBase);
+  *Size = PcdGet32 (PcdBiosRomSize);
   return EFI_SUCCESS;
 }
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
new file mode 100644
index 0000000000..4dd3827a6e
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
@@ -0,0 +1,1409 @@
+/** @file
+  This file include all platform action which can be customized by IBV/OEM.
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "BdsPlatform.h"
+#include <Guid/EventGroup.h>
+#include <Protocol/DxeSmmReadyToLock.h>
+#include <Protocol/FirmwareVolume2.h>
+#include <Protocol/PciRootBridgeIo.h>
+
+#include <Protocol/BlockIo.h>
+#include <Protocol/PciIo.h>
+#include <Library/IoLib.h>
+#include <Library/PciLib.h>
+#include <Guid/EventGroup.h>
+
+#include <Library/Tcg2PhysicalPresenceLib.h>
+
+#include <Library/HobLib.h>
+#include <Protocol/UsbIo.h>
+#include <Library/BootLogoLib.h>
+
+#include <Library/UefiBootManagerLib.h>
+
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_BOOT_MODE                 gBootMode;
+
+BOOLEAN                      gPPRequireUIConfirm;
+
+extern UINTN                                      mBootMenuOptionNumber;
+
+GLOBAL_REMOVE_IF_UNREFERENCED USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboardDevicePath = {
+  {
+    {
+      MESSAGING_DEVICE_PATH,
+      MSG_USB_CLASS_DP,
+      {
+        (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)),
+        (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8)
+      }
+    },
+    0xffff,           // VendorId
+    0xffff,           // ProductId
+    CLASS_HID,        // DeviceClass
+    SUBCLASS_BOOT,    // DeviceSubClass
+    PROTOCOL_KEYBOARD // DeviceProtocol
+  },
+  gEndEntire
+};
+
+//
+// Platform specific ISA serial device path
+//
+GLOBAL_REMOVE_IF_UNREFERENCED PLATFORM_ISA_SERIAL_DEVICE_PATH gIsaSerialDevicePath = {
+  gPciRootBridge,
+  gPciIsaBridge,
+  gPnp16550ComPort,
+  gUart(115200, 8, 1, 1),
+  gPcAnsiTerminal,
+  gEndEntire
+};
+
+//
+// Internal shell mode
+//
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32         mShellModeColumn;
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32         mShellModeRow;
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32         mShellHorizontalResolution;
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32         mShellVerticalResolution;
+//
+// BDS Platform Functions
+//
+
+BOOLEAN
+IsMorBitSet (
+  VOID
+  )
+{
+  UINTN                     MorControl;
+  EFI_STATUS                Status;
+  UINTN                     DataSize;
+
+  //
+  // Check if the MOR bit is set.
+  //
+  DataSize = sizeof (MorControl);
+  Status = gRT->GetVariable (
+                  MEMORY_OVERWRITE_REQUEST_VARIABLE_NAME,
+                  &gEfiMemoryOverwriteControlDataGuid,
+                  NULL,
+                  &DataSize,
+                  &MorControl
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: gEfiMemoryOverwriteControlDataGuid doesn't exist!!***\n"));
+    MorControl = 0;
+  } else {
+    DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: Get the gEfiMemoryOverwriteControlDataGuid = %x!!***\n", MorControl));
+  }
+
+  return (BOOLEAN) (MorControl & 0x01);
+}
+
+VOID
+DumpDevicePath (
+  IN CHAR16           *Name,
+  IN EFI_DEVICE_PATH  *DevicePath
+  )
+{
+  CHAR16 *Str;
+
+  Str = ConvertDevicePathToText(DevicePath, TRUE, TRUE);
+  DEBUG ((DEBUG_INFO, "%s: %s\n", Name, Str));
+  if (Str != NULL) {
+    FreePool (Str);
+  }
+}
+
+/**
+  An empty function to pass error checking of CreateEventEx ().
+
+  This empty function ensures that EVT_NOTIFY_SIGNAL_ALL is error
+  checked correctly since it is now mapped into CreateEventEx() in UEFI 2.0.
+
+  @param  Event                 Event whose notification function is being invoked.
+  @param  Context               The pointer to the notification function's context,
+                                which is implementation-dependent.
+**/
+VOID
+EFIAPI
+InternalBdsEmptyCallbackFuntion (
+  IN EFI_EVENT                Event,
+  IN VOID                     *Context
+  )
+{
+  return;
+}
+
+VOID
+ExitPmAuth (
+  VOID
+  )
+{
+  EFI_HANDLE                 Handle;
+  EFI_STATUS                 Status;
+  EFI_EVENT                  EndOfDxeEvent;
+
+  DEBUG((DEBUG_INFO,"ExitPmAuth ()- Start\n"));
+  //
+  // Prepare S3 information, this MUST be done before ExitPmAuth/EndOfDxe
+  //
+  //
+  // Since PI1.2.1, we need signal EndOfDxe as ExitPmAuth
+  //
+  Status = gBS->CreateEventEx (
+                  EVT_NOTIFY_SIGNAL,
+                  TPL_CALLBACK,
+                  InternalBdsEmptyCallbackFuntion,
+                  NULL,
+                  &gEfiEndOfDxeEventGroupGuid,
+                  &EndOfDxeEvent
+                  );
+  ASSERT_EFI_ERROR (Status);
+  gBS->SignalEvent (EndOfDxeEvent);
+  gBS->CloseEvent (EndOfDxeEvent);
+  DEBUG((DEBUG_INFO,"All EndOfDxe callbacks have returned successfully\n"));
+
+  //
+  // NOTE: We need install DxeSmmReadyToLock directly here because many boot script is added via ExitPmAuth/EndOfDxe callback.
+  // If we install them at same callback, these boot script will be rejected because BootScript Driver runs first to lock them done.
+  // So we seperate them to be 2 different events, ExitPmAuth is last chance to let platform add boot script. DxeSmmReadyToLock will
+  // make boot script save driver lock down the interface.
+  //
+  Handle = NULL;
+  Status = gBS->InstallProtocolInterface (
+                  &Handle,
+                  &gEfiDxeSmmReadyToLockProtocolGuid,
+                  EFI_NATIVE_INTERFACE,
+                  NULL
+                  );
+  ASSERT_EFI_ERROR (Status);
+  DEBUG((DEBUG_INFO,"ExitPmAuth ()- End\n"));
+}
+
+VOID
+ConnectRootBridge (
+  BOOLEAN Recursive
+  )
+{
+  UINTN                            RootBridgeHandleCount;
+  EFI_HANDLE                       *RootBridgeHandleBuffer;
+  UINTN                            RootBridgeIndex;
+
+  RootBridgeHandleCount = 0;
+  gBS->LocateHandleBuffer (
+         ByProtocol,
+         &gEfiPciRootBridgeIoProtocolGuid,
+         NULL,
+         &RootBridgeHandleCount,
+         &RootBridgeHandleBuffer
+         );
+  for (RootBridgeIndex = 0; RootBridgeIndex < RootBridgeHandleCount; RootBridgeIndex++) {
+    gBS->ConnectController (RootBridgeHandleBuffer[RootBridgeIndex], NULL, NULL, Recursive);
+  }
+}
+
+
+/**
+  Return whether the device is trusted console.
+
+  @param Device  The device to be tested.
+
+  @retval TRUE   The device can be trusted.
+  @retval FALSE  The device cannot be trusted.
+**/
+BOOLEAN
+IsTrustedConsole (
+  IN CONSOLE_TYPE              ConsoleType,
+  IN EFI_DEVICE_PATH_PROTOCOL  *Device
+  )
+{
+  VOID                      *TrustedConsoleDevicepath;
+  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL  *Instance;
+  UINTN                     Size;
+  EFI_DEVICE_PATH_PROTOCOL  *ConsoleDevice;
+
+  if (Device == NULL) {
+    return FALSE;
+  }
+
+  ConsoleDevice = DuplicateDevicePath(Device);
+
+  TrustedConsoleDevicepath = NULL;
+
+  switch (ConsoleType) {
+  case ConIn:
+    TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleInputDevicePath);
+    break;
+  case ConOut:
+    //
+    // Check GOP and remove last node
+    //
+    TempDevicePath = ConsoleDevice;
+    while (!IsDevicePathEndType (TempDevicePath)) {
+      if (DevicePathType (TempDevicePath) == ACPI_DEVICE_PATH &&
+          DevicePathSubType (TempDevicePath) == ACPI_ADR_DP) {
+        SetDevicePathEndNode (TempDevicePath);
+        break;
+      }
+      TempDevicePath = NextDevicePathNode (TempDevicePath);
+    }
+
+    TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleOutputDevicePath);
+    break;
+  default:
+    ASSERT(FALSE);
+    break;
+  }
+
+  TempDevicePath = TrustedConsoleDevicepath;
+  do {
+    Instance = GetNextDevicePathInstance (&TempDevicePath, &Size);
+    if (Instance == NULL) {
+      break;
+    }
+
+    if (CompareMem (ConsoleDevice, Instance, Size - END_DEVICE_PATH_LENGTH) == 0) {
+      FreePool (Instance);
+      FreePool (ConsoleDevice);
+      return TRUE;
+    }
+
+    FreePool (Instance);
+  } while (TempDevicePath != NULL);
+
+  FreePool (ConsoleDevice);
+
+  return FALSE;
+}
+
+BOOLEAN
+IsUsbShortForm (
+  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
+  )
+{
+  if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) &&
+      ((DevicePathSubType (DevicePath) == MSG_USB_CLASS_DP) || (DevicePathSubType (DevicePath) == MSG_USB_WWID_DP)) ) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
+  Connect the USB short form device path.
+
+  @param DevicePath   USB short form device path
+
+  @retval EFI_SUCCESS           Successfully connected the USB device
+  @retval EFI_NOT_FOUND         Cannot connect the USB device
+  @retval EFI_INVALID_PARAMETER The device path is invalid.
+**/
+EFI_STATUS
+ConnectUsbShortFormDevicePath (
+  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath
+  )
+{
+  EFI_STATUS                            Status;
+  EFI_HANDLE                            *Handles;
+  UINTN                                 HandleCount;
+  UINTN                                 Index;
+  EFI_PCI_IO_PROTOCOL                   *PciIo;
+  UINT8                                 Class[3];
+  BOOLEAN                               AtLeastOneConnected;
+
+  //
+  // Check the passed in parameters
+  //
+  if (DevicePath == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (!IsUsbShortForm (DevicePath)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  // Find the usb host controller firstly, then connect with the remaining device path
+  //
+  AtLeastOneConnected = FALSE;
+  Status = gBS->LocateHandleBuffer (
+                  ByProtocol,
+                  &gEfiPciIoProtocolGuid,
+                  NULL,
+                  &HandleCount,
+                  &Handles
+                  );
+  for (Index = 0; Index < HandleCount; Index++) {
+    Status = gBS->HandleProtocol (
+                    Handles[Index],
+                    &gEfiPciIoProtocolGuid,
+                    (VOID **) &PciIo
+                    );
+    if (!EFI_ERROR (Status)) {
+      //
+      // Check whether the Pci device is the wanted usb host controller
+      //
+      Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class);
+      if (!EFI_ERROR (Status) &&
+          ((PCI_CLASS_SERIAL == Class[2]) && (PCI_CLASS_SERIAL_USB == Class[1]))
+         ) {
+        Status = gBS->ConnectController (
+                        Handles[Index],
+                        NULL,
+                        DevicePath,
+                        FALSE
+                        );
+        if (!EFI_ERROR(Status)) {
+          AtLeastOneConnected = TRUE;
+        }
+      }
+    }
+  }
+
+  return AtLeastOneConnected ? EFI_SUCCESS : EFI_NOT_FOUND;
+}
+
+/**
+  Update the ConIn/ConOut variable with ISA Serial device path,if its not already exists in ConIn/ConOut
+**/
+VOID
+EnumIsaSerial (
+  VOID
+  )
+{
+  DEBUG ((DEBUG_INFO, "[EnumIsaSerial]\n"));
+  EfiBootManagerUpdateConsoleVariable (ConIn, (EFI_DEVICE_PATH_PROTOCOL *) &gIsaSerialDevicePath, NULL);
+  EfiBootManagerUpdateConsoleVariable (ConOut, (EFI_DEVICE_PATH_PROTOCOL *) &gIsaSerialDevicePath, NULL);
+
+  //
+  // Append ISA Serial DevicePath to "ConInDev" and "ConOutDev"
+  //
+  EfiBootManagerUpdateConsoleVariable (ConInDev, (EFI_DEVICE_PATH_PROTOCOL *) &gIsaSerialDevicePath, NULL);
+  EfiBootManagerUpdateConsoleVariable (ConOutDev, (EFI_DEVICE_PATH_PROTOCOL *) &gIsaSerialDevicePath, NULL);
+}
+
+/**
+  Update the ConIn variable with USB Keyboard device path,if its not already exists in ConIn
+**/
+VOID
+EnumUsbKeyboard (
+  VOID
+  )
+{
+  DEBUG ((DEBUG_INFO, "[EnumUsbKeyboard]\n"));
+  EfiBootManagerUpdateConsoleVariable (ConIn, (EFI_DEVICE_PATH_PROTOCOL *) &gUsbClassKeyboardDevicePath, NULL);
+
+  //
+  // Append Usb Keyboard short form DevicePath into "ConInDev"
+  //
+  EfiBootManagerUpdateConsoleVariable (ConInDev, (EFI_DEVICE_PATH_PROTOCOL *) &gUsbClassKeyboardDevicePath, NULL);
+}
+
+BOOLEAN
+IsVgaHandle (
+  IN EFI_HANDLE Handle
+  )
+{
+  EFI_PCI_IO_PROTOCOL *PciIo;
+  PCI_TYPE00          Pci;
+  EFI_STATUS          Status;
+
+  Status = gBS->HandleProtocol (
+                  Handle,
+                  &gEfiPciIoProtocolGuid,
+                  (VOID **)&PciIo
+                  );
+  if (!EFI_ERROR (Status)) {
+    Status = PciIo->Pci.Read (
+                          PciIo,
+                          EfiPciIoWidthUint32,
+                          0,
+                          sizeof (Pci) / sizeof (UINT32),
+                          &Pci
+                          );
+    if (!EFI_ERROR (Status)) {
+      if (IS_PCI_VGA (&Pci) || IS_PCI_OLD_VGA (&Pci)) {
+        return TRUE;
+      }
+    }
+  }
+  return FALSE;
+}
+
+EFI_HANDLE
+IsVideoController (
+  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL  *DupDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
+  EFI_STATUS                Status;
+  EFI_HANDLE                DeviceHandle;
+
+  DupDevicePath = DuplicateDevicePath (DevicePath);
+  ASSERT (DupDevicePath != NULL);
+  if (DupDevicePath == NULL) {
+    return NULL;
+  }
+
+  TempDevicePath = DupDevicePath;
+  Status = gBS->LocateDevicePath (
+                  &gEfiDevicePathProtocolGuid,
+                  &TempDevicePath,
+                  &DeviceHandle
+                  );
+  FreePool (DupDevicePath);
+  if (EFI_ERROR (Status)) {
+    return NULL;
+  }
+
+  if (IsVgaHandle (DeviceHandle)) {
+    return DeviceHandle;
+  } else {
+    return NULL;
+  }
+}
+
+BOOLEAN
+IsGopDevicePath (
+  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
+  )
+{
+  while (!IsDevicePathEndType (DevicePath)) {
+    if (DevicePathType (DevicePath) == ACPI_DEVICE_PATH &&
+        DevicePathSubType (DevicePath) == ACPI_ADR_DP) {
+      return TRUE;
+    }
+    DevicePath = NextDevicePathNode (DevicePath);
+  }
+  return FALSE;
+}
+
+/**
+  Remove all GOP device path instance from DevicePath and add the Gop to the DevicePath.
+**/
+EFI_DEVICE_PATH_PROTOCOL *
+UpdateGopDevicePath (
+  EFI_DEVICE_PATH_PROTOCOL *DevicePath,
+  EFI_DEVICE_PATH_PROTOCOL *Gop
+  )
+{
+  UINTN                    Size;
+  UINTN                    GopSize;
+  EFI_DEVICE_PATH_PROTOCOL *Temp;
+  EFI_DEVICE_PATH_PROTOCOL *Return;
+  EFI_DEVICE_PATH_PROTOCOL *Instance;
+  BOOLEAN                  Exist;
+
+  Exist = FALSE;
+  Return = NULL;
+  GopSize = GetDevicePathSize (Gop);
+  do {
+    Instance = GetNextDevicePathInstance (&DevicePath, &Size);
+    if (Instance == NULL) {
+      break;
+    }
+    if (!IsGopDevicePath (Instance) ||
+        (Size == GopSize && CompareMem (Instance, Gop, GopSize) == 0)
+       ) {
+      if (Size == GopSize && CompareMem (Instance, Gop, GopSize) == 0) {
+        Exist = TRUE;
+      }
+      Temp = Return;
+      Return = AppendDevicePathInstance (Return, Instance);
+      if (Temp != NULL) {
+        FreePool (Temp);
+      }
+    }
+    FreePool (Instance);
+  } while (DevicePath != NULL);
+
+  if (!Exist) {
+    Temp = Return;
+    Return = AppendDevicePathInstance (Return, Gop);
+    if (Temp != NULL) {
+      FreePool (Temp);
+    }
+  }
+  return Return;
+}
+
+/**
+  Get Graphics Controller Handle.
+
+  @retval GraphicsController    Successfully located
+  @retval NULL                  Failed to locate
+**/
+EFI_HANDLE
+EFIAPI
+GetGraphicsController (
+  IN BOOLEAN    NeedTrustedConsole
+  )
+{
+  EFI_STATUS                Status;
+  UINTN                     Index;
+  EFI_HANDLE                *PciHandles;
+  UINTN                     PciHandlesSize;
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+
+  Status = gBS->LocateHandleBuffer (
+                  ByProtocol,
+                  &gEfiPciIoProtocolGuid,
+                  NULL,
+                  &PciHandlesSize,
+                  &PciHandles
+                  );
+  if (EFI_ERROR (Status)) {
+    return NULL;
+  }
+
+  for (Index = 0; Index < PciHandlesSize; Index++) {
+    Status = gBS->HandleProtocol (
+                    PciHandles[Index],
+                    &gEfiDevicePathProtocolGuid,
+                    (VOID **) &DevicePath
+                    );
+    if (EFI_ERROR(Status)) {
+      continue;
+    }
+    if (!IsVgaHandle (PciHandles[Index])) {
+      continue;
+    }
+    if ((NeedTrustedConsole && IsTrustedConsole (ConOut, DevicePath)) ||
+        ((!NeedTrustedConsole) && (!IsTrustedConsole (ConOut, DevicePath)))) {
+      return PciHandles[Index];
+    }
+  }
+
+  return NULL;
+}
+
+VOID
+UpdateGraphicConOut (
+  IN BOOLEAN    NeedTrustedConsole
+  )
+{
+  EFI_HANDLE                          GraphicsControllerHandle;
+  EFI_DEVICE_PATH_PROTOCOL            *GopDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL            *ConOutDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL            *UpdatedConOutDevicePath;
+
+  //
+  // Update ConOut variable
+  //
+  GraphicsControllerHandle = GetGraphicsController (NeedTrustedConsole);
+  if (GraphicsControllerHandle != NULL) {
+    //
+    // Connect the GOP driver
+    //
+    gBS->ConnectController (GraphicsControllerHandle, NULL, NULL, TRUE);
+
+    //
+    // Get the GOP device path
+    // NOTE: We may get a device path that contains Controller node in it.
+    //
+    GopDevicePath = EfiBootManagerGetGopDevicePath (GraphicsControllerHandle);
+    if (GopDevicePath != NULL) {
+      GetEfiGlobalVariable2 (L"ConOut", (VOID **)&ConOutDevicePath, NULL);
+      UpdatedConOutDevicePath = UpdateGopDevicePath (ConOutDevicePath, GopDevicePath);
+      if (ConOutDevicePath != NULL) {
+        FreePool (ConOutDevicePath);
+      }
+      FreePool (GopDevicePath);
+      gRT->SetVariable (
+                      L"ConOut",
+                      &gEfiGlobalVariableGuid,
+                      EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
+                      GetDevicePathSize (UpdatedConOutDevicePath),
+                      UpdatedConOutDevicePath
+                      );
+    }
+  }
+}
+
+VOID
+AddConsoleVariable (
+  IN CONSOLE_TYPE              ConsoleType,
+  IN EFI_DEVICE_PATH           *ConsoleDevicePath
+  )
+{
+  EFI_DEVICE_PATH           *TempDevicePath;
+  EFI_DEVICE_PATH           *Instance;
+  UINTN                     Size;
+  EFI_HANDLE                GraphicsControllerHandle;
+  EFI_DEVICE_PATH           *GopDevicePath;
+
+  TempDevicePath = ConsoleDevicePath;
+  do {
+    Instance = GetNextDevicePathInstance (&TempDevicePath, &Size);
+    if (Instance == NULL) {
+      break;
+    }
+
+    switch (ConsoleType) {
+    case ConIn:
+      if (IsUsbShortForm (Instance)) {
+        //
+        // Append Usb Keyboard short form DevicePath into "ConInDev"
+        //
+        EfiBootManagerUpdateConsoleVariable (ConInDev, Instance, NULL);
+      }
+      EfiBootManagerUpdateConsoleVariable (ConsoleType, Instance, NULL);
+      break;
+    case ConOut:
+      GraphicsControllerHandle = IsVideoController (Instance);
+      if (GraphicsControllerHandle == NULL) {
+        EfiBootManagerUpdateConsoleVariable (ConsoleType, Instance, NULL);
+      } else {
+        //
+        // Connect the GOP driver
+        //
+        gBS->ConnectController (GraphicsControllerHandle, NULL, NULL, TRUE);
+        //
+        // Get the GOP device path
+        // NOTE: We may get a device path that contains Controller node in it.
+        //
+        GopDevicePath = EfiBootManagerGetGopDevicePath (GraphicsControllerHandle);
+        if (GopDevicePath != NULL) {
+          EfiBootManagerUpdateConsoleVariable (ConsoleType, GopDevicePath, NULL);
+        }
+      }
+      break;
+    default:
+      ASSERT(FALSE);
+      break;
+    }
+
+    FreePool (Instance);
+  } while (TempDevicePath != NULL);
+}
+
+/**
+  The function connects the trusted consoles.
+**/
+VOID
+ConnectTrustedConsole (
+  VOID
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL     *Consoles;
+  EFI_DEVICE_PATH_PROTOCOL     *TempDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL     *Instance;
+  EFI_DEVICE_PATH_PROTOCOL     *Next;
+  UINTN                        Size;
+  UINTN                        Index;
+  EFI_HANDLE                   Handle;
+  EFI_STATUS                   Status;
+  CHAR16                       *ConsoleVar[] = {L"ConIn", L"ConOut"};
+  VOID                         *TrustedConsoleDevicepath;
+
+  TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleInputDevicePath);
+  DumpDevicePath (L"TrustedConsoleIn", TrustedConsoleDevicepath);
+  TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleOutputDevicePath);
+  DumpDevicePath (L"TrustedConsoleOut", TrustedConsoleDevicepath);
+
+  for (Index = 0; Index < sizeof (ConsoleVar) / sizeof (ConsoleVar[0]); Index++) {
+
+    GetEfiGlobalVariable2 (ConsoleVar[Index], (VOID **)&Consoles, NULL);
+
+    TempDevicePath = Consoles;
+    do {
+      Instance = GetNextDevicePathInstance (&TempDevicePath, &Size);
+      if (Instance == NULL) {
+        break;
+      }
+      if (IsTrustedConsole (Index, Instance)) {
+        if (IsUsbShortForm (Instance)) {
+          ConnectUsbShortFormDevicePath (Instance);
+        } else {
+          for (Next = Instance; !IsDevicePathEnd (Next); Next = NextDevicePathNode (Next)) {
+            if (DevicePathType (Next) == ACPI_DEVICE_PATH && DevicePathSubType (Next) == ACPI_ADR_DP) {
+              break;
+            } else if (DevicePathType (Next) == HARDWARE_DEVICE_PATH &&
+                       DevicePathSubType (Next) == HW_CONTROLLER_DP &&
+                       DevicePathType (NextDevicePathNode (Next)) == ACPI_DEVICE_PATH &&
+                       DevicePathSubType (NextDevicePathNode (Next)) == ACPI_ADR_DP
+                       ) {
+              break;
+            }
+          }
+          if (!IsDevicePathEnd (Next)) {
+            SetDevicePathEndNode (Next);
+            Status = EfiBootManagerConnectDevicePath (Instance, &Handle);
+            if (!EFI_ERROR (Status)) {
+              gBS->ConnectController (Handle, NULL, NULL, TRUE);
+            }
+          } else {
+            EfiBootManagerConnectDevicePath (Instance, NULL);
+          }
+        }
+      }
+      FreePool (Instance);
+    } while (TempDevicePath != NULL);
+
+    if (Consoles != NULL) {
+      FreePool (Consoles);
+    }
+  }
+}
+
+/**
+  The function connects the trusted Storages.
+**/
+VOID
+ConnectTrustedStorage (
+  VOID
+  )
+{
+  VOID                      *TrustedStorageDevicepath;
+  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL  *Instance;
+  UINTN                     Size;
+  EFI_DEVICE_PATH_PROTOCOL  *TempStorageDevicePath;
+  EFI_STATUS                Status;
+  EFI_HANDLE                DeviceHandle;
+
+  TrustedStorageDevicepath = PcdGetPtr (PcdTrustedStorageDevicePath);
+  DumpDevicePath (L"TrustedStorage", TrustedStorageDevicepath);
+
+  TempDevicePath = TrustedStorageDevicepath;
+  do {
+    Instance = GetNextDevicePathInstance (&TempDevicePath, &Size);
+    if (Instance == NULL) {
+      break;
+    }
+
+    EfiBootManagerConnectDevicePath (Instance, NULL);
+
+    TempStorageDevicePath = Instance;
+
+    Status = gBS->LocateDevicePath (
+                    &gEfiDevicePathProtocolGuid,
+                    &TempStorageDevicePath,
+                    &DeviceHandle
+                    );
+    if (!EFI_ERROR (Status)) {
+      gBS->ConnectController (DeviceHandle, NULL, NULL, FALSE);
+    }
+
+    FreePool (Instance);
+  } while (TempDevicePath != NULL);
+}
+
+/**
+  The function connects the trusted consoles and then call the PP processing library interface.
+**/
+VOID
+ProcessTcgPp (
+  VOID
+  )
+{
+  gPPRequireUIConfirm |= Tcg2PhysicalPresenceLibNeedUserConfirm();
+
+  if (gPPRequireUIConfirm) {
+    ConnectTrustedConsole ();
+  }
+
+  Tcg2PhysicalPresenceLibProcessRequest (NULL);
+}
+
+/**
+  The function connects the trusted storage to perform TPerReset.
+**/
+VOID
+ProcessTcgMor (
+  VOID
+  )
+{
+  if (IsMorBitSet ()) {
+    ConnectTrustedConsole();
+    ConnectTrustedStorage();
+  }
+}
+
+/**
+  Check if current BootCurrent variable is internal shell boot option.
+
+  @retval  TRUE         BootCurrent is internal shell.
+  @retval  FALSE        BootCurrent is not internal shell.
+**/
+BOOLEAN
+BootCurrentIsInternalShell (
+  VOID
+  )
+{
+  UINTN                         VarSize;
+  UINT16                        BootCurrent;
+  CHAR16                        BootOptionName[16];
+  UINT8                         *BootOption;
+  UINT8                         *Ptr;
+  BOOLEAN                       Result;
+  EFI_STATUS                    Status;
+  EFI_DEVICE_PATH_PROTOCOL      *TempDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL      *LastDeviceNode;
+  EFI_GUID                      *GuidPoint;
+
+  BootOption = NULL;
+  Result     = FALSE;
+
+  //
+  // Get BootCurrent variable
+  //
+  VarSize = sizeof (UINT16);
+  Status = gRT->GetVariable (
+                  L"BootCurrent",
+                  &gEfiGlobalVariableGuid,
+                  NULL,
+                  &VarSize,
+                  &BootCurrent
+                  );
+  if (EFI_ERROR (Status)) {
+    return FALSE;
+  }
+
+  //
+  // Create boot option Bootxxxx from BootCurrent
+  //
+  UnicodeSPrint (BootOptionName, sizeof(BootOptionName), L"Boot%04X", BootCurrent);
+
+  GetEfiGlobalVariable2 (BootOptionName, (VOID **) &BootOption, &VarSize);
+  if (BootOption == NULL || VarSize == 0) {
+    return FALSE;
+  }
+
+  Ptr = BootOption;
+  Ptr += sizeof (UINT32);
+  Ptr += sizeof (UINT16);
+  Ptr += StrSize ((CHAR16 *) Ptr);
+  TempDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
+  LastDeviceNode = TempDevicePath;
+  while (!IsDevicePathEnd (TempDevicePath)) {
+    LastDeviceNode = TempDevicePath;
+    TempDevicePath = NextDevicePathNode (TempDevicePath);
+  }
+  GuidPoint = EfiGetNameGuidFromFwVolDevicePathNode (
+                (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode
+                );
+  if ((GuidPoint != NULL) &&
+      ((CompareGuid (GuidPoint, &gUefiShellFileGuid)))
+    ) {
+    //
+    // if this option is internal shell, return TRUE
+    //
+    Result = TRUE;
+  }
+
+  if (BootOption != NULL) {
+    FreePool (BootOption);
+    BootOption = NULL;
+  }
+
+  return Result;
+}
+
+/**
+  This function will change video resolution and text mode
+  for internl shell when internal shell is launched.
+
+  @param   None.
+
+  @retval  EFI_SUCCESS  Mode is changed successfully.
+  @retval  Others       Mode failed to changed.
+**/
+EFI_STATUS
+EFIAPI
+ChangeModeForInternalShell (
+  VOID
+  )
+{
+  EFI_GRAPHICS_OUTPUT_PROTOCOL          *GraphicsOutput;
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL       *SimpleTextOut;
+  UINTN                                 SizeOfInfo;
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info;
+  UINT32                                MaxGopMode;
+  UINT32                                MaxTextMode;
+  UINT32                                ModeNumber;
+  UINTN                                 HandleCount;
+  EFI_HANDLE                            *HandleBuffer;
+  EFI_STATUS                            Status;
+  UINTN                                 Index;
+  UINTN                                 CurrentColumn;
+  UINTN                                 CurrentRow;
+
+  Status = gBS->HandleProtocol (
+                  gST->ConsoleOutHandle,
+                  &gEfiGraphicsOutputProtocolGuid,
+                  (VOID**)&GraphicsOutput
+                  );
+  if (EFI_ERROR (Status)) {
+    GraphicsOutput = NULL;
+  }
+
+  Status = gBS->HandleProtocol (
+                  gST->ConsoleOutHandle,
+                  &gEfiSimpleTextOutProtocolGuid,
+                  (VOID**)&SimpleTextOut
+                  );
+  if (EFI_ERROR (Status)) {
+    SimpleTextOut = NULL;
+  }
+
+  if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {
+    return EFI_UNSUPPORTED;
+  }
+
+  MaxGopMode  = GraphicsOutput->Mode->MaxMode;
+  MaxTextMode = SimpleTextOut->Mode->MaxMode;
+
+  //
+  // 1. If current video resolution is same with new video resolution,
+  //    video resolution need not be changed.
+  //    1.1. If current text mode is same with new text mode, text mode need not be change.
+  //    1.2. If current text mode is different with new text mode, text mode need be change to new text mode.
+  // 2. If current video resolution is different with new video resolution, we need restart whole console drivers.
+  //
+  for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {
+    Status = GraphicsOutput->QueryMode (
+                       GraphicsOutput,
+                       ModeNumber,
+                       &SizeOfInfo,
+                       &Info
+                       );
+    if (!EFI_ERROR (Status)) {
+      if ((Info->HorizontalResolution == mShellHorizontalResolution) &&
+          (Info->VerticalResolution == mShellVerticalResolution)) {
+        if ((GraphicsOutput->Mode->Info->HorizontalResolution == mShellHorizontalResolution) &&
+            (GraphicsOutput->Mode->Info->VerticalResolution == mShellVerticalResolution)) {
+          //
+          // If current video resolution is same with new resolution,
+          // then check if current text mode is same with new text mode.
+          //
+          Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);
+          ASSERT_EFI_ERROR (Status);
+          if (CurrentColumn == mShellModeColumn && CurrentRow == mShellModeRow) {
+            //
+            // Current text mode is same with new text mode, text mode need not be change.
+            //
+            FreePool (Info);
+            return EFI_SUCCESS;
+          } else {
+            //
+            // Current text mode is different with new text mode, text mode need be change to new text mode.
+            //
+            for (Index = 0; Index < MaxTextMode; Index++) {
+              Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);
+              if (!EFI_ERROR(Status)) {
+                if ((CurrentColumn == mShellModeColumn) && (CurrentRow == mShellModeRow)) {
+                  //
+                  // New text mode is supported, set it.
+                  //
+                  Status = SimpleTextOut->SetMode (SimpleTextOut, Index);
+                  ASSERT_EFI_ERROR (Status);
+                  //
+                  // Update text mode PCD.
+                  //
+                  Status = PcdSet32S (PcdConOutColumn, mShellModeColumn);
+                  ASSERT_EFI_ERROR (Status);
+
+                  Status = PcdSet32S (PcdConOutRow, mShellModeRow);
+                  ASSERT_EFI_ERROR (Status);
+
+                  FreePool (Info);
+                  return EFI_SUCCESS;
+                }
+              }
+            }
+            if (Index == MaxTextMode) {
+              //
+              // If new text mode is not supported, return error.
+              //
+              FreePool (Info);
+              return EFI_UNSUPPORTED;
+            }
+          }
+        } else {
+          FreePool (Info);
+          //
+          // If current video resolution is not same with the new one, set new video resolution.
+          // In this case, the driver which produces simple text out need be restarted.
+          //
+          Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);
+          if (!EFI_ERROR (Status)) {
+            //
+            // Set PCD to restart GraphicsConsole and Consplitter to change video resolution
+            // and produce new text mode based on new resolution.
+            //
+            Status = PcdSet32S (PcdVideoHorizontalResolution, mShellHorizontalResolution);
+            ASSERT_EFI_ERROR (Status);
+
+            Status = PcdSet32S (PcdVideoVerticalResolution, mShellVerticalResolution);
+            ASSERT_EFI_ERROR (Status);
+
+            Status = PcdSet32S (PcdConOutColumn, mShellModeColumn);
+            ASSERT_EFI_ERROR (Status);
+
+            Status = PcdSet32S (PcdConOutRow, mShellModeRow);
+            ASSERT_EFI_ERROR (Status);
+
+            Status = gBS->LocateHandleBuffer (
+                             ByProtocol,
+                             &gEfiSimpleTextOutProtocolGuid,
+                             NULL,
+                             &HandleCount,
+                             &HandleBuffer
+                             );
+            if (!EFI_ERROR (Status)) {
+              for (Index = 0; Index < HandleCount; Index++) {
+                gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);
+              }
+              for (Index = 0; Index < HandleCount; Index++) {
+                gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
+              }
+              if (HandleBuffer != NULL) {
+                FreePool (HandleBuffer);
+              }
+              break;
+            }
+          }
+        }
+      }
+      FreePool (Info);
+    }
+  }
+
+  if (ModeNumber == MaxGopMode) {
+    //
+    // If the new resolution is not supported, return error.
+    //
+    return EFI_UNSUPPORTED;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  ReadyToBoot callback to set video and text mode for internal shell boot.
+  That will not connect USB controller while CSM and FastBoot are disabled, we need to connect them
+  before booting to Shell for showing USB devices in Shell.
+
+  When FastBoot is enabled and Windows Console is the chosen Console behavior, input devices will not be connected
+  by default. Hence, when booting to EFI shell, connecting input consoles are required.
+
+  @param  Event   Pointer to this event
+  @param  Context Event hanlder private data
+
+  @retval None.
+**/
+VOID
+EFIAPI
+OnReadyToBootCallBack (
+  IN  EFI_EVENT                 Event,
+  IN  VOID                      *Context
+  )
+{
+  DEBUG ((DEBUG_INFO, "OnReadyToBootCallBack\n"));
+
+  if (BootCurrentIsInternalShell ()) {
+
+    ChangeModeForInternalShell ();
+    EfiBootManagerConnectAllDefaultConsoles();
+    gDS->Dispatch ();
+  }
+}
+
+/**
+  Platform Bds init. Incude the platform firmware vendor, revision
+  and so crc check.
+**/
+VOID
+EFIAPI
+PlatformBootManagerBeforeConsole (
+  VOID
+  )
+{
+  EFI_STATUS                          Status;
+  EFI_DEVICE_PATH_PROTOCOL            *VarConOut;
+  EFI_DEVICE_PATH_PROTOCOL            *VarConIn;
+  EFI_EVENT                           Event;
+
+  DEBUG ((DEBUG_INFO, "PlatformBootManagerBeforeConsole\n"));
+
+  Status = EFI_SUCCESS;
+
+  //
+  // Get user defined text mode for internal shell only once.
+  //
+  mShellHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);
+  mShellVerticalResolution   = PcdGet32 (PcdSetupVideoVerticalResolution);
+  mShellModeColumn           = PcdGet32 (PcdSetupConOutColumn);
+  mShellModeRow              = PcdGet32 (PcdSetupConOutRow);
+
+  //
+  // Create event to set proper video resolution and text mode for internal shell.
+  //
+  Status = EfiCreateEventReadyToBootEx (
+             TPL_CALLBACK,
+             OnReadyToBootCallBack,
+             NULL,
+             &Event
+             );
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Connect Root Bridge to make PCI BAR resource allocated and all PciIo created
+  //
+  ConnectRootBridge (FALSE);
+
+  //
+  // Fill ConIn/ConOut in Full Configuration boot mode
+  //
+  gBootMode = GetBootModeHob();
+  DEBUG ((DEBUG_INFO, "PlatformBootManagerInit - %x\n", gBootMode));
+
+  if (gBootMode == BOOT_WITH_FULL_CONFIGURATION ||
+      gBootMode == BOOT_WITH_DEFAULT_SETTINGS ||
+      gBootMode == BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS ||
+      gBootMode == BOOT_IN_RECOVERY_MODE) {
+
+    GetEfiGlobalVariable2 (L"ConOut", (VOID **)&VarConOut, NULL);   if (VarConOut != NULL) { FreePool (VarConOut); }
+    GetEfiGlobalVariable2 (L"ConIn", (VOID **)&VarConIn, NULL);    if (VarConIn  != NULL) { FreePool (VarConIn);  }
+
+    //
+    // Only fill ConIn/ConOut when ConIn/ConOut is empty because we may drop to Full Configuration boot mode in non-first boot
+    //
+    if (VarConOut == NULL || VarConIn == NULL) {
+      if (PcdGetSize (PcdTrustedConsoleOutputDevicePath) >= sizeof(EFI_DEVICE_PATH_PROTOCOL)) {
+        AddConsoleVariable (ConOut, PcdGetPtr (PcdTrustedConsoleOutputDevicePath));
+      }
+      if (PcdGetSize (PcdTrustedConsoleInputDevicePath) >= sizeof(EFI_DEVICE_PATH_PROTOCOL)) {
+        AddConsoleVariable (ConIn, PcdGetPtr (PcdTrustedConsoleInputDevicePath));
+      }
+    }
+  }
+
+  EnumIsaSerial ();
+
+  EnumUsbKeyboard ();
+  //
+  // For trusted console it must be handled here.
+  //
+  UpdateGraphicConOut (TRUE);
+
+  if (gBootMode == BOOT_ON_FLASH_UPDATE) {
+    //
+    // Logo show
+    //
+    BootLogoEnableLogo ();
+
+    DEBUG((DEBUG_INFO, "ProcessCapsules Before EndOfDxe......\n"));
+    ProcessCapsules ();
+    DEBUG((DEBUG_INFO, "ProcessCapsules Done\n"));
+  }
+
+  //
+  // Dynamically register hot key: F2/F7/Enter
+  //
+  RegisterDefaultBootOption ();
+  RegisterStaticHotkey ();
+
+  PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7010);
+  if (PcdGetBool (PcdTpm2Enable)) {
+    ProcessTcgPp ();
+    ProcessTcgMor ();
+  }
+  PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7011);
+
+  //
+  // We should make all UEFI memory and GCD information populated before ExitPmAuth.
+  // SMM may consume these information.
+  //
+  MemoryTest((EXTENDMEM_COVERAGE_LEVEL) PcdGet32 (PcdPlatformMemoryCheckLevel));
+
+  PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7020);
+  ExitPmAuth ();
+  PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7021);
+
+  //
+  // Dispatch the deferred 3rd party images.
+  //
+  EfiBootManagerDispatchDeferredImages ();
+
+  //
+  // For non-trusted console it must be handled here.
+  //
+  UpdateGraphicConOut (FALSE);
+
+  if (gBootMode == BOOT_ON_FLASH_UPDATE) {
+    //
+    // Logo show
+    //
+    BootLogoEnableLogo ();
+
+    DEBUG((DEBUG_INFO, "ProcessCapsules After ConnectAll......\n"));
+    ProcessCapsules();
+    DEBUG((DEBUG_INFO, "ProcessCapsules Done\n"));
+  }
+}
+
+
+/**
+  Connect with predeined platform connect sequence,
+  the OEM/IBV can customize with their own connect sequence.
+
+  @param[in] BootMode          Boot mode of this boot.
+**/
+VOID
+ConnectSequence (
+  IN EFI_BOOT_MODE         BootMode
+  )
+{
+  EfiBootManagerConnectAll ();
+}
+
+/**
+  The function is to consider the boot order which is not in our expectation.
+  In the case that we need to re-sort the boot option.
+
+  @retval  TRUE         Need to sort Boot Option.
+  @retval  FALSE        Don't need to sort Boot Option.
+**/
+BOOLEAN
+IsNeedSortBootOption (
+  VOID
+  )
+{
+  EFI_BOOT_MANAGER_LOAD_OPTION  *BootOptions;
+  UINTN                         BootOptionCount;
+
+  BootOptions = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
+
+  //
+  // If setup is the first priority in boot option, we need to sort boot option.
+  //
+  if ((BootOptionCount > 1) &&
+      (((StrnCmp (BootOptions->Description, L"Enter Setup", StrLen (L"Enter Setup"))) == 0) ||
+       ((StrnCmp (BootOptions->Description, L"BootManagerMenuApp", StrLen (L"BootManagerMenuApp"))) == 0))) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
+  The function will excute with as the platform policy, current policy
+  is driven by boot mode. IBV/OEM can customize this code for their specific
+  policy action.
+
+  @param DriverOptionList - The header of the driver option link list
+  @param BootOptionList   - The header of the boot option link list
+  @param ProcessCapsules  - A pointer to ProcessCapsules()
+  @param BaseMemoryTest   - A pointer to BaseMemoryTest()
+**/
+VOID
+EFIAPI
+PlatformBootManagerAfterConsole (
+  VOID
+  )
+{
+  EFI_BOOT_MODE                 LocalBootMode;
+
+  DEBUG ((DEBUG_INFO, "PlatformBootManagerAfterConsole\n"));
+
+  //
+  // Get current Boot Mode
+  //
+  LocalBootMode = gBootMode;
+  DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode));
+
+  //
+  // Logo show
+  //
+  BootLogoEnableLogo ();
+
+  //
+  // Go the different platform policy with different boot mode
+  // Notes: this part code can be change with the table policy
+  //
+  switch (LocalBootMode) {
+
+
+  case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
+  case BOOT_WITH_MINIMAL_CONFIGURATION:
+  case BOOT_ON_S4_RESUME:
+    //
+    // Perform some platform specific connect sequence
+    //
+    PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7050);
+    ConnectSequence (LocalBootMode);
+    PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7051);
+
+    break;
+
+  case BOOT_WITH_FULL_CONFIGURATION:
+  case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
+  case BOOT_WITH_DEFAULT_SETTINGS:
+  default:
+    //
+    // Perform some platform specific connect sequence
+    //
+    ConnectSequence (LocalBootMode);
+
+    //
+    // Only in Full Configuration boot mode we do the enumeration of boot device
+    //
+    //
+    // Dispatch all but Storage Oprom explicitly, because we assume Int13Thunk driver is there.
+    //
+    EfiBootManagerRefreshAllBootOption ();
+
+    if (IsNeedSortBootOption()) {
+      EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootOption);
+    }
+    //
+    // PXE boot option may appear after boot option enumeration
+    //
+
+    break;
+  }
+
+  Print (L"Press F7 for BootMenu!\n");
+
+  EfiBootManagerRefreshAllBootOption ();
+  EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootOption);
+}
+
+/**
+  The function is called when no boot option could be launched,
+  including platform recovery options and options pointing to applications
+  built into firmware volumes.
+
+  If this function returns, BDS attempts to enter an infinite loop.
+**/
+VOID
+EFIAPI
+PlatformBootManagerUnableToBoot (
+  VOID
+  )
+{
+  EFI_STATUS                   Status;
+  EFI_BOOT_MANAGER_LOAD_OPTION BootDeviceList;
+  CHAR16                       OptionName[sizeof ("Boot####")];
+
+  if (mBootMenuOptionNumber == LoadOptionNumberUnassigned) {
+    return;
+  }
+  UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", mBootMenuOptionNumber);
+  Status = EfiBootManagerVariableToLoadOption (OptionName, &BootDeviceList);
+  if (EFI_ERROR (Status)) {
+    return;
+  }
+  for (;;) {
+    EfiBootManagerBoot (&BootDeviceList);
+  }
+}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.h
new file mode 100644
index 0000000000..0bdc11bdd8
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.h
@@ -0,0 +1,253 @@
+/** @file
+  Header file for BDS Platform specific code
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _BDS_PLATFORM_H
+#define _BDS_PLATFORM_H
+
+#include <PiDxe.h>
+#include <Protocol/DevicePath.h>
+#include <Protocol/SimpleNetwork.h>
+#include <Protocol/PciRootBridgeIo.h>
+#include <Protocol/LoadFile.h>
+#include <Protocol/PciIo.h>
+#include <Protocol/CpuIo2.h>
+#include <Protocol/LoadedImage.h>
+#include <Protocol/DiskInfo.h>
+#include <Protocol/GraphicsOutput.h>
+#include <Protocol/UgaDraw.h>
+#include <Protocol/GenericMemoryTest.h>
+#include <Protocol/DevicePathToText.h>
+#include <Protocol/FirmwareVolume2.h>
+#include <Protocol/SimpleFileSystem.h>
+
+#include <Guid/CapsuleVendor.h>
+#include <Guid/MemoryTypeInformation.h>
+#include <Guid/GlobalVariable.h>
+#include <Guid/MemoryOverwriteControl.h>
+#include <Guid/FileInfo.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/BaseLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PlatformBootManagerLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/UefiLib.h>
+#include <Library/HobLib.h>
+#include <Library/DxeServicesLib.h>
+#include <Library/DxeServicesTableLib.h>
+#include <Library/PrintLib.h>
+#include <Library/HiiLib.h>
+#include <Library/CapsuleLib.h>
+#include <Library/PerformanceLib.h>
+
+#include <IndustryStandard/Pci30.h>
+#include <IndustryStandard/PciCodeId.h>
+
+///
+/// ConnectType
+///
+#define CONSOLE_OUT 0x00000001
+#define STD_ERROR   0x00000002
+#define CONSOLE_IN  0x00000004
+#define CONSOLE_ALL (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
+
+extern EFI_GUID                  gUefiShellFileGuid;
+extern EFI_BOOT_MODE             gBootMode;
+
+#define PCI_DEVICE_PATH_NODE(Func, Dev) \
+  { \
+    HARDWARE_DEVICE_PATH, \
+    HW_PCI_DP, \
+    { \
+      (UINT8) (sizeof (PCI_DEVICE_PATH)), \
+      (UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8) \
+    }, \
+    (Func), \
+    (Dev) \
+  }
+
+#define PNPID_DEVICE_PATH_NODE(PnpId) \
+  { \
+    { \
+      ACPI_DEVICE_PATH, \
+      ACPI_DP, \
+      { \
+        (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
+        (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
+      } \
+    }, \
+    EISA_PNP_ID((PnpId)), \
+    0 \
+  }
+
+#define gPciRootBridge \
+  { \
+    { \
+      ACPI_DEVICE_PATH, \
+      ACPI_DP, \
+      { \
+        (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
+        (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
+      }, \
+    }, \
+    EISA_PNP_ID (0x0A03), \
+    0 \
+  }
+
+#define gPciIsaBridge \
+  PCI_DEVICE_PATH_NODE(0, 0x1f)
+
+#define gPnp16550ComPort \
+  PNPID_DEVICE_PATH_NODE(0x0501)
+
+#define gUart(BaudRate, DataBits, Parity, StopBits) \
+  { \
+    { \
+      MESSAGING_DEVICE_PATH, \
+      MSG_UART_DP, \
+      { \
+        (UINT8) (sizeof (UART_DEVICE_PATH)), \
+        (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) \
+      } \
+    }, \
+    0, \
+    (BaudRate), \
+    (DataBits), \
+    (Parity), \
+    (StopBits) \
+  }
+
+#define gPcAnsiTerminal \
+  { \
+    { \
+      MESSAGING_DEVICE_PATH, \
+      MSG_VENDOR_DP, \
+      { \
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)), \
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) \
+      } \
+    }, \
+    DEVICE_PATH_MESSAGING_PC_ANSI \
+  }
+
+#define gEndEntire \
+  { \
+    END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { END_DEVICE_PATH_LENGTH, 0 } \
+  }
+
+typedef struct {
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+  UINTN                     ConnectType;
+} BDS_CONSOLE_CONNECT_ENTRY;
+
+//
+// Platform Root Bridge
+//
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_ROOT_BRIDGE_DEVICE_PATH;
+
+//
+// Below is the platform console device path
+//
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           IsaBridge;
+  ACPI_HID_DEVICE_PATH      Keyboard;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_KEYBOARD_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           PciDevice;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_ONBOARD_CONTROLLER_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           Pci0Device;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_PEG_ROOT_CONTROLLER_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           PciBridge;
+  PCI_DEVICE_PATH           PciDevice;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_PCI_CONTROLLER_DEVICE_PATH;
+
+//
+// Below is the boot option device path
+//
+
+#define CLASS_HID           3
+#define SUBCLASS_BOOT       1
+#define PROTOCOL_KEYBOARD   1
+
+typedef struct {
+  USB_CLASS_DEVICE_PATH           UsbClass;
+  EFI_DEVICE_PATH_PROTOCOL        End;
+} USB_CLASS_FORMAT_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           IsaBridge;
+  ACPI_HID_DEVICE_PATH      IsaSerial;
+  UART_DEVICE_PATH          Uart;
+  VENDOR_DEVICE_PATH        TerminalType;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_ISA_SERIAL_DEVICE_PATH;
+
+//
+// Platform BDS Functions
+//
+
+
+/**
+  Perform the memory test base on the memory test intensive level,
+  and update the memory resource.
+
+  @param  Level         The memory test intensive level.
+
+  @retval EFI_STATUS    Success test all the system memory and update
+                        the memory resource
+
+**/
+EFI_STATUS
+MemoryTest (
+  IN EXTENDMEM_COVERAGE_LEVEL Level
+  );
+
+VOID
+ConnectSequence (
+  IN EFI_BOOT_MODE                      BootMode
+  );
+
+
+INTN
+EFIAPI
+CompareBootOption (
+  CONST VOID  *Left,
+  CONST VOID  *Right
+  );
+
+
+VOID
+RegisterStaticHotkey (
+  VOID
+  );
+VOID
+RegisterDefaultBootOption (
+  VOID
+  );
+
+#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
new file mode 100644
index 0000000000..b04169ad33
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
@@ -0,0 +1,95 @@
+### @file
+# Component name for module DxePlatformBootManagerLib
+#
+# Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+###
+
+[Defines]
+  INF_VERSION                    = 0x00010017
+  BASE_NAME                      = DxePlatformBootManagerLib
+  FILE_GUID                      = A6BC385D-59E5-4B77-87D7-200ABAA83C15
+  VERSION_STRING                 = 1.0
+  MODULE_TYPE                    = DXE_DRIVER
+  UEFI_SPECIFICATION_VERSION     = 2.10
+  LIBRARY_CLASS                  = PlatformBootManagerLib|DXE_DRIVER
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 EBC
+#
+
+[LibraryClasses]
+  BaseLib
+  MemoryAllocationLib
+  UefiBootServicesTableLib
+  UefiRuntimeServicesTableLib
+  BaseMemoryLib
+  DebugLib
+  PcdLib
+  PrintLib
+  DevicePathLib
+  UefiLib
+  HobLib
+  DxeServicesLib
+  DxeServicesTableLib
+  HiiLib
+  UefiBootManagerLib
+  PerformanceLib
+  TimerLib
+  Tcg2PhysicalPresenceLib
+  CapsuleLib
+  BootLogoLib
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  SecurityPkg/SecurityPkg.dec
+  MinPlatformPkg/MinPlatformPkg.dec
+
+[Pcd]
+  gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable                    ## CONSUMES
+  gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut                   ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution       ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution         ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow                       ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn                    ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn               ## CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow                  ## CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution  ## CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution    ## CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand            ## PRODUCES
+  gMinPlatformPkgTokenSpaceGuid.PcdPlatformMemoryCheckLevel      ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdBootToShellOnly               ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleInputDevicePath  ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleOutputDevicePath ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdTrustedStorageDevicePath       ## CONSUMES
+
+[Sources]
+  BdsPlatform.c
+  BdsPlatform.h
+  PlatformBootOption.c
+  MemoryTest.c
+
+[Protocols]
+  gEfiPciRootBridgeIoProtocolGuid               ## CONSUMES
+  gEfiPciIoProtocolGuid                         ## CONSUMES
+  gEfiCpuIo2ProtocolGuid                        ## CONSUMES
+  gEfiDxeSmmReadyToLockProtocolGuid             ## PRODUCES
+  gEfiGenericMemTestProtocolGuid                ## CONSUMES
+  gEfiDiskInfoProtocolGuid                      ## CONSUMES
+  gEfiDevicePathToTextProtocolGuid              ## CONSUMES
+  gEfiSimpleTextInputExProtocolGuid             ## CONSUMES
+  gEfiFirmwareVolume2ProtocolGuid               ## CONSUMES
+  gEfiFormBrowser2ProtocolGuid                  ## CONSUMES
+  gEfiGenericMemTestProtocolGuid                ## CONSUMES
+
+[Guids]
+  gEfiGlobalVariableGuid                        ## PRODUCES
+  gEfiMemoryOverwriteControlDataGuid            ## PRODUCES
+  gEfiEndOfDxeEventGroupGuid                    ## CONSUMES
+
+[Depex.common.DXE_DRIVER]
+  gEfiVariableArchProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/MemoryTest.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/MemoryTest.c
new file mode 100644
index 0000000000..654845349a
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/MemoryTest.c
@@ -0,0 +1,83 @@
+/** @file
+  Perform the platform memory test
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "BdsPlatform.h"
+#include <Protocol/GenericMemoryTest.h>
+
+/**
+  Perform the memory test base on the memory test intensive level,
+  and update the memory resource.
+
+  @param  Level         The memory test intensive level.
+
+  @retval EFI_STATUS    Success test all the system memory and update
+                        the memory resource
+
+**/
+EFI_STATUS
+MemoryTest (
+  IN EXTENDMEM_COVERAGE_LEVEL Level
+  )
+{
+  EFI_STATUS                        Status;
+  BOOLEAN                           RequireSoftECCInit;
+  EFI_GENERIC_MEMORY_TEST_PROTOCOL  *GenMemoryTest;
+  UINT64                            TestedMemorySize;
+  UINT64                            TotalMemorySize;
+  BOOLEAN                           ErrorOut;
+  BOOLEAN                           TestAbort;
+
+  TestedMemorySize  = 0;
+  TotalMemorySize   = 0;
+  ErrorOut          = FALSE;
+  TestAbort         = FALSE;
+
+  RequireSoftECCInit = FALSE;
+
+  Status = gBS->LocateProtocol (
+                  &gEfiGenericMemTestProtocolGuid,
+                  NULL,
+                  (VOID **) &GenMemoryTest
+                  );
+  if (EFI_ERROR (Status)) {
+    return EFI_SUCCESS;
+  }
+
+  Status = GenMemoryTest->MemoryTestInit (
+                                GenMemoryTest,
+                                Level,
+                                &RequireSoftECCInit
+                                );
+  if (Status == EFI_NO_MEDIA) {
+    //
+    // The PEI codes also have the relevant memory test code to check the memory,
+    // it can select to test some range of the memory or all of them. If PEI code
+    // checks all the memory, this BDS memory test will has no not-test memory to
+    // do the test, and then the status of EFI_NO_MEDIA will be returned by
+    // "MemoryTestInit". So it does not need to test memory again, just return.
+    //
+    return EFI_SUCCESS;
+  }
+
+  do {
+    Status = GenMemoryTest->PerformMemoryTest (
+                              GenMemoryTest,
+                              &TestedMemorySize,
+                              &TotalMemorySize,
+                              &ErrorOut,
+                              TestAbort
+                              );
+    if (ErrorOut && (Status == EFI_DEVICE_ERROR)) {
+      ASSERT (0);
+    }
+  } while (Status != EFI_NOT_FOUND);
+
+  Status = GenMemoryTest->Finished (GenMemoryTest);
+
+  return EFI_SUCCESS;
+}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/PlatformBootOption.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/PlatformBootOption.c
new file mode 100644
index 0000000000..84aa097d58
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/PlatformBootOption.c
@@ -0,0 +1,559 @@
+/** @file
+  Driver for Platform Boot Options support.
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "BdsPlatform.h"
+
+#include <Library/PcdLib.h>
+
+BOOLEAN    mContinueBoot  = FALSE;
+BOOLEAN    mBootMenuBoot  = FALSE;
+BOOLEAN    mPxeBoot       = FALSE;
+BOOLEAN    mHotKeypressed = FALSE;
+EFI_EVENT  HotKeyEvent    = NULL;
+
+UINTN      mBootMenuOptionNumber;
+
+EFI_DEVICE_PATH_PROTOCOL *
+BdsCreateShellDevicePath (
+  VOID
+  )
+/*++
+
+Routine Description:
+
+  This function will create a SHELL BootOption to boot.
+
+Arguments:
+
+  None.
+
+Returns:
+
+  Shell Device path for booting.
+
+--*/
+{
+  UINTN                             FvHandleCount;
+  EFI_HANDLE                        *FvHandleBuffer;
+  UINTN                             Index;
+  EFI_STATUS                        Status;
+  EFI_FIRMWARE_VOLUME2_PROTOCOL     *Fv;
+  UINTN                             Size;
+  UINT32                            AuthenticationStatus;
+  EFI_DEVICE_PATH_PROTOCOL          *DevicePath;
+  VOID                              *Buffer;
+
+  DevicePath  = NULL;
+  Status      = EFI_SUCCESS;
+
+  DEBUG ((DEBUG_INFO, "BdsCreateShellDevicePath\n"));
+  gBS->LocateHandleBuffer (
+        ByProtocol,
+        &gEfiFirmwareVolume2ProtocolGuid,
+        NULL,
+        &FvHandleCount,
+        &FvHandleBuffer
+        );
+
+  for (Index = 0; Index < FvHandleCount; Index++) {
+    gBS->HandleProtocol (
+          FvHandleBuffer[Index],
+          &gEfiFirmwareVolume2ProtocolGuid,
+          (VOID **) &Fv
+          );
+
+    Buffer  = NULL;
+    Size    = 0;
+    Status  = Fv->ReadSection (
+                    Fv,
+                    &gUefiShellFileGuid,
+                    EFI_SECTION_PE32,
+                    0,
+                    &Buffer,
+                    &Size,
+                    &AuthenticationStatus
+                    );
+    if (EFI_ERROR (Status)) {
+      //
+      // Skip if no shell file in the FV
+      //
+      continue;
+    } else {
+      //
+      // Found the shell
+      //
+      break;
+    }
+  }
+
+  if (EFI_ERROR (Status)) {
+    //
+    // No shell present
+    //
+    if (FvHandleCount) {
+      FreePool (FvHandleBuffer);
+    }
+    return NULL;
+  }
+  //
+  // Build the shell boot option
+  //
+  DevicePath = DevicePathFromHandle (FvHandleBuffer[Index]);
+
+  if (FvHandleCount) {
+    FreePool (FvHandleBuffer);
+  }
+
+  return DevicePath;
+}
+
+
+EFI_STATUS
+CreateFvBootOption (
+  EFI_GUID                     *FileGuid,
+  CHAR16                       *Description,
+  EFI_BOOT_MANAGER_LOAD_OPTION *BootOption,
+  UINT32                       Attributes,
+  UINT8                        *OptionalData,    OPTIONAL
+  UINT32                       OptionalDataSize
+  )
+{
+  EFI_STATUS                         Status;
+  EFI_DEVICE_PATH_PROTOCOL           *DevicePath;
+  EFI_LOADED_IMAGE_PROTOCOL          *LoadedImage;
+  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH  FileNode;
+  EFI_FIRMWARE_VOLUME2_PROTOCOL      *Fv;
+  UINT32                             AuthenticationStatus;
+  VOID                               *Buffer;
+  UINTN                              Size;
+
+  if ((BootOption == NULL) || (FileGuid == NULL) || (Description == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid);
+
+  if (!CompareGuid (&gUefiShellFileGuid, FileGuid)) {
+    Status = gBS->HandleProtocol (
+                    gImageHandle,
+                    &gEfiLoadedImageProtocolGuid,
+                    (VOID **) &LoadedImage
+                    );
+    if (!EFI_ERROR (Status)) {
+      Status = gBS->HandleProtocol (
+                      LoadedImage->DeviceHandle,
+                      &gEfiFirmwareVolume2ProtocolGuid,
+                      (VOID **) &Fv
+                      );
+      if (!EFI_ERROR (Status)) {
+        Buffer  = NULL;
+        Size    = 0;
+        Status  = Fv->ReadSection (
+                        Fv,
+                        FileGuid,
+                        EFI_SECTION_PE32,
+                        0,
+                        &Buffer,
+                        &Size,
+                        &AuthenticationStatus
+                        );
+        if (Buffer != NULL) {
+          FreePool (Buffer);
+        }
+      }
+    }
+    if (EFI_ERROR (Status)) {
+      return EFI_NOT_FOUND;
+    }
+
+    DevicePath = AppendDevicePathNode (
+                   DevicePathFromHandle (LoadedImage->DeviceHandle),
+                   (EFI_DEVICE_PATH_PROTOCOL *) &FileNode
+                   );
+  } else {
+    DevicePath = AppendDevicePathNode (
+                   BdsCreateShellDevicePath (),
+                   (EFI_DEVICE_PATH_PROTOCOL *) &FileNode
+                   );
+  }
+
+  Status = EfiBootManagerInitializeLoadOption (
+             BootOption,
+             LoadOptionNumberUnassigned,
+             LoadOptionTypeBoot,
+             Attributes,
+             Description,
+             DevicePath,
+             OptionalData,
+             OptionalDataSize
+             );
+  FreePool (DevicePath);
+  return Status;
+}
+
+EFI_GUID mUiFile = {
+  0x462CAA21, 0x7614, 0x4503, { 0x83, 0x6E, 0x8A, 0xB6, 0xF4, 0x66, 0x23, 0x31 }
+};
+EFI_GUID mBootMenuFile = {
+  0xEEC25BDC, 0x67F2, 0x4D95, { 0xB1, 0xD5, 0xF8, 0x1B, 0x20, 0x39, 0xD1, 0x1D }
+};
+
+
+/**
+  Return the index of the load option in the load option array.
+
+  The function consider two load options are equal when the
+  OptionType, Attributes, Description, FilePath and OptionalData are equal.
+
+  @param Key    Pointer to the load option to be found.
+  @param Array  Pointer to the array of load options to be found.
+  @param Count  Number of entries in the Array.
+
+  @retval -1          Key wasn't found in the Array.
+  @retval 0 ~ Count-1 The index of the Key in the Array.
+**/
+INTN
+PlatformFindLoadOption (
+  IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Key,
+  IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Array,
+  IN UINTN                              Count
+  )
+{
+  UINTN                             Index;
+
+  for (Index = 0; Index < Count; Index++) {
+    if ((Key->OptionType == Array[Index].OptionType) &&
+        (Key->Attributes == Array[Index].Attributes) &&
+        (StrCmp (Key->Description, Array[Index].Description) == 0) &&
+        (CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePathSize (Key->FilePath)) == 0) &&
+        (Key->OptionalDataSize == Array[Index].OptionalDataSize) &&
+        (CompareMem (Key->OptionalData, Array[Index].OptionalData, Key->OptionalDataSize) == 0)) {
+      return (INTN) Index;
+    }
+  }
+
+  return -1;
+}
+
+UINTN
+RegisterFvBootOption (
+  EFI_GUID                         *FileGuid,
+  CHAR16                           *Description,
+  UINTN                            Position,
+  UINT32                           Attributes,
+  UINT8                            *OptionalData,    OPTIONAL
+  UINT32                           OptionalDataSize
+  )
+{
+  EFI_STATUS                       Status;
+  UINTN                            OptionIndex;
+  EFI_BOOT_MANAGER_LOAD_OPTION     NewOption;
+  EFI_BOOT_MANAGER_LOAD_OPTION     *BootOptions;
+  UINTN                            BootOptionCount;
+
+  NewOption.OptionNumber = LoadOptionNumberUnassigned;
+  Status = CreateFvBootOption (FileGuid, Description, &NewOption, Attributes, OptionalData, OptionalDataSize);
+  if (!EFI_ERROR (Status)) {
+    BootOptions = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
+
+    OptionIndex = PlatformFindLoadOption (&NewOption, BootOptions, BootOptionCount);
+
+    if (OptionIndex == -1) {
+      Status = EfiBootManagerAddLoadOptionVariable (&NewOption, Position);
+      ASSERT_EFI_ERROR (Status);
+    } else {
+      NewOption.OptionNumber = BootOptions[OptionIndex].OptionNumber;
+    }
+    EfiBootManagerFreeLoadOption (&NewOption);
+    EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);
+  }
+
+  return NewOption.OptionNumber;
+}
+
+
+
+VOID
+EFIAPI
+PlatformBootManagerWaitCallback (
+  UINT16          TimeoutRemain
+  )
+{
+  EFI_STATUS                    Status;
+  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *TxtInEx;
+  EFI_KEY_DATA                  KeyData;
+  BOOLEAN                       PausePressed;
+
+  //
+  // Pause on PAUSE key
+  //
+  Status = gBS->HandleProtocol (gST->ConsoleInHandle, &gEfiSimpleTextInputExProtocolGuid, (VOID **) &TxtInEx);
+  ASSERT_EFI_ERROR (Status);
+
+  PausePressed = FALSE;
+
+  while (TRUE) {
+    Status = TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData);
+    if (EFI_ERROR (Status)) {
+      break;
+    }
+
+    if (KeyData.Key.ScanCode == SCAN_PAUSE) {
+      PausePressed = TRUE;
+      break;
+    }
+  }
+
+  //
+  // Loop until non-PAUSE key pressed
+  //
+  while (PausePressed) {
+    Status = TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData);
+    if (!EFI_ERROR (Status)) {
+      DEBUG ((
+        DEBUG_INFO, "[PauseCallback] %x/%x %x/%x\n",
+        KeyData.Key.ScanCode, KeyData.Key.UnicodeChar,
+        KeyData.KeyState.KeyShiftState, KeyData.KeyState.KeyToggleState
+        ));
+      PausePressed = (BOOLEAN) (KeyData.Key.ScanCode == SCAN_PAUSE);
+    }
+  }
+}
+
+
+EFI_GUID gUefiShellFileGuid = { 0x7C04A583, 0x9E3E, 0x4f1c, { 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 } };
+
+#define INTERNAL_UEFI_SHELL_NAME      L"Internal UEFI Shell 2.0"
+#define UEFI_HARD_DRIVE_NAME          L"UEFI Hard Drive"
+
+VOID
+RegisterDefaultBootOption (
+  VOID
+  )
+{
+#if 0
+  EFI_DEVICE_PATH_PROTOCOL           *DevicePath;
+  EFI_LOADED_IMAGE_PROTOCOL          *LoadedImage;
+  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH  FileNode;
+#endif
+  UINT16                             *ShellData;
+  UINT32                             ShellDataSize;
+
+    ShellData = NULL;
+    ShellDataSize = 0;
+    RegisterFvBootOption (&gUefiShellFileGuid,      INTERNAL_UEFI_SHELL_NAME, (UINTN) -1, LOAD_OPTION_ACTIVE, (UINT8 *)ShellData, ShellDataSize);
+
+  //
+  // Boot Menu
+  //
+  mBootMenuOptionNumber = RegisterFvBootOption (&mBootMenuFile, L"Boot Device List",   (UINTN) -1, LOAD_OPTION_CATEGORY_APP | LOAD_OPTION_ACTIVE | LOAD_OPTION_HIDDEN, NULL, 0);
+
+  if (mBootMenuOptionNumber == LoadOptionNumberUnassigned) {
+    DEBUG ((DEBUG_INFO, "BootMenuOptionNumber (%d) should not be same to LoadOptionNumberUnassigned(%d).\n", mBootMenuOptionNumber, LoadOptionNumberUnassigned));
+  }
+#if 0
+  //
+  // Boot Manager Menu
+  //
+  EfiInitializeFwVolDevicepathNode (&FileNode, &mUiFile);
+
+  gBS->HandleProtocol (
+         gImageHandle,
+         &gEfiLoadedImageProtocolGuid,
+         (VOID **) &LoadedImage
+         );
+  DevicePath = AppendDevicePathNode (DevicePathFromHandle (LoadedImage->DeviceHandle), (EFI_DEVICE_PATH_PROTOCOL *) &FileNode);
+#endif
+
+}
+
+VOID
+RegisterBootOptionHotkey (
+  UINT16                       OptionNumber,
+  EFI_INPUT_KEY                *Key,
+  BOOLEAN                      Add
+  )
+{
+  EFI_STATUS                   Status;
+
+  if (!Add) {
+    //
+    // No enter hotkey when force to setup or there is no boot option
+    //
+    Status = EfiBootManagerDeleteKeyOptionVariable (NULL, 0, Key, NULL);
+    ASSERT (Status == EFI_SUCCESS || Status == EFI_NOT_FOUND);
+  } else {
+    //
+    // Register enter hotkey for the first boot option
+    //
+    Status = EfiBootManagerAddKeyOptionVariable (NULL, OptionNumber, 0, Key,NULL);
+    ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
+  }
+}
+
+EFI_STATUS
+EFIAPI
+DetectKeypressCallback (
+  IN EFI_KEY_DATA     *KeyData
+)
+{
+  mHotKeypressed = TRUE;
+
+  if (HotKeyEvent != NULL) {
+    gBS->SignalEvent(HotKeyEvent);
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  This function is called after all the boot options are enumerated and ordered properly.
+**/
+VOID
+RegisterStaticHotkey (
+  VOID
+  )
+{
+
+  EFI_INPUT_KEY                 Enter;
+  EFI_KEY_DATA                  F2;
+  EFI_KEY_DATA                  F7;
+  BOOLEAN                       EnterSetup;
+  EFI_STATUS                    Status;
+  EFI_BOOT_MANAGER_LOAD_OPTION  BootOption;
+
+  EnterSetup = FALSE;
+
+  //
+  // [Enter]
+  //
+  mContinueBoot = !EnterSetup;
+  if (mContinueBoot) {
+    Enter.ScanCode    = SCAN_NULL;
+    Enter.UnicodeChar = CHAR_CARRIAGE_RETURN;
+    EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL);
+  }
+
+
+  //
+  // [F2]/[F7]
+  //
+  F2.Key.ScanCode    = SCAN_F2;
+  F2.Key.UnicodeChar = CHAR_NULL;
+  F2.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
+  F2.KeyState.KeyToggleState = 0;
+  Status = EfiBootManagerGetBootManagerMenu (&BootOption);
+  ASSERT_EFI_ERROR (Status);
+  RegisterBootOptionHotkey ((UINT16) BootOption.OptionNumber, &F2.Key, TRUE);
+  EfiBootManagerFreeLoadOption (&BootOption);
+
+  F7.Key.ScanCode    = SCAN_F7;
+  F7.Key.UnicodeChar = CHAR_NULL;
+  F7.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
+  F7.KeyState.KeyToggleState = 0;
+  mBootMenuBoot  = !EnterSetup;
+  RegisterBootOptionHotkey ((UINT16) mBootMenuOptionNumber, &F7.Key, mBootMenuBoot);
+
+}
+
+UINT8
+BootOptionType (
+  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL      *Node;
+  EFI_DEVICE_PATH_PROTOCOL      *NextNode;
+
+  for (Node = DevicePath; !IsDevicePathEndType (Node); Node = NextDevicePathNode (Node)) {
+    if (DevicePathType (Node) == MESSAGING_DEVICE_PATH) {
+      //
+      // Make sure the device path points to the driver device.
+      //
+      NextNode = NextDevicePathNode (Node);
+      if (DevicePathSubType(NextNode) == MSG_DEVICE_LOGICAL_UNIT_DP) {
+        //
+        // if the next node type is Device Logical Unit, which specify the Logical Unit Number (LUN),
+        // skip it
+        //
+        NextNode = NextDevicePathNode (NextNode);
+      }
+      if (IsDevicePathEndType (NextNode)) {
+        if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH)) {
+          return DevicePathSubType (Node);
+        } else {
+          return MSG_SATA_DP;
+        }
+      }
+    }
+  }
+
+  return (UINT8) -1;
+}
+
+/**
+  Returns the priority number.
+  OptionType                 EFI
+  ------------------------------------
+  PXE                         2
+  DVD                         4
+  USB                         6
+  NVME                        7
+  HDD                         8
+  EFI Shell                   9
+  Others                      100
+
+  @param BootOption
+**/
+UINTN
+BootOptionPriority (
+  CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
+  )
+{
+    //
+    // EFI boot options
+    //
+    switch (BootOptionType (BootOption->FilePath)) {
+    case MSG_MAC_ADDR_DP:
+    case MSG_VLAN_DP:
+    case MSG_IPv4_DP:
+    case MSG_IPv6_DP:
+      return 2;
+
+    case MSG_SATA_DP:
+    case MSG_ATAPI_DP:
+    case MSG_UFS_DP:
+    case MSG_NVME_NAMESPACE_DP:
+      return 4;
+
+    case MSG_USB_DP:
+      return 6;
+
+    }
+    if (StrCmp (BootOption->Description, INTERNAL_UEFI_SHELL_NAME) == 0) {
+      if (PcdGetBool (PcdBootToShellOnly)) {
+        return 0;
+      }
+      return 9;
+    }
+    if (StrCmp (BootOption->Description, UEFI_HARD_DRIVE_NAME) == 0) {
+      return 8;
+    }
+    return 100;
+}
+
+INTN
+EFIAPI
+CompareBootOption (
+  CONST VOID  *Left,
+  CONST VOID  *Right
+  )
+{
+  return BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Left) -
+         BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Right);
+}
+
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
deleted file mode 100644
index 4adca1b465..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
+++ /dev/null
@@ -1,3092 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                                   
-
-
-Module Name:
-
-  BdsPlatform.c
-
-Abstract:
-
-  This file include all platform action which can be customized
-  by IBV/OEM.
-
---*/
-
-#include "BdsPlatform.h"
-#include "SetupMode.h"
-#include <Guid/SetupVariable.h>
-#include <Library/TcgPhysicalPresenceLib.h>
-#include <Library/Tcg2PhysicalPresenceLib.h>
-#include <Protocol/I2cMasterMcg.h>
-#include <TianoApi.h>
-#include <PlatformBaseAddresses.h>
-#include <Protocol/GlobalNvsArea.h>
-#include <Library/DxeServicesTableLib.h>
-#include <Protocol/BlockIo.h>
-#include <PchRegs/PchRegsPcu.h>
-#include <Library/S3BootScriptLib.h>
-#include "PchAccess.h"
-#include "PchRegs/PchRegsSata.h"
-#include <Library/SerialPortLib.h>
-#include <Library/DebugLib.h>
-
-#include <Library/GenericBdsLib/InternalBdsLib.h>
-#include <Library/GenericBdsLib/String.h>
-#include <Library/NetLib.h>
-
-#include <Library/CapsuleLib.h>
-#include <Protocol/EsrtManagement.h>
-
-EFI_GUID *ConnectDriverTable[] = {
-  &gEfiMmioDeviceProtocolGuid,
-  &gEfiI2cMasterProtocolGuid,
-  &gEfiI2cHostProtocolGuid
-};
-
-#define SHELL_ENVIRONMENT_INTERFACE_PROTOCOL \
-  { \
-    0x47c7b221, 0xc42a, 0x11d2, 0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b \
-  }
-VOID               *mShellImageCallbackReg = NULL;
-
-
-
-EFI_USER_PROFILE_HANDLE                           mCurrentUser = NULL;
-EFI_EVENT                                         mHotKeyTimerEvent = NULL;
-EFI_EVENT                                         mHitHotkeyEvent = NULL;
-EFI_EVENT                                         mUsbKeyboardConnectEvent = NULL;
-BOOLEAN                                           mHotKeyPressed = FALSE;
-VOID                                              *mHitHotkeyRegistration;
-#define KEYBOARD_TIMER_INTERVAL                   20000 // 0.02s
-
-VOID
-ConnectUSBController (
-  VOID
-  );
-
-EFI_STATUS
-PlatformBdsConnectSimpleConsole (
-  IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
-);
-
-VOID 
-BootIntoFirmwareInterface(
-  VOID
-  );
-  
-VOID
-EFIAPI
-PlatformBdsInitHotKeyEvent (
-  VOID
-  );
-
-VOID
-EFIAPI
-DisableAhciCtlr (
-  IN EFI_EVENT                          Event,
-  IN VOID                               *Context
-  )
-{
-  UINT32                    PmcDisableAddress;
-  UINT8                     SataStorageAmount;
-  UINT32                    SataBase;
-  UINT16                    SataPortStatus;
-
-
-  DEBUG ((EFI_D_INFO, "Disable AHCI event is signalled\n"));
-  SataStorageAmount = 0;
-  SataBase = *(UINT32*) Context;
-
-  //
-  // BayTrail-M EDS chapter 16 ---- PCI IO Register Offset 92 (SATA Port Control and Status)
-  //
-  SataPortStatus = MmioRead16 (SataBase + R_PCH_SATA_PCS);
-
-  //
-  // Bit 8 EN: Port 0 Present
-  //
-  if ((SataPortStatus & 0x100) == 0x100) {
-    SataStorageAmount++;
-  }
-
-  //
-  // Bit 9 EN: Port 1 Present
-  //
-  if ((SataPortStatus & 0x200) == 0x200) {
-    SataStorageAmount++;
-  }
-
-  //
-  // Disable SATA controller when it sets to AHCI mode without carrying any devices
-  // in order to prevent AHCI yellow bang under Win device manager.
-  //
-  if (SataStorageAmount == 0) {
-    PmcDisableAddress = (MmioRead32 ((PCH_PCI_EXPRESS_BASE_ADDRESS + (UINT32) (31 << 15)) + R_PCH_LPC_PMC_BASE) & B_PCH_LPC_PMC_BASE_BAR) + R_PCH_PMC_FUNC_DIS;
-    MmioOr32 (PmcDisableAddress, B_PCH_PMC_FUNC_DIS_SATA);
-    S3BootScriptSaveMemWrite (
-      EfiBootScriptWidthUint32,
-      (UINTN) PmcDisableAddress,
-      1,
-      (VOID *) (UINTN) PmcDisableAddress
-      );
-  }
-}
-
-VOID
-InstallReadyToLock (
-  VOID
-  )
-{
-  EFI_STATUS                Status;
-  EFI_HANDLE                Handle;
-  EFI_SMM_ACCESS2_PROTOCOL  *SmmAccess;
-  EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save;
-
-  //
-  // Install DxeSmmReadyToLock protocol prior to the processing of boot options
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiSmmAccess2ProtocolGuid,
-                  NULL,
-                  (VOID **) &SmmAccess
-                  );
-  if (!EFI_ERROR (Status)) {
-
-    //
-    // Prepare S3 information, this MUST be done before DxeSmmReadyToLock
-    //
-    Status = gBS->LocateProtocol (
-                    &gEfiAcpiS3SaveProtocolGuid,
-                    NULL,
-                    (VOID **)&AcpiS3Save
-                    );
-    if (!EFI_ERROR (Status)) {
-      AcpiS3Save->S3Save (AcpiS3Save, NULL);
-    }
-
-    Handle = NULL;
-    Status = gBS->InstallProtocolInterface (
-                    &Handle,
-                    &gExitPmAuthProtocolGuid,
-                    EFI_NATIVE_INTERFACE,
-                    NULL
-                    );
-    ASSERT_EFI_ERROR (Status);
-
-    //
-    // Signal EndOfDxe PI Event
-    //
-    EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid);
-
-    Handle = NULL;
-    Status = gBS->InstallProtocolInterface (
-                    &Handle,
-                    &gEfiDxeSmmReadyToLockProtocolGuid,
-                    EFI_NATIVE_INTERFACE,
-                    NULL
-                    );
-    ASSERT_EFI_ERROR (Status);
-  }
-
-  return ;
-}
-
-VOID
-EFIAPI
-ShellImageCallback (
-  IN EFI_EVENT                          Event,
-  IN VOID                               *Context
-  )
-{
- BdsSetConsoleMode (TRUE);
- DEBUG ((EFI_D_INFO, "BdsEntry ShellImageCallback \n"));
-}
-
-//
-// BDS Platform Functions
-//
-/**
-  Platform Bds init. Include the platform firmware vendor, revision
-  and so crc check.
-
-  @param VOID
-
-  @retval  None.
-
-**/
-VOID
-EFIAPI
-PlatformBdsInit (
-  VOID
-  )
-{
-  EFI_STATUS  Status;
-  EFI_EVENT   ShellImageEvent;
-  EFI_GUID    ShellEnvProtocol = SHELL_ENVIRONMENT_INTERFACE_PROTOCOL;
-
-  #ifdef __GNUC__
-  SerialPortWrite((UINT8 *)">>>>BdsEntry[GCC]\r\n", 19);
-  #else
-  SerialPortWrite((UINT8 *)">>>>BdsEntry\r\n", 14);
-  #endif
-  BdsLibSaveMemoryTypeInformation ();
-
-  //
-  // Before user authentication, the user identification devices need be connected
-  // from the platform customized device paths
-  //
-  PlatformBdsConnectAuthDevice ();
-
-  //
-  // As console is not ready, the auto logon user will be identified.
-  //
-  BdsLibUserIdentify (&mCurrentUser);
-
-  //
-  // Change Gop mode when boot into Shell
-  //
-  if (mShellImageCallbackReg == NULL) {
-    Status = gBS->CreateEvent (
-                    EFI_EVENT_NOTIFY_SIGNAL,
-                    EFI_TPL_CALLBACK,
-                    ShellImageCallback,
-                    NULL,
-                    &ShellImageEvent
-                    );
-    if (!EFI_ERROR (Status)) {
-      Status = gBS->RegisterProtocolNotify (
-                      &ShellEnvProtocol,
-                      ShellImageEvent,
-                      &mShellImageCallbackReg
-                      );
-
-      DEBUG ((EFI_D_INFO, "BdsEntry ShellImageCallback \n"));
-    }
-  }
-}
-
-EFI_STATUS
-GetGopDevicePath (
-   IN  EFI_DEVICE_PATH_PROTOCOL *PciDevicePath,
-   OUT EFI_DEVICE_PATH_PROTOCOL **GopDevicePath
-   )
-{
-  UINTN                           Index;
-  EFI_STATUS                      Status;
-  EFI_HANDLE                      PciDeviceHandle;
-  EFI_DEVICE_PATH_PROTOCOL        *TempDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL        *TempPciDevicePath;
-  UINTN                           GopHandleCount;
-  EFI_HANDLE                      *GopHandleBuffer;
-
-  UINTN                                 VarSize;
-  SYSTEM_CONFIGURATION  mSystemConfiguration;
-
-  if (PciDevicePath == NULL || GopDevicePath == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Initialize the GopDevicePath to be PciDevicePath
-  //
-  *GopDevicePath    = PciDevicePath;
-  TempPciDevicePath = PciDevicePath;
-
-  Status = gBS->LocateDevicePath (
-                  &gEfiDevicePathProtocolGuid,
-                  &TempPciDevicePath,
-                  &PciDeviceHandle
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Try to connect this handle, so that GOP driver could start on this
-  // device and create child handles with GraphicsOutput Protocol installed
-  // on them, then we get device paths of these child handles and select
-  // them as possible console device.
-  //
-
-  //
-  // Select display devices
-  //
-  VarSize = sizeof(SYSTEM_CONFIGURATION);
-  Status = gRT->GetVariable(
-                  L"Setup",
-                  &gEfiNormalSetupGuid,
-                  NULL,
-                  &VarSize,
-                  &mSystemConfiguration
-                  );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
-    VarSize = sizeof(SYSTEM_CONFIGURATION);
-    Status = gRT->GetVariable(
-              L"SetupRecovery",
-              &gEfiNormalSetupGuid,
-              NULL,
-              &VarSize,
-              &mSystemConfiguration
-              );
-    ASSERT_EFI_ERROR (Status);
-  }    
-
-  if(mSystemConfiguration.BootDisplayDevice != 0x0)
-  {
-    ACPI_ADR_DEVICE_PATH         AcpiAdr;
-    EFI_DEVICE_PATH_PROTOCOL  *MyDevicePath = NULL;
-
-    AcpiAdr.Header.Type     = ACPI_DEVICE_PATH;
-    AcpiAdr.Header.SubType  = ACPI_ADR_DP;
-
-    switch (mSystemConfiguration.BootDisplayDevice) {
-    case 1:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, PORT_CRT, 0);    //CRT Device
-      break;
-    case 2:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL, PORT_B_HDMI, 0);  //HDMI Device Port B
-      break;
-    case 3:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL, PORT_B_DP, 0);    //DP PortB
-      break;
-    case 4:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL, PORT_C_DP, 0);    //DP PortC
-      break;
-    case 5:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL, PORT_C_DP, 0);    //eDP Port C
-      break;
-    case 6:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL, PORT_MIPI_A, 0);  //DSI Port A
-      break;
-    case 7:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL, PORT_MIPI_C, 0);  //DSI Port C
-      break;
-    default:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, PORT_CRT, 0);
-      break;
-    }
-
-    SetDevicePathNodeLength (&AcpiAdr.Header, sizeof (ACPI_ADR_DEVICE_PATH));
-
-    MyDevicePath = AppendDevicePathNode(MyDevicePath, (EFI_DEVICE_PATH_PROTOCOL*)&AcpiAdr);
-
-    gBS->ConnectController (
-           PciDeviceHandle,
-           NULL,
-           MyDevicePath,
-           FALSE
-           );
-
-    FreePool(MyDevicePath);
-  }
-  else
-  {
-    gBS->ConnectController (
-           PciDeviceHandle,
-           NULL,
-           NULL,
-           FALSE
-           );
-  }
-
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiGraphicsOutputProtocolGuid,
-                  NULL,
-                  &GopHandleCount,
-                  &GopHandleBuffer
-                  );
-  if (!EFI_ERROR (Status)) {
-    //
-    // Add all the child handles as possible Console Device
-    //
-    for (Index = 0; Index < GopHandleCount; Index++) {
-      Status = gBS->HandleProtocol (
-                      GopHandleBuffer[Index],
-                      &gEfiDevicePathProtocolGuid,
-                      (VOID**)&TempDevicePath
-                      );
-      if (EFI_ERROR (Status)) {
-        continue;
-      }
-      if (CompareMem (
-            PciDevicePath,
-            TempDevicePath,
-            GetDevicePathSize (PciDevicePath) - END_DEVICE_PATH_LENGTH
-            ) == 0) {
-        //
-        // In current implementation, we only enable one of the child handles
-        // as console device, i.e. sotre one of the child handle's device
-        // path to variable "ConOut"
-        // In future, we could select all child handles to be console device
-        //
-        *GopDevicePath = TempDevicePath;
-      }
-    }
-    gBS->FreePool (GopHandleBuffer);
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-
-  Search out all the platform pci or agp video device. The function may will
-  find multiple video device, and return all enabled device path.
-
-  @param PlugInPciVgaDevicePath    Return the platform plug in pci video device
-                                   path if the system have plug in pci video device.
-  @param OnboardPciVgaDevicePath   Return the platform active agp video device path
-                                   if the system have plug in agp video device or on
-                                   chip agp device.
-
-  @retval EFI_SUCCSS               Get all platform active video device path.
-  @retval EFI_STATUS               Return the status of gBS->LocateDevicePath (),
-                                   gBS->ConnectController (),
-                                   and gBS->LocateHandleBuffer ().
-
-**/
-EFI_STATUS
-GetPlugInPciVgaDevicePath (
-  IN OUT EFI_DEVICE_PATH_PROTOCOL     **PlugInPciVgaDevicePath,
-  IN OUT EFI_DEVICE_PATH_PROTOCOL     **OnboardPciVgaDevicePath
-  )
-{
-  EFI_STATUS                Status;
-  EFI_HANDLE                RootHandle;
-  UINTN                     HandleCount;
-  EFI_HANDLE                *HandleBuffer;
-  UINTN                     Index;
-  UINTN                     Index1;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  BOOLEAN                   PlugInPciVga;
-  EFI_PCI_IO_PROTOCOL       *PciIo;
-  PCI_TYPE00                Pci;
-
-  DevicePath = NULL;
-  PlugInPciVga = TRUE;
-  HandleCount = 0;
-  HandleBuffer = NULL;
-
-  //
-  // Make all the PCI_IO protocols on PCI Seg 0 show up
-  //
-  BdsLibConnectDevicePath (gPlatformRootBridges[0]);
-
-  Status = gBS->LocateDevicePath (
-                  &gEfiDevicePathProtocolGuid,
-                  &gPlatformRootBridges[0],
-                  &RootHandle
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = gBS->ConnectController (
-                  RootHandle,
-                  NULL,
-                  NULL,
-                  FALSE
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Start to check all the pci io to find all possible VGA device
-  //
-  HandleCount = 0;
-  HandleBuffer = NULL;
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiPciIoProtocolGuid,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuffer
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    Status = gBS->HandleProtocol (
-                    HandleBuffer[Index],
-                    &gEfiPciIoProtocolGuid,
-                    (VOID**)&PciIo
-                    );
-    if (!EFI_ERROR (Status)) {
-
-      //
-      // Check for all VGA device
-      //
-      Status = PciIo->Pci.Read (
-                        PciIo,
-                        EfiPciIoWidthUint32,
-                        0,
-                        sizeof (Pci) / sizeof (UINT32),
-                        &Pci
-                        );
-      if (EFI_ERROR (Status)) {
-        continue;
-      }
-
-      //
-      // Here we decide which VGA device to enable in PCI bus
-      //
-      // The first plugin PCI VGA card device will be present as PCI VGA
-      // The onchip AGP or AGP card will be present as AGP VGA
-      //
-      if (!IS_PCI_VGA (&Pci)) {
-        continue;
-      }
-
-      //
-      // Set the device as the possible console out device,
-      //
-      // Below code will make every VGA device to be one
-      // of the possibe console out device
-      //
-      PlugInPciVga = TRUE;
-      gBS->HandleProtocol (
-             HandleBuffer[Index],
-             &gEfiDevicePathProtocolGuid,
-             (VOID**)&DevicePath
-             );
-
-      Index1 = 0;
-
-      while (gPlatformAllPossiblePciVgaConsole[Index1] != NULL) {
-        if (CompareMem (
-              DevicePath,
-              gPlatformAllPossiblePciVgaConsole[Index1],
-              GetDevicePathSize (gPlatformAllPossiblePciVgaConsole[Index1])
-              ) == 0) {
-
-          //
-          // This device is an AGP device
-          //
-          *OnboardPciVgaDevicePath = DevicePath;
-          PlugInPciVga = FALSE;
-          break;
-        }
-
-        Index1 ++;
-      }
-
-      if (PlugInPciVga) {
-        *PlugInPciVgaDevicePath = DevicePath;
-      }
-    }
-  }
-
-  FreePool (HandleBuffer);
-
-  return EFI_SUCCESS;
-}
-
-/**
-
-  Find the platform  active vga, and base on the policy to enable the vga as
-  the console out device. The policy is driven by one setup variable "VBIOS".
-
-  None.
-
-  @param EFI_UNSUPPORTED         There is no active vga device
-
-  @retval EFI_STATUS             Return the status of BdsLibGetVariableAndSize ()
-
-**/
-EFI_STATUS
-PlatformBdsForceActiveVga (
-  VOID
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *PlugInPciVgaDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *OnboardPciVgaDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePathFirst;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePathSecond;
-  EFI_DEVICE_PATH_PROTOCOL  *GopDevicePath;
-  UINTN                VarSize;
-  SYSTEM_CONFIGURATION  mSystemConfiguration;
-
-  Status = EFI_SUCCESS;
-  PlugInPciVgaDevicePath = NULL;
-  OnboardPciVgaDevicePath = NULL;
-
-  //
-  // Check the policy which is the first enabled VGA
-  //
-  GetPlugInPciVgaDevicePath (&PlugInPciVgaDevicePath, &OnboardPciVgaDevicePath);
-
-  if (PlugInPciVgaDevicePath == NULL && OnboardPciVgaDevicePath == NULL) {
-    return EFI_UNSUPPORTED;
-  }
-
-  VarSize = sizeof(SYSTEM_CONFIGURATION);
-  Status = gRT->GetVariable(
-                  L"Setup",
-                  &gEfiNormalSetupGuid,
-                  NULL,
-                  &VarSize,
-                  &mSystemConfiguration
-                  );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
-    VarSize = sizeof(SYSTEM_CONFIGURATION);
-    Status = gRT->GetVariable(
-              L"SetupRecovery",
-              &gEfiNormalSetupGuid,
-              NULL,
-              &VarSize,
-              &mSystemConfiguration
-              );
-    ASSERT_EFI_ERROR (Status);
-  }    
-
-
-  if ((PlugInPciVgaDevicePath == NULL && OnboardPciVgaDevicePath != NULL) ) {
-    DEBUG ((EFI_D_ERROR,"Update onboard PCI VGA ...\n"));
-    DevicePathFirst  = OnboardPciVgaDevicePath;
-    DevicePathSecond = PlugInPciVgaDevicePath;
-    goto UpdateConOut;
-  }
-  if(OnboardPciVgaDevicePath != NULL && mSystemConfiguration.PrimaryVideoAdaptor == 0) {
-    DEBUG ((EFI_D_ERROR,"Update onboard PCI VGA When set primary!!!...\n"));
-    DevicePathFirst  = OnboardPciVgaDevicePath;
-    DevicePathSecond = PlugInPciVgaDevicePath;
-    goto UpdateConOut;
-  }
-
-  DEBUG ((EFI_D_ERROR,"Update plug in PCI VGA ...\n"));
-  DevicePathFirst  = PlugInPciVgaDevicePath;
-  DevicePathSecond = OnboardPciVgaDevicePath;
-
-UpdateConOut:
-  GetGopDevicePath (DevicePathFirst, &GopDevicePath);
-  DevicePathFirst = GopDevicePath;
-
-  Status = BdsLibUpdateConsoleVariable (
-             L"ConOut",
-             DevicePathFirst,
-             DevicePathSecond
-             );
-
-  return Status;
-}
-
-VOID
-UpdateConsoleResolution(
-  VOID
-  )
-{
-  UINT32                 HorizontalResolution;
-  UINT32                 VerticalResolution;
-  SYSTEM_CONFIGURATION   SystemConfiguration;
-  UINTN                  VarSize;
-  EFI_STATUS             Status;
-
-
-  HorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);
-  VerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution);
-
-  VarSize = sizeof(SYSTEM_CONFIGURATION);
-  Status = gRT->GetVariable(
-                  L"Setup",
-                  &gEfiNormalSetupGuid,
-                  NULL,
-                  &VarSize,
-                  &SystemConfiguration
-                  );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
-    VarSize = sizeof(SYSTEM_CONFIGURATION);
-    Status = gRT->GetVariable(
-              L"SetupRecovery",
-              &gEfiNormalSetupGuid,
-              NULL,
-              &VarSize,
-              &SystemConfiguration
-              );
-    ASSERT_EFI_ERROR (Status);
-  }  
-
-  switch (SystemConfiguration.IgdFlatPanel) {
-
-  case 0:
-    //
-    // Use the detault PCD values.
-    //
-    break;
-
-  case 1:
-    HorizontalResolution = 640;
-    VerticalResolution = 480;
-    break;
-
-  case 2:
-    HorizontalResolution = 800;
-    VerticalResolution = 600;
-    break;
-
-  case 3:
-    HorizontalResolution = 1024;
-    VerticalResolution = 768;
-    break;
-
-  case 4:
-  HorizontalResolution = 1280;
-  VerticalResolution = 1024;
-  break;
-
-  case 5:
-  HorizontalResolution = 1366;
-  VerticalResolution = 768;
-  break;
-
-  case 6:
-  HorizontalResolution = 1680;
-  VerticalResolution = 1050;
-  break;
-
-  case 7:
-  HorizontalResolution = 1920;
-  VerticalResolution = 1200;
-  break;
-
-  case 8:
-  HorizontalResolution = 1280;
-  VerticalResolution = 800;
-  break;
-  }
-
-  PcdSet32 (PcdSetupVideoHorizontalResolution, HorizontalResolution);
-  PcdSet32 (PcdSetupVideoVerticalResolution, VerticalResolution);
-  DEBUG ((EFI_D_ERROR, "HorizontalResolution = %x; VerticalResolution = %x", HorizontalResolution, VerticalResolution));
-
-  return;
-}
-
-/**
-  Connect the predefined platform default console device. Always try to find
-  and enable the vga device if have.
-
-  @param PlatformConsole    Predefined platform default console device array.
-
-  @retval EFI_SUCCESS       Success connect at least one ConIn and ConOut
-                            device, there must have one ConOut device is
-                            active vga device.
-
-  @retval EFI_STATUS        Return the status of
-                            BdsLibConnectAllDefaultConsoles ()
-
-**/
-EFI_STATUS
-PlatformBdsConnectConsole (
-  IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
-)
-{
-  EFI_STATUS                         Status;
-  UINTN                              Index;
-  EFI_DEVICE_PATH_PROTOCOL           *VarConout;
-  EFI_DEVICE_PATH_PROTOCOL           *VarConin;
-  UINTN                              DevicePathSize;
-
-  UpdateConsoleResolution();
-
-  Index = 0;
-  Status = EFI_SUCCESS;
-  DevicePathSize = 0;
-  VarConout = BdsLibGetVariableAndSize (
-                L"ConOut",
-                &gEfiGlobalVariableGuid,
-                &DevicePathSize
-                );
-  VarConin = BdsLibGetVariableAndSize (
-               L"ConIn",
-               &gEfiGlobalVariableGuid,
-               &DevicePathSize
-               );
-  if (VarConout == NULL || VarConin == NULL) {
-    //
-    // Have chance to connect the platform default console,
-    // the platform default console is the minimum device group
-    // the platform should support
-    //
-    while (PlatformConsole[Index].DevicePath != NULL) {
-
-      //
-      // Update the console variable with the connect type
-      //
-      if ((PlatformConsole[Index].ConnectType & CONSOLE_IN) == CONSOLE_IN) {
-        BdsLibUpdateConsoleVariable (L"ConIn", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      if ((PlatformConsole[Index].ConnectType & CONSOLE_OUT) == CONSOLE_OUT) {
-        BdsLibUpdateConsoleVariable (L"ConOut", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      if ((PlatformConsole[Index].ConnectType & STD_ERROR) == STD_ERROR) {
-        BdsLibUpdateConsoleVariable (L"ErrOut", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      Index ++;
-    }
-  }
-
-  //
-  // Make sure we have at least one active VGA, and have the right
-  // active VGA in console variable
-  //
-  Status = PlatformBdsForceActiveVga ();
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  DEBUG ((EFI_D_INFO, "DISPLAY INIT DONE\n"));
-
-  //
-  // Connect the all the default console with current console variable
-  //
-  Status = BdsLibConnectAllDefaultConsoles ();
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Connect with predefined platform connect sequence,
-  the OEM/IBV can customize with their own connect sequence.
-
-  @param None.
-
-  @retval None.
-
-**/
-VOID
-PlatformBdsConnectSequence (
-  VOID
-  )
-{
-  UINTN                     Index;
-
-  Index = 0;
-
-  //
-  // Here we can get the customized platform connect sequence
-  // Notes: we can connect with new variable which record the
-  // last time boots connect device path sequence
-  //
-  while (gPlatformConnectSequence[Index] != NULL) {
-
-    //
-    // Build the platform boot option
-    //
-    BdsLibConnectDevicePath (gPlatformConnectSequence[Index]);
-    Index ++;
-  }
-
-  //
-  // Just use the simple policy to connect all devices
-  // There should be no difference between debug tip and release tip, or it will be extremely hard to debug.
-  //
-  // There is case that IdeController driver will write boot script in driver model Start() function. It will be rejected by boot script save.
-  // It is only found when DEBUG disabled, because we are using BdsLibConnectAll() when DEBUG enabled.
-  //
-  // So we use BdsLibConnectAll() here to make sure IdeController.Start() is invoked before InstallReadyToLock().
-  // We may also consider to connect SataController only later if needed.
-  //
-  BdsLibConnectAll ();
-}
-
-/**
-
-  Load the predefined driver option, OEM/IBV can customize this
-  to load their own drivers
-
-  @param BdsDriverLists  The header of the driver option link list.
-
-  @retval None.
-
-**/
-VOID
-PlatformBdsGetDriverOption (
-  IN OUT LIST_ENTRY                  *BdsDriverLists
-  )
-{
-  UINTN                              Index;
-
-  Index = 0;
-
-  //
-  // Here we can get the customized platform driver option
-  //
-  while (gPlatformDriverOption[Index] != NULL) {
-
-    //
-    // Build the platform boot option
-    //
-    BdsLibRegisterNewOption (BdsDriverLists, gPlatformDriverOption[Index], NULL, L"DriverOrder");
-    Index ++;
-  }
-
-}
-
-/**
-  This function is used for some critical time if the the system
-  have no any boot option, and there is no time out for user to add
-  the new boot option. This can also treat as the platform default
-  boot option.
-
-  @param BdsBootOptionList   The header of the boot option link list.
-
-  @retval None.
-
-**/
-VOID
-PlatformBdsPredictBootOption (
-  IN OUT LIST_ENTRY                  *BdsBootOptionList
-  )
-{
-  UINTN                              Index;
-
-  Index = 0;
-
-  //
-  // Here give chance to get platform boot option data
-  //
-  while (gPlatformBootOption[Index] != NULL) {
-
-    //
-    // Build the platform boot option
-    //
-    BdsLibRegisterNewOption (BdsBootOptionList, gPlatformBootOption[Index], NULL, L"BootOrder");
-    Index ++;
-  }
-}
-
-/**
-  Perform the platform diagnostic, such like test memory. OEM/IBV also
-  can customize this fuction to support specific platform diagnostic.
-
-  @param MemoryTestLevel   The memory test intensive level
-  @param QuietBoot         Indicate if need to enable the quiet boot
-  @param BaseMemoryTest    A pointer to BdsMemoryTest()
-
-  @retval  None.
-
-**/
-VOID
-PlatformBdsDiagnostics (
-  IN EXTENDMEM_COVERAGE_LEVEL    MemoryTestLevel,
-  IN BOOLEAN                     QuietBoot,
-  IN BASEM_MEMORY_TEST           BaseMemoryTest
-  )
-{
-  EFI_STATUS                     Status;
-
-  //
-  // Here we can decide if we need to show
-  // the diagnostics screen
-  // Notes: this quiet boot code should be remove
-  // from the graphic lib
-  //
-  if (QuietBoot) {
-    EnableQuietBoot (PcdGetPtr(PcdLogoFile));
-
-    //
-    // Perform system diagnostic
-    //
-    Status = BaseMemoryTest (MemoryTestLevel);
-    if (EFI_ERROR (Status)) {
-      DisableQuietBoot ();
-    }
-
-    return;
-  }
-
-  //
-  // Perform system diagnostic
-  //
-  Status = BaseMemoryTest (MemoryTestLevel);
-}
-
-
-/**
-  For EFI boot option, BDS separate them as six types:
-  1. Network - The boot option points to the SimpleNetworkProtocol device.
-               Bds will try to automatically create this type boot option when enumerate.
-  2. Shell   - The boot option points to internal flash shell.
-               Bds will try to automatically create this type boot option when enumerate.
-  3. Removable BlockIo      - The boot option only points to the removable media
-                              device, like USB flash disk, DVD, Floppy etc.
-                              These device should contain a *removable* blockIo
-                              protocol in their device handle.
-                              Bds will try to automatically create this type boot option
-                              when enumerate.
-  4. Fixed BlockIo          - The boot option only points to a Fixed blockIo device,
-                              like HardDisk.
-                              These device should contain a *fixed* blockIo
-                              protocol in their device handle.
-                              BDS will skip fixed blockIo devices, and NOT
-                              automatically create boot option for them. But BDS
-                              will help to delete those fixed blockIo boot option,
-                              whose description rule conflict with other auto-created
-                              boot options.
-  5. Non-BlockIo Simplefile - The boot option points to a device whose handle
-                              has SimpleFileSystem Protocol, but has no blockio
-                              protocol. These devices do not offer blockIo
-                              protocol, but BDS still can get the
-                              \EFI\BOOT\boot{machinename}.EFI by SimpleFileSystem
-                              Protocol.
-  6. File    - The boot option points to a file. These boot options are usually
-               created by user manually or OS loader. BDS will not delete or modify
-               these boot options.
-
-  This function will enumerate all possible boot device in the system, and
-  automatically create boot options for Network, Shell, Removable BlockIo,
-  and Non-BlockIo Simplefile devices.
-  It will only execute once of every boot.
-
-  @param  BdsBootOptionList      The header of the link list which indexed all
-                                 current boot options
-
-  @retval EFI_SUCCESS            Finished all the boot device enumerate and create
-                                 the boot option base on that boot device
-
-  @retval EFI_OUT_OF_RESOURCES   Failed to enumerate the boot device and create the boot option list
-**/
-EFI_STATUS
-EFIAPI
-PlatformBdsLibEnumerateAllBootOption (
-  IN OUT LIST_ENTRY          *BdsBootOptionList
-  )
-{
-  EFI_STATUS                    Status;
-  UINT16                        FloppyNumber;
-  UINT16                        HarddriveNumber;
-  UINT16                        CdromNumber;
-  UINT16                        UsbNumber;
-  UINT16                        MiscNumber;
-  UINT16                        ScsiNumber;
-  UINT16                        NonBlockNumber;
-  UINTN                         NumberBlockIoHandles;
-  EFI_HANDLE                    *BlockIoHandles;
-  EFI_BLOCK_IO_PROTOCOL         *BlkIo;
-  BOOLEAN                       Removable[2];
-  UINTN                         RemovableIndex;
-  UINTN                         Index;
-  UINTN                         NumOfLoadFileHandles;
-  EFI_HANDLE                    *LoadFileHandles;
-  UINTN                         FvHandleCount;
-  EFI_HANDLE                    *FvHandleBuffer;
-  EFI_FV_FILETYPE               Type;
-  UINTN                         Size;
-  EFI_FV_FILE_ATTRIBUTES        Attributes;
-  UINT32                        AuthenticationStatus;
-  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
-  EFI_DEVICE_PATH_PROTOCOL      *DevicePath;
-  UINTN                         DevicePathType;
-  CHAR16                        Buffer[40];
-  EFI_HANDLE                    *FileSystemHandles;
-  UINTN                         NumberFileSystemHandles;
-  BOOLEAN                       NeedDelete;
-  EFI_IMAGE_DOS_HEADER          DosHeader;
-  CHAR8                         *PlatLang;
-  CHAR8                         *LastLang;
-  EFI_IMAGE_OPTIONAL_HEADER_UNION       HdrData;
-  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;
-  CHAR16                        *MacStr;
-  CHAR16                        *IPverStr;
-  EFI_HANDLE                    *NetworkHandles;
-  UINTN                         BufferSize;
-
-  FloppyNumber    = 0;
-  HarddriveNumber = 0;
-  CdromNumber     = 0;
-  UsbNumber       = 0;
-  MiscNumber      = 0;
-  ScsiNumber      = 0;
-  PlatLang        = NULL;
-  LastLang        = NULL;
-  ZeroMem (Buffer, sizeof (Buffer));
-
-  //
-  // If the boot device enumerate happened, just get the boot
-  // device from the boot order variable
-  //
-  if (mEnumBootDevice) {
-    GetVariable2 (LAST_ENUM_LANGUAGE_VARIABLE_NAME, &gLastEnumLangGuid, (VOID**)&LastLang, NULL);
-    GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&PlatLang, NULL);
-    ASSERT (PlatLang != NULL);
-    if ((LastLang != NULL) && (AsciiStrCmp (LastLang, PlatLang) == 0)) {
-      Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");
-      FreePool (LastLang);
-      FreePool (PlatLang);
-      return Status;
-    } else {
-      Status = gRT->SetVariable (
-        LAST_ENUM_LANGUAGE_VARIABLE_NAME,
-        &gLastEnumLangGuid,
-        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-        AsciiStrSize (PlatLang),
-        PlatLang
-        );
-      //
-      // Failure to set the variable only impacts the performance next time enumerating the boot options.
-      //
-
-      if (LastLang != NULL) {
-        FreePool (LastLang);
-      }
-      FreePool (PlatLang);
-    }
-  }
-
-  //
-  // Notes: this dirty code is to get the legacy boot option from the
-  // BBS table and create to variable as the EFI boot option, it should
-  // be removed after the CSM can provide legacy boot option directly
-  //
-  REFRESH_LEGACY_BOOT_OPTIONS;
-
-  //
-  // Delete invalid boot option
-  //
-  BdsDeleteAllInvalidEfiBootOption ();
-
-  //
-  // Parse removable media followed by fixed media.
-  // The Removable[] array is used by the for-loop below to create removable media boot options 
-  // at first, and then to create fixed media boot options.
-  //
-  Removable[0]  = FALSE;
-  Removable[1]  = TRUE;
-
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiBlockIoProtocolGuid,
-        NULL,
-        &NumberBlockIoHandles,
-        &BlockIoHandles
-        );
-
-  for (RemovableIndex = 0; RemovableIndex < 2; RemovableIndex++) {
-    for (Index = 0; Index < NumberBlockIoHandles; Index++) {
-      Status = gBS->HandleProtocol (
-                      BlockIoHandles[Index],
-                      &gEfiBlockIoProtocolGuid,
-                      (VOID **) &BlkIo
-                      );
-      //
-      // skip the logical partition
-      //
-      if (EFI_ERROR (Status) || BlkIo->Media->LogicalPartition) {
-        continue;
-      }
-
-      //
-      // firstly fixed block io then the removable block io
-      //
-      if (BlkIo->Media->RemovableMedia == Removable[RemovableIndex]) {
-        continue;
-      }
-      DevicePath  = DevicePathFromHandle (BlockIoHandles[Index]);
-      DevicePathType = BdsGetBootTypeFromDevicePath (DevicePath);
-
-      switch (DevicePathType) {
-      case BDS_EFI_ACPI_FLOPPY_BOOT:
-        if (FloppyNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)), FloppyNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        FloppyNumber++;
-        break;
-
-      //
-      // Assume a removable SATA device should be the DVD/CD device, a fixed SATA device should be the Hard Drive device.
-      //
-      case BDS_EFI_MESSAGE_ATAPI_BOOT:
-      case BDS_EFI_MESSAGE_SATA_BOOT:
-        if (BlkIo->Media->RemovableMedia) {
-          if (CdromNumber != 0) {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)), CdromNumber);
-          } else {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)));
-          }
-          CdromNumber++;
-        } else {
-          if (HarddriveNumber != 0) {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)), HarddriveNumber);
-          } else {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)));
-          }
-          HarddriveNumber++;
-        }
-        DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Buffer: %S\n", Buffer));
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        break;
-
-      case BDS_EFI_MESSAGE_USB_DEVICE_BOOT:
-        if (UsbNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)), UsbNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        UsbNumber++;
-        break;
-
-      case BDS_EFI_MESSAGE_SCSI_BOOT:
-        if (ScsiNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)), ScsiNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        ScsiNumber++;
-        break;
-
-      case BDS_EFI_MESSAGE_MISC_BOOT:
-      default:
-        if (MiscNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)), MiscNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        MiscNumber++;
-        break;
-      }
-    }
-  }
-
-  if (NumberBlockIoHandles != 0) {
-    FreePool (BlockIoHandles);
-  }
-
-  //
-  // If there is simple file protocol which does not consume block Io protocol, create a boot option for it here.
-  //
-  NonBlockNumber = 0;
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiSimpleFileSystemProtocolGuid,
-        NULL,
-        &NumberFileSystemHandles,
-        &FileSystemHandles
-        );
-  for (Index = 0; Index < NumberFileSystemHandles; Index++) {
-    Status = gBS->HandleProtocol (
-                    FileSystemHandles[Index],
-                    &gEfiBlockIoProtocolGuid,
-                    (VOID **) &BlkIo
-                    );
-     if (!EFI_ERROR (Status)) {
-      //
-      //  Skip if the file system handle supports a BlkIo protocol,
-      //
-      continue;
-    }
-
-    //
-    // Do the removable Media thing. \EFI\BOOT\boot{machinename}.EFI
-    //  machinename is ia32, ia64, x64, ...
-    //
-    Hdr.Union  = &HdrData;
-    NeedDelete = TRUE;
-    Status     = BdsLibGetImageHeader (
-                   FileSystemHandles[Index],
-                   EFI_REMOVABLE_MEDIA_FILE_NAME,
-                   &DosHeader,
-                   Hdr
-                   );
-    if (!EFI_ERROR (Status) &&
-        EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Hdr.Pe32->FileHeader.Machine) &&
-        Hdr.Pe32->OptionalHeader.Subsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {
-      NeedDelete = FALSE;
-    }
-
-    if (NeedDelete) {
-      //
-      // No such file or the file is not a EFI application, delete this boot option
-      //
-      BdsLibDeleteOptionFromHandle (FileSystemHandles[Index]);
-    } else {
-      if (NonBlockNumber != 0) {
-        UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)), NonBlockNumber);
-      } else {
-        UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)));
-      }
-      BdsLibBuildOptionFromHandle (FileSystemHandles[Index], BdsBootOptionList, Buffer);
-      NonBlockNumber++;
-    }
-  }
-
-  if (NumberFileSystemHandles != 0) {
-    FreePool (FileSystemHandles);
-  }
-
-  //
-  // Check if we have on flash shell
-  //
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiFirmwareVolume2ProtocolGuid,
-        NULL,
-        &FvHandleCount,
-        &FvHandleBuffer
-        );
-  for (Index = 0; Index < FvHandleCount; Index++) {
-    gBS->HandleProtocol (
-          FvHandleBuffer[Index],
-          &gEfiFirmwareVolume2ProtocolGuid,
-          (VOID **) &Fv
-          );
-
-    Status = Fv->ReadFile (
-                  Fv,
-                  &gUefiShellFileGuid,
-                  NULL,
-                  &Size,
-                  &Type,
-                  &Attributes,
-                  &AuthenticationStatus
-                  );
-    if (EFI_ERROR (Status)) {
-      //
-      // Skip if no shell file in the FV
-      //
-      continue;
-    }
-    //
-    // Build the shell boot option
-    //
-    BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList);
-  }
-
-  if (FvHandleCount != 0) {
-    FreePool (FvHandleBuffer);
-  }
-
-  //
-  // Parse Network Boot Device
-  //
-  NumOfLoadFileHandles = 0;
-  //
-  // Search Load File protocol for PXE boot option.
-  //
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiLoadFileProtocolGuid,
-        NULL,
-        &NumOfLoadFileHandles,
-        &LoadFileHandles
-        );
-
-  for (Index = 0; Index < NumOfLoadFileHandles; Index++) {
-
-//
-//Locate EFI_DEVICE_PATH_PROTOCOL to dynamically get IPv4/IPv6 protocol information.
-//
-
- Status = gBS->HandleProtocol (
-                  LoadFileHandles[Index],
-                  &gEfiDevicePathProtocolGuid,
-                  (VOID **) &DevicePath
-                  );
-  
- ASSERT_EFI_ERROR (Status);
-
-  while (!IsDevicePathEnd (DevicePath)) {
-    if ((DevicePath->Type == MESSAGING_DEVICE_PATH) &&
-        (DevicePath->SubType == MSG_IPv4_DP)) {
-
-  //
-  //Get handle infomation
-  //
-  BufferSize = 0;
-  NetworkHandles = NULL;
-  Status = gBS->LocateHandle (
-                  ByProtocol, 
-                  &gEfiSimpleNetworkProtocolGuid,
-                  NULL,
-                  &BufferSize,
-                  NetworkHandles
-                  );
-
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    NetworkHandles = AllocateZeroPool(BufferSize);
-    if (NetworkHandles == NULL) {
-      return (EFI_OUT_OF_RESOURCES);
-    }
-    Status = gBS->LocateHandle(
-                    ByProtocol,
-                    &gEfiSimpleNetworkProtocolGuid,
-                    NULL,
-                    &BufferSize,
-                    NetworkHandles
-                    );
- }
-               
-  //
-  //Get the MAC string
-  //
-  Status = NetLibGetMacString (
-             *NetworkHandles,
-             NULL,
-             &MacStr
-             );
-  if (EFI_ERROR (Status)) {	
-    return Status;
-  }
-  IPverStr = L" IPv4";
-  UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr);
-  break;
-  }
-    if((DevicePath->Type == MESSAGING_DEVICE_PATH) &&
-        (DevicePath->SubType == MSG_IPv6_DP)) {
-
-  //
-  //Get handle infomation
-  //
-  BufferSize = 0;
-  NetworkHandles = NULL;
-  Status = gBS->LocateHandle (
-                  ByProtocol, 
-                  &gEfiSimpleNetworkProtocolGuid,
-                  NULL,
-                  &BufferSize,
-                  NetworkHandles
-                  );
-
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    NetworkHandles = AllocateZeroPool(BufferSize);
-    if (NetworkHandles == NULL) {
-       return (EFI_OUT_OF_RESOURCES);
-    }
-    Status = gBS->LocateHandle(
-                    ByProtocol,
-                    &gEfiSimpleNetworkProtocolGuid,
-                    NULL,
-                    &BufferSize,
-                    NetworkHandles
-                    );
- }
-                    
-  //
-  //Get the MAC string
-  //
-  Status = NetLibGetMacString (
-             *NetworkHandles,
-             NULL,
-             &MacStr
-             );
-  if (EFI_ERROR (Status)) {	
-    return Status;
-  }
-      IPverStr = L" IPv6";
-      UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr);
-      break;
-    }
-    DevicePath = NextDevicePathNode (DevicePath);
-  }
-  
-    BdsLibBuildOptionFromHandle (LoadFileHandles[Index], BdsBootOptionList, Buffer);
-  }
-
-  if (NumOfLoadFileHandles != 0) {
-    FreePool (LoadFileHandles);
-  }
-
-  //
-  // Check if we have on flash shell
-  //
- /* gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiFirmwareVolume2ProtocolGuid,
-        NULL,
-        &FvHandleCount,
-        &FvHandleBuffer
-        );
-  for (Index = 0; Index < FvHandleCount; Index++) {
-    gBS->HandleProtocol (
-          FvHandleBuffer[Index],
-          &gEfiFirmwareVolume2ProtocolGuid,
-          (VOID **) &Fv
-          );
-
-    Status = Fv->ReadFile (
-                  Fv,
-                  &gUefiShellFileGuid,
-                  NULL,
-                  &Size,
-                  &Type,
-                  &Attributes,
-                  &AuthenticationStatus
-                  );
-    if (EFI_ERROR (Status)) {
-      //
-      // Skip if no shell file in the FV
-      //
-      continue;
-    }
-    //
-    // Build the shell boot option
-    //
-    BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList);
-  }
-
-  if (FvHandleCount != 0) {
-    FreePool (FvHandleBuffer);
-  } */
-  
-  //
-  // Make sure every boot only have one time
-  // boot device enumerate
-  //
-  Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");
-  mEnumBootDevice = TRUE;
-
-  return Status;
-} 
-
-
-
-/**
-
-  The function will execute with as the platform policy, current policy
-  is driven by boot mode. IBV/OEM can customize this code for their specific
-  policy action.
-
-  @param DriverOptionList - The header of the driver option link list
-  @param  BootOptionList   - The header of the boot option link list
-  @param ProcessCapsules  - A pointer to ProcessCapsules()
-  @param BaseMemoryTest   - A pointer to BaseMemoryTest()
-
-  @retval None.
-
-**/
-VOID
-EFIAPI
-PlatformBdsPolicyBehavior (
-  IN OUT LIST_ENTRY                  *DriverOptionList,
-  IN OUT LIST_ENTRY                  *BootOptionList,
-  IN PROCESS_CAPSULES                BdsProcessCapsules,
-  IN BASEM_MEMORY_TEST               BaseMemoryTest
-  )
-{
-  EFI_STATUS                         Status;
-  UINT16                             Timeout;
-  EFI_BOOT_MODE                      BootMode;
-  BOOLEAN                            DeferredImageExist;
-  UINTN                              Index;
-  SYSTEM_CONFIGURATION               SystemConfiguration;
-  UINTN                              VarSize;
-  PLATFORM_PCI_DEVICE_PATH           *EmmcBootDevPath;
-  EFI_GLOBAL_NVS_AREA_PROTOCOL       *GlobalNvsArea;
-  EFI_HANDLE                         FvProtocolHandle;
-  UINTN                              HandleCount;
-  EFI_HANDLE                         *HandleBuffer;
-  UINTN                              Index1;
-  UINTN                              SataPciRegBase = 0;
-  UINT16                             SataModeSelect = 0;
-  VOID                               *RegistrationExitPmAuth = NULL;
-  EFI_EVENT                          Event;
-  BOOLEAN                            IsFirstBoot;
-  UINT16                             *BootOrder;
-  UINTN                              BootOrderSize;
-  ESRT_MANAGEMENT_PROTOCOL           *EsrtManagement;
-
-  Timeout = PcdGet16 (PcdPlatformBootTimeOut);
-  if (Timeout > 10 ) {
-    //we think the Timeout variable is corrupted
-    Timeout = 10;
-  }
-
-  VarSize = sizeof(SYSTEM_CONFIGURATION);
-  Status = gRT->GetVariable(
-                  NORMAL_SETUP_NAME,
-                  &gEfiNormalSetupGuid,
-                  NULL,
-                  &VarSize,
-                  &SystemConfiguration
-                  );
-
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
-    VarSize = sizeof(SYSTEM_CONFIGURATION);
-    Status = gRT->GetVariable(
-              L"SetupRecovery",
-              &gEfiNormalSetupGuid,
-              NULL,
-              &VarSize,
-              &SystemConfiguration
-              );
-    ASSERT_EFI_ERROR (Status);
-  }
-
-  //
-  // Load the driver option as the driver option list
-  //
-  PlatformBdsGetDriverOption (DriverOptionList);
-
-  //
-  // Get current Boot Mode
-  //
-  BootMode = GetBootModeHob();
-
-  //
-  // No deferred images exist by default
-  //
-  DeferredImageExist = FALSE;
-  if ((BootMode != BOOT_WITH_MINIMAL_CONFIGURATION) && (PcdGet32(PcdFlashFvShellSize) > 0)){
-    gDS->ProcessFirmwareVolume (
-           (VOID *)(UINTN)PcdGet32(PcdFlashFvShellBase),
-           PcdGet32(PcdFlashFvShellSize),
-           &FvProtocolHandle
-           );
-  }
-
-  if (SystemConfiguration.FastBoot == 1) {
-    BootOrder = BdsLibGetVariableAndSize (
-                  L"BootOrder",
-                  &gEfiGlobalVariableGuid,
-                  &BootOrderSize
-                  );
-    if ((BootOrder != NULL) && (BootMode != BOOT_ON_FLASH_UPDATE)) {
-      //
-      // BootOrder exist, it means system has boot before. We can do fast boot.
-      //
-      BootMode = BOOT_WITH_MINIMAL_CONFIGURATION;
-    }
-  }
-
-
-  //
-  // Use eMMC to boot OS and turn on AHCI, when SATA HDD is diconnected,
-  // SATA AHCI CTLR device will show yellow bang, implement this solution to solve it.
-  //
-  SataPciRegBase  = MmPciAddress (0, 0, PCI_DEVICE_NUMBER_PCH_SATA, 0, 0);
-  SataModeSelect  = MmioRead16 (SataPciRegBase + R_PCH_SATA_MAP) & B_PCH_SATA_MAP_SMS_MASK;
-  Status          = EFI_SUCCESS;
-  if (SataModeSelect != V_PCH_SATA_MAP_SMS_IDE) {
-    Status = gBS->CreateEvent (
-                    EVT_NOTIFY_SIGNAL,
-                    TPL_CALLBACK,
-                    DisableAhciCtlr,
-                    &SataPciRegBase,
-                    &Event
-                     );
-    if (!EFI_ERROR (Status)) {
-      Status = gBS->RegisterProtocolNotify (
-                      &gExitPmAuthProtocolGuid,
-                      Event,
-                      &RegistrationExitPmAuth
-                      );
-    }
-  }
-
-  Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtManagement);
-  if (EFI_ERROR(Status)) {
-    EsrtManagement = NULL;
-  }
-
-  DEBUG ((DEBUG_INFO, "BDS: BootMode=%02x\n", BootMode));
-
-  switch (BootMode) {
-
-  case BOOT_WITH_MINIMAL_CONFIGURATION:
-    PlatformBdsInitHotKeyEvent ();
-    PlatformBdsConnectSimpleConsole (gPlatformSimpleConsole);
-
-
-    //
-    // Check to see if it's needed to dispatch more DXE drivers.
-    //
-    for (Index = 0; Index < sizeof(ConnectDriverTable)/sizeof(EFI_GUID *); Index++) {
-      Status = gBS->LocateHandleBuffer (
-                      ByProtocol,
-                      ConnectDriverTable[Index],
-                      NULL,
-                      &HandleCount,
-                      &HandleBuffer
-                      );
-      if (!EFI_ERROR (Status)) {
-        for (Index1 = 0; Index1 < HandleCount; Index1++) {
-          gBS->ConnectController (
-                 HandleBuffer[Index1],
-                 NULL,
-                 NULL,
-                 TRUE
-                 );
-        }
-      }
-
-      if (HandleBuffer != NULL) {
-        FreePool (HandleBuffer);
-      }
-
-      gDS->Dispatch ();
-    }
-
-    //
-    //  Locate the Global NVS Protocol.
-    //
-    Status = gBS->LocateProtocol (
-                    &gEfiGlobalNvsAreaProtocolGuid,
-                    NULL,
-                    (void **)&GlobalNvsArea
-                    );
-    if (GlobalNvsArea->Area->emmcVersion == 0){
-      EmmcBootDevPath = (PLATFORM_PCI_DEVICE_PATH *)gPlatformSimpleBootOption[0];
-      EmmcBootDevPath->PciDevice.Device = 0x10;
-    }
-
-    //
-    // Connect boot device here to give time to read keyboard.
-    //
-    BdsLibConnectDevicePath (gPlatformSimpleBootOption[0]);
-
-    //
-    // This is a workround for dectecting hotkey from USB keyboard.
-    //
-    gBS->Stall(KEYBOARD_TIMER_INTERVAL);
-
-    if (mHotKeyTimerEvent != NULL) {
-      gBS->SetTimer (
-             mHotKeyTimerEvent,
-             TimerCancel,
-             0
-             );
-      gBS->CloseEvent (mHotKeyTimerEvent);
-      mHotKeyTimerEvent = NULL;
-    }
-    if (mHotKeyPressed) {
-      //
-      // Skip show progress count down
-      //
-      Timeout = 0xFFFF;
-      goto FULL_CONFIGURATION;
-    }
-
-    EnableQuietBoot (PcdGetPtr(PcdLogoFile));
-    if (!SystemConfiguration.QuietBoot) {
-      PlatformBdsDiagnostics (IGNORE, FALSE, BaseMemoryTest);
-    }
-
-
-    #ifdef TPM_ENABLED
-    TcgPhysicalPresenceLibProcessRequest();
-    #endif
-
-    if (EsrtManagement != NULL) {
-      EsrtManagement->LockEsrtRepository();
-    }
-
-    //
-    // Close boot script and install ready to lock
-    //
-    InstallReadyToLock ();
-
-    //
-    // Give one chance to enter the setup if we
-    // select Gummiboot "Reboot Into Firmware Interface" and Fast Boot is enabled.
-    //
-    BootIntoFirmwareInterface();
-    break;
-
-  case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
-
-    //
-    // In no-configuration boot mode, we can connect the
-    // console directly.
-    //
-    BdsLibConnectAllDefaultConsoles ();
-    PlatformBdsDiagnostics (IGNORE, TRUE, BaseMemoryTest);
-
-    //
-    // Perform some platform specific connect sequence
-    //
-    PlatformBdsConnectSequence ();
-
-    //
-    // As console is ready, perform user identification again.
-    //
-    if (mCurrentUser == NULL) {
-      PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist);
-      if (DeferredImageExist) {
-        //
-        // After user authentication, the deferred drivers was loaded again.
-        // Here, need to ensure the deferred images are connected.
-        //
-        BdsLibConnectAllDefaultConsoles ();
-        PlatformBdsConnectSequence ();
-      }
-    }
-
-    if (EsrtManagement != NULL) {
-      EsrtManagement->LockEsrtRepository();
-    }
-
-    //
-    // Close boot script and install ready to lock
-    //
-    InstallReadyToLock ();
-
-    //
-    // Notes: current time out = 0 can not enter the
-    // front page
-    //
-    PlatformBdsEnterFrontPageWithHotKey (Timeout, FALSE);
-
-    //
-    // Check the boot option with the boot option list
-    //
-    BdsLibBuildOptionFromVar (BootOptionList, L"BootOrder");
-    break;
-
-  case BOOT_ON_FLASH_UPDATE:
-
-    //
-    // Boot with the specific configuration
-    //
-    PlatformBdsConnectConsole (gPlatformConsole);
-    PlatformBdsDiagnostics (EXTENSIVE, TRUE, BaseMemoryTest);
-
-    DEBUG((DEBUG_INFO, "ProcessCapsules Before EndOfDxe......\n"));
-    ProcessCapsules ();
-    DEBUG((DEBUG_INFO, "ProcessCapsules Done\n"));
-
-    //
-    // Close boot script and install ready to lock
-    //
-    InstallReadyToLock ();
-
-    BdsLibConnectAll ();
-
-    //
-    // Perform user identification
-    //
-    if (mCurrentUser == NULL) {
-      PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist);
-      if (DeferredImageExist) {
-        //
-        // After user authentication, the deferred drivers was loaded again.
-        // Here, need to ensure the deferred images are connected.
-        //
-        BdsLibConnectAll ();
-      }
-    }
-
-    if (EsrtManagement != NULL) {
-      EsrtManagement->SyncEsrtFmp();
-    }
-
-    DEBUG((DEBUG_INFO, "ProcessCapsules After ConnectAll......\n"));
-    ProcessCapsules();
-    DEBUG((DEBUG_INFO, "ProcessCapsules Done\n"));
-    break;
-
-  case BOOT_IN_RECOVERY_MODE:
-
-    //
-    // In recovery mode, just connect platform console
-    // and show up the front page
-    //
-    PlatformBdsConnectConsole (gPlatformConsole);
-    PlatformBdsDiagnostics (EXTENSIVE, FALSE, BaseMemoryTest);
-    BdsLibConnectAll ();
-
-    //
-    // Perform user identification
-    //
-    if (mCurrentUser == NULL) {
-      PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist);
-      if (DeferredImageExist) {
-        //
-        // After user authentication, the deferred drivers was loaded again.
-        // Here, need to ensure the deferred drivers are connected.
-        //
-        BdsLibConnectAll ();
-      }
-    }
-
-    //
-    // Close boot script and install ready to lock
-    //
-    InstallReadyToLock ();
-
-    //
-    // In recovery boot mode, we still enter to the
-    // frong page now
-    //
-    PlatformBdsEnterFrontPageWithHotKey (Timeout, FALSE);
-    break;
-
-FULL_CONFIGURATION:
-  case BOOT_WITH_FULL_CONFIGURATION:
-  case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
-  case BOOT_WITH_DEFAULT_SETTINGS:
-  default:
-
-    //
-    // Connect platform console
-    //
-    Status = PlatformBdsConnectConsole (gPlatformConsole);
-    if (EFI_ERROR (Status)) {
-
-      //
-      // Here OEM/IBV can customize with defined action
-      //
-      PlatformBdsNoConsoleAction ();
-    }
-
-    //
-    // Chenyunh[TODO]: This is Workgroud to show the fs for uSDcard,
-    // Need to root cause this issue.
-    //
-    DEBUG ((DEBUG_ERROR, "Start to reconnect all driver.\n"));
-    BdsLibDisconnectAllEfi();
-    BdsLibConnectAll ();
-    DEBUG ((DEBUG_ERROR, "End to reconnect all driver.\n"));
-
-    //
-    // Perform some platform specific connect sequence
-    //
-    PlatformBdsConnectSequence ();
-    EnableQuietBoot (PcdGetPtr(PcdLogoFile));
-    if (!SystemConfiguration.QuietBoot) {
-      PlatformBdsDiagnostics (IGNORE, FALSE, BaseMemoryTest);
-    }
-
-    //
-    // Do a pre-delay so Hard Disk can spin up and see more logo.
-    //
-    gBS->Stall(SystemConfiguration.HddPredelay * 1000000);
-
-    //
-    // Perform user identification
-    //
-    if (mCurrentUser == NULL) {
-      PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist);
-      if (DeferredImageExist) {
-        //
-        // After user authentication, the deferred drivers was loaded again.
-        // Here, need to ensure the deferred drivers are connected.
-        //
-        Status = PlatformBdsConnectConsole (gPlatformConsole);
-        if (EFI_ERROR (Status)) {
-          PlatformBdsNoConsoleAction ();
-        }
-        PlatformBdsConnectSequence ();
-      }
-    }
-   #ifdef TPM_ENABLED
-   TcgPhysicalPresenceLibProcessRequest();
-   #endif
-
-    if (EsrtManagement != NULL) {
-      EsrtManagement->SyncEsrtFmp();
-    }
-    //
-    // Close boot script and install ready to lock
-    //
-    InstallReadyToLock ();
-
-    //
-    // Here we have enough time to do the enumeration of boot device
-    //
-    PlatformBdsLibEnumerateAllBootOption (BootOptionList);
-
-    //
-    // Give one chance to enter the setup if we
-    // have the time out
-    //
-    PlatformBdsEnterFrontPageWithHotKey (Timeout, FALSE);
-
-	//
-	// Give one chance to enter the setup if we
-	// select Gummiboot "Reboot Into Firmware Interface"
-	//
-	BootIntoFirmwareInterface();
-
-    //
-    // In default boot mode, always find all boot
-    // option and do enumerate all the default boot option
-    //
-    if (Timeout == 0) {
-      BdsLibBuildOptionFromVar (BootOptionList, L"BootOrder");
-      if (IsListEmpty(BootOptionList)) {
-        PlatformBdsPredictBootOption (BootOptionList);
-      }
-
-      return;
-    }
-
-
-    break;
-  }
-
-
-  IsFirstBoot = PcdGetBool(PcdBootState);
-  if (IsFirstBoot) {
-    PcdSetBool(PcdBootState, FALSE);
-  }
-  return;
-
-}
-
-/**
-  Hook point after a boot attempt succeeds. We don't expect a boot option to
-  return, so the UEFI 2.0 specification defines that you will default to an
-  interactive mode and stop processing the BootOrder list in this case. This
-  is alos a platform implementation and can be customized by IBV/OEM.
-
-  @param Option  Pointer to Boot Option that succeeded to boot.
-
-  @retval None.
-
-**/
-VOID
-EFIAPI
-PlatformBdsBootSuccess (
-  IN  BDS_COMMON_OPTION *Option
-  )
-{
-  CHAR16  *TmpStr;
-
-  //
-  // If Boot returned with EFI_SUCCESS and there is not in the boot device
-  // select loop then we need to pop up a UI and wait for user input.
-  //
-  TmpStr =  Option->StatusString;
-  if (TmpStr != NULL) {
-    BdsLibOutputStrings (gST->ConOut, TmpStr, Option->Description, L"\n\r", NULL);
-    FreePool(TmpStr);
-  }
-}
-
-/**
-  Hook point after a boot attempt fails.
-
-  @param Option - Pointer to Boot Option that failed to boot.
-  @param Status - Status returned from failed boot.
-  @param ExitData - Exit data returned from failed boot.
-  @param ExitDataSize - Exit data size returned from failed boot.
-
-  @retval None.
-
-**/
-VOID
-EFIAPI
-PlatformBdsBootFail (
-  IN  BDS_COMMON_OPTION  *Option,
-  IN  EFI_STATUS         Status,
-  IN  CHAR16             *ExitData,
-  IN  UINTN              ExitDataSize
-  )
-{
-  CHAR16          *TmpStr;
-  EFI_HANDLE      FvProtocolHandle;
-
-  //
-  // If Boot returned with failed status then we need to pop up a UI and wait
-  // for user input.
-  //
-  TmpStr = Option->StatusString;
-  if (TmpStr != NULL) {
-    BdsLibOutputStrings (gST->ConOut, TmpStr, Option->Description, L"\n\r", NULL);
-    FreePool(TmpStr);
-  }
-  if (PcdGet32(PcdFlashFvShellSize) > 0){
-    gDS->ProcessFirmwareVolume (
-           (VOID *)(UINTN)PcdGet32(PcdFlashFvShellBase),
-           PcdGet32(PcdFlashFvShellSize),
-           &FvProtocolHandle
-           );
-  }
-  PlatformBdsConnectSequence ();
-}
-
-/**
-  This function is remained for IBV/OEM to do some platform action,
-  if there no console device can be connected.
-
-  @param  None.
-
-  @retval EFI_SUCCESS       Direct return success now.
-
-**/
-EFI_STATUS
-PlatformBdsNoConsoleAction (
-  VOID
-  )
-{
-  return EFI_SUCCESS;
-}
-
-/**
-  This function locks the block
-
-  @param Base            The base address flash region to be locked.
-
-**/
-VOID
-BdsLockFv (
-  IN EFI_PHYSICAL_ADDRESS  Base
-  )
-{
-  EFI_FV_BLOCK_MAP_ENTRY      *BlockMap;
-  EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;
-  EFI_PHYSICAL_ADDRESS        BaseAddress;
-  UINT32                      BlockLength;
-  UINTN                       Index;
-
-  BaseAddress = Base - 0x400000 + 2;
-  FvHeader    = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINTN) (Base));
-  BlockMap    = &(FvHeader->BlockMap[0]);
-
-  while ((BlockMap->NumBlocks != 0) && (BlockMap->Length != 0)) {
-    BlockLength = BlockMap->Length;
-    for (Index = 0; Index < BlockMap->NumBlocks; Index++) {
-      MmioOr8 ((UINTN) BaseAddress, 0x03);
-      BaseAddress += BlockLength;
-    }
-    BlockMap++;
-  }
-}
-
-VOID
-EFIAPI
-PlatformBdsLockNonUpdatableFlash (
-  VOID
-  )
-{
-  EFI_PHYSICAL_ADDRESS  Base;
-
-  Base = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashFvMainBase);
-  if (Base > 0) {
-    BdsLockFv (Base);
-  }
-
-  Base = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashFvRecoveryBase);
-  if (Base > 0) {
-    BdsLockFv (Base);
-  }
-}
-
-/**
-  Lock the ConsoleIn device in system table. All key
-  presses will be ignored until the Password is typed in. The only way to
-  disable the password is to type it in to a ConIn device.
-
-  @param  Password        Password used to lock ConIn device.
-
-  @retval EFI_SUCCESS     lock the Console In Spliter virtual handle successfully.
-  @retval EFI_UNSUPPORTED Password not found
-
-**/
-EFI_STATUS
-EFIAPI
-LockKeyboards (
-  IN  CHAR16    *Password
-  )
-{
-    return EFI_UNSUPPORTED;
-}
-
-/**
-  Connect the predefined platform default authentication devices.
-
-  This function connects the predefined device path for authentication device,
-  and if the predefined device path has child device path, the child handle will
-  be connected too. But the child handle of the child will not be connected.
-
-**/
-VOID
-EFIAPI
-PlatformBdsConnectAuthDevice (
-  VOID
-  )
-{
-  EFI_STATUS                   Status;
-  UINTN                        Index;
-  UINTN                        HandleIndex;
-  UINTN                        HandleCount;
-  EFI_HANDLE                   *HandleBuffer;
-  EFI_DEVICE_PATH_PROTOCOL     *ChildDevicePath;
-  EFI_USER_MANAGER_PROTOCOL    *Manager;
-
-  Status = gBS->LocateProtocol (
-                  &gEfiUserManagerProtocolGuid,
-                  NULL,
-                  (VOID **) &Manager
-                  );
-  if (EFI_ERROR (Status)) {
-    //
-    // As user manager protocol is not installed, the authentication devices
-    // should not be connected.
-    //
-    return ;
-  }
-
-  Index = 0;
-  while (gUserAuthenticationDevice[Index] != NULL) {
-    //
-    // Connect the platform customized device paths
-    //
-    BdsLibConnectDevicePath (gUserAuthenticationDevice[Index]);
-    Index++;
-  }
-
-  //
-  // Find and connect the child device paths of the platform customized device paths
-  //
-  HandleBuffer = NULL;
-  for (Index = 0; gUserAuthenticationDevice[Index] != NULL; Index++) {
-    HandleCount = 0;
-    Status = gBS->LocateHandleBuffer (
-                    AllHandles,
-                    NULL,
-                    NULL,
-                    &HandleCount,
-                    &HandleBuffer
-                    );
-    ASSERT (!EFI_ERROR (Status));
-
-    //
-    // Find and connect the child device paths of gUserIdentificationDevice[Index]
-    //
-    for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
-      ChildDevicePath = NULL;
-      Status = gBS->HandleProtocol (
-                      HandleBuffer[HandleIndex],
-                      &gEfiDevicePathProtocolGuid,
-                      (VOID **) &ChildDevicePath
-                      );
-      if (EFI_ERROR (Status) || ChildDevicePath == NULL) {
-        continue;
-      }
-
-      if (CompareMem (
-            ChildDevicePath,
-            gUserAuthenticationDevice[Index],
-            (GetDevicePathSize (gUserAuthenticationDevice[Index]) - sizeof (EFI_DEVICE_PATH_PROTOCOL))
-            ) != 0) {
-        continue;
-      }
-      gBS->ConnectController (
-             HandleBuffer[HandleIndex],
-             NULL,
-             NULL,
-             TRUE
-             );
-    }
-  }
-
-  if (HandleBuffer != NULL) {
-    FreePool (HandleBuffer);
-  }
-}
-
-/**
-  This function is to identify a user, and return whether deferred images exist.
-
-  @param[out]  User               Point to user profile handle.
-  @param[out]  DeferredImageExist On return, points to TRUE if the deferred image
-                                  exist or FALSE if it did not exist.
-
-**/
-VOID
-EFIAPI
-PlatformBdsUserIdentify (
-  OUT EFI_USER_PROFILE_HANDLE        *User,
-  OUT BOOLEAN                        *DeferredImageExist
-  )
-{
-  EFI_STATUS                         Status;
-  EFI_DEFERRED_IMAGE_LOAD_PROTOCOL   *DeferredImage;
-  UINTN                              HandleCount;
-  EFI_HANDLE                         *HandleBuf;
-  UINTN                              Index;
-  UINTN                              DriverIndex;
-  EFI_DEVICE_PATH_PROTOCOL           *ImageDevicePath;
-  VOID                               *DriverImage;
-  UINTN                              ImageSize;
-  BOOLEAN                            BootOption;
-
-  //
-  // Perform user identification
-  //
-  do {
-    Status = BdsLibUserIdentify (User);
-  } while (EFI_ERROR (Status));
-
-  //
-  // After user authentication now, try to find whether deferred image exists
-  //
-  HandleCount = 0;
-  HandleBuf   = NULL;
-  *DeferredImageExist = FALSE;
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiDeferredImageLoadProtocolGuid,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuf
-                  );
-  if (EFI_ERROR (Status)) {
-    return ;
-  }
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    Status = gBS->HandleProtocol (
-                    HandleBuf[Index],
-                    &gEfiDeferredImageLoadProtocolGuid,
-                    (VOID **) &DeferredImage
-                    );
-    if (!EFI_ERROR (Status)) {
-      //
-      // Find whether deferred image exists in this instance.
-      //
-      DriverIndex = 0;
-      Status = DeferredImage->GetImageInfo(
-                                DeferredImage,
-                                DriverIndex,
-                                &ImageDevicePath,
-                                (VOID **) &DriverImage,
-                                &ImageSize,
-                                &BootOption
-                                );
-      if (!EFI_ERROR (Status)) {
-        //
-        // The deferred image is found.
-        //
-        FreePool (HandleBuf);
-        *DeferredImageExist = TRUE;
-        return ;
-      }
-    }
-  }
-
-  FreePool (HandleBuf);
-}
-
-UINTN gHotKey = 0;
-
-
-EFI_STATUS
-ShowProgressHotKey (
-  IN UINT16                       TimeoutDefault
-  )
-{
-  CHAR16                        *TmpStr;
-  UINT16                        TimeoutRemain;
-  EFI_STATUS                    Status;
-  EFI_INPUT_KEY                 Key;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;
-  UINT32                        GpioValue;
-  CHAR16                        *TmpStr1;
-  CHAR16                        *TmpStr2;
-  CHAR16                        *TmpStr3;
-  UINTN                         TmpStrSize;
-  VOID                          *Buffer;
-  UINTN                         Size;
-
-  if (TimeoutDefault == 0) {
-    return EFI_TIMEOUT;
-  }
-
-  gST->ConOut->SetAttribute(gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
-    
-  if (DebugAssertEnabled())
-  {
-    DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it, or press <F2> or <DEL> to enter setup page! ...Zzz....\n"));
-  }
-  else
-  {  
-    #ifdef __GNUC__
-    SerialPortWrite((UINT8 *)"\n\n>>>>Start boot option, Press <F2> or <DEL> to enter setup page(5 Sec)[GCC]", 76);
-    #else
-    SerialPortWrite((UINT8 *)"\n\n>>>>Start boot option, Press <F2> or <DEL> to enter setup page(5 Sec)", 71);
-    #endif
-  } 
-  SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);
-  SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);
-  SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);
-
-  TmpStr2 = NULL;
-  TmpStr3 = NULL;
-
-  //
-  // Check if the platform is using test key.
-  //
-  Status = GetSectionFromAnyFv(
-             PcdGetPtr(PcdEdkiiRsa2048Sha256TestPublicKeyFileGuid),
-             EFI_SECTION_RAW,
-             0,
-             &Buffer,
-             &Size
-             );
-  if (!EFI_ERROR(Status)) {
-    if ((Size == PcdGetSize(PcdRsa2048Sha256PublicKeyBuffer)) &&
-        (CompareMem(Buffer, PcdGetPtr(PcdRsa2048Sha256PublicKeyBuffer), Size) == 0)) {
-      TmpStr2 = L"WARNING: Recovery Test Key is used.\r\n";
-      if (DebugAssertEnabled()) {
-        DEBUG ((DEBUG_INFO, "\n\nWARNING: Recovery Test Key is used.\n"));
-      } else {
-        SerialPortWrite((UINT8 *)"\n\nWARNING: Recovery Test Key is used.", sizeof("\n\nWARNING: Recovery Test Key is used."));
-      }
-      PcdSetBoolS(PcdTestKeyUsed, TRUE);
-    }
-    FreePool(Buffer);
-  }
-  Status = GetSectionFromAnyFv(
-             PcdGetPtr(PcdEdkiiPkcs7TestPublicKeyFileGuid),
-             EFI_SECTION_RAW,
-             0,
-             &Buffer,
-             &Size
-             );
-  if (!EFI_ERROR(Status)) {
-    if ((Size == PcdGetSize(PcdPkcs7CertBuffer)) &&
-        (CompareMem(Buffer, PcdGetPtr(PcdPkcs7CertBuffer), Size) == 0)) {
-      TmpStr3 = L"WARNING: Capsule Test Key is used.\r\n";
-      if (DebugAssertEnabled()) {
-        DEBUG ((DEBUG_INFO, "\n\nWARNING: Capsule Test Key is used.\r\n"));
-      } else {
-        SerialPortWrite((UINT8 *)"\n\nWARNING: Capsule Test Key is used.", sizeof("\n\nWARNING: Capsule Test Key is used."));
-      }
-      PcdSetBoolS(PcdTestKeyUsed, TRUE);
-    }
-    FreePool(Buffer);
-  }
-
-  //
-  // Clear the progress status bar first
-  //
-  TmpStr1 = L"Start boot option, Press <F2> or <DEL> to enter setup page.\r\n";
-  TmpStrSize = StrSize(TmpStr1);
-  if (TmpStr2 != NULL) {
-    TmpStrSize += StrSize(TmpStr2);
-  }
-  if (TmpStr3 != NULL) {
-    TmpStrSize += StrSize(TmpStr3);
-  }
-  TmpStr = AllocatePool (TmpStrSize);
-  if (TmpStr == NULL) {
-    TmpStr = TmpStr1;
-  } else {
-    StrCpyS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr1);
-    if (TmpStr2 != NULL) {
-      StrCatS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr2);
-    }
-    if (TmpStr3 != NULL) {
-      StrCatS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr3);
-    }
-  }
-  PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0);
-
-  TimeoutRemain = TimeoutDefault;
-  while (TimeoutRemain != 0) {
-    if (DebugAssertEnabled())
-    {
-    DEBUG ((EFI_D_INFO, "Showing progress bar...Remaining %d second!\n", TimeoutRemain));
-    }
-    else
-    {	
-    SerialPortWrite ((UINT8 *)".", 1);
-    }
-    Status = WaitForSingleEvent (gST->ConIn->WaitForKey, ONE_SECOND);
-    if (Status != EFI_TIMEOUT) {
-      break;
-    }
-    TimeoutRemain--;
-
-    //
-    // Show progress
-    //
-    if (TmpStr != NULL) {
-      PlatformBdsShowProgress (
-        Foreground,
-        Background,
-        TmpStr,
-        Color,
-        ((TimeoutDefault - TimeoutRemain) * 100 / TimeoutDefault),
-        0
-        );
-    }
-  }
-
-  //
-  // Timeout expired
-  //
-  if (TimeoutRemain == 0) {
-    if (DebugAssertEnabled())
-	{
-	}
-    else
-    {	
-    SerialPortWrite ((UINT8 *)"\r\n", 2);
-    }
-    return EFI_TIMEOUT;
-  }
-
-  //
-  // User pressed some key
-  //
-  Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Check Volume Up Key to enter Setup
-  //
-  GpioValue = MmioRead32 (IO_BASE_ADDRESS + 0x0668);  // The value of GPIOC_5
-  if (((GpioValue & BIT0) == 0) && (Key.ScanCode == SCAN_UP)) {
-    gHotKey = 0;
-    return EFI_SUCCESS;
-  }
-
-  if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
-    //
-    // User pressed enter, equivalent to select "continue"
-    //
-    return EFI_TIMEOUT;
-  }
-
-  //
-  //F2 --  Front Page
-  //F5 --  Device Manager
-  //F7 --  Boot Manager
-  // do not use F8. generally people assume it is windows safe mode key.
-  //F9 --  Boot order
-  //
-  DEBUG ((EFI_D_INFO, "[Key Pressed]: ScanCode 0x%x\n", Key.ScanCode));
-  switch(Key.ScanCode) {
-      case SCAN_F2:
-          gHotKey = 0;
-          break;
-
-      case SCAN_DELETE:
-          gHotKey = 0;
-          break;
-
-      case SCAN_F5:
-          gHotKey = FRONT_PAGE_KEY_DEVICE_MANAGER;
-          break;
-
-      case SCAN_F7:
-          gHotKey = FRONT_PAGE_KEY_BOOT_MANAGER;
-          break;
-
-      case SCAN_F9:
-          gHotKey = FRONT_PAGE_KEY_BOOT_MAINTAIN;
-          break;
-
-      default:
-          //set gHotKey to continue so that flow will not go into CallFrontPage
-          gHotKey = FRONT_PAGE_KEY_CONTINUE;
-          return EFI_TIMEOUT;
-          break;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-
-/**
-  This function is the main entry of the platform setup entry.
-  The function will present the main menu of the system setup,
-  this is the platform reference part and can be customize.
-
-
-  @param TimeoutDefault     The fault time out value before the system
-                            continue to boot.
-  @param ConnectAllHappened The indicater to check if the connect all have
-                            already happened.
-
-**/
-VOID
-PlatformBdsEnterFrontPageWithHotKey (
-  IN UINT16                       TimeoutDefault,
-  IN BOOLEAN                      ConnectAllHappened
-  )
-{
-  EFI_STATUS                    Status;
-
-  EFI_STATUS                         LogoStatus;
-  EFI_BOOT_LOGO_PROTOCOL             *BootLogo;
-  EFI_GRAPHICS_OUTPUT_PROTOCOL       *GraphicsOutput;
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *SimpleTextOut;
-  UINTN                              BootTextColumn;
-  UINTN                              BootTextRow;
-
-  GraphicsOutput = NULL;
-  SimpleTextOut = NULL;
-
-  PERF_START (NULL, "BdsTimeOut", "BDS", 0);
-
-  //
-  // Indicate if we need connect all in the platform setup
-  //
-  if (ConnectAllHappened) {
-    gConnectAllHappened = TRUE;
-  }
-
-  if (!mModeInitialized) {
-    //
-    // After the console is ready, get current video resolution
-    // and text mode before launching setup at first time.
-    //
-    Status = gBS->HandleProtocol (
-                    gST->ConsoleOutHandle,
-                    &gEfiGraphicsOutputProtocolGuid,
-                    (VOID**)&GraphicsOutput
-                    );
-    if (EFI_ERROR (Status)) {
-      GraphicsOutput = NULL;
-    }
-
-    Status = gBS->HandleProtocol (
-                    gST->ConsoleOutHandle,
-                    &gEfiSimpleTextOutProtocolGuid,
-                    (VOID**)&SimpleTextOut
-                    );
-    if (EFI_ERROR (Status)) {
-      SimpleTextOut = NULL;
-    }
-
-    if (GraphicsOutput != NULL) {
-      //
-      // Get current video resolution and text mode.
-      //
-      mBootHorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution;
-      mBootVerticalResolution   = GraphicsOutput->Mode->Info->VerticalResolution;
-    }
-
-    if (SimpleTextOut != NULL) {
-      Status = SimpleTextOut->QueryMode (
-                                SimpleTextOut,
-                                SimpleTextOut->Mode->Mode,
-                                &BootTextColumn,
-                                &BootTextRow
-                                );
-      mBootTextModeColumn = (UINT32)BootTextColumn;
-      mBootTextModeRow    = (UINT32)BootTextRow;
-    }
-
-    //
-    // Get user defined text mode for setup.
-    //
-    mSetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);
-    mSetupVerticalResolution   = PcdGet32 (PcdSetupVideoVerticalResolution);
-    mSetupTextModeColumn       = PcdGet32 (PcdSetupConOutColumn);
-    mSetupTextModeRow          = PcdGet32 (PcdSetupConOutRow);
-
-    mModeInitialized           = TRUE;
-  }
-
-  if (TimeoutDefault != 0xffff) {
-    Status = ShowProgressHotKey (TimeoutDefault);
-
-    //
-    // Ensure screen is clear when switch Console from Graphics mode to Text mode
-    //
-    gST->ConOut->EnableCursor (gST->ConOut, TRUE);
-    gST->ConOut->ClearScreen (gST->ConOut);
-
-    //
-    // Boot Logo is corrupted, report it using Boot Logo protocol.
-    //
-    LogoStatus = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);
-    if (!EFI_ERROR (LogoStatus) && (BootLogo != NULL)) {
-      BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);
-    }
-
-    if (EFI_ERROR (Status)) {
-      //
-      // Timeout or user press enter to continue
-      //
-      goto Exit;
-    }
-  }
-
-  //
-  // Install BM HiiPackages. 
-  // Keep BootMaint HiiPackage, so that it can be covered by global setting. 
-  //
-	InitBMPackage ();
-  do {
-
-    BdsSetConsoleMode (TRUE);
-
-    InitializeFrontPage (FALSE);
-
-    //
-    // Update Front Page strings
-    //
-    UpdateFrontPageStrings ();
-
-    Status = EFI_SUCCESS;
-    gCallbackKey = 0;
-    if (gHotKey == 0) {
-      Status = CallFrontPage ();
-    } else {
-      gCallbackKey = gHotKey;
-      gHotKey = 0;
-    }
-
-    //
-    // If gCallbackKey is greater than 1 and less or equal to 5,
-    // it will launch configuration utilities.
-    // 2 = set language
-    // 3 = boot manager
-    // 4 = device manager
-    // 5 = boot maintenance manager
-    //
-    if (gCallbackKey != 0) {
-      REPORT_STATUS_CODE (
-        EFI_PROGRESS_CODE,
-        (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_USER_SETUP)
-        );
-    }
-
-    //
-    // Based on the key that was set, we can determine what to do
-    //
-    switch (gCallbackKey) {
-    //
-    // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can
-    // describe to their customers in documentation how to find their setup information (namely
-    // under the device manager and specific buckets)
-    //
-    // These entries consist of the Continue, Select language, Boot Manager, and Device Manager
-    //
-    case FRONT_PAGE_KEY_CONTINUE:
-
-      //
-      // User hit continue
-      //
-      break;
-
-    case FRONT_PAGE_KEY_LANGUAGE:
-
-      //
-      // User made a language setting change - display front page again
-      //
-      break;
-
-    case FRONT_PAGE_KEY_BOOT_MANAGER:
-      //
-	  // Remove the installed BootMaint HiiPackages when exit.
-      //
-      FreeBMPackage ();
-
-      //
-      // User chose to run the Boot Manager
-      //
-      CallBootManager ();
-	  
-	  //
-      // Reinstall BootMaint HiiPackages after exiting from Boot Manager.
-      //
-      InitBMPackage ();
-      break;
-
-    case FRONT_PAGE_KEY_DEVICE_MANAGER:
-
-      //
-      // Display the Device Manager
-      //
-      do {
-        CallDeviceManager ();
-      } while (gCallbackKey == FRONT_PAGE_KEY_DEVICE_MANAGER);
-      break;
-
-    case FRONT_PAGE_KEY_BOOT_MAINTAIN:
-
-      //
-      // Display the Boot Maintenance Manager
-      //
-      BdsStartBootMaint ();
-      break;
-    }
-
-  } while (((UINTN)gCallbackKey) != FRONT_PAGE_KEY_CONTINUE);
-
-  //
-  //Will leave browser, check any reset required change is applied? if yes, reset system
-  //
-  SetupResetReminder ();
-  //
-  // Remove the installed BootMaint HiiPackages when exit.
-  //
-  FreeBMPackage ();
-
-Exit:
-  //
-  // Automatically load current entry
-  // Note: The following lines of code only execute when Auto boot
-  // takes affect
-  //
-  PERF_END (NULL, "BdsTimeOut", "BDS", 0);
-}
-
-
-VOID 
-BootIntoFirmwareInterface(
-VOID
-)
-{
-  EFI_STATUS        Status;
-  UINTN             DataSize;
-  UINT16            Timeout;    
-  UINT64            OsIndication;
-
-  
-  OsIndication = 0;
-  DataSize = sizeof(UINT64);
-  Status = gRT->GetVariable (
-                  L"OsIndications",
-                  &gEfiGlobalVariableGuid,
-                  NULL,
-                  &DataSize,
-                  &OsIndication
-                  );
-				  
-  DEBUG ((EFI_D_INFO, "OSIndication Variable Value %d\n", OsIndication));
-  //
-  //Goto FrontPage directly when bit EFI_OS_INDICATIONS_BOOT_TO_FW_UI in OSIndication Variable is setted.
-  //  
-  if (!EFI_ERROR(Status) && (OsIndication != 0)) {				  
-   Timeout = 0xffff;
-   PlatformBdsEnterFrontPage (Timeout, FALSE);
-   }
-}
-
-
-EFI_STATUS
-PlatformBdsConnectSimpleConsole (
-  IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
-)
-{
-  EFI_STATUS                         Status;
-  UINTN                              Index;
-  EFI_DEVICE_PATH_PROTOCOL           *VarConout;
-  EFI_DEVICE_PATH_PROTOCOL           *VarConin;
-  UINTN                              DevicePathSize;
-
-
-  Index = 0;
-  Status = EFI_SUCCESS;
-  DevicePathSize = 0;
-  VarConout = BdsLibGetVariableAndSize (
-                L"ConOut",
-                &gEfiGlobalVariableGuid,
-                &DevicePathSize
-                );
-  VarConin = BdsLibGetVariableAndSize (
-               L"ConIn",
-               &gEfiGlobalVariableGuid,
-               &DevicePathSize
-               );
-  if (VarConout == NULL || VarConin == NULL) {
-    //
-    // Have chance to connect the platform default console,
-    // the platform default console is the minimum device group
-    // the platform should support
-    //
-    while (PlatformConsole[Index].DevicePath != NULL) {
-
-      //
-      // Update the console variable with the connect type
-      //
-      if ((PlatformConsole[Index].ConnectType & CONSOLE_IN) == CONSOLE_IN) {
-        BdsLibUpdateConsoleVariable (L"ConIn", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      if ((PlatformConsole[Index].ConnectType & CONSOLE_OUT) == CONSOLE_OUT) {
-        BdsLibUpdateConsoleVariable (L"ConOut", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      if ((PlatformConsole[Index].ConnectType & STD_ERROR) == STD_ERROR) {
-        BdsLibUpdateConsoleVariable (L"ErrOut", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      Index ++;
-    }
-  }
-
-  //
-  // Connect ConIn first to give keyboard time to parse hot key event.
-  //
-  Status = BdsLibConnectConsoleVariable (L"ConIn");
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Make sure we have at least one active VGA, and have the right
-  // active VGA in console variable
-  //
-  Status = PlatformBdsForceActiveVga ();
-
-  //
-  // It seems impossible not to have any ConOut device on platform,
-  // so we check the status here.
-  //
-  Status = BdsLibConnectConsoleVariable (L"ConOut");
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Timer handler to convert the key from USB.
-
-  @param  Event                    Indicates the event that invoke this function.
-  @param  Context                  Indicates the calling context.
-**/
-VOID
-EFIAPI
-HotKeyTimerHandler (
-  IN  EFI_EVENT                 Event,
-  IN  VOID                      *Context
-  )
-{
-  EFI_STATUS                    Status;
-  EFI_INPUT_KEY                 Key;
-
-  Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
-  if (EFI_ERROR (Status)) {
-    return;
-  }
-
-  switch(Key.ScanCode) {
-  case SCAN_F2:
-    gHotKey = 0;
-    mHotKeyPressed = TRUE;
-    break;
-
-  case SCAN_F5:
-    gHotKey = FRONT_PAGE_KEY_DEVICE_MANAGER;
-    mHotKeyPressed = TRUE;
-    break;
-
-  case SCAN_F7:
-    gHotKey = FRONT_PAGE_KEY_BOOT_MANAGER;
-    mHotKeyPressed = TRUE;
-    break;
-
-  case SCAN_F9:
-    gHotKey = FRONT_PAGE_KEY_BOOT_MAINTAIN;
-    mHotKeyPressed = TRUE;
-    break;
-  }
-
-  if (mHotKeyPressed) {
-    gBS->SetTimer (
-           mHotKeyTimerEvent,
-           TimerCancel,
-           0
-           );
-    gBS->CloseEvent (mHotKeyTimerEvent);
-    mHotKeyTimerEvent = NULL;
-  }
-
-  return;
-}
-
-
-/**
-  Callback function for SimpleTextInEx protocol install events
-
-  @param Event           the event that is signaled.
-  @param Context         not used here.
-
-**/
-VOID
-EFIAPI
-HitHotkeyEvent (
-  IN EFI_EVENT    Event,
-  IN VOID         *Context
-  )
-{
-  EFI_STATUS                         Status;
-
-  Status = gBS->CloseEvent(mHitHotkeyEvent);
-  if (EFI_ERROR (Status)) {
-    return;
-  }
-  Status = gBS->CreateEvent (
-                  EVT_TIMER | EVT_NOTIFY_SIGNAL,
-                  TPL_NOTIFY,
-                  HotKeyTimerHandler,
-                  NULL,
-                  &mHotKeyTimerEvent
-                  );
-  if (EFI_ERROR (Status)) {
-    return;
-  }
-  Status = gBS->SetTimer (
-                  mHotKeyTimerEvent,
-                  TimerPeriodic,
-                  KEYBOARD_TIMER_INTERVAL
-                  );
-  if (EFI_ERROR (Status)) {
-    return;
-  }
-
-  return;
-}
-
-
-VOID
-EFIAPI
-PlatformBdsInitHotKeyEvent (
-  VOID
-  )
-{
-  EFI_STATUS      Status;
-
-  //
-  // Register Protocol notify for Hotkey service
-  //
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_CALLBACK,
-                  HitHotkeyEvent,
-                  NULL,
-                  &mHitHotkeyEvent
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // Register for protocol notifications on this event
-  //
-  Status = gBS->RegisterProtocolNotify (
-                  &gEfiSimpleTextInputExProtocolGuid,
-                  mHitHotkeyEvent,
-                  &mHitHotkeyRegistration
-                  );
-  ASSERT_EFI_ERROR (Status);
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.h
deleted file mode 100644
index b5bb519747..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.h
+++ /dev/null
@@ -1,516 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  BdsPlatform.h
-
-Abstract:
-
-  Head file for BDS Platform specific code
-
---*/
-
-#ifndef _BDS_PLATFORM_H
-#define _BDS_PLATFORM_H
-
-#include <FrameworkDxe.h>
-
-#include <Protocol/FirmwareVolume2.h>
-#include <Protocol/DevicePath.h>
-#include <Protocol/SimpleNetwork.h>
-#include <Protocol/PciRootBridgeIo.h>
-#include <Protocol/LoadFile.h>
-#include <Protocol/LegacyBios.h>
-#include <Protocol/PciIo.h>
-#include <Protocol/SmmAccess2.h>
-#include <Protocol/DxeSmmReadyToLock.h>
-#include <Protocol/UserManager.h>
-#include <Protocol/DeferredImageLoad.h>
-#include <Protocol/AcpiS3Save.h>
-#include <Protocol/ExitPmAuth.h>
-#include <Protocol/MmioDevice.h>
-#include <Protocol/I2cBusMcg.h>
-#include <Protocol/I2cHostMcg.h>
-#include <Guid/CapsuleVendor.h>
-#include <Guid/MemoryTypeInformation.h>
-#include <Guid/GlobalVariable.h>
-#include <Guid/DebugAgentGuid.h>
-
-
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/BaseLib.h>
-#include <Library/PcdLib.h>
-#include <Library/IoLib.h>
-#include <Library/GenericBdsLib.h>
-#include <Library/PlatformBdsLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/UefiLib.h>
-#include <Library/HobLib.h>
-#include <Library/PrintLib.h>
-#include <Library/PerformanceLib.h>
-#include <Library/ReportStatusCodeLib.h>
-
-#include <IndustryStandard/Pci.h>
-
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformRootBridges [];
-extern BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformAllPossiblePciVgaConsole [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformConnectSequence [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformDriverOption [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformBootOption [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gUserAuthenticationDevice[];
-extern BDS_CONSOLE_CONNECT_ENTRY gPlatformSimpleConsole [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformSimpleBootOption [];
-
-extern BOOLEAN mEnumBootDevice;
-
-
-//
-// the short form device path for Usb keyboard
-//
-#define CLASS_HID           3
-#define SUBCLASS_BOOT       1
-#define PROTOCOL_KEYBOARD   1
-
-#define PCI_DEVICE_PATH_NODE(Func, Dev) \
-  { \
-    HARDWARE_DEVICE_PATH, \
-    HW_PCI_DP, \
-    { \
-      (UINT8) (sizeof (PCI_DEVICE_PATH)), \
-      (UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8) \
-    }, \
-    (Func), \
-    (Dev) \
-  }
-
-#define PNPID_DEVICE_PATH_NODE(PnpId) \
-  { \
-    { \
-      ACPI_DEVICE_PATH, \
-      ACPI_DP, \
-      { \
-        (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
-        (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
-      } \
-    }, \
-    EISA_PNP_ID((PnpId)), \
-    0 \
-  }
-
-#define gUart(BaudRate, DataBits, Parity, StopBits) \
-  { \
-    { \
-      MESSAGING_DEVICE_PATH, \
-      MSG_UART_DP, \
-      { \
-        (UINT8) (sizeof (UART_DEVICE_PATH)), \
-        (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) \
-      } \
-    }, \
-    0, \
-    (BaudRate), \
-    (DataBits), \
-    (Parity), \
-    (StopBits) \
-  }
-
-#define gPcAnsiTerminal \
-  { \
-    { \
-      MESSAGING_DEVICE_PATH, \
-      MSG_VENDOR_DP, \
-      { \
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)), \
-        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) \
-      } \
-    }, \
-    DEVICE_PATH_MESSAGING_PC_ANSI \
-  }
-
-#define gUsbKeyboardMouse \
-  { \
-    { \
-      MESSAGING_DEVICE_PATH, \
-      MSG_USB_CLASS_DP, \
-      (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)), \
-      (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8) \
-    }, \
-    0xffff, \
-    0xffff, \
-    CLASS_HID, \
-    SUBCLASS_BOOT, \
-    PROTOCOL_KEYBOARD \
-  }
-
-#define gEndEntire \
-  { \
-    END_DEVICE_PATH_TYPE, \
-    END_ENTIRE_DEVICE_PATH_SUBTYPE, \
-    { \
-      END_DEVICE_PATH_LENGTH, \
-      0 \
-    } \
-  }
-
-#define gPciRootBridge \
-  PNPID_DEVICE_PATH_NODE(0x0A03)
-
-#define gPnpPs2Keyboard \
-  PNPID_DEVICE_PATH_NODE(0x0303)
-
-#define gPnp16550ComPort \
-  PNPID_DEVICE_PATH_NODE(0x0501)
-
-#define gPciePort0Bridge \
-  PCI_DEVICE_PATH_NODE(0, 0x1C)
-
-#define gPciePort1Bridge \
-  PCI_DEVICE_PATH_NODE(1, 0x1C)
-
-#define gPciePort2Bridge \
-  PCI_DEVICE_PATH_NODE(2, 0x1C)
-
-#define gPciePort3Bridge \
-  PCI_DEVICE_PATH_NODE(3, 0x1C)
-
-#define gPciIsaBridge \
-  PCI_DEVICE_PATH_NODE(0, 0x1f)
-
-//
-// Platform Root Bridge
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_ROOT_BRIDGE_DEVICE_PATH;
-
-//
-// Below is the platform console device path
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           IsaBridge;
-  ACPI_HID_DEVICE_PATH      Keyboard;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_ISA_KEYBOARD_DEVICE_PATH;
-
-typedef struct {
-  VENDOR_DEVICE_PATH             VendorDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL       End;
-} HII_VENDOR_DEVICE_PATH;
-
-typedef struct {
-  USB_CLASS_DEVICE_PATH           UsbClass;
-  EFI_DEVICE_PATH_PROTOCOL        End;
-} USB_CLASS_FORMAT_DEVICE_PATH;
-
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           OnboardVga;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_ONBOARD_VGA_DEVICE_PATH;
-
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           AgpBridge;
-  PCI_DEVICE_PATH           AgpDevice;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_OFFBOARD_VGA_DEVICE_PATH;
-
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           IsaBridge;
-  ACPI_HID_DEVICE_PATH      IsaSerial;
-  UART_DEVICE_PATH          Uart;
-  VENDOR_DEVICE_PATH        TerminalType;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_ISA_SERIAL_DEVICE_PATH;
-
-//
-// Below is the boot option device path
-//
-typedef struct {
-  BBS_BBS_DEVICE_PATH             LegacyHD;
-  EFI_DEVICE_PATH_PROTOCOL        End;
-} LEGACY_HD_DEVICE_PATH;
-
-//
-// Below is the platform IDE device path
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           IsaBridge;
-  ATAPI_DEVICE_PATH         Ide;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_IDE_DEVICE_PATH;
-
-//
-// Floppy device path definition
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           IsaBridge;
-  ACPI_HID_DEVICE_PATH      Floppy;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_FLOPPY_DEVICE_PATH;
-
-//
-// Below is the platform USB controller device path for
-// USB disk as user authentication device.
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           PciDevice;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_USB_DEVICE_PATH;
-
-//
-// Debug Agent UART Console device path definition
-//
-typedef struct {
-  VENDOR_DEVICE_PATH        VendorHardware;
-  UART_DEVICE_PATH          Uart;
-  VENDOR_DEVICE_PATH        TerminalType;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} VENDOR_UART_DEVICE_PATH;
-
-//
-// Below is the platform PCI device path
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           PciDevice;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_PCI_DEVICE_PATH;
-
-typedef enum {
-  PMIC_Equal         = 0, // =		0
-  PMIC_Greater_Than,	  // >		1
-  PMIC_Smaller_Than,	  // <		2
-  PMIC_Greater_Equal,	  // >=		3
-  PMIC_Smaller_Equal,	  // <=		4
-  PMIC_Any				  // don't care 5
-} PMIC_Condition_list;
-
-typedef enum {
-  PMIC_White_List	= 0,  //White list
-  PMIC_Black_List	= 1   //Black list
-} PMIC_Compliance_mode;
-
-typedef struct {
-  UINT8		Cond_Choice;	// PMIC_Condition_list
-  UINT8		Cond_Number;		// the number
-}PMIC_Condition_Item;
-
-typedef struct {
-  PMIC_Condition_Item   					PMIC_BoardID;
-  PMIC_Condition_Item   					PMIC_FabID;
-  PMIC_Condition_Item   					Soc_Stepping;//define PMIC type, 1:Dialog , 2:Rohm
-  PMIC_Condition_Item   					PMIC_VendID;
-  PMIC_Condition_Item   					PMIC_RevID;
-  PMIC_Compliance_mode 				        mode;        //if 1, blacklist; if 0, white list.
-} PMIC_Compliance_Item;
-
-//
-// Platform BDS Functions
-//
-VOID
-PlatformBdsGetDriverOption (
-  IN LIST_ENTRY                   *BdsDriverLists
-  );
-
-VOID
-PlatformBdsPredictBootOption (
-  IN  LIST_ENTRY                     *BdsBootOptionList
-  );
-
-EFI_STATUS
-PlatformBdsShowProgress (
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground,
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground,
-  CHAR16                        *Title,
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor,
-  UINTN                         Progress,
-  UINTN                         PreviousValue
-  );
-
-VOID
-PlatformBdsConnectSequence (
-  VOID
-  );
-
-EFI_STATUS
-PlatformBdsConnectConsole (
-  IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
-  );
-
-EFI_STATUS
-PlatformBdsNoConsoleAction (
-  VOID
-  );
-
-VOID
-PlatformBdsEnterFrontPage (
-  IN UINT16                 TimeoutDefault,
-  IN BOOLEAN                ConnectAllHappened
-  );
-
-VOID
-EFIAPI
-PlatformBdsUserIdentify (
-  OUT EFI_USER_PROFILE_HANDLE        *User,
-  OUT BOOLEAN                        *DeferredImage
-  );
-
-VOID
-EFIAPI
-PlatformBdsConnectAuthDevice (
-  VOID
-  );
-
-VOID
-PlatformBdsEnterFrontPageWithHotKey (
-  IN UINT16                       TimeoutDefault,
-  IN BOOLEAN                      ConnectAllHappened
-  );
-
- EFI_STATUS
- ShowProgress (
-   IN UINT16					   TimeoutDefault
-   );
-
- EFI_STATUS
- InitializeFrontPage (
-   IN BOOLEAN						  InitializeHiiData
-   );
-
- VOID
- UpdateFrontPageStrings (
-   VOID
-   );
-   
-   
- EFI_STATUS
- InitBMPackage  (
-   VOID
-   );
-   
-      
- VOID
- FreeBMPackage  (
-   VOID
-   );
-   
-   
- EFI_STATUS
- CallFrontPage (
-   VOID
-   );
-
-
- VOID
- CallBootManager (
-   VOID
-   );
-
-VOID
-CallDeviceManager (
-  VOID
-  );
-
-VOID
-BdsStartBootMaint (
-  VOID
-  );
-
-CHAR16 *
-GetStringById (
-  IN  EFI_STRING_ID   Id
-  );
-
-EFI_STATUS
-WaitForSingleEvent (
-  IN EFI_EVENT                  Event,
-  IN UINT64                     Timeout OPTIONAL
-  );
-
-EFI_STATUS
-BdsLibDeleteOptionFromHandle (
-  IN  EFI_HANDLE                 Handle
-  );
-
-EFI_STATUS
-BdsDeleteAllInvalidEfiBootOption (
-  VOID
-  );
-
-
-#define ONE_SECOND  10000000
-#define FRONT_PAGE_KEY_CONTINUE        0x1000
-#define FRONT_PAGE_KEY_LANGUAGE        0x1234
-#define FRONT_PAGE_KEY_BOOT_MANAGER    0x1064
-#define FRONT_PAGE_KEY_DEVICE_MANAGER  0x8567
-#define FRONT_PAGE_KEY_BOOT_MAINTAIN   0x9876
-
-#define PORT_A_DVO                     0           // ; DVO A
-#define PORT_B_DVO                     1           // ; DVO B
-#define PORT_C_DVO                     2           // ; DVO C
-#define PORT_D_DVO                     3           // ; DVO D
-#define PORT_LVDS                      4           // ; Integrated LVDS port
-#define PORT_ANALOG_TV                 5           // ; Integrated TV port
-#define PORT_CRT                       6           // ; integrated Analog port
-#define PORT_B_DP                      7           // ; DisplayPort B
-#define PORT_C_DP                      8           // ; DisplayPort C
-#define PORT_D_DP                      9           // ; DisplayPort D
-#define PORT_A_DP                      10          // ; DisplayPort A (for eDP on ILK)
-#define PORT_B_HDMI                    11          // ; HDMI B
-#define PORT_C_HDMI                    12          // ; HDMI C
-#define PORT_D_HDMI                    13          // ; HDMI D
-#define PORT_B_DVI                     14          // ; DVI B
-#define PORT_C_DVI                     15          // ; DVI C
-#define PORT_D_DVI                     16          // ; DVI D
-#define PORT_MIPI_A                    21          // ; MIPI
-#define PORT_MIPI_B                    22
-#define PORT_MIPI_C                    23
-
-
-extern BOOLEAN gConnectAllHappened;
-extern UINTN gCallbackKey;
-
-VOID
-BdsBootDeviceSelect (
-  VOID
-);
-VOID FastBoot(VOID);
-
-extern BOOLEAN    mModeInitialized;
-
-//
-// Boot video resolution and text mode.
-//
-extern UINT32     mBootHorizontalResolution    ;
-extern UINT32     mBootVerticalResolution      ;
-extern UINT32     mBootTextModeColumn          ;
-extern UINT32     mBootTextModeRow             ;
-
-//
-// BIOS setup video resolution and text mode.
-//
-extern UINT32     mSetupTextModeColumn         ;
-extern UINT32     mSetupTextModeRow            ;
-extern UINT32     mSetupHorizontalResolution   ;
-extern UINT32     mSetupVerticalResolution     ;
-extern EFI_STATUS BdsSetConsoleMode (BOOLEAN);
-#endif // _BDS_PLATFORM_H
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
deleted file mode 100644
index 66d11c6cda..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
+++ /dev/null
@@ -1,128 +0,0 @@
-#/** @file
-# Component name for module PlatformBootManagerLib
-#
-# Copyright (c) 2008  - 2019, Intel Corporation. All rights reserved.<BR>
-#
-
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#
-
-#
-#
-#
-#**/
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = PlatformBdsLib
-  FILE_GUID                      = A6BC385D-59E5-4b77-87D7-200ABAA83C15
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = PlatformBootManagerLib|DXE_DRIVER
-  EDK_RELEASE_VERSION            = 0x00020000
-  EFI_SPECIFICATION_VERSION      = 0x0002000A
-
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  BdsPlatform.c
-  BdsPlatform.h
-  PlatformData.c
-  PlatformBdsStrings.uni
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  ShellPkg/ShellPkg.dec
-  CryptoPkg/CryptoPkg.dec
-  SecurityPkg/SecurityPkg.dec
-  SignedCapsulePkg/SignedCapsulePkg.dec
-  SourceLevelDebugPkg/SourceLevelDebugPkg.dec
-  NetworkPkg/NetworkPkg.dec
-
-[LibraryClasses]
-  DxeServicesTableLib
-  BaseLib
-  MemoryAllocationLib
-  UefiBootServicesTableLib
-  UefiRuntimeServicesTableLib
-  BaseMemoryLib
-  DebugLib
-  PcdLib
-  GenericBdsLib
-  DevicePathLib
-  NetLib
-  UefiLib
-  HobLib
-  PciLib
-  PrintLib
-  BaseCryptLib
-#  TcgPhysicalPresenceLib
-  Tcg2PhysicalPresenceLib  
-  FileHandleLib
-  S3BootScriptLib
-  SerialPortLib
-  CapsuleLib
-
-[Protocols]
-  gEfiFirmwareVolume2ProtocolGuid
-  gEfiSimpleNetworkProtocolGuid
-  gEfiLoadFileProtocolGuid
-  gEfiPciIoProtocolGuid
-  gEfiSmmAccess2ProtocolGuid
-  gEfiDxeSmmReadyToLockProtocolGuid
-  gEfiUserManagerProtocolGuid
-  gEfiDeferredImageLoadProtocolGuid
-  gEfiAcpiS3SaveProtocolGuid
-  gEfiSpiProtocolGuid                           ## PROTOCOL CONSUMES
-  gExitPmAuthProtocolGuid
-  gEfiTdtOperationProtocolGuid
-  gEfiGlobalNvsAreaProtocolGuid
-  gEfiMmioDeviceProtocolGuid
-  gEfiI2cMasterProtocolGuid
-  gEfiI2cHostProtocolGuid
-  gEsrtManagementProtocolGuid
-
-[Guids]
-  gEfiMemoryTypeInformationGuid
-  gEfiCapsuleVendorGuid
-  gEfiGlobalVariableGuid
-  gEfiNormalSetupGuid
-  gEfiPartTypeSystemPartGuid
-  gEfiEndOfDxeEventGroupGuid
-  gUefiShellFileGuid
-
-[Pcd]
-  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiRsa2048Sha256TestPublicKeyFileGuid
-  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiPkcs7TestPublicKeyFileGuid
-  gEfiSecurityPkgTokenSpaceGuid.PcdRsa2048Sha256PublicKeyBuffer
-  gEfiSecurityPkgTokenSpaceGuid.PcdPkcs7CertBuffer
-  gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed
-  gPlatformModuleTokenSpaceGuid.PcdFlashFvRecovery2Base
-  gPlatformModuleTokenSpaceGuid.PcdFlashFvMainBase
-  gPlatformModuleTokenSpaceGuid.PcdFlashFvRecoveryBase
-  gPlatformModuleTokenSpaceGuid.PcdFlashFvShellBase
-  gPlatformModuleTokenSpaceGuid.PcdFlashFvShellSize
-  gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile
-  gPlatformModuleTokenSpaceGuid.PcdIFWISigBaseAddress
-  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow
-  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn
-  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution
-  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution
-  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootState
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsStrings.uni b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsStrings.uni
deleted file mode 100644
index 101106f9f4..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsStrings.uni
+++ /dev/null
@@ -1,30 +0,0 @@
-///** @file
-//  
-//  String definitions for Boot Option description.
-//  
-//  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
-//  SPDX-License-Identifier: BSD-2-Clause-Patent
-//  
-//**/
-
-/=#
-
-#langdef   en-US "English"
-#langdef   fr-FR "Français"
-
-#string STR_DESCRIPTION_FLOPPY         #language en-US  "EFI Floppy"
-                                       #language fr-FR  "fr-FR: EFI Floppy"
-#string STR_DESCRIPTION_CD_DVD         #language en-US  "EFI DVD/CDROM"
-                                       #language fr-FR  "fr-FR: EFI DVD/CDROM"
-#string STR_DESCRIPTION_HARDDRIVE      #language en-US  "EFI Hard Drive"
-                                       #language fr-FR  "fr-FR: EFI Hard Drive"
-#string STR_DESCRIPTION_USB            #language en-US  "EFI USB Device"
-                                       #language fr-FR  "fr-FR: EFI USB Device"
-#string STR_DESCRIPTION_SCSI           #language en-US  "EFI SCSI Device"
-                                       #language fr-FR  "fr-FR: EFI SCSI Device"
-#string STR_DESCRIPTION_MISC           #language en-US  "EFI Misc Device"
-                                       #language fr-FR  "fr-FR: EFI Misc Device"
-#string STR_DESCRIPTION_NETWORK        #language en-US  "EFI Network"
-                                       #language fr-FR  "fr-FR: EFI Network"
-#string STR_DESCRIPTION_NON_BLOCK      #language en-US  "EFI Non-Block Boot Device"
-                                       #language fr-FR  "fr-FR: EFI Non-Block Boot Device"
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformData.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformData.c
deleted file mode 100644
index 9dff93f52b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformData.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-  PlatformData.c
-
-Abstract:
-
-  Defined the platform specific device path which will be used by
-  platform Bbd to perform the platform policy connect.
-
---*/
-
-#include "BdsPlatform.h"
-
-//
-// Predefined platform default time out value
-//
-UINT16  gPlatformBootTimeOutDefault = 10;
-
-//
-// Predefined platform root bridge
-//
-PLATFORM_ROOT_BRIDGE_DEVICE_PATH gPlatformRootBridge0 = {
-  gPciRootBridge,
-  gEndEntire
-};
-
-EFI_DEVICE_PATH_PROTOCOL* gPlatformRootBridges [] = {
-  (EFI_DEVICE_PATH_PROTOCOL*)&gPlatformRootBridge0,
-  NULL
-};
-
-//
-// Platform specific ISA keyboard device path
-//
-PLATFORM_ISA_KEYBOARD_DEVICE_PATH gIsaKeyboardDevicePath = {
-  gPciRootBridge,
-  gPciIsaBridge,
-  gPnpPs2Keyboard,
-  gEndEntire
-};
-
-//
-// Platform specific on chip PCI VGA device path
-//
-PLATFORM_ONBOARD_VGA_DEVICE_PATH gOnChipPciVgaDevicePath = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(0, 0x2),
-  gEndEntire
-};
-
-//
-// Platform specific plug in PCI VGA device path
-//
-PLATFORM_OFFBOARD_VGA_DEVICE_PATH gPlugInPciVgaDevicePath = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(0, 0x1),
-  PCI_DEVICE_PATH_NODE(0, 0x0),
-  gEndEntire
-};
-
-//
-// Platform specific ISA serial device path
-//
-PLATFORM_ISA_SERIAL_DEVICE_PATH gIsaSerialDevicePath = {
-  gPciRootBridge,
-  gPciIsaBridge,
-  gPnp16550ComPort,
-  gUart(115200, 8, 1, 1),
-  gPcAnsiTerminal,
-  gEndEntire
-};
-
-
-//
-// Platform specific Button Array device path
-//
-HII_VENDOR_DEVICE_PATH  gHiiVendorDevicePath0 = {
-  {
-    {
-      HARDWARE_DEVICE_PATH,
-      HW_VENDOR_DP,
-      {
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
-        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
-      }
-    },
-
-    //
-    // {C8752FDE-B5C8-4528-897D-6920FE771E38}
-    //
-    { 0xC8752FDE, 0xB5C8, 0x4528, { 0x89, 0x7D, 0x69, 0x20, 0xFE, 0x77, 0x1E, 0x38 } }
-  },
-  {
-    END_DEVICE_PATH_TYPE,
-    END_ENTIRE_DEVICE_PATH_SUBTYPE,
-    {
-      (UINT8) (END_DEVICE_PATH_LENGTH),
-      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
-    }
-  }
-};
-
-USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboardDevicePath = {
-  gUsbKeyboardMouse,
-  gEndEntire
-};
-
-//
-// Debug Agent UART Console device path 
-//
-VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
-  {
-    {
-      HARDWARE_DEVICE_PATH,
-      HW_VENDOR_DP,
-      {
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
-        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
-      }
-    },
-    EFI_DEBUG_AGENT_GUID,
-  },
-  {
-    {
-      MESSAGING_DEVICE_PATH,
-      MSG_UART_DP,
-      {
-        (UINT8) (sizeof (UART_DEVICE_PATH)),
-        (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)
-      }
-    },
-    0,  // Reserved
-    0,  // BaudRate - Default
-    0,  // DataBits - Default
-    0,  // Parity   - Default
-    0,  // StopBits - Default
-  },
-  {
-    {
-      MESSAGING_DEVICE_PATH,
-      MSG_VENDOR_DP,
-      {
-        (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
-        (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
-      }
-    },
-    DEVICE_PATH_MESSAGING_PC_ANSI
-  },
-  gEndEntire
-};
-
-//
-// Predefined platform default console device path
-//
-BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole [] = {
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gIsaSerialDevicePath, CONSOLE_ALL},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gHiiVendorDevicePath0, CONSOLE_IN},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gIsaKeyboardDevicePath, CONSOLE_IN},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gDebugAgentUartDevicePath, CONSOLE_ALL},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gUsbClassKeyboardDevicePath, CONSOLE_IN},
-  {NULL, 0}
-};
-
-//
-// All the possible platform PCI VGA device path
-//
-EFI_DEVICE_PATH_PROTOCOL* gPlatformAllPossiblePciVgaConsole [] = {
-  (EFI_DEVICE_PATH_PROTOCOL*)&gOnChipPciVgaDevicePath,
-  (EFI_DEVICE_PATH_PROTOCOL*)&gPlugInPciVgaDevicePath,
-  NULL
-};
-
-//
-// Legacy hard disk boot option
-//
-LEGACY_HD_DEVICE_PATH gLegacyHd = {
-  {
-    BBS_DEVICE_PATH,
-    BBS_BBS_DP,
-    (UINT8)(sizeof(BBS_BBS_DEVICE_PATH)),
-    (UINT8)((sizeof(BBS_BBS_DEVICE_PATH)) >> 8),
-    BBS_TYPE_HARDDRIVE,
-    0,
-    0
-  },
-  gEndEntire
-};
-
-//
-// Legacy cdrom boot option
-//
-LEGACY_HD_DEVICE_PATH gLegacyCdrom = {
-  {
-    BBS_DEVICE_PATH,
-    BBS_BBS_DP,
-    (UINT8)(sizeof(BBS_BBS_DEVICE_PATH)),
-    (UINT8)((sizeof(BBS_BBS_DEVICE_PATH)) >> 8),
-    BBS_TYPE_CDROM,
-    0,
-    0
-  },
-  gEndEntire
-};
-
-//
-// Predefined platform specific perdict boot option
-//
-EFI_DEVICE_PATH_PROTOCOL* gPlatformBootOption [] = {
-  (EFI_DEVICE_PATH_PROTOCOL*)&gLegacyHd,
-  (EFI_DEVICE_PATH_PROTOCOL*)&gLegacyCdrom,
-  NULL
-};
-
-//
-// Predefined platform specific driver option
-//
-EFI_DEVICE_PATH_PROTOCOL* gPlatformDriverOption [] = {
-  NULL
-};
-
-//
-// Predefined platform connect sequence
-//
-EFI_DEVICE_PATH_PROTOCOL* gPlatformConnectSequence [] = {
-  (EFI_DEVICE_PATH_PROTOCOL *)&gPlatformRootBridge0,  // Force PCI enumer before Legacy OpROM shadow
-  NULL
-};
-
-//
-// Platform specific USB controller device path
-//
-PLATFORM_USB_DEVICE_PATH gUsbDevicePath0 = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(0, 0x1D),
-  gEndEntire
-};
-
-PLATFORM_USB_DEVICE_PATH gUsbDevicePath1 = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(1, 0x1D),
-  gEndEntire
-};
-
-PLATFORM_USB_DEVICE_PATH gUsbDevicePath2 = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(2, 0x1D),
-  gEndEntire
-};
-
-PLATFORM_USB_DEVICE_PATH gUsbDevicePath3 = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(3, 0x1D),
-  gEndEntire
-};
-
-//
-// Predefined platform device path for user authtication
-//
-EFI_DEVICE_PATH_PROTOCOL* gUserAuthenticationDevice[] = {
-  //
-  // Predefined device path for secure card (USB disk).
-  //
-  (EFI_DEVICE_PATH_PROTOCOL*)&gUsbDevicePath0,
-  (EFI_DEVICE_PATH_PROTOCOL*)&gUsbDevicePath1,
-  (EFI_DEVICE_PATH_PROTOCOL*)&gUsbDevicePath2,
-  (EFI_DEVICE_PATH_PROTOCOL*)&gUsbDevicePath3,
-  NULL
-};
-
-//
-// Predefined platform console device path
-//
-BDS_CONSOLE_CONNECT_ENTRY gPlatformSimpleConsole [] = {
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gOnChipPciVgaDevicePath, CONSOLE_OUT},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gIsaSerialDevicePath, CONSOLE_ALL},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gHiiVendorDevicePath0, CONSOLE_IN},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gDebugAgentUartDevicePath, CONSOLE_ALL},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gUsbClassKeyboardDevicePath, CONSOLE_IN},
-  {NULL, 0}
-};
-
-//
-// eMMC device at BDF(0x0, 0x17, 0x0)
-//
-PLATFORM_PCI_DEVICE_PATH gEmmcBootDevPath0 = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE (0x00, 0x10),
-  gEndEntire
-};
-
-//
-// Predefined platform specific perdict boot option
-//
-EFI_DEVICE_PATH_PROTOCOL* gPlatformSimpleBootOption [] = {
-  (EFI_DEVICE_PATH_PROTOCOL*)&gEmmcBootDevPath0,
-  NULL
-};
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
deleted file mode 100644
index 3034853695..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
+++ /dev/null
@@ -1,4490 +0,0 @@
-/** @file
-  BDS Lib functions which relate with create or process the boot option.
-
-Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "InternalBdsLib.h"
-#include "String.h"
-#include <Library/NetLib.h>
-#include "Library/DebugLib.h"
-
-BOOLEAN mEnumBootDevice = FALSE;
-EFI_HII_HANDLE gBdsLibStringPackHandle = NULL;
-
-/**
-
-  End Perf entry of BDS
-
-  @param  Event                 The triggered event.
-  @param  Context               Context for this event.
-
-**/
-VOID
-EFIAPI
-BmEndOfBdsPerfCode (
-  IN EFI_EVENT  Event,
-  IN VOID       *Context
-  )
-{
-  //
-  // Record the performance data for End of BDS
-  //
-  PERF_END(NULL, "BDS", NULL, 0);
-
-  return ;
-}
-
-/**
-  The constructor function register UNI strings into imageHandle.
-  
-  It will ASSERT() if that operation fails and it will always return EFI_SUCCESS. 
-
-  @param  ImageHandle   The firmware allocated handle for the EFI image.
-  @param  SystemTable   A pointer to the EFI System Table.
-  
-  @retval EFI_SUCCESS   The constructor successfully added string package.
-  @retval Other value   The constructor can't add string package.
-
-**/
-EFI_STATUS
-EFIAPI
-GenericBdsLibConstructor (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-
-  gBdsLibStringPackHandle = HiiAddPackages (
-                              &gBdsLibStringPackageGuid,
-                              ImageHandle,
-                              GenericBdsLibStrings,
-                              NULL
-                              );
-
-  ASSERT (gBdsLibStringPackHandle != NULL);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Deletete the Boot Option from EFI Variable. The Boot Order Arrray
-  is also updated.
-
-  @param OptionNumber    The number of Boot option want to be deleted.
-  @param BootOrder       The Boot Order array.
-  @param BootOrderSize   The size of the Boot Order Array.
-
-  @retval  EFI_SUCCESS           The Boot Option Variable was found and removed
-  @retval  EFI_UNSUPPORTED       The Boot Option Variable store was inaccessible
-  @retval  EFI_NOT_FOUND         The Boot Option Variable was not found
-**/
-EFI_STATUS
-EFIAPI
-BdsDeleteBootOption (
-  IN UINTN                       OptionNumber,
-  IN OUT UINT16                  *BootOrder,
-  IN OUT UINTN                   *BootOrderSize
-  )
-{
-  CHAR16      BootOption[9];
-  UINTN       Index;
-  EFI_STATUS  Status;
-
-  UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", OptionNumber);
-  Status = gRT->SetVariable (
-                  BootOption,
-                  &gEfiGlobalVariableGuid,
-                  0,
-                  0,
-                  NULL
-                  );
-  //
-  // Deleting variable with existing variable implementation shouldn't fail.
-  //
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // adjust boot order array
-  //
-  for (Index = 0; Index < *BootOrderSize / sizeof (UINT16); Index++) {
-    if (BootOrder[Index] == OptionNumber) {
-      CopyMem (&BootOrder[Index], &BootOrder[Index+1], *BootOrderSize - (Index+1) * sizeof (UINT16));
-      *BootOrderSize -= sizeof (UINT16);
-      break;
-    }
-  }
-
-  return Status;
-}
-/**
-
-  Translate the first n characters of an Ascii string to
-  Unicode characters. The count n is indicated by parameter
-  Size. If Size is greater than the length of string, then
-  the entire string is translated.
-
-
-  @param AStr               Pointer to input Ascii string.
-  @param Size               The number of characters to translate.
-  @param UStr               Pointer to output Unicode string buffer.
-
-**/
-VOID
-AsciiToUnicodeSize (
-  IN UINT8              *AStr,
-  IN UINTN              Size,
-  OUT UINT16            *UStr
-  )
-{
-  UINTN Idx;
-
-  Idx = 0;
-  while (AStr[Idx] != 0) {
-    UStr[Idx] = (CHAR16) AStr[Idx];
-    if (Idx == Size) {
-      break;
-    }
-
-    Idx++;
-  }
-  UStr[Idx] = 0;
-}
-
-/**
-  Build Legacy Device Name String according.
-
-  @param CurBBSEntry     BBS Table.
-  @param Index           Index.
-  @param BufSize         The buffer size.
-  @param BootString      The output string.
-
-**/
-VOID
-BdsBuildLegacyDevNameString (
-  IN  BBS_TABLE                 *CurBBSEntry,
-  IN  UINTN                     Index,
-  IN  UINTN                     BufSize,
-  OUT CHAR16                    *BootString
-  )
-{
-  CHAR16  *Fmt;
-  CHAR16  *Type;
-  UINT8   *StringDesc;
-  CHAR16  Temp[80];
-
-  switch (Index) {
-  //
-  // Primary Master
-  //
-  case 1:
-    Fmt = L"Primary Master %s";
-    break;
-
- //
- // Primary Slave
- //
-  case 2:
-    Fmt = L"Primary Slave %s";
-    break;
-
-  //
-  // Secondary Master
-  //
-  case 3:
-    Fmt = L"Secondary Master %s";
-    break;
-
-  //
-  // Secondary Slave
-  //
-  case 4:
-    Fmt = L"Secondary Slave %s";
-    break;
-
-  default:
-    Fmt = L"%s";
-    break;
-  }
-
-  switch (CurBBSEntry->DeviceType) {
-  case BBS_FLOPPY:
-    Type = L"Floppy";
-    break;
-
-  case BBS_HARDDISK:
-    Type = L"Harddisk";
-    break;
-
-  case BBS_CDROM:
-    Type = L"CDROM";
-    break;
-
-  case BBS_PCMCIA:
-    Type = L"PCMCIAe";
-    break;
-
-  case BBS_USB:
-    Type = L"USB";
-    break;
-
-  case BBS_EMBED_NETWORK:
-    Type = L"Network";
-    break;
-
-  case BBS_BEV_DEVICE:
-    Type = L"BEVe";
-    break;
-
-  case BBS_UNKNOWN:
-  default:
-    Type = L"Unknown";
-    break;
-  }
-  //
-  // If current BBS entry has its description then use it.
-  //
-  StringDesc = (UINT8 *) (UINTN) ((CurBBSEntry->DescStringSegment << 4) + CurBBSEntry->DescStringOffset);
-  if (NULL != StringDesc) {
-    //
-    // Only get fisrt 32 characters, this is suggested by BBS spec
-    //
-    AsciiToUnicodeSize (StringDesc, 32, Temp);
-    Fmt   = L"%s";
-    Type  = Temp;
-  }
-
-  //
-  // BbsTable 16 entries are for onboard IDE.
-  // Set description string for SATA harddisks, Harddisk 0 ~ Harddisk 11
-  //
-  if (Index >= 5 && Index <= 16 && (CurBBSEntry->DeviceType == BBS_HARDDISK || CurBBSEntry->DeviceType == BBS_CDROM)) {
-    Fmt = L"%s %d";
-    UnicodeSPrint (BootString, BufSize, Fmt, Type, Index - 5);
-  } else {
-    UnicodeSPrint (BootString, BufSize, Fmt, Type);
-  }
-}
-
-/**
-
-  Create a legacy boot option for the specified entry of
-  BBS table, save it as variable, and append it to the boot
-  order list.
-
-
-  @param CurrentBbsEntry    Pointer to current BBS table.
-  @param CurrentBbsDevPath  Pointer to the Device Path Protocol instance of BBS
-  @param Index              Index of the specified entry in BBS table.
-  @param BootOrderList      On input, the original boot order list.
-                            On output, the new boot order list attached with the
-                            created node.
-  @param BootOrderListSize  On input, the original size of boot order list.
-                            On output, the size of new boot order list.
-
-  @retval  EFI_SUCCESS             Boot Option successfully created.
-  @retval  EFI_OUT_OF_RESOURCES    Fail to allocate necessary memory.
-  @retval  Other                   Error occurs while setting variable.
-
-**/
-EFI_STATUS
-BdsCreateLegacyBootOption (
-  IN BBS_TABLE                        *CurrentBbsEntry,
-  IN EFI_DEVICE_PATH_PROTOCOL         *CurrentBbsDevPath,
-  IN UINTN                            Index,
-  IN OUT UINT16                       **BootOrderList,
-  IN OUT UINTN                        *BootOrderListSize
-  )
-{
-  EFI_STATUS           Status;
-  UINT16               CurrentBootOptionNo;
-  UINT16               BootString[10];
-  CHAR16               BootDesc[100];
-  CHAR8                HelpString[100];
-  UINT16               *NewBootOrderList;
-  UINTN                BufferSize;
-  UINTN                StringLen;
-  VOID                 *Buffer;
-  UINT8                *Ptr;
-  UINT16               CurrentBbsDevPathSize;
-  UINTN                BootOrderIndex;
-  UINTN                BootOrderLastIndex;
-  UINTN                ArrayIndex;
-  BOOLEAN              IndexNotFound;
-  BBS_BBS_DEVICE_PATH  *NewBbsDevPathNode;
-
-  if ((*BootOrderList) == NULL) {
-    CurrentBootOptionNo = 0;
-  } else {
-    for (ArrayIndex = 0; ArrayIndex < (UINTN) (*BootOrderListSize / sizeof (UINT16)); ArrayIndex++) {
-      IndexNotFound = TRUE;
-      for (BootOrderIndex = 0; BootOrderIndex < (UINTN) (*BootOrderListSize / sizeof (UINT16)); BootOrderIndex++) {
-        if ((*BootOrderList)[BootOrderIndex] == ArrayIndex) {
-          IndexNotFound = FALSE;
-          break;
-        }
-      }
-
-      if (!IndexNotFound) {
-        continue;
-      } else {
-        break;
-      }
-    }
-
-    CurrentBootOptionNo = (UINT16) ArrayIndex;
-  }
-
-  UnicodeSPrint (
-    BootString,
-    sizeof (BootString),
-    L"Boot%04x",
-    CurrentBootOptionNo
-    );
-
-  BdsBuildLegacyDevNameString (CurrentBbsEntry, Index, sizeof (BootDesc), BootDesc);
-
-  //
-  // Create new BBS device path node with description string
-  //
-  UnicodeStrToAsciiStr (BootDesc, HelpString);
-
-  StringLen = AsciiStrLen (HelpString);
-  NewBbsDevPathNode = AllocateZeroPool (sizeof (BBS_BBS_DEVICE_PATH) + StringLen);
-  if (NewBbsDevPathNode == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  CopyMem (NewBbsDevPathNode, CurrentBbsDevPath, sizeof (BBS_BBS_DEVICE_PATH));
-  CopyMem (NewBbsDevPathNode->String, HelpString, StringLen + 1);
-  SetDevicePathNodeLength (&(NewBbsDevPathNode->Header), sizeof (BBS_BBS_DEVICE_PATH) + StringLen);
-
-  //
-  // Create entire new CurrentBbsDevPath with end node
-  //
-  CurrentBbsDevPath = AppendDevicePathNode (
-                        NULL,
-                        (EFI_DEVICE_PATH_PROTOCOL *) NewBbsDevPathNode
-                        );
-   if (CurrentBbsDevPath == NULL) {
-    FreePool (NewBbsDevPathNode);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  CurrentBbsDevPathSize = (UINT16) (GetDevicePathSize (CurrentBbsDevPath));
-
-  BufferSize = sizeof (UINT32) +
-    sizeof (UINT16) +
-    StrSize (BootDesc) +
-    CurrentBbsDevPathSize +
-    sizeof (BBS_TABLE) +
-    sizeof (UINT16);
-
-  Buffer = AllocateZeroPool (BufferSize);
-  if (Buffer == NULL) {
-    FreePool (NewBbsDevPathNode);
-    FreePool (CurrentBbsDevPath);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Ptr               = (UINT8 *) Buffer;
-
-  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;
-  Ptr += sizeof (UINT32);
-
-  *((UINT16 *) Ptr) = CurrentBbsDevPathSize;
-  Ptr += sizeof (UINT16);
-
-  CopyMem (
-    Ptr,
-    BootDesc,
-    StrSize (BootDesc)
-    );
-  Ptr += StrSize (BootDesc);
-
-  CopyMem (
-    Ptr,
-    CurrentBbsDevPath,
-    CurrentBbsDevPathSize
-    );
-  Ptr += CurrentBbsDevPathSize;
-
-  CopyMem (
-    Ptr,
-    CurrentBbsEntry,
-    sizeof (BBS_TABLE)
-    );
-
-  Ptr += sizeof (BBS_TABLE);
-  *((UINT16 *) Ptr) = (UINT16) Index;
-
-  Status = gRT->SetVariable (
-                  BootString,
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  BufferSize,
-                  Buffer
-                  );
-
-  FreePool (Buffer);
-  
-  Buffer = NULL;
-
-  NewBootOrderList = AllocateZeroPool (*BootOrderListSize + sizeof (UINT16));
-  if (NULL == NewBootOrderList) {
-    FreePool (NewBbsDevPathNode);
-    FreePool (CurrentBbsDevPath);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  if (*BootOrderList != NULL) {
-    CopyMem (NewBootOrderList, *BootOrderList, *BootOrderListSize);
-    FreePool (*BootOrderList);
-  }
-
-  BootOrderLastIndex                    = (UINTN) (*BootOrderListSize / sizeof (UINT16));
-  NewBootOrderList[BootOrderLastIndex]  = CurrentBootOptionNo;
-  *BootOrderListSize += sizeof (UINT16);
-  *BootOrderList = NewBootOrderList;
-
-  FreePool (NewBbsDevPathNode);
-  FreePool (CurrentBbsDevPath);
-  return Status;
-}
-
-/**
-  Check if the boot option is a legacy one.
-
-  @param BootOptionVar   The boot option data payload.
-  @param BbsEntry        The BBS Table.
-  @param BbsIndex        The table index.
-
-  @retval TRUE           It is a legacy boot option.
-  @retval FALSE          It is not a legacy boot option.
-
-**/
-BOOLEAN
-BdsIsLegacyBootOption (
-  IN UINT8                 *BootOptionVar,
-  OUT BBS_TABLE            **BbsEntry,
-  OUT UINT16               *BbsIndex
-  )
-{
-  UINT8                     *Ptr;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  BOOLEAN                   Ret;
-  UINT16                    DevPathLen;
-
-  Ptr = BootOptionVar;
-  Ptr += sizeof (UINT32);
-  DevPathLen = *(UINT16 *) Ptr;
-  Ptr += sizeof (UINT16);
-  Ptr += StrSize ((UINT16 *) Ptr);
-  DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
-  if ((BBS_DEVICE_PATH == DevicePath->Type) && (BBS_BBS_DP == DevicePath->SubType)) {
-    Ptr += DevPathLen;
-    *BbsEntry = (BBS_TABLE *) Ptr;
-    Ptr += sizeof (BBS_TABLE);
-    *BbsIndex = *(UINT16 *) Ptr;
-    Ret       = TRUE;
-  } else {
-    *BbsEntry = NULL;
-    Ret       = FALSE;
-  }
-
-  return Ret;
-}
-
-/**
-  Delete all the invalid legacy boot options.
-
-  @retval EFI_SUCCESS             All invalide legacy boot options are deleted.
-  @retval EFI_OUT_OF_RESOURCES    Fail to allocate necessary memory.
-  @retval EFI_NOT_FOUND           Fail to retrive variable of boot order.
-**/
-EFI_STATUS
-EFIAPI
-BdsDeleteAllInvalidLegacyBootOptions (
-  VOID
-  )
-{
-  UINT16                    *BootOrder;
-  UINT8                     *BootOptionVar;
-  UINTN                     BootOrderSize;
-  UINTN                     BootOptionSize;
-  EFI_STATUS                Status;
-  UINT16                    HddCount;
-  UINT16                    BbsCount;
-  HDD_INFO                  *LocalHddInfo;
-  BBS_TABLE                 *LocalBbsTable;
-  BBS_TABLE                 *BbsEntry;
-  UINT16                    BbsIndex;
-  EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
-  UINTN                     Index;
-  UINT16                    BootOption[10];
-  UINT16                    BootDesc[100];
-  BOOLEAN                   DescStringMatch;
-
-  Status        = EFI_SUCCESS;
-  BootOrder     = NULL;
-  BootOrderSize = 0;
-  HddCount      = 0;
-  BbsCount      = 0;
-  LocalHddInfo  = NULL;
-  LocalBbsTable = NULL;
-  BbsEntry      = NULL;
-
-  Status        = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  BootOrder = BdsLibGetVariableAndSize (
-                L"BootOrder",
-                &gEfiGlobalVariableGuid,
-                &BootOrderSize
-                );
-  if (BootOrder == NULL) {
-    return EFI_NOT_FOUND;
-  }
-
-  LegacyBios->GetBbsInfo (
-                LegacyBios,
-                &HddCount,
-                &LocalHddInfo,
-                &BbsCount,
-                &LocalBbsTable
-                );
-
-  Index = 0;
-  while (Index < BootOrderSize / sizeof (UINT16)) {
-    UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);
-    BootOptionVar = BdsLibGetVariableAndSize (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      &BootOptionSize
-                      );
-    if (NULL == BootOptionVar) {
-      BootOptionSize = 0;
-      Status = gRT->GetVariable (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      NULL,
-                      &BootOptionSize,
-                      BootOptionVar
-                      );
-      if (Status == EFI_NOT_FOUND) {
-        //
-        // Update BootOrder
-        //
-        BdsDeleteBootOption (
-          BootOrder[Index],
-          BootOrder,
-          &BootOrderSize
-          );
-        continue;
-      } else {
-        FreePool (BootOrder);
-        return EFI_OUT_OF_RESOURCES;
-      }
-    }
-  
-    //
-    // Skip Non-Legacy boot option
-    // 
-    if (!BdsIsLegacyBootOption (BootOptionVar, &BbsEntry, &BbsIndex)) {
-      if (BootOptionVar!= NULL) {
-        FreePool (BootOptionVar);
-      }
-      Index++;
-      continue;
-    }
-
-    if (BbsIndex < BbsCount) {
-      //
-      // Check if BBS Description String is changed
-      //
-      DescStringMatch = FALSE;
-      BdsBuildLegacyDevNameString (
-        &LocalBbsTable[BbsIndex],
-        BbsIndex,
-        sizeof (BootDesc),
-        BootDesc
-        );
-
-      if (StrCmp (BootDesc, (UINT16*)(BootOptionVar + sizeof (UINT32) + sizeof (UINT16))) == 0) {
-        DescStringMatch = TRUE;
-      }
-
-      if (!((LocalBbsTable[BbsIndex].BootPriority == BBS_IGNORE_ENTRY) ||
-            (LocalBbsTable[BbsIndex].BootPriority == BBS_DO_NOT_BOOT_FROM)) &&
-          (LocalBbsTable[BbsIndex].DeviceType == BbsEntry->DeviceType) &&
-          DescStringMatch) {
-        Index++;
-        continue;
-      }
-    }
-
-    if (BootOptionVar != NULL) {
-      FreePool (BootOptionVar);
-    }
-    //
-    // should delete
-    //
-    BdsDeleteBootOption (
-      BootOrder[Index],
-      BootOrder,
-      &BootOrderSize
-      );
-  }
-
-  //
-  // Adjust the number of boot options.
-  //
-  Status = gRT->SetVariable (
-                  L"BootOrder",
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  BootOrderSize,
-                  BootOrder
-                  );
-  //
-  // Shrinking variable with existing variable implementation shouldn't fail.
-  //
-  ASSERT_EFI_ERROR (Status);
-  FreePool (BootOrder);
-
-  return Status;
-}
-
-/**
-  Find all legacy boot option by device type.
-
-  @param BootOrder       The boot order array.
-  @param BootOptionNum   The number of boot option.
-  @param DevType         Device type.
-  @param DevName         Device name.
-  @param Attribute       The boot option attribute.
-  @param BbsIndex        The BBS table index.
-  @param OptionNumber    The boot option index.
-
-  @retval TRUE           The Legacy boot option is found.
-  @retval FALSE          The legacy boot option is not found.
-
-**/
-BOOLEAN
-BdsFindLegacyBootOptionByDevTypeAndName (
-  IN UINT16                 *BootOrder,
-  IN UINTN                  BootOptionNum,
-  IN UINT16                 DevType,
-  IN CHAR16                 *DevName,
-  OUT UINT32                *Attribute,
-  OUT UINT16                *BbsIndex,
-  OUT UINT16                *OptionNumber
-  )
-{
-  UINTN     Index;
-  CHAR16    BootOption[9];
-  UINTN     BootOptionSize;
-  UINT8     *BootOptionVar;
-  BBS_TABLE *BbsEntry;
-  BOOLEAN   Found;
-
-  BbsEntry  = NULL;
-  Found     = FALSE;
-
-  if (NULL == BootOrder) {
-    return Found;
-  }
-
-  //
-  // Loop all boot option from variable
-  //
-  for (Index = 0; Index < BootOptionNum; Index++) {
-    UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", (UINTN) BootOrder[Index]);
-    BootOptionVar = BdsLibGetVariableAndSize (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      &BootOptionSize
-                      );
-    if (NULL == BootOptionVar) {
-      continue;
-    }
-
-    //
-    // Skip Non-legacy boot option
-    //
-    if (!BdsIsLegacyBootOption (BootOptionVar, &BbsEntry, BbsIndex)) {
-      FreePool (BootOptionVar);
-      continue;
-    }
-
-    if (
-        (BbsEntry->DeviceType != DevType) ||
-        (StrCmp (DevName, (CHAR16*)(BootOptionVar + sizeof (UINT32) + sizeof (UINT16))) != 0)
-       ) {
-      FreePool (BootOptionVar);
-      continue;
-    }
-
-    *Attribute    = *(UINT32 *) BootOptionVar;
-    *OptionNumber = BootOrder[Index];
-    Found         = TRUE;
-    FreePool (BootOptionVar);
-    break;
-  }
-
-  return Found;
-}
-
-/**
-  Create a legacy boot option.
-
-  @param BbsItem         The BBS Table entry.
-  @param Index           Index of the specified entry in BBS table.
-  @param BootOrderList   The boot order list.
-  @param BootOrderListSize The size of boot order list.
-
-  @retval EFI_OUT_OF_RESOURCE  No enough memory.
-  @retval EFI_SUCCESS          The function complete successfully.
-  @return Other value if the legacy boot option is not created.
-
-**/
-EFI_STATUS
-BdsCreateOneLegacyBootOption (
-  IN BBS_TABLE              *BbsItem,
-  IN UINTN                  Index,
-  IN OUT UINT16             **BootOrderList,
-  IN OUT UINTN              *BootOrderListSize
-  )
-{
-  BBS_BBS_DEVICE_PATH       BbsDevPathNode;
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *DevPath;
-
-  DevPath                       = NULL;
-
-  //
-  // Create device path node.
-  //
-  BbsDevPathNode.Header.Type    = BBS_DEVICE_PATH;
-  BbsDevPathNode.Header.SubType = BBS_BBS_DP;
-  SetDevicePathNodeLength (&BbsDevPathNode.Header, sizeof (BBS_BBS_DEVICE_PATH));
-  BbsDevPathNode.DeviceType = BbsItem->DeviceType;
-  CopyMem (&BbsDevPathNode.StatusFlag, &BbsItem->StatusFlags, sizeof (UINT16));
-
-  DevPath = AppendDevicePathNode (
-              NULL,
-              (EFI_DEVICE_PATH_PROTOCOL *) &BbsDevPathNode
-              );
-  if (NULL == DevPath) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Status = BdsCreateLegacyBootOption (
-            BbsItem,
-            DevPath,
-            Index,
-            BootOrderList,
-            BootOrderListSize
-            );
-  BbsItem->BootPriority = 0x00;
-
-  FreePool (DevPath);
-
-  return Status;
-}
-
-/**
-  Add the legacy boot options from BBS table if they do not exist.
-
-  @retval EFI_SUCCESS          The boot options are added successfully 
-                               or they are already in boot options.
-  @retval EFI_NOT_FOUND        No legacy boot options is found.
-  @retval EFI_OUT_OF_RESOURCE  No enough memory.
-  @return Other value          LegacyBoot options are not added.
-**/
-EFI_STATUS
-EFIAPI
-BdsAddNonExistingLegacyBootOptions (
-  VOID
-  )
-{
-  UINT16                    *BootOrder;
-  UINTN                     BootOrderSize;
-  EFI_STATUS                Status;
-  CHAR16                    Desc[100];
-  UINT16                    HddCount;
-  UINT16                    BbsCount;
-  HDD_INFO                  *LocalHddInfo;
-  BBS_TABLE                 *LocalBbsTable;
-  UINT16                    BbsIndex;
-  EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
-  UINT16                    Index;
-  UINT32                    Attribute;
-  UINT16                    OptionNumber;
-  BOOLEAN                   Exist;
-
-  HddCount      = 0;
-  BbsCount      = 0;
-  LocalHddInfo  = NULL;
-  LocalBbsTable = NULL;
-
-  Status        = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  LegacyBios->GetBbsInfo (
-                LegacyBios,
-                &HddCount,
-                &LocalHddInfo,
-                &BbsCount,
-                &LocalBbsTable
-                );
-
-  BootOrder = BdsLibGetVariableAndSize (
-                L"BootOrder",
-                &gEfiGlobalVariableGuid,
-                &BootOrderSize
-                );
-  if (BootOrder == NULL) {
-    BootOrderSize = 0;
-  }
-
-  for (Index = 0; Index < BbsCount; Index++) {
-    if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||
-        (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM)
-        ) {
-      continue;
-    }
-
-    BdsBuildLegacyDevNameString (&LocalBbsTable[Index], Index, sizeof (Desc), Desc);
-
-    Exist = BdsFindLegacyBootOptionByDevTypeAndName (
-              BootOrder,
-              BootOrderSize / sizeof (UINT16),
-              LocalBbsTable[Index].DeviceType,
-              Desc,
-              &Attribute,
-              &BbsIndex,
-              &OptionNumber
-              );
-    if (!Exist) {
-      //
-      // Not found such type of legacy device in boot options or we found but it's disabled
-      // so we have to create one and put it to the tail of boot order list
-      //
-      Status = BdsCreateOneLegacyBootOption (
-                &LocalBbsTable[Index],
-                Index,
-                &BootOrder,
-                &BootOrderSize
-                );
-      if (!EFI_ERROR (Status)) {
-        ASSERT (BootOrder != NULL);
-        BbsIndex     = Index;
-        OptionNumber = BootOrder[BootOrderSize / sizeof (UINT16) - 1];
-      }
-    }
-
-    ASSERT (BbsIndex == Index);
-  }
-
-  Status = gRT->SetVariable (
-                  L"BootOrder",
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  BootOrderSize,
-                  BootOrder
-                  );
-  if (BootOrder != NULL) {
-    FreePool (BootOrder);
-  }
-
-  return Status;
-}
-
-/**
-  Fill the device order buffer.
-
-  @param BbsTable        The BBS table.
-  @param BbsType         The BBS Type.
-  @param BbsCount        The BBS Count.
-  @param Buf             device order buffer.
-
-  @return The device order buffer.
-
-**/
-UINT16 *
-BdsFillDevOrderBuf (
-  IN BBS_TABLE                    *BbsTable,
-  IN BBS_TYPE                     BbsType,
-  IN UINTN                        BbsCount,
-  OUT UINT16                      *Buf
-  )
-{
-  UINTN Index;
-
-  for (Index = 0; Index < BbsCount; Index++) {
-    if (BbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) {
-      continue;
-    }
-
-    if (BbsTable[Index].DeviceType != BbsType) {
-      continue;
-    }
-
-    *Buf = (UINT16) (Index & 0xFF);
-    Buf++;
-  }
-
-  return Buf;
-}
-
-/**
-  Create the device order buffer.
-
-  @param BbsTable        The BBS table.
-  @param BbsCount        The BBS Count.
-
-  @retval EFI_SUCCES             The buffer is created and the EFI variable named 
-                                 VAR_LEGACY_DEV_ORDER and gEfiLegacyDevOrderVariableGuid is
-                                 set correctly.
-  @retval EFI_OUT_OF_RESOURCES   Memmory or storage is not enough.
-  @retval EFI_DEVICE_ERROR       Fail to add the device order into EFI variable fail
-                                 because of hardware error.
-**/
-EFI_STATUS
-BdsCreateDevOrder (
-  IN BBS_TABLE                  *BbsTable,
-  IN UINT16                     BbsCount
-  )
-{
-  UINTN                       Index;
-  UINTN                       FDCount;
-  UINTN                       HDCount;
-  UINTN                       CDCount;
-  UINTN                       NETCount;
-  UINTN                       BEVCount;
-  UINTN                       TotalSize;
-  UINTN                       HeaderSize;
-  LEGACY_DEV_ORDER_ENTRY      *DevOrder;
-  LEGACY_DEV_ORDER_ENTRY      *DevOrderPtr;
-  EFI_STATUS                  Status;
-
-  FDCount     = 0;
-  HDCount     = 0;
-  CDCount     = 0;
-  NETCount    = 0;
-  BEVCount    = 0;
-  TotalSize   = 0;
-  HeaderSize  = sizeof (BBS_TYPE) + sizeof (UINT16);
-  DevOrder    = NULL;
-  Status      = EFI_SUCCESS;
-
-  //
-  // Count all boot devices
-  //
-  for (Index = 0; Index < BbsCount; Index++) {
-    if (BbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) {
-      continue;
-    }
-
-    switch (BbsTable[Index].DeviceType) {
-    case BBS_FLOPPY:
-      FDCount++;
-      break;
-
-    case BBS_HARDDISK:
-      HDCount++;
-      break;
-
-    case BBS_CDROM:
-      CDCount++;
-      break;
-
-    case BBS_EMBED_NETWORK:
-      NETCount++;
-      break;
-
-    case BBS_BEV_DEVICE:
-      BEVCount++;
-      break;
-
-    default:
-      break;
-    }
-  }
-
-  TotalSize += (HeaderSize + sizeof (UINT16) * FDCount);
-  TotalSize += (HeaderSize + sizeof (UINT16) * HDCount);
-  TotalSize += (HeaderSize + sizeof (UINT16) * CDCount);
-  TotalSize += (HeaderSize + sizeof (UINT16) * NETCount);
-  TotalSize += (HeaderSize + sizeof (UINT16) * BEVCount);
-
-  //
-  // Create buffer to hold all boot device order
-  //
-  DevOrder = AllocateZeroPool (TotalSize);
-  if (NULL == DevOrder) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  DevOrderPtr          = DevOrder;
-
-  DevOrderPtr->BbsType = BBS_FLOPPY;
-  DevOrderPtr->Length  = (UINT16) (sizeof (DevOrderPtr->Length) + FDCount * sizeof (UINT16));
-  DevOrderPtr          = (LEGACY_DEV_ORDER_ENTRY *) BdsFillDevOrderBuf (BbsTable, BBS_FLOPPY, BbsCount, DevOrderPtr->Data);
-
-  DevOrderPtr->BbsType = BBS_HARDDISK;
-  DevOrderPtr->Length  = (UINT16) (sizeof (UINT16) + HDCount * sizeof (UINT16));
-  DevOrderPtr          = (LEGACY_DEV_ORDER_ENTRY *) BdsFillDevOrderBuf (BbsTable, BBS_HARDDISK, BbsCount, DevOrderPtr->Data);
-  
-  DevOrderPtr->BbsType = BBS_CDROM;
-  DevOrderPtr->Length  = (UINT16) (sizeof (UINT16) + CDCount * sizeof (UINT16));
-  DevOrderPtr          = (LEGACY_DEV_ORDER_ENTRY *) BdsFillDevOrderBuf (BbsTable, BBS_CDROM, BbsCount, DevOrderPtr->Data);
-  
-  DevOrderPtr->BbsType = BBS_EMBED_NETWORK;
-  DevOrderPtr->Length  = (UINT16) (sizeof (UINT16) + NETCount * sizeof (UINT16));
-  DevOrderPtr          = (LEGACY_DEV_ORDER_ENTRY *) BdsFillDevOrderBuf (BbsTable, BBS_EMBED_NETWORK, BbsCount, DevOrderPtr->Data);
-
-  DevOrderPtr->BbsType = BBS_BEV_DEVICE;
-  DevOrderPtr->Length  = (UINT16) (sizeof (UINT16) + BEVCount * sizeof (UINT16));
-  DevOrderPtr          = (LEGACY_DEV_ORDER_ENTRY *) BdsFillDevOrderBuf (BbsTable, BBS_BEV_DEVICE, BbsCount, DevOrderPtr->Data);
-
-  ASSERT (TotalSize == (UINTN) ((UINT8 *) DevOrderPtr - (UINT8 *) DevOrder));
-
-  //
-  // Save device order for legacy boot device to variable.
-  //
-  Status = gRT->SetVariable (
-                  VAR_LEGACY_DEV_ORDER,
-                  &gEfiLegacyDevOrderVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  TotalSize,
-                  DevOrder
-                  );
-  FreePool (DevOrder);
-
-  return Status;
-}
-
-/**
-  Add the legacy boot devices from BBS table into 
-  the legacy device boot order.
-
-  @retval EFI_SUCCESS           The boot devices are added successfully.
-  @retval EFI_NOT_FOUND         The legacy boot devices are not found.
-  @retval EFI_OUT_OF_RESOURCES  Memmory or storage is not enough.
-  @retval EFI_DEVICE_ERROR      Fail to add the legacy device boot order into EFI variable
-                                because of hardware error.
-**/
-EFI_STATUS
-EFIAPI
-BdsUpdateLegacyDevOrder (
-  VOID
-  )
-{
-  LEGACY_DEV_ORDER_ENTRY      *DevOrder;
-  LEGACY_DEV_ORDER_ENTRY      *NewDevOrder;
-  LEGACY_DEV_ORDER_ENTRY      *Ptr;
-  LEGACY_DEV_ORDER_ENTRY      *NewPtr;
-  UINTN                       DevOrderSize;
-  EFI_LEGACY_BIOS_PROTOCOL    *LegacyBios;
-  EFI_STATUS                  Status;
-  UINT16                      HddCount;
-  UINT16                      BbsCount;
-  HDD_INFO                    *LocalHddInfo;
-  BBS_TABLE                   *LocalBbsTable;
-  UINTN                       Index;
-  UINTN                       Index2;
-  UINTN                       *Idx;
-  UINTN                       FDCount;
-  UINTN                       HDCount;
-  UINTN                       CDCount;
-  UINTN                       NETCount;
-  UINTN                       BEVCount;
-  UINTN                       TotalSize;
-  UINTN                       HeaderSize;
-  UINT16                      *NewFDPtr;
-  UINT16                      *NewHDPtr;
-  UINT16                      *NewCDPtr;
-  UINT16                      *NewNETPtr;
-  UINT16                      *NewBEVPtr;
-  UINT16                      *NewDevPtr;
-  UINTN                       FDIndex;
-  UINTN                       HDIndex;
-  UINTN                       CDIndex;
-  UINTN                       NETIndex;
-  UINTN                       BEVIndex;
-
-  Idx           = NULL;
-  FDCount       = 0;
-  HDCount       = 0;
-  CDCount       = 0;
-  NETCount      = 0;
-  BEVCount      = 0;
-  TotalSize     = 0;
-  HeaderSize    = sizeof (BBS_TYPE) + sizeof (UINT16);
-  FDIndex       = 0;
-  HDIndex       = 0;
-  CDIndex       = 0;
-  NETIndex      = 0;
-  BEVIndex      = 0;
-  NewDevPtr     = NULL;
-
-  Status        = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = LegacyBios->GetBbsInfo (
-                         LegacyBios,
-                         &HddCount,
-                         &LocalHddInfo,
-                         &BbsCount,
-                         &LocalBbsTable
-                         );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  DevOrder = BdsLibGetVariableAndSize (
-               VAR_LEGACY_DEV_ORDER,
-               &gEfiLegacyDevOrderVariableGuid,
-               &DevOrderSize
-               );
-  if (NULL == DevOrder) {
-    return BdsCreateDevOrder (LocalBbsTable, BbsCount);
-  }
-  //
-  // First we figure out how many boot devices with same device type respectively
-  //
-  for (Index = 0; Index < BbsCount; Index++) {
-    if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||
-        (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM)
-        ) {
-      continue;
-    }
-
-    switch (LocalBbsTable[Index].DeviceType) {
-    case BBS_FLOPPY:
-      FDCount++;
-      break;
-
-    case BBS_HARDDISK:
-      HDCount++;
-      break;
-
-    case BBS_CDROM:
-      CDCount++;
-      break;
-
-    case BBS_EMBED_NETWORK:
-      NETCount++;
-      break;
-
-    case BBS_BEV_DEVICE:
-      BEVCount++;
-      break;
-
-    default:
-      break;
-    }
-  }
-
-  TotalSize += (HeaderSize + FDCount * sizeof (UINT16));
-  TotalSize += (HeaderSize + HDCount * sizeof (UINT16));
-  TotalSize += (HeaderSize + CDCount * sizeof (UINT16));
-  TotalSize += (HeaderSize + NETCount * sizeof (UINT16));
-  TotalSize += (HeaderSize + BEVCount * sizeof (UINT16));
-
-  NewDevOrder = AllocateZeroPool (TotalSize);
-  if (NULL == NewDevOrder) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-
-
-  //
-  // copy FD
-  //
-  Ptr             = DevOrder;
-  NewPtr          = NewDevOrder;
-  NewPtr->BbsType = Ptr->BbsType;
-  NewPtr->Length  = (UINT16) (sizeof (UINT16) + FDCount * sizeof (UINT16));
-  for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-    if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_FLOPPY
-        ) {
-      continue;
-    }
-
-    NewPtr->Data[FDIndex] = Ptr->Data[Index];
-    FDIndex++;
-  }
-  NewFDPtr = NewPtr->Data;
-
-  //
-  // copy HD
-  //
-  Ptr             = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-  NewPtr          = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-  NewPtr->BbsType = Ptr->BbsType;
-  NewPtr->Length  = (UINT16) (sizeof (UINT16) + HDCount * sizeof (UINT16));
-  for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-    if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_HARDDISK
-        ) {
-      continue;
-    }
-
-    NewPtr->Data[HDIndex] = Ptr->Data[Index];
-    HDIndex++;
-  }
-  NewHDPtr = NewPtr->Data;
-
-  //
-  // copy CD
-  //
-  Ptr    = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-  NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-  NewPtr->BbsType = Ptr->BbsType;
-  NewPtr->Length  = (UINT16) (sizeof (UINT16) + CDCount * sizeof (UINT16));
-  for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-    if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_CDROM
-        ) {
-      continue;
-    }
-
-    NewPtr->Data[CDIndex] = Ptr->Data[Index];
-    CDIndex++;
-  }
-  NewCDPtr = NewPtr->Data;
-
-  //
-  // copy NET
-  //
-  Ptr    = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-  NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-  NewPtr->BbsType = Ptr->BbsType;
-  NewPtr->Length  = (UINT16) (sizeof (UINT16) + NETCount * sizeof (UINT16));
-  for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-    if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_EMBED_NETWORK
-        ) {
-      continue;
-    }
-
-    NewPtr->Data[NETIndex] = Ptr->Data[Index];
-    NETIndex++;
-  }
-  NewNETPtr = NewPtr->Data;
-  
-  //
-  // copy BEV
-  //
-  Ptr    = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-  NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-  NewPtr->BbsType = Ptr->BbsType;
-  NewPtr->Length  = (UINT16) (sizeof (UINT16) + BEVCount * sizeof (UINT16));
-  for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-    if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_BEV_DEVICE
-        ) {
-      continue;
-    }
-
-    NewPtr->Data[BEVIndex] = Ptr->Data[Index];
-    BEVIndex++;
-  }
-  NewBEVPtr = NewPtr->Data;
-
-  for (Index = 0; Index < BbsCount; Index++) {
-    if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||
-        (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM)
-        ) {
-      continue;
-    }
-
-    switch (LocalBbsTable[Index].DeviceType) {
-    case BBS_FLOPPY:
-      Idx       = &FDIndex;
-      NewDevPtr = NewFDPtr;
-      break;
-
-    case BBS_HARDDISK:
-      Idx       = &HDIndex;
-      NewDevPtr = NewHDPtr;
-      break;
-
-    case BBS_CDROM:
-      Idx       = &CDIndex;
-      NewDevPtr = NewCDPtr;
-      break;
-
-    case BBS_EMBED_NETWORK:
-      Idx       = &NETIndex;
-      NewDevPtr = NewNETPtr;
-      break;
-
-    case BBS_BEV_DEVICE:
-      Idx       = &BEVIndex;
-      NewDevPtr = NewBEVPtr;
-      break;
-
-    default:
-      Idx = NULL;
-      break;
-    }
-    //
-    // at this point we have copied those valid indexes to new buffer
-    // and we should check if there is any new appeared boot device
-    //
-    if (Idx != NULL) {
-      for (Index2 = 0; Index2 < *Idx; Index2++) {
-        if ((NewDevPtr[Index2] & 0xFF) == (UINT16) Index) {
-          break;
-        }
-      }
-
-      if (Index2 == *Idx) {
-        //
-        // Index2 == *Idx means we didn't find Index
-        // so Index is a new appeared device's index in BBS table
-        // insert it before disabled indexes.
-        //
-        for (Index2 = 0; Index2 < *Idx; Index2++) {
-          if ((NewDevPtr[Index2] & 0xFF00) == 0xFF00) {
-            break;
-          }
-        }
-        CopyMem (&NewDevPtr[Index2 + 1], &NewDevPtr[Index2], (*Idx - Index2) * sizeof (UINT16));
-        NewDevPtr[Index2] = (UINT16) (Index & 0xFF);
-        (*Idx)++;
-      }
-    }
-  }
-
-  FreePool (DevOrder);
-
-  Status = gRT->SetVariable (
-                  VAR_LEGACY_DEV_ORDER,
-                  &gEfiLegacyDevOrderVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  TotalSize,
-                  NewDevOrder
-                  );
-  FreePool (NewDevOrder);
-
-  return Status;
-}
-
-/**
-  Set Boot Priority for specified device type.
-
-  @param DeviceType      The device type.
-  @param BbsIndex        The BBS index to set the highest priority. Ignore when -1.
-  @param LocalBbsTable   The BBS table.
-  @param Priority        The prority table.
-
-  @retval EFI_SUCCESS           The function completes successfully.
-  @retval EFI_NOT_FOUND         Failed to find device.
-  @retval EFI_OUT_OF_RESOURCES  Failed to get the efi variable of device order.
-
-**/
-EFI_STATUS
-BdsSetBootPriority4SameTypeDev (
-  IN UINT16                                              DeviceType,
-  IN UINTN                                               BbsIndex,
-  IN OUT BBS_TABLE                                       *LocalBbsTable,
-  IN OUT UINT16                                          *Priority
-  )
-{
-  LEGACY_DEV_ORDER_ENTRY      *DevOrder;
-  LEGACY_DEV_ORDER_ENTRY      *DevOrderPtr;
-  UINTN                       DevOrderSize;
-  UINTN                       Index;
-
-  DevOrder = BdsLibGetVariableAndSize (
-               VAR_LEGACY_DEV_ORDER,
-               &gEfiLegacyDevOrderVariableGuid,
-               &DevOrderSize
-               );
-  if (NULL == DevOrder) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  DevOrderPtr = DevOrder;
-  while ((UINT8 *) DevOrderPtr < (UINT8 *) DevOrder + DevOrderSize) {
-    if (DevOrderPtr->BbsType == DeviceType) {
-      break;
-    }
-
-    DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *) ((UINTN) DevOrderPtr + sizeof (BBS_TYPE) + DevOrderPtr->Length);
-  }
-
-  if ((UINT8 *) DevOrderPtr >= (UINT8 *) DevOrder + DevOrderSize) {
-    FreePool (DevOrder);
-    return EFI_NOT_FOUND;
-  }
-
-  if (BbsIndex != (UINTN) -1) {
-    LocalBbsTable[BbsIndex].BootPriority = *Priority;
-    (*Priority)++;
-  }
-  //
-  // If the high byte of the DevIndex is 0xFF, it indicates that this device has been disabled.
-  //
-  for (Index = 0; Index < DevOrderPtr->Length / sizeof (UINT16) - 1; Index++) {
-    if ((DevOrderPtr->Data[Index] & 0xFF00) == 0xFF00) {
-      //
-      // LocalBbsTable[DevIndex[Index] & 0xFF].BootPriority = BBS_DISABLED_ENTRY;
-      //
-    } else if (DevOrderPtr->Data[Index] != BbsIndex) {
-      LocalBbsTable[DevOrderPtr->Data[Index]].BootPriority = *Priority;
-      (*Priority)++;
-    }
-  }
-
-  FreePool (DevOrder);
-  return EFI_SUCCESS;
-}
-
-/**
-  Print the BBS Table.
-
-  @param LocalBbsTable   The BBS table.
-  @param BbsCount        The count of entry in BBS table.
-**/
-VOID
-PrintBbsTable (
-  IN BBS_TABLE  *LocalBbsTable,
-  IN UINT16     BbsCount
-  )
-{
-  UINT16  Idx;
-
-  DEBUG ((DEBUG_ERROR, "\n"));
-  DEBUG ((DEBUG_ERROR, " NO  Prio bb/dd/ff cl/sc Type Stat segm:offs\n"));
-  DEBUG ((DEBUG_ERROR, "=============================================\n"));
-  for (Idx = 0; Idx < BbsCount; Idx++) {
-    if ((LocalBbsTable[Idx].BootPriority == BBS_IGNORE_ENTRY) ||
-        (LocalBbsTable[Idx].BootPriority == BBS_DO_NOT_BOOT_FROM) ||
-        (LocalBbsTable[Idx].BootPriority == BBS_LOWEST_PRIORITY)
-        ) {
-      continue;
-    }
-
-    DEBUG (
-      (DEBUG_ERROR,
-      " %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x %04x:%04x\n",
-      (UINTN) Idx,
-      (UINTN) LocalBbsTable[Idx].BootPriority,
-      (UINTN) LocalBbsTable[Idx].Bus,
-      (UINTN) LocalBbsTable[Idx].Device,
-      (UINTN) LocalBbsTable[Idx].Function,
-      (UINTN) LocalBbsTable[Idx].Class,
-      (UINTN) LocalBbsTable[Idx].SubClass,
-      (UINTN) LocalBbsTable[Idx].DeviceType,
-      (UINTN) * (UINT16 *) &LocalBbsTable[Idx].StatusFlags,
-      (UINTN) LocalBbsTable[Idx].BootHandlerSegment,
-      (UINTN) LocalBbsTable[Idx].BootHandlerOffset,
-      (UINTN) ((LocalBbsTable[Idx].MfgStringSegment << 4) + LocalBbsTable[Idx].MfgStringOffset),
-      (UINTN) ((LocalBbsTable[Idx].DescStringSegment << 4) + LocalBbsTable[Idx].DescStringOffset))
-      );
-  }
-
-  DEBUG ((DEBUG_ERROR, "\n"));
-}
-
-/**
-  Set the boot priority for BBS entries based on boot option entry and boot order.
-
-  @param  Entry             The boot option is to be checked for refresh BBS table.
-  
-  @retval EFI_SUCCESS           The boot priority for BBS entries is refreshed successfully.
-  @retval EFI_NOT_FOUND         BBS entries can't be found.
-  @retval EFI_OUT_OF_RESOURCES  Failed to get the legacy device boot order.
-**/
-EFI_STATUS
-EFIAPI
-BdsRefreshBbsTableForBoot (
-  IN BDS_COMMON_OPTION        *Entry
-  )
-{
-  EFI_STATUS                Status;
-  UINT16                    BbsIndex;
-  UINT16                    HddCount;
-  UINT16                    BbsCount;
-  HDD_INFO                  *LocalHddInfo;
-  BBS_TABLE                 *LocalBbsTable;
-  UINT16                    DevType;
-  EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
-  UINTN                     Index;
-  UINT16                    Priority;
-  UINT16                    *BootOrder;
-  UINTN                     BootOrderSize;
-  UINT8                     *BootOptionVar;
-  UINTN                     BootOptionSize;
-  CHAR16                    BootOption[9];
-  UINT8                     *Ptr;
-  UINT16                    DevPathLen;
-  EFI_DEVICE_PATH_PROTOCOL  *DevPath;
-  UINT16                    *DeviceType;
-  UINTN                     DeviceTypeCount;
-  UINTN                     DeviceTypeIndex;
-
-  HddCount      = 0;
-  BbsCount      = 0;
-  LocalHddInfo  = NULL;
-  LocalBbsTable = NULL;
-  DevType       = BBS_UNKNOWN;
-
-  Status        = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  LegacyBios->GetBbsInfo (
-                LegacyBios,
-                &HddCount,
-                &LocalHddInfo,
-                &BbsCount,
-                &LocalBbsTable
-                );
-  //
-  // First, set all the present devices' boot priority to BBS_UNPRIORITIZED_ENTRY
-  // We will set them according to the settings setup by user
-  //
-  for (Index = 0; Index < BbsCount; Index++) {
-    if (!((BBS_IGNORE_ENTRY == LocalBbsTable[Index].BootPriority) ||
-        (BBS_DO_NOT_BOOT_FROM == LocalBbsTable[Index].BootPriority) ||
-         (BBS_LOWEST_PRIORITY == LocalBbsTable[Index].BootPriority))) {
-      LocalBbsTable[Index].BootPriority = BBS_UNPRIORITIZED_ENTRY;
-    }
-  }
-  //
-  // boot priority always starts at 0
-  //
-  Priority = 0;
-  if (Entry->LoadOptionsSize == sizeof (BBS_TABLE) + sizeof (UINT16)) {
-    //
-    // If Entry stands for a legacy boot option, we prioritize the devices with the same type first.
-    //
-    DevType  = ((BBS_TABLE *) Entry->LoadOptions)->DeviceType;
-    BbsIndex = *(UINT16 *) ((BBS_TABLE *) Entry->LoadOptions + 1);
-    Status = BdsSetBootPriority4SameTypeDev (
-              DevType,
-              BbsIndex,
-              LocalBbsTable,
-              &Priority
-              );
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  }
-  //
-  // we have to set the boot priority for other BBS entries with different device types
-  //
-  BootOrder = BdsLibGetVariableAndSize (
-                L"BootOrder",
-                &gEfiGlobalVariableGuid,
-                &BootOrderSize
-                );
-  DeviceType = AllocatePool (BootOrderSize + sizeof (UINT16));
-  ASSERT (DeviceType != NULL);
-
-  DeviceType[0]   = DevType;
-  DeviceTypeCount = 1;
-  for (Index = 0; ((BootOrder != NULL) && (Index < BootOrderSize / sizeof (UINT16))); Index++) {
-    UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);
-    BootOptionVar = BdsLibGetVariableAndSize (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      &BootOptionSize
-                      );
-    if (NULL == BootOptionVar) {
-      continue;
-    }
-
-    Ptr = BootOptionVar;
-
-    Ptr += sizeof (UINT32);
-    DevPathLen = *(UINT16 *) Ptr;
-    Ptr += sizeof (UINT16);
-    Ptr += StrSize ((UINT16 *) Ptr);
-    DevPath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
-    if (BBS_DEVICE_PATH != DevPath->Type || BBS_BBS_DP != DevPath->SubType) {
-      FreePool (BootOptionVar);
-      continue;
-    }
-
-    Ptr += DevPathLen;
-    DevType = ((BBS_TABLE *) Ptr)->DeviceType;
-    for (DeviceTypeIndex = 0; DeviceTypeIndex < DeviceTypeCount; DeviceTypeIndex++) {
-      if (DeviceType[DeviceTypeIndex] == DevType) {
-        break;
-      }
-    }
-    if (DeviceTypeIndex < DeviceTypeCount) {
-      //
-      // We don't want to process twice for a device type
-      //
-      FreePool (BootOptionVar);
-      continue;
-    }
-
-    DeviceType[DeviceTypeCount] = DevType;
-    DeviceTypeCount++;
-
-    Status = BdsSetBootPriority4SameTypeDev (
-              DevType,
-              (UINTN) -1,
-              LocalBbsTable,
-              &Priority
-              );
-    FreePool (BootOptionVar);
-    if (EFI_ERROR (Status)) {
-      break;
-    }
-  }
-
-  FreePool (DeviceType);
-
-  if (BootOrder != NULL) {
-    FreePool (BootOrder);
-  }
-
-  DEBUG_CODE_BEGIN();
-    PrintBbsTable (LocalBbsTable, BbsCount);
-  DEBUG_CODE_END();
-
-  return Status;
-}
-
-/**
-  Boot the legacy system with the boot option
-
-  @param  Option                 The legacy boot option which have BBS device path
-
-  @retval EFI_UNSUPPORTED        There is no legacybios protocol, do not support
-                                 legacy boot.
-  @retval EFI_STATUS             Return the status of LegacyBios->LegacyBoot ().
-
-**/
-EFI_STATUS
-BdsLibDoLegacyBoot (
-  IN  BDS_COMMON_OPTION           *Option
-  )
-{
-  EFI_STATUS                Status;
-  EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
-  EFI_EVENT                 LegacyBootEvent;
-
-  Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
-  if (EFI_ERROR (Status)) {
-    //
-    // If no LegacyBios protocol we do not support legacy boot
-    //
-    return EFI_UNSUPPORTED;
-  }
-  //
-  // Notes: if we separate the int 19, then we don't need to refresh BBS
-  //
-  BdsRefreshBbsTableForBoot (Option);
-
-  //
-  // Write boot to OS performance data for legacy boot.
-  //
-  PERF_CODE (
-    //
-    // Create an event to be signalled when Legacy Boot occurs to write performance data.
-    //
-    Status = EfiCreateEventLegacyBootEx(
-               TPL_NOTIFY,
-               BmEndOfBdsPerfCode,
-               NULL, 
-               &LegacyBootEvent
-               );
-    ASSERT_EFI_ERROR (Status);
-  );
-
-  DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Legacy Boot: %S\n", Option->Description));
-  return LegacyBios->LegacyBoot (
-                      LegacyBios,
-                      (BBS_BBS_DEVICE_PATH *) Option->DevicePath,
-                      Option->LoadOptionsSize,
-                      Option->LoadOptions
-                      );
-}
-
-/**
-  Internal function to check if the input boot option is a valid EFI NV Boot####.
-
-  @param OptionToCheck  Boot option to be checked.
-
-  @retval TRUE      This boot option matches a valid EFI NV Boot####.
-  @retval FALSE     If not.
-
-**/
-BOOLEAN
-IsBootOptionValidNVVarialbe (
-  IN  BDS_COMMON_OPTION             *OptionToCheck
-  )
-{
-  LIST_ENTRY        TempList;
-  BDS_COMMON_OPTION *BootOption;
-  BOOLEAN           Valid;
-  CHAR16            OptionName[20];
-
-  Valid = FALSE;
-
-  InitializeListHead (&TempList);
-  UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", OptionToCheck->BootCurrent);
-
-  BootOption = BdsLibVariableToOption (&TempList, OptionName);
-  if (BootOption == NULL) {
-    return FALSE;
-  }
-
-  //
-  // If the Boot Option Number and Device Path matches, OptionToCheck matches a
-  // valid EFI NV Boot####.
-  //
-  if ((OptionToCheck->BootCurrent == BootOption->BootCurrent) &&
-      (CompareMem (OptionToCheck->DevicePath, BootOption->DevicePath, GetDevicePathSize (OptionToCheck->DevicePath)) == 0))
-      {
-    Valid = TRUE;
-  }
-
-  FreePool (BootOption);
-
-  return Valid;
-}
-
-/**
-  Check whether a USB device match the specified USB Class device path. This
-  function follows "Load Option Processing" behavior in UEFI specification.
-
-  @param UsbIo       USB I/O protocol associated with the USB device.
-  @param UsbClass    The USB Class device path to match.
-
-  @retval TRUE       The USB device match the USB Class device path.
-  @retval FALSE      The USB device does not match the USB Class device path.
-
-**/
-BOOLEAN
-BdsMatchUsbClass (
-  IN EFI_USB_IO_PROTOCOL        *UsbIo,
-  IN USB_CLASS_DEVICE_PATH      *UsbClass
-  )
-{
-  EFI_STATUS                    Status;
-  EFI_USB_DEVICE_DESCRIPTOR     DevDesc;
-  EFI_USB_INTERFACE_DESCRIPTOR  IfDesc;
-  UINT8                         DeviceClass;
-  UINT8                         DeviceSubClass;
-  UINT8                         DeviceProtocol;
-
-  if ((DevicePathType (UsbClass) != MESSAGING_DEVICE_PATH) ||
-      (DevicePathSubType (UsbClass) != MSG_USB_CLASS_DP)){
-    return FALSE;
-  }
-
-  //
-  // Check Vendor Id and Product Id.
-  //
-  Status = UsbIo->UsbGetDeviceDescriptor (UsbIo, &DevDesc);
-  if (EFI_ERROR (Status)) {
-    return FALSE;
-  }
-
-  if ((UsbClass->VendorId != 0xffff) &&
-      (UsbClass->VendorId != DevDesc.IdVendor)) {
-    return FALSE;
-  }
-
-  if ((UsbClass->ProductId != 0xffff) &&
-      (UsbClass->ProductId != DevDesc.IdProduct)) {
-    return FALSE;
-  }
-
-  DeviceClass    = DevDesc.DeviceClass;
-  DeviceSubClass = DevDesc.DeviceSubClass;
-  DeviceProtocol = DevDesc.DeviceProtocol;
-  if (DeviceClass == 0) {
-    //
-    // If Class in Device Descriptor is set to 0, use the Class, SubClass and
-    // Protocol in Interface Descriptor instead.
-    //
-    Status = UsbIo->UsbGetInterfaceDescriptor (UsbIo, &IfDesc);
-    if (EFI_ERROR (Status)) {
-      return FALSE;
-    }
-
-    DeviceClass    = IfDesc.InterfaceClass;
-    DeviceSubClass = IfDesc.InterfaceSubClass;
-    DeviceProtocol = IfDesc.InterfaceProtocol;
-  }
-
-  //
-  // Check Class, SubClass and Protocol.
-  //
-  if ((UsbClass->DeviceClass != 0xff) &&
-      (UsbClass->DeviceClass != DeviceClass)) {
-    return FALSE;
-  }
-
-  if ((UsbClass->DeviceSubClass != 0xff) &&
-      (UsbClass->DeviceSubClass != DeviceSubClass)) {
-    return FALSE;
-  }
-
-  if ((UsbClass->DeviceProtocol != 0xff) &&
-      (UsbClass->DeviceProtocol != DeviceProtocol)) {
-    return FALSE;
-  }
-
-  return TRUE;
-}
-
-/**
-  Check whether a USB device match the specified USB WWID device path. This
-  function follows "Load Option Processing" behavior in UEFI specification.
-
-  @param UsbIo       USB I/O protocol associated with the USB device.
-  @param UsbWwid     The USB WWID device path to match.
-
-  @retval TRUE       The USB device match the USB WWID device path.
-  @retval FALSE      The USB device does not match the USB WWID device path.
-
-**/
-BOOLEAN
-BdsMatchUsbWwid (
-  IN EFI_USB_IO_PROTOCOL        *UsbIo,
-  IN USB_WWID_DEVICE_PATH       *UsbWwid
-  )
-{
-  EFI_STATUS                   Status;
-  EFI_USB_DEVICE_DESCRIPTOR    DevDesc;
-  EFI_USB_INTERFACE_DESCRIPTOR IfDesc;
-  UINT16                       *LangIdTable;
-  UINT16                       TableSize;
-  UINT16                       Index;
-  CHAR16                       *CompareStr;
-  UINTN                        CompareLen;
-  CHAR16                       *SerialNumberStr;
-  UINTN                        Length;
-
-  if ((DevicePathType (UsbWwid) != MESSAGING_DEVICE_PATH) ||
-      (DevicePathSubType (UsbWwid) != MSG_USB_WWID_DP )){
-    return FALSE;
-  }
-
-  //
-  // Check Vendor Id and Product Id.
-  //
-  Status = UsbIo->UsbGetDeviceDescriptor (UsbIo, &DevDesc);
-  if (EFI_ERROR (Status)) {
-    return FALSE;
-  }
-  if ((DevDesc.IdVendor != UsbWwid->VendorId) ||
-      (DevDesc.IdProduct != UsbWwid->ProductId)) {
-    return FALSE;
-  }
-
-  //
-  // Check Interface Number.
-  //
-  Status = UsbIo->UsbGetInterfaceDescriptor (UsbIo, &IfDesc);
-  if (EFI_ERROR (Status)) {
-    return FALSE;
-  }
-  if (IfDesc.InterfaceNumber != UsbWwid->InterfaceNumber) {
-    return FALSE;
-  }
-
-  //
-  // Check Serial Number.
-  //
-  if (DevDesc.StrSerialNumber == 0) {
-    return FALSE;
-  }
-
-  //
-  // Get all supported languages.
-  //
-  TableSize = 0;
-  LangIdTable = NULL;
-  Status = UsbIo->UsbGetSupportedLanguages (UsbIo, &LangIdTable, &TableSize);
-  if (EFI_ERROR (Status) || (TableSize == 0) || (LangIdTable == NULL)) {
-    return FALSE;
-  }
-
-  //
-  // Serial number in USB WWID device path is the last 64-or-less UTF-16 characters.
-  //
-  CompareStr = (CHAR16 *) (UINTN) (UsbWwid + 1);
-  CompareLen = (DevicePathNodeLength (UsbWwid) - sizeof (USB_WWID_DEVICE_PATH)) / sizeof (CHAR16);
-  if (CompareStr[CompareLen - 1] == L'\0') {
-    CompareLen--;
-  }
-
-  //
-  // Compare serial number in each supported language.
-  //
-  for (Index = 0; Index < TableSize / sizeof (UINT16); Index++) {
-    SerialNumberStr = NULL;
-    Status = UsbIo->UsbGetStringDescriptor (
-                      UsbIo,
-                      LangIdTable[Index],
-                      DevDesc.StrSerialNumber,
-                      &SerialNumberStr
-                      );
-    if (EFI_ERROR (Status) || (SerialNumberStr == NULL)) {
-      continue;
-    }
-
-    Length = StrLen (SerialNumberStr);
-    if ((Length >= CompareLen) &&
-        (CompareMem (SerialNumberStr + Length - CompareLen, CompareStr, CompareLen * sizeof (CHAR16)) == 0)) {
-      FreePool (SerialNumberStr);
-      return TRUE;
-    }
-
-    FreePool (SerialNumberStr);
-  }
-
-  return FALSE;
-}
-
-/**
-  Find a USB device path which match the specified short-form device path start
-  with USB Class or USB WWID device path and load the boot file then return the 
-  image handle. If ParentDevicePath is NULL, this function will search in all USB
-  devices of the platform. If ParentDevicePath is not NULL,this function will only
-  search in its child devices.
-
-  @param ParentDevicePath      The device path of the parent.
-  @param ShortFormDevicePath   The USB Class or USB WWID device path to match.
-
-  @return  The image Handle if find load file from specified short-form device path
-           or NULL if not found.
-
-**/
-EFI_HANDLE *
-BdsFindUsbDevice (
-  IN EFI_DEVICE_PATH_PROTOCOL   *ParentDevicePath,
-  IN EFI_DEVICE_PATH_PROTOCOL   *ShortFormDevicePath
-  )
-{
-  EFI_STATUS                Status;
-  UINTN                     UsbIoHandleCount;
-  EFI_HANDLE                *UsbIoHandleBuffer;
-  EFI_DEVICE_PATH_PROTOCOL  *UsbIoDevicePath;
-  EFI_USB_IO_PROTOCOL       *UsbIo;
-  UINTN                     Index;
-  UINTN                     ParentSize;
-  UINTN                     Size;
-  EFI_HANDLE                ImageHandle;
-  EFI_HANDLE                Handle;
-  EFI_DEVICE_PATH_PROTOCOL  *FullDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *NextDevicePath;
-
-  FullDevicePath = NULL;
-  ImageHandle    = NULL;
-
-  //
-  // Get all UsbIo Handles.
-  //
-  UsbIoHandleCount = 0;
-  UsbIoHandleBuffer = NULL;
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiUsbIoProtocolGuid,
-                  NULL,
-                  &UsbIoHandleCount,
-                  &UsbIoHandleBuffer
-                  );
-  if (EFI_ERROR (Status) || (UsbIoHandleCount == 0) || (UsbIoHandleBuffer == NULL)) {
-    return NULL;
-  }
-
-  ParentSize = (ParentDevicePath == NULL) ? 0 : GetDevicePathSize (ParentDevicePath);
-  for (Index = 0; Index < UsbIoHandleCount; Index++) {
-    //
-    // Get the Usb IO interface.
-    //
-    Status = gBS->HandleProtocol(
-                    UsbIoHandleBuffer[Index],
-                    &gEfiUsbIoProtocolGuid,
-                    (VOID **) &UsbIo
-                    );
-    if (EFI_ERROR (Status)) {
-      continue;
-    }
-
-    UsbIoDevicePath = DevicePathFromHandle (UsbIoHandleBuffer[Index]);
-    if (UsbIoDevicePath == NULL) {
-      continue;
-    }
-
-    if (ParentDevicePath != NULL) {
-      //
-      // Compare starting part of UsbIoHandle's device path with ParentDevicePath.
-      //
-      Size = GetDevicePathSize (UsbIoDevicePath);
-      if ((Size < ParentSize) ||
-          (CompareMem (UsbIoDevicePath, ParentDevicePath, ParentSize - END_DEVICE_PATH_LENGTH) != 0)) {
-        continue;
-      }
-    }
-
-    if (BdsMatchUsbClass (UsbIo, (USB_CLASS_DEVICE_PATH *) ShortFormDevicePath) ||
-        BdsMatchUsbWwid (UsbIo, (USB_WWID_DEVICE_PATH *) ShortFormDevicePath)) {
-      //
-      // Try to find if there is the boot file in this DevicePath
-      //
-      NextDevicePath = NextDevicePathNode (ShortFormDevicePath);
-      if (!IsDevicePathEnd (NextDevicePath)) {
-        FullDevicePath = AppendDevicePath (UsbIoDevicePath, NextDevicePath);
-        //
-        // Connect the full device path, so that Simple File System protocol
-        // could be installed for this USB device.
-        //
-        BdsLibConnectDevicePath (FullDevicePath);
-        REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
-        Status = gBS->LoadImage (
-                       TRUE,
-                       gImageHandle,
-                       FullDevicePath,
-                       NULL,
-                       0,
-                       &ImageHandle
-                       );
-        FreePool (FullDevicePath);
-      } else {
-        FullDevicePath = UsbIoDevicePath;
-        Status = EFI_NOT_FOUND;
-      }
-
-      //
-      // If we didn't find an image directly, we need to try as if it is a removable device boot option
-      // and load the image according to the default boot behavior for removable device.
-      //
-      if (EFI_ERROR (Status)) {
-        //
-        // check if there is a bootable removable media could be found in this device path ,
-        // and get the bootable media handle
-        //
-        Handle = BdsLibGetBootableHandle(UsbIoDevicePath);
-        if (Handle == NULL) {
-          continue;
-        }
-        //
-        // Load the default boot file \EFI\BOOT\boot{machinename}.EFI from removable Media
-        //  machinename is ia32, ia64, x64, ...
-        //
-        FullDevicePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
-        if (FullDevicePath != NULL) {
-          REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
-          Status = gBS->LoadImage (
-                          TRUE,
-                          gImageHandle,
-                          FullDevicePath,
-                          NULL,
-                          0,
-                          &ImageHandle
-                          );
-          if (EFI_ERROR (Status)) {
-            //
-            // The DevicePath failed, and it's not a valid
-            // removable media device.
-            //
-            continue;
-          }
-        } else {
-          continue;
-        }
-      }
-      break;
-    }
-  }
-
-  FreePool (UsbIoHandleBuffer);
-  return ImageHandle;
-}
-
-/**
-  Expand USB Class or USB WWID device path node to be full device path of a USB
-  device in platform then load the boot file on this full device path and return the 
-  image handle.
-
-  This function support following 4 cases:
-  1) Boot Option device path starts with a USB Class or USB WWID device path,
-     and there is no Media FilePath device path in the end.
-     In this case, it will follow Removable Media Boot Behavior.
-  2) Boot Option device path starts with a USB Class or USB WWID device path,
-     and ended with Media FilePath device path.
-  3) Boot Option device path starts with a full device path to a USB Host Controller,
-     contains a USB Class or USB WWID device path node, while not ended with Media
-     FilePath device path. In this case, it will follow Removable Media Boot Behavior.
-  4) Boot Option device path starts with a full device path to a USB Host Controller,
-     contains a USB Class or USB WWID device path node, and ended with Media
-     FilePath device path.
-
-  @param  DevicePath    The Boot Option device path.
-
-  @return  The image handle of boot file, or NULL if there is no boot file found in
-           the specified USB Class or USB WWID device path.
-
-**/
-EFI_HANDLE *
-BdsExpandUsbShortFormDevicePath (
-  IN EFI_DEVICE_PATH_PROTOCOL       *DevicePath
-  )
-{
-  EFI_HANDLE                *ImageHandle;
-  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *ShortFormDevicePath;
-
-  //
-  // Search for USB Class or USB WWID device path node.
-  //
-  ShortFormDevicePath = NULL;
-  ImageHandle         = NULL;
-  TempDevicePath      = DevicePath;
-  while (!IsDevicePathEnd (TempDevicePath)) {
-    if ((DevicePathType (TempDevicePath) == MESSAGING_DEVICE_PATH) &&
-        ((DevicePathSubType (TempDevicePath) == MSG_USB_CLASS_DP) ||
-         (DevicePathSubType (TempDevicePath) == MSG_USB_WWID_DP))) {
-      ShortFormDevicePath = TempDevicePath;
-      break;
-    }
-    TempDevicePath = NextDevicePathNode (TempDevicePath);
-  }
-
-  if (ShortFormDevicePath == NULL) {
-    //
-    // No USB Class or USB WWID device path node found, do nothing.
-    //
-    return NULL;
-  }
-
-  if (ShortFormDevicePath == DevicePath) {
-    //
-    // Boot Option device path starts with USB Class or USB WWID device path.
-    //
-    ImageHandle = BdsFindUsbDevice (NULL, ShortFormDevicePath);
-    if (ImageHandle == NULL) {
-      //
-      // Failed to find a match in existing devices, connect the short form USB
-      // device path and try again.
-      //
-      BdsLibConnectUsbDevByShortFormDP (0xff, ShortFormDevicePath);
-      ImageHandle = BdsFindUsbDevice (NULL, ShortFormDevicePath);
-    }
-  } else {
-    //
-    // Boot Option device path contains USB Class or USB WWID device path node.
-    //
-
-    //
-    // Prepare the parent device path for search.
-    //
-    TempDevicePath = DuplicateDevicePath (DevicePath);
-    ASSERT (TempDevicePath != NULL);
-    SetDevicePathEndNode (((UINT8 *) TempDevicePath) + ((UINTN) ShortFormDevicePath - (UINTN) DevicePath));
-
-    //
-    // The USB Host Controller device path is already in Boot Option device path
-    // and USB Bus driver already support RemainingDevicePath starts with USB
-    // Class or USB WWID device path, so just search in existing USB devices and
-    // doesn't perform ConnectController here.
-    //
-    ImageHandle = BdsFindUsbDevice (TempDevicePath, ShortFormDevicePath);
-    FreePool (TempDevicePath);
-  }
-
-  return ImageHandle;
-}
-
-/**
-  Process the boot option follow the UEFI specification and
-  special treat the legacy boot option with BBS_DEVICE_PATH.
-
-  @param  Option                 The boot option need to be processed
-  @param  DevicePath             The device path which describe where to load the
-                                 boot image or the legacy BBS device path to boot
-                                 the legacy OS
-  @param  ExitDataSize           The size of exit data.
-  @param  ExitData               Data returned when Boot image failed.
-
-  @retval EFI_SUCCESS            Boot from the input boot option successfully.
-  @retval EFI_NOT_FOUND          If the Device Path is not found in the system
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibBootViaBootOption (
-  IN  BDS_COMMON_OPTION             *Option,
-  IN  EFI_DEVICE_PATH_PROTOCOL      *DevicePath,
-  OUT UINTN                         *ExitDataSize,
-  OUT CHAR16                        **ExitData OPTIONAL
-  )
-{
-  EFI_STATUS                Status;
-  EFI_STATUS                StatusLogo;
-  EFI_HANDLE                Handle;
-  EFI_HANDLE                ImageHandle;
-  EFI_DEVICE_PATH_PROTOCOL  *FilePath;
-  EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;
-  EFI_DEVICE_PATH_PROTOCOL  *WorkingDevicePath;
-  EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save;
-  LIST_ENTRY                TempBootLists;
-  EFI_BOOT_LOGO_PROTOCOL    *BootLogo;
-
-  *ExitDataSize = 0;
-  *ExitData     = NULL;
-
-  //
-  // Notes: this code can be remove after the s3 script table
-  // hook on the event EVT_SIGNAL_READY_TO_BOOT or
-  // EVT_SIGNAL_LEGACY_BOOT
-  //
-  Status = gBS->LocateProtocol (&gEfiAcpiS3SaveProtocolGuid, NULL, (VOID **) &AcpiS3Save);
-  if (!EFI_ERROR (Status)) {
-    AcpiS3Save->S3Save (AcpiS3Save, NULL);
-  }
-  //
-  // If it's Device Path that starts with a hard drive path, append it with the front part to compose a
-  // full device path
-  //
-  WorkingDevicePath = NULL;
-  if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) &&
-      (DevicePathSubType (DevicePath) == MEDIA_HARDDRIVE_DP)) {
-    WorkingDevicePath = BdsExpandPartitionPartialDevicePathToFull (
-                          (HARDDRIVE_DEVICE_PATH *)DevicePath
-                          );
-    if (WorkingDevicePath != NULL) {
-      DevicePath = WorkingDevicePath;
-    }
-  }
-
-  //
-  // Set Boot Current
-  //
-  if (IsBootOptionValidNVVarialbe (Option)) {
-    //
-    // For a temporary boot (i.e. a boot by selected a EFI Shell using "Boot From File"), Boot Current is actually not valid.
-    // In this case, "BootCurrent" is not created.
-    // Only create the BootCurrent variable when it points to a valid Boot#### variable.
-    //
-    SetVariableAndReportStatusCodeOnError (
-          L"BootCurrent",
-          &gEfiGlobalVariableGuid,
-          EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
-          sizeof (UINT16),
-          &Option->BootCurrent
-          );
-  }
-
-  //
-  // Report Status Code to indicate ReadyToBoot event will be signalled
-  //
-  REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT));
-
-  //
-  // Signal the EVT_SIGNAL_READY_TO_BOOT event
-  //
-  EfiSignalEventReadyToBoot();
-
-  //
-  // Expand USB Class or USB WWID device path node to be full device path of a USB
-  // device in platform then load the boot file on this full device path and get the
-  // image handle.
-  //
-  ImageHandle = BdsExpandUsbShortFormDevicePath (DevicePath);
-
-  //
-  // Adjust the different type memory page number just before booting
-  // and save the updated info into the variable for next boot to use
-  //
-  BdsSetMemoryTypeInformationVariable ();
-
-  //
-  // By expanding the USB Class or WWID device path, the ImageHandle has returnned.
-  // Here get the ImageHandle for the non USB class or WWID device path.
-  //
-  if (ImageHandle == NULL) {
-    ASSERT (Option->DevicePath != NULL);
-    if ((DevicePathType (Option->DevicePath) == BBS_DEVICE_PATH) &&
-        (DevicePathSubType (Option->DevicePath) == BBS_BBS_DP)
-       ) {
-      //
-      // Check to see if we should legacy BOOT. If yes then do the legacy boot
-      //
-      return BdsLibDoLegacyBoot (Option);
-    }
-
-    //
-    // If the boot option point to Internal FV shell, make sure it is valid
-    //
-    Status = BdsLibUpdateFvFileDevicePath (&DevicePath, &gUefiShellFileGuid);
-    if (!EFI_ERROR(Status)) {
-      if (Option->DevicePath != NULL) {
-        FreePool(Option->DevicePath);
-      }
-      Option->DevicePath  = AllocateZeroPool (GetDevicePathSize (DevicePath));
-      ASSERT(Option->DevicePath != NULL);
-      CopyMem (Option->DevicePath, DevicePath, GetDevicePathSize (DevicePath));
-      //
-      // Update the shell boot option
-      //
-      InitializeListHead (&TempBootLists);
-      BdsLibRegisterNewOption (&TempBootLists, DevicePath, L"EFI Internal Shell", L"BootOrder");
-
-      //
-      // free the temporary device path created by BdsLibUpdateFvFileDevicePath()
-      //
-      FreePool (DevicePath);
-      DevicePath = Option->DevicePath;
-    }
-
-    DEBUG_CODE_BEGIN();
-
-    if (Option->Description == NULL) {
-      DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Booting from unknown device path\n"));
-    } else {
-      DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Booting %S\n", Option->Description));
-    }
-        
-    DEBUG_CODE_END();
-  
-    //
-    // Report status code for OS Loader LoadImage.
-    //
-    REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
-    Status = gBS->LoadImage (
-                    TRUE,
-                    gImageHandle,
-                    DevicePath,
-                    NULL,
-                    0,
-                    &ImageHandle
-                    );
-
-    //
-    // If we didn't find an image directly, we need to try as if it is a removable device boot option
-    // and load the image according to the default boot behavior for removable device.
-    //
-    if (EFI_ERROR (Status)) {
-      //
-      // check if there is a bootable removable media could be found in this device path ,
-      // and get the bootable media handle
-      //
-      Handle = BdsLibGetBootableHandle(DevicePath);
-      if (Handle != NULL) {
-        //
-        // Load the default boot file \EFI\BOOT\boot{machinename}.EFI from removable Media
-        //  machinename is ia32, ia64, x64, ...
-        //
-        FilePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
-        if (FilePath != NULL) {
-          REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
-          Status = gBS->LoadImage (
-                          TRUE,
-                          gImageHandle,
-                          FilePath,
-                          NULL,
-                          0,
-                          &ImageHandle
-                          );
-        }
-      }
-    }
-  }
-  //
-  // Provide the image with it's load options
-  //
-  if ((ImageHandle == NULL) || (EFI_ERROR(Status))) {
-    //
-    // Report Status Code to indicate that the failure to load boot option
-    //
-    REPORT_STATUS_CODE (
-      EFI_ERROR_CODE | EFI_ERROR_MINOR,
-      (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR)
-      );    
-    goto Done;
-  }
-
-  Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &ImageInfo);
-  ASSERT_EFI_ERROR (Status);
-
-  if (Option->LoadOptionsSize != 0) {
-    ImageInfo->LoadOptionsSize  = Option->LoadOptionsSize;
-    ImageInfo->LoadOptions      = Option->LoadOptions;
-  }
-
-  //
-  // Clean to NULL because the image is loaded directly from the firmwares boot manager.
-  //
-  ImageInfo->ParentHandle = NULL;
-
-  //
-  // Before calling the image, enable the Watchdog Timer for
-  // the 5 Minute period
-  //
-  gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);
-
-  //
-  // Write boot to OS performance data for UEFI boot
-  //
-  PERF_CODE (
-    BmEndOfBdsPerfCode (NULL, NULL);
-  );
-
-  //
-  // Report status code for OS Loader StartImage.
-  //
-  REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderStart));
-
-  Status = gBS->StartImage (ImageHandle, ExitDataSize, ExitData);
-  DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Image Return Status = %r\n", Status));
-  if (EFI_ERROR (Status)) {
-    //
-    // Report Status Code to indicate that boot failure
-    //
-    REPORT_STATUS_CODE (
-      EFI_ERROR_CODE | EFI_ERROR_MINOR,
-      (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED)
-      );
-  }
-
-  //
-  // Clear the Watchdog Timer after the image returns
-  //
-  gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);
-
-Done:
-  //
-  // Set Logo status invalid after trying one boot option
-  //
-  BootLogo = NULL;
-  StatusLogo = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);
-  if (!EFI_ERROR (StatusLogo) && (BootLogo != NULL)) {
-    BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);
-  }
-
-  //
-  // Clear Boot Current
-  // Deleting variable with current implementation shouldn't fail.
-  //
-  gRT->SetVariable (
-        L"BootCurrent",
-        &gEfiGlobalVariableGuid,
-        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
-        0,
-        NULL
-        );
-
-  return Status;
-}
-
-
-/**
-  Expand a device path that starts with a hard drive media device path node to be a
-  full device path that includes the full hardware path to the device. We need
-  to do this so it can be booted. As an optimization the front match (the part point
-  to the partition node. E.g. ACPI() /PCI()/ATA()/Partition() ) is saved in a variable
-  so a connect all is not required on every boot. All successful history device path
-  which point to partition node (the front part) will be saved.
-
-  @param  HardDriveDevicePath    EFI Device Path to boot, if it starts with a hard
-                                 drive media device path.
-  @return A Pointer to the full device path or NULL if a valid Hard Drive devic path
-          cannot be found.
-
-**/
-EFI_DEVICE_PATH_PROTOCOL *
-EFIAPI
-BdsExpandPartitionPartialDevicePathToFull (
-  IN  HARDDRIVE_DEVICE_PATH      *HardDriveDevicePath
-  )
-{
-  EFI_STATUS                Status;
-  UINTN                     BlockIoHandleCount;
-  EFI_HANDLE                *BlockIoBuffer;
-  EFI_DEVICE_PATH_PROTOCOL  *FullDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *BlockIoDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  UINTN                     Index;
-  UINTN                     InstanceNum;
-  EFI_DEVICE_PATH_PROTOCOL  *CachedDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *TempNewDevicePath;
-  UINTN                     CachedDevicePathSize;
-  BOOLEAN                   DeviceExist;
-  BOOLEAN                   NeedAdjust;
-  EFI_DEVICE_PATH_PROTOCOL  *Instance;
-  UINTN                     Size;
-
-  FullDevicePath = NULL;
-  //
-  // Check if there is prestore HD_BOOT_DEVICE_PATH_VARIABLE_NAME variable.
-  // If exist, search the front path which point to partition node in the variable instants.
-  // If fail to find or HD_BOOT_DEVICE_PATH_VARIABLE_NAME not exist, reconnect all and search in all system
-  //
-  GetVariable2 (
-    HD_BOOT_DEVICE_PATH_VARIABLE_NAME,
-    &gHdBootDevicePathVariablGuid,
-    (VOID **) &CachedDevicePath,
-    &CachedDevicePathSize
-    );
-
-  //
-  // Delete the invalid HD_BOOT_DEVICE_PATH_VARIABLE_NAME variable.
-  //
-  if ((CachedDevicePath != NULL) && !IsDevicePathValid (CachedDevicePath, CachedDevicePathSize)) {
-    FreePool (CachedDevicePath);
-    CachedDevicePath = NULL;
-    Status = gRT->SetVariable (
-                    HD_BOOT_DEVICE_PATH_VARIABLE_NAME,
-                    &gHdBootDevicePathVariablGuid,
-                    0,
-                    0,
-                    NULL
-                    );
-    ASSERT_EFI_ERROR (Status);
-  }
-
-  if (CachedDevicePath != NULL) {
-    TempNewDevicePath = CachedDevicePath;
-    DeviceExist = FALSE;
-    NeedAdjust = FALSE;
-    do {
-      //
-      // Check every instance of the variable
-      // First, check whether the instance contain the partition node, which is needed for distinguishing  multi
-      // partial partition boot option. Second, check whether the instance could be connected.
-      //
-      Instance  = GetNextDevicePathInstance (&TempNewDevicePath, &Size);
-      if (MatchPartitionDevicePathNode (Instance, HardDriveDevicePath)) {
-        //
-        // Connect the device path instance, the device path point to hard drive media device path node
-        // e.g. ACPI() /PCI()/ATA()/Partition()
-        //
-        Status = BdsLibConnectDevicePath (Instance);
-        if (!EFI_ERROR (Status)) {
-          DeviceExist = TRUE;
-          break;
-        }
-      }
-      //
-      // Come here means the first instance is not matched
-      //
-      NeedAdjust = TRUE;
-      FreePool(Instance);
-    } while (TempNewDevicePath != NULL);
-
-    if (DeviceExist) {
-      //
-      // Find the matched device path.
-      // Append the file path information from the boot option and return the fully expanded device path.
-      //
-      DevicePath     = NextDevicePathNode ((EFI_DEVICE_PATH_PROTOCOL *) HardDriveDevicePath);
-      FullDevicePath = AppendDevicePath (Instance, DevicePath);
-
-      //
-      // Adjust the HD_BOOT_DEVICE_PATH_VARIABLE_NAME instances sequence if the matched one is not first one.
-      //
-      if (NeedAdjust) {
-        //
-        // First delete the matched instance.
-        //
-        TempNewDevicePath = CachedDevicePath;
-        CachedDevicePath  = BdsLibDelPartMatchInstance (CachedDevicePath, Instance );
-        FreePool (TempNewDevicePath);
-
-        //
-        // Second, append the remaining path after the matched instance
-        //
-        TempNewDevicePath = CachedDevicePath;
-        CachedDevicePath = AppendDevicePathInstance (Instance, CachedDevicePath );
-        FreePool (TempNewDevicePath);
-        //
-        // Save the matching Device Path so we don't need to do a connect all next time
-        // Failure to set the variable only impacts the performance when next time expanding the short-form device path.
-        //
-        Status = gRT->SetVariable (
-                        HD_BOOT_DEVICE_PATH_VARIABLE_NAME,
-                        &gHdBootDevicePathVariablGuid,
-                        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                        GetDevicePathSize (CachedDevicePath),
-                        CachedDevicePath
-                        );
-      }
-
-      FreePool (Instance);
-      FreePool (CachedDevicePath);
-      return FullDevicePath;
-    }
-  }
-
-  //
-  // If we get here we fail to find or HD_BOOT_DEVICE_PATH_VARIABLE_NAME not exist, and now we need
-  // to search all devices in the system for a matched partition
-  //
-  BdsLibConnectAllDriversToAllControllers ();
-  Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &BlockIoHandleCount, &BlockIoBuffer);
-  if (EFI_ERROR (Status) || BlockIoHandleCount == 0 || BlockIoBuffer == NULL) {
-    //
-    // If there was an error or there are no device handles that support
-    // the BLOCK_IO Protocol, then return.
-    //
-    return NULL;
-  }
-  //
-  // Loop through all the device handles that support the BLOCK_IO Protocol
-  //
-  for (Index = 0; Index < BlockIoHandleCount; Index++) {
-
-    Status = gBS->HandleProtocol (BlockIoBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID *) &BlockIoDevicePath);
-    if (EFI_ERROR (Status) || BlockIoDevicePath == NULL) {
-      continue;
-    }
-
-    if (MatchPartitionDevicePathNode (BlockIoDevicePath, HardDriveDevicePath)) {
-      //
-      // Find the matched partition device path
-      //
-      DevicePath    = NextDevicePathNode ((EFI_DEVICE_PATH_PROTOCOL *) HardDriveDevicePath);
-      FullDevicePath = AppendDevicePath (BlockIoDevicePath, DevicePath);
-
-      //
-      // Save the matched partition device path in HD_BOOT_DEVICE_PATH_VARIABLE_NAME variable
-      //
-      if (CachedDevicePath != NULL) {
-        //
-        // Save the matched partition device path as first instance of HD_BOOT_DEVICE_PATH_VARIABLE_NAME variable
-        //
-        if (BdsLibMatchDevicePaths (CachedDevicePath, BlockIoDevicePath)) {
-          TempNewDevicePath = CachedDevicePath;
-          CachedDevicePath = BdsLibDelPartMatchInstance (CachedDevicePath, BlockIoDevicePath);
-          FreePool(TempNewDevicePath);
-        }
-
-        if (CachedDevicePath != NULL) {
-          TempNewDevicePath = CachedDevicePath;
-          CachedDevicePath = AppendDevicePathInstance (BlockIoDevicePath, CachedDevicePath);
-          FreePool(TempNewDevicePath);
-        } else {
-          CachedDevicePath = DuplicateDevicePath (BlockIoDevicePath);
-        }
-
-        //
-        // Here limit the device path instance number to 12, which is max number for a system support 3 IDE controller
-        // If the user try to boot many OS in different HDs or partitions, in theory, 
-        // the HD_BOOT_DEVICE_PATH_VARIABLE_NAME variable maybe become larger and larger.
-        //
-        InstanceNum = 0;
-        ASSERT (CachedDevicePath != NULL);
-        TempNewDevicePath = CachedDevicePath;
-        while (!IsDevicePathEnd (TempNewDevicePath)) {
-          TempNewDevicePath = NextDevicePathNode (TempNewDevicePath);
-          //
-          // Parse one instance
-          //
-          while (!IsDevicePathEndType (TempNewDevicePath)) {
-            TempNewDevicePath = NextDevicePathNode (TempNewDevicePath);
-          }
-          InstanceNum++;
-          //
-          // If the CachedDevicePath variable contain too much instance, only remain 12 instances.
-          //
-          if (InstanceNum >= 12) {
-            SetDevicePathEndNode (TempNewDevicePath);
-            break;
-          }
-        }
-      } else {
-        CachedDevicePath = DuplicateDevicePath (BlockIoDevicePath);
-      }
-
-      //
-      // Save the matching Device Path so we don't need to do a connect all next time
-      // Failure to set the variable only impacts the performance when next time expanding the short-form device path.
-      //
-      Status = gRT->SetVariable (
-                      HD_BOOT_DEVICE_PATH_VARIABLE_NAME,
-                      &gHdBootDevicePathVariablGuid,
-                      EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                      GetDevicePathSize (CachedDevicePath),
-                      CachedDevicePath
-                      );
-
-      break;
-    }
-  }
-
-  if (CachedDevicePath != NULL) {
-    FreePool (CachedDevicePath);
-  }
-  if (BlockIoBuffer != NULL) {
-    FreePool (BlockIoBuffer);
-  }
-  return FullDevicePath;
-}
-
-/**
-  Check whether there is a instance in BlockIoDevicePath, which contain multi device path
-  instances, has the same partition node with HardDriveDevicePath device path
-
-  @param  BlockIoDevicePath      Multi device path instances which need to check
-  @param  HardDriveDevicePath    A device path which starts with a hard drive media
-                                 device path.
-
-  @retval TRUE                   There is a matched device path instance.
-  @retval FALSE                  There is no matched device path instance.
-
-**/
-BOOLEAN
-EFIAPI
-MatchPartitionDevicePathNode (
-  IN  EFI_DEVICE_PATH_PROTOCOL   *BlockIoDevicePath,
-  IN  HARDDRIVE_DEVICE_PATH      *HardDriveDevicePath
-  )
-{
-  HARDDRIVE_DEVICE_PATH     *TmpHdPath;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  BOOLEAN                   Match;
-  EFI_DEVICE_PATH_PROTOCOL  *BlockIoHdDevicePathNode;
-
-  if ((BlockIoDevicePath == NULL) || (HardDriveDevicePath == NULL)) {
-    return FALSE;
-  }
-
-  //
-  // Make PreviousDevicePath == the device path node before the end node
-  //
-  DevicePath              = BlockIoDevicePath;
-  BlockIoHdDevicePathNode = NULL;
-
-  //
-  // find the partition device path node
-  //
-  while (!IsDevicePathEnd (DevicePath)) {
-    if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) &&
-        (DevicePathSubType (DevicePath) == MEDIA_HARDDRIVE_DP)
-        ) {
-      BlockIoHdDevicePathNode = DevicePath;
-      break;
-    }
-
-    DevicePath = NextDevicePathNode (DevicePath);
-  }
-
-  if (BlockIoHdDevicePathNode == NULL) {
-    return FALSE;
-  }
-  //
-  // See if the harddrive device path in blockio matches the orig Hard Drive Node
-  //
-  TmpHdPath = (HARDDRIVE_DEVICE_PATH *) BlockIoHdDevicePathNode;
-  Match = FALSE;
-
-  //
-  // Check for the match
-  //
-  if ((TmpHdPath->MBRType == HardDriveDevicePath->MBRType) &&
-      (TmpHdPath->SignatureType == HardDriveDevicePath->SignatureType)) {
-    switch (TmpHdPath->SignatureType) {
-    case SIGNATURE_TYPE_GUID:
-      Match = CompareGuid ((EFI_GUID *)TmpHdPath->Signature, (EFI_GUID *)HardDriveDevicePath->Signature);
-      break;
-    case SIGNATURE_TYPE_MBR:
-      Match = (BOOLEAN)(*((UINT32 *)(&(TmpHdPath->Signature[0]))) == ReadUnaligned32((UINT32 *)(&(HardDriveDevicePath->Signature[0]))));
-      break;
-    default:
-      Match = FALSE;
-      break;
-    }
-  }
-
-  return Match;
-}
-
-/**
-  Delete the boot option associated with the handle passed in.
-
-  @param  Handle                 The handle which present the device path to create
-                                 boot option
-
-  @retval EFI_SUCCESS            Delete the boot option success
-  @retval EFI_NOT_FOUND          If the Device Path is not found in the system
-  @retval EFI_OUT_OF_RESOURCES   Lack of memory resource
-  @retval Other                  Error return value from SetVariable()
-
-**/
-EFI_STATUS
-BdsLibDeleteOptionFromHandle (
-  IN  EFI_HANDLE                 Handle
-  )
-{
-  UINT16                    *BootOrder;
-  UINT8                     *BootOptionVar;
-  UINTN                     BootOrderSize;
-  UINTN                     BootOptionSize;
-  EFI_STATUS                Status;
-  UINTN                     Index;
-  UINT16                    BootOption[BOOT_OPTION_MAX_CHAR];
-  UINTN                     DevicePathSize;
-  UINTN                     OptionDevicePathSize;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *OptionDevicePath;
-  UINT8                     *TempPtr;
-
-  Status        = EFI_SUCCESS;
-  BootOrder     = NULL;
-  BootOrderSize = 0;
-
-  //
-  // Check "BootOrder" variable, if no, means there is no any boot order.
-  //
-  BootOrder = BdsLibGetVariableAndSize (
-                L"BootOrder",
-                &gEfiGlobalVariableGuid,
-                &BootOrderSize
-                );
-  if (BootOrder == NULL) {
-    return EFI_NOT_FOUND;
-  }
-
-  //
-  // Convert device handle to device path protocol instance
-  //
-  DevicePath = DevicePathFromHandle (Handle);
-  if (DevicePath == NULL) {
-    return EFI_NOT_FOUND;
-  }
-  DevicePathSize = GetDevicePathSize (DevicePath);
-
-  //
-  // Loop all boot order variable and find the matching device path
-  //
-  Index = 0;
-  while (Index < BootOrderSize / sizeof (UINT16)) {
-    UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);
-    BootOptionVar = BdsLibGetVariableAndSize (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      &BootOptionSize
-                      );
-
-    if (BootOptionVar == NULL) {
-      FreePool (BootOrder);
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    if (!ValidateOption(BootOptionVar, BootOptionSize)) {
-      BdsDeleteBootOption (BootOrder[Index], BootOrder, &BootOrderSize);
-      FreePool (BootOptionVar);
-      Index++;
-      continue;
-    }
-
-    TempPtr = BootOptionVar;
-    TempPtr += sizeof (UINT32) + sizeof (UINT16);
-    TempPtr += StrSize ((CHAR16 *) TempPtr);
-    OptionDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;
-    OptionDevicePathSize = GetDevicePathSize (OptionDevicePath);
-
-    //
-    // Check whether the device path match
-    //
-    if ((OptionDevicePathSize == DevicePathSize) &&
-        (CompareMem (DevicePath, OptionDevicePath, DevicePathSize) == 0)) {
-      BdsDeleteBootOption (BootOrder[Index], BootOrder, &BootOrderSize);
-      FreePool (BootOptionVar);
-      break;
-    }
-
-    FreePool (BootOptionVar);
-    Index++;
-  }
-
-  //
-  // Adjust number of boot option for "BootOrder" variable.
-  //
-  Status = gRT->SetVariable (
-                  L"BootOrder",
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  BootOrderSize,
-                  BootOrder
-                  );
-  //
-  // Shrinking variable with existing variable implementation shouldn't fail.
-  //
-  ASSERT_EFI_ERROR (Status);
-
-  FreePool (BootOrder);
-
-  return Status;
-}
-
-
-/**
-  Delete all invalid EFI boot options.
-
-  @retval EFI_SUCCESS            Delete all invalid boot option success
-  @retval EFI_NOT_FOUND          Variable "BootOrder" is not found
-  @retval EFI_OUT_OF_RESOURCES   Lack of memory resource
-  @retval Other                  Error return value from SetVariable()
-
-**/
-EFI_STATUS
-BdsDeleteAllInvalidEfiBootOption (
-  VOID
-  )
-{
-  UINT16                    *BootOrder;
-  UINT8                     *BootOptionVar;
-  UINTN                     BootOrderSize;
-  UINTN                     BootOptionSize;
-  EFI_STATUS                Status;
-  UINTN                     Index;
-  UINTN                     Index2;
-  UINT16                    BootOption[BOOT_OPTION_MAX_CHAR];
-  EFI_DEVICE_PATH_PROTOCOL  *OptionDevicePath;
-  UINT8                     *TempPtr;
-  CHAR16                    *Description;
-  BOOLEAN                   Corrupted;
-
-  Status           = EFI_SUCCESS;
-  BootOrder        = NULL;
-  Description      = NULL;
-  OptionDevicePath = NULL;
-  BootOrderSize    = 0;
-  Corrupted        = FALSE;
-
-  //
-  // Check "BootOrder" variable firstly, this variable hold the number of boot options
-  //
-  BootOrder = BdsLibGetVariableAndSize (
-                L"BootOrder",
-                &gEfiGlobalVariableGuid,
-                &BootOrderSize
-                );
-  if (NULL == BootOrder) {
-    return EFI_NOT_FOUND;
-  }
-
-  Index = 0;
-  while (Index < BootOrderSize / sizeof (UINT16)) {
-    UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);
-    BootOptionVar = BdsLibGetVariableAndSize (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      &BootOptionSize
-                      );
-    if (NULL == BootOptionVar) {
-      FreePool (BootOrder);
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    if (!ValidateOption(BootOptionVar, BootOptionSize)) {
-      Corrupted = TRUE;
-    } else {
-      TempPtr = BootOptionVar;
-      TempPtr += sizeof (UINT32) + sizeof (UINT16);
-      Description = (CHAR16 *) TempPtr;
-      TempPtr += StrSize ((CHAR16 *) TempPtr);
-      OptionDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;
-
-      //
-      // Skip legacy boot option (BBS boot device)
-      //
-      if ((DevicePathType (OptionDevicePath) == BBS_DEVICE_PATH) &&
-          (DevicePathSubType (OptionDevicePath) == BBS_BBS_DP)) {
-        FreePool (BootOptionVar);
-        Index++;
-        continue;
-      }
-    }
-
-    if (Corrupted || !BdsLibIsValidEFIBootOptDevicePathExt (OptionDevicePath, FALSE, Description)) {
-      //
-      // Delete this invalid boot option "Boot####"
-      //
-      Status = gRT->SetVariable (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                      0,
-                      NULL
-                      );
-      //
-      // Deleting variable with current variable implementation shouldn't fail.
-      //
-      ASSERT_EFI_ERROR (Status);
-      //
-      // Mark this boot option in boot order as deleted
-      //
-      BootOrder[Index] = 0xffff;
-      Corrupted        = FALSE;
-    }
-
-    FreePool (BootOptionVar);
-    Index++;
-  }
-
-  //
-  // Adjust boot order array
-  //
-  Index2 = 0;
-  for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {
-    if (BootOrder[Index] != 0xffff) {
-      BootOrder[Index2] = BootOrder[Index];
-      Index2 ++;
-    }
-  }
-  Status = gRT->SetVariable (
-                  L"BootOrder",
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  Index2 * sizeof (UINT16),
-                  BootOrder
-                  );
-  //
-  // Shrinking variable with current variable implementation shouldn't fail.
-  //
-  ASSERT_EFI_ERROR (Status);
-
-  FreePool (BootOrder);
-
-  return Status;
-}
-
-
-/**
-  For EFI boot option, BDS separate them as six types:
-  1. Network - The boot option points to the SimpleNetworkProtocol device.
-               Bds will try to automatically create this type boot option when enumerate.
-  2. Shell   - The boot option points to internal flash shell.
-               Bds will try to automatically create this type boot option when enumerate.
-  3. Removable BlockIo      - The boot option only points to the removable media
-                              device, like USB flash disk, DVD, Floppy etc.
-                              These device should contain a *removable* blockIo
-                              protocol in their device handle.
-                              Bds will try to automatically create this type boot option
-                              when enumerate.
-  4. Fixed BlockIo          - The boot option only points to a Fixed blockIo device,
-                              like HardDisk.
-                              These device should contain a *fixed* blockIo
-                              protocol in their device handle.
-                              BDS will skip fixed blockIo devices, and NOT
-                              automatically create boot option for them. But BDS
-                              will help to delete those fixed blockIo boot option,
-                              whose description rule conflict with other auto-created
-                              boot options.
-  5. Non-BlockIo Simplefile - The boot option points to a device whose handle
-                              has SimpleFileSystem Protocol, but has no blockio
-                              protocol. These devices do not offer blockIo
-                              protocol, but BDS still can get the
-                              \EFI\BOOT\boot{machinename}.EFI by SimpleFileSystem
-                              Protocol.
-  6. File    - The boot option points to a file. These boot options are usually
-               created by user manually or OS loader. BDS will not delete or modify
-               these boot options.
-
-  This function will enumerate all possible boot device in the system, and
-  automatically create boot options for Network, Shell, Removable BlockIo,
-  and Non-BlockIo Simplefile devices.
-  It will only execute once of every boot.
-
-  @param  BdsBootOptionList      The header of the link list which indexed all
-                                 current boot options
-
-  @retval EFI_SUCCESS            Finished all the boot device enumerate and create
-                                 the boot option base on that boot device
-
-  @retval EFI_OUT_OF_RESOURCES   Failed to enumerate the boot device and create the boot option list
-**/
-EFI_STATUS
-EFIAPI
-BdsLibEnumerateAllBootOption (
-  IN OUT LIST_ENTRY          *BdsBootOptionList
-  )
-{
-  EFI_STATUS                    Status;
-  UINT16                        FloppyNumber;
-  UINT16                        HarddriveNumber;
-  UINT16                        CdromNumber;
-  UINT16                        UsbNumber;
-  UINT16                        MiscNumber;
-  UINT16                        ScsiNumber;
-  UINT16                        NonBlockNumber;
-  UINTN                         NumberBlockIoHandles;
-  EFI_HANDLE                    *BlockIoHandles;
-  EFI_BLOCK_IO_PROTOCOL         *BlkIo;
-  BOOLEAN                       Removable[2];
-  UINTN                         RemovableIndex;
-  UINTN                         Index;
-  UINTN                         NumOfLoadFileHandles;
-  EFI_HANDLE                    *LoadFileHandles;
-  UINTN                         FvHandleCount;
-  EFI_HANDLE                    *FvHandleBuffer;
-  EFI_FV_FILETYPE               Type;
-  UINTN                         Size;
-  EFI_FV_FILE_ATTRIBUTES        Attributes;
-  UINT32                        AuthenticationStatus;
-  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
-  EFI_DEVICE_PATH_PROTOCOL      *DevicePath;
-  UINTN                         DevicePathType;
-  CHAR16                        Buffer[40];
-  EFI_HANDLE                    *FileSystemHandles;
-  UINTN                         NumberFileSystemHandles;
-  BOOLEAN                       NeedDelete;
-  EFI_IMAGE_DOS_HEADER          DosHeader;
-  CHAR8                         *PlatLang;
-  CHAR8                         *LastLang;
-  EFI_IMAGE_OPTIONAL_HEADER_UNION       HdrData;
-  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;
-  CHAR16                        *MacStr;
-  CHAR16                        *IPverStr;
-  EFI_HANDLE                    *NetworkHandles;
-  UINTN                         BufferSize;
-
-  FloppyNumber    = 0;
-  HarddriveNumber = 0;
-  CdromNumber     = 0;
-  UsbNumber       = 0;
-  MiscNumber      = 0;
-  ScsiNumber      = 0;
-  PlatLang        = NULL;
-  LastLang        = NULL;
-  ZeroMem (Buffer, sizeof (Buffer));
-
-  //
-  // If the boot device enumerate happened, just get the boot
-  // device from the boot order variable
-  //
-  if (mEnumBootDevice) {
-    GetVariable2 (LAST_ENUM_LANGUAGE_VARIABLE_NAME, &gLastEnumLangGuid, (VOID**)&LastLang, NULL);
-    GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&PlatLang, NULL);
-    ASSERT (PlatLang != NULL);
-    if ((LastLang != NULL) && (AsciiStrCmp (LastLang, PlatLang) == 0)) {
-      Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");
-      FreePool (LastLang);
-      FreePool (PlatLang);
-      return Status;
-    } else {
-      Status = gRT->SetVariable (
-        LAST_ENUM_LANGUAGE_VARIABLE_NAME,
-        &gLastEnumLangGuid,
-        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-        AsciiStrSize (PlatLang),
-        PlatLang
-        );
-      //
-      // Failure to set the variable only impacts the performance next time enumerating the boot options.
-      //
-
-      if (LastLang != NULL) {
-        FreePool (LastLang);
-      }
-      FreePool (PlatLang);
-    }
-  }
-
-  //
-  // Notes: this dirty code is to get the legacy boot option from the
-  // BBS table and create to variable as the EFI boot option, it should
-  // be removed after the CSM can provide legacy boot option directly
-  //
-  REFRESH_LEGACY_BOOT_OPTIONS;
-
-  //
-  // Delete invalid boot option
-  //
-  BdsDeleteAllInvalidEfiBootOption ();
-
-  //
-  // Parse removable media followed by fixed media.
-  // The Removable[] array is used by the for-loop below to create removable media boot options 
-  // at first, and then to create fixed media boot options.
-  //
-  Removable[0]  = FALSE;
-  Removable[1]  = TRUE;
-
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiBlockIoProtocolGuid,
-        NULL,
-        &NumberBlockIoHandles,
-        &BlockIoHandles
-        );
-
-  for (RemovableIndex = 0; RemovableIndex < 2; RemovableIndex++) {
-    for (Index = 0; Index < NumberBlockIoHandles; Index++) {
-      Status = gBS->HandleProtocol (
-                      BlockIoHandles[Index],
-                      &gEfiBlockIoProtocolGuid,
-                      (VOID **) &BlkIo
-                      );
-      //
-      // skip the logical partition
-      //
-      if (EFI_ERROR (Status) || BlkIo->Media->LogicalPartition) {
-        continue;
-      }
-
-      //
-      // firstly fixed block io then the removable block io
-      //
-      if (BlkIo->Media->RemovableMedia == Removable[RemovableIndex]) {
-        continue;
-      }
-      DevicePath  = DevicePathFromHandle (BlockIoHandles[Index]);
-      DevicePathType = BdsGetBootTypeFromDevicePath (DevicePath);
-
-      switch (DevicePathType) {
-      case BDS_EFI_ACPI_FLOPPY_BOOT:
-        if (FloppyNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)), FloppyNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        FloppyNumber++;
-        break;
-
-      //
-      // Assume a removable SATA device should be the DVD/CD device, a fixed SATA device should be the Hard Drive device.
-      //
-      case BDS_EFI_MESSAGE_ATAPI_BOOT:
-      case BDS_EFI_MESSAGE_SATA_BOOT:
-        if (BlkIo->Media->RemovableMedia) {
-          if (CdromNumber != 0) {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)), CdromNumber);
-          } else {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)));
-          }
-          CdromNumber++;
-        } else {
-          if (HarddriveNumber != 0) {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)), HarddriveNumber);
-          } else {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)));
-          }
-          HarddriveNumber++;
-        }
-        DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Buffer: %S\n", Buffer));
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        break;
-
-      case BDS_EFI_MESSAGE_USB_DEVICE_BOOT:
-        if (UsbNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)), UsbNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        UsbNumber++;
-        break;
-
-      case BDS_EFI_MESSAGE_SCSI_BOOT:
-        if (ScsiNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)), ScsiNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        ScsiNumber++;
-        break;
-
-      case BDS_EFI_MESSAGE_MISC_BOOT:
-      default:
-        if (MiscNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)), MiscNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        MiscNumber++;
-        break;
-      }
-    }
-  }
-
-  if (NumberBlockIoHandles != 0) {
-    FreePool (BlockIoHandles);
-  }
-
-  //
-  // If there is simple file protocol which does not consume block Io protocol, create a boot option for it here.
-  //
-  NonBlockNumber = 0;
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiSimpleFileSystemProtocolGuid,
-        NULL,
-        &NumberFileSystemHandles,
-        &FileSystemHandles
-        );
-  for (Index = 0; Index < NumberFileSystemHandles; Index++) {
-    Status = gBS->HandleProtocol (
-                    FileSystemHandles[Index],
-                    &gEfiBlockIoProtocolGuid,
-                    (VOID **) &BlkIo
-                    );
-     if (!EFI_ERROR (Status)) {
-      //
-      //  Skip if the file system handle supports a BlkIo protocol,
-      //
-      continue;
-    }
-
-    //
-    // Do the removable Media thing. \EFI\BOOT\boot{machinename}.EFI
-    //  machinename is ia32, ia64, x64, ...
-    //
-    Hdr.Union  = &HdrData;
-    NeedDelete = TRUE;
-    Status     = BdsLibGetImageHeader (
-                   FileSystemHandles[Index],
-                   EFI_REMOVABLE_MEDIA_FILE_NAME,
-                   &DosHeader,
-                   Hdr
-                   );
-    if (!EFI_ERROR (Status) &&
-        EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Hdr.Pe32->FileHeader.Machine) &&
-        Hdr.Pe32->OptionalHeader.Subsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {
-      NeedDelete = FALSE;
-    }
-
-    if (NeedDelete) {
-      //
-      // No such file or the file is not a EFI application, delete this boot option
-      //
-      BdsLibDeleteOptionFromHandle (FileSystemHandles[Index]);
-    } else {
-      if (NonBlockNumber != 0) {
-        UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)), NonBlockNumber);
-      } else {
-        UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)));
-      }
-      BdsLibBuildOptionFromHandle (FileSystemHandles[Index], BdsBootOptionList, Buffer);
-      NonBlockNumber++;
-    }
-  }
-
-  if (NumberFileSystemHandles != 0) {
-    FreePool (FileSystemHandles);
-  }
-
-  //
-  // Parse Network Boot Device
-  //
-  NumOfLoadFileHandles = 0;
-  //
-  // Search Load File protocol for PXE boot option.
-  //
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiLoadFileProtocolGuid,
-        NULL,
-        &NumOfLoadFileHandles,
-        &LoadFileHandles
-        );
-
-  for (Index = 0; Index < NumOfLoadFileHandles; Index++) {
-
-//
-//Locate EFI_DEVICE_PATH_PROTOCOL to dynamically get IPv4/IPv6 protocol information.
-//
-
- Status = gBS->HandleProtocol (
-                  LoadFileHandles[Index],
-                  &gEfiDevicePathProtocolGuid,
-                  (VOID **) &DevicePath
-                  );
-  
- ASSERT_EFI_ERROR (Status);
-
-  while (!IsDevicePathEnd (DevicePath)) {
-    if ((DevicePath->Type == MESSAGING_DEVICE_PATH) &&
-        (DevicePath->SubType == MSG_IPv4_DP)) {
-
-  //
-  //Get handle infomation
-  //
-  BufferSize = 0;
-  NetworkHandles = NULL;
-  Status = gBS->LocateHandle (
-                  ByProtocol, 
-                  &gEfiSimpleNetworkProtocolGuid,
-                  NULL,
-                  &BufferSize,
-                  NetworkHandles
-                  );
-
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    NetworkHandles = AllocateZeroPool(BufferSize);
-    if (NetworkHandles == NULL) {
-      return (EFI_OUT_OF_RESOURCES);
-    }
-    Status = gBS->LocateHandle(
-                    ByProtocol,
-                    &gEfiSimpleNetworkProtocolGuid,
-                    NULL,
-                    &BufferSize,
-                    NetworkHandles
-                    );
- }
-               
-  //
-  //Get the MAC string
-  //
-  Status = NetLibGetMacString (
-             *NetworkHandles,
-             NULL,
-             &MacStr
-             );
-  if (EFI_ERROR (Status)) {	
-    return Status;
-  }
-  IPverStr = L" IPv4";
-  UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr);
-  break;
-  }
-    if((DevicePath->Type == MESSAGING_DEVICE_PATH) &&
-        (DevicePath->SubType == MSG_IPv6_DP)) {
-
-  //
-  //Get handle infomation
-  //
-  BufferSize = 0;
-  NetworkHandles = NULL;
-  Status = gBS->LocateHandle (
-                  ByProtocol, 
-                  &gEfiSimpleNetworkProtocolGuid,
-                  NULL,
-                  &BufferSize,
-                  NetworkHandles
-                  );
-
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    NetworkHandles = AllocateZeroPool(BufferSize);
-    if (NetworkHandles == NULL) {
-       return (EFI_OUT_OF_RESOURCES);
-    }
-    Status = gBS->LocateHandle(
-                    ByProtocol,
-                    &gEfiSimpleNetworkProtocolGuid,
-                    NULL,
-                    &BufferSize,
-                    NetworkHandles
-                    );
- }
-                    
-  //
-  //Get the MAC string
-  //
-  Status = NetLibGetMacString (
-             *NetworkHandles,
-             NULL,
-             &MacStr
-             );
-  if (EFI_ERROR (Status)) {	
-    return Status;
-  }
-      IPverStr = L" IPv6";
-      UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr);
-      break;
-    }
-    DevicePath = NextDevicePathNode (DevicePath);
-  }
-  
-    BdsLibBuildOptionFromHandle (LoadFileHandles[Index], BdsBootOptionList, Buffer);
-  }
-
-  if (NumOfLoadFileHandles != 0) {
-    FreePool (LoadFileHandles);
-  }
-
-  //
-  // Check if we have on flash shell
-  //
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiFirmwareVolume2ProtocolGuid,
-        NULL,
-        &FvHandleCount,
-        &FvHandleBuffer
-        );
-  for (Index = 0; Index < FvHandleCount; Index++) {
-    gBS->HandleProtocol (
-          FvHandleBuffer[Index],
-          &gEfiFirmwareVolume2ProtocolGuid,
-          (VOID **) &Fv
-          );
-
-    Status = Fv->ReadFile (
-                  Fv,
-                  &gUefiShellFileGuid,
-                  NULL,
-                  &Size,
-                  &Type,
-                  &Attributes,
-                  &AuthenticationStatus
-                  );
-    if (EFI_ERROR (Status)) {
-      //
-      // Skip if no shell file in the FV
-      //
-      continue;
-    }
-    //
-    // Build the shell boot option
-    //
-    BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList);
-  }
-
-  if (FvHandleCount != 0) {
-    FreePool (FvHandleBuffer);
-  }
-  //
-  // Make sure every boot only have one time
-  // boot device enumerate
-  //
-  Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");
-  mEnumBootDevice = TRUE;
-
-  return Status;
-}
-
-/**
-  Build the boot option with the handle parsed in
-
-  @param  Handle                 The handle which present the device path to create
-                                 boot option
-  @param  BdsBootOptionList      The header of the link list which indexed all
-                                 current boot options
-  @param  String                 The description of the boot option.
-
-**/
-VOID
-EFIAPI
-BdsLibBuildOptionFromHandle (
-  IN  EFI_HANDLE                 Handle,
-  IN  LIST_ENTRY                 *BdsBootOptionList,
-  IN  CHAR16                     *String
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-
-  DevicePath = DevicePathFromHandle (Handle);
-
-  //
-  // Create and register new boot option
-  //
-  BdsLibRegisterNewOption (BdsBootOptionList, DevicePath, String, L"BootOrder");
-}
-
-
-/**
-  Build the on flash shell boot option with the handle parsed in.
-
-  @param  Handle                 The handle which present the device path to create
-                                 on flash shell boot option
-  @param  BdsBootOptionList      The header of the link list which indexed all
-                                 current boot options
-
-**/
-VOID
-EFIAPI
-BdsLibBuildOptionFromShell (
-  IN EFI_HANDLE                  Handle,
-  IN OUT LIST_ENTRY              *BdsBootOptionList
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL          *DevicePath;
-  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH ShellNode;
-
-  DevicePath = DevicePathFromHandle (Handle);
-
-  //
-  // Build the shell device path
-  //
-  EfiInitializeFwVolDevicepathNode (&ShellNode, &gUefiShellFileGuid);
-
-  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *) &ShellNode);
-
-  //
-  // Create and register the shell boot option
-  //
-  BdsLibRegisterNewOption (BdsBootOptionList, DevicePath, L"EFI Internal Shell", L"BootOrder");
-
-}
-
-/**
-  Boot from the UEFI spec defined "BootNext" variable.
-
-**/
-VOID
-EFIAPI
-BdsLibBootNext (
-  VOID
-  )
-{
-  EFI_STATUS        Status;
-  UINT16            *BootNext;
-  UINTN             BootNextSize;
-  CHAR16            Buffer[20];
-  BDS_COMMON_OPTION *BootOption;
-  LIST_ENTRY        TempList;
-  UINTN             ExitDataSize;
-  CHAR16            *ExitData;
-
-  //
-  // Init the boot option name buffer and temp link list
-  //
-  InitializeListHead (&TempList);
-  ZeroMem (Buffer, sizeof (Buffer));
-
-  BootNext = BdsLibGetVariableAndSize (
-              L"BootNext",
-              &gEfiGlobalVariableGuid,
-              &BootNextSize
-              );
-
-  //
-  // Clear the boot next variable first
-  //
-  if (BootNext != NULL) {
-    Status = gRT->SetVariable (
-                    L"BootNext",
-                    &gEfiGlobalVariableGuid,
-                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                    0,
-                    NULL
-                    );
-    //
-    // Deleting variable with current variable implementation shouldn't fail.
-    //
-    ASSERT_EFI_ERROR (Status);
-
-    //
-    // Start to build the boot option and try to boot
-    //
-    UnicodeSPrint (Buffer, sizeof (Buffer), L"Boot%04x", *BootNext);
-    BootOption = BdsLibVariableToOption (&TempList, Buffer);
-    ASSERT (BootOption != NULL);
-    BdsLibConnectDevicePath (BootOption->DevicePath);
-    BdsLibBootViaBootOption (BootOption, BootOption->DevicePath, &ExitDataSize, &ExitData);
-    FreePool(BootOption);
-    FreePool(BootNext);
-  }
-
-}
-
-/**
-  Return the bootable media handle.
-  First, check the device is connected
-  Second, check whether the device path point to a device which support SimpleFileSystemProtocol,
-  Third, detect the the default boot file in the Media, and return the removable Media handle.
-
-  @param  DevicePath  Device Path to a  bootable device
-
-  @return  The bootable media handle. If the media on the DevicePath is not bootable, NULL will return.
-
-**/
-EFI_HANDLE
-EFIAPI
-BdsLibGetBootableHandle (
-  IN  EFI_DEVICE_PATH_PROTOCOL      *DevicePath
-  )
-{
-  EFI_STATUS                      Status;
-  EFI_TPL                         OldTpl;
-  EFI_DEVICE_PATH_PROTOCOL        *UpdatedDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL        *DupDevicePath;
-  EFI_HANDLE                      Handle;
-  EFI_BLOCK_IO_PROTOCOL           *BlockIo;
-  VOID                            *Buffer;
-  EFI_DEVICE_PATH_PROTOCOL        *TempDevicePath;
-  UINTN                           Size;
-  UINTN                           TempSize;
-  EFI_HANDLE                      ReturnHandle;
-  EFI_HANDLE                      *SimpleFileSystemHandles;
-
-  UINTN                           NumberSimpleFileSystemHandles;
-  UINTN                           Index;
-  EFI_IMAGE_DOS_HEADER            DosHeader;
-  EFI_IMAGE_OPTIONAL_HEADER_UNION       HdrData;
-  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;
-
-  UpdatedDevicePath = DevicePath;
-
-  //
-  // Enter to critical section to protect the acquired BlockIo instance 
-  // from getting released due to the USB mass storage hotplug event
-  //
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
-
-  //
-  // Check whether the device is connected
-  //
-  Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &UpdatedDevicePath, &Handle);
-  if (EFI_ERROR (Status)) {
-    //
-    // Skip the case that the boot option point to a simple file protocol which does not consume block Io protocol,
-    //
-    Status = gBS->LocateDevicePath (&gEfiSimpleFileSystemProtocolGuid, &UpdatedDevicePath, &Handle);
-    if (EFI_ERROR (Status)) {
-      //
-      // Fail to find the proper BlockIo and simple file protocol, maybe because device not present,  we need to connect it firstly
-      //
-      UpdatedDevicePath = DevicePath;
-      Status            = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &UpdatedDevicePath, &Handle);
-      gBS->ConnectController (Handle, NULL, NULL, TRUE);
-    }
-  } else {
-    //
-    // For removable device boot option, its contained device path only point to the removable device handle, 
-    // should make sure all its children handles (its child partion or media handles) are created and connected. 
-    //
-    gBS->ConnectController (Handle, NULL, NULL, TRUE); 
-    //
-    // Get BlockIo protocol and check removable attribute
-    //
-    Status = gBS->HandleProtocol (Handle, &gEfiBlockIoProtocolGuid, (VOID **)&BlockIo);
-    ASSERT_EFI_ERROR (Status);
-
-    //
-    // Issue a dummy read to the device to check for media change.
-    // When the removable media is changed, any Block IO read/write will
-    // cause the BlockIo protocol be reinstalled and EFI_MEDIA_CHANGED is
-    // returned. After the Block IO protocol is reinstalled, subsequent
-    // Block IO read/write will success.
-    //
-    Buffer = AllocatePool (BlockIo->Media->BlockSize);
-    if (Buffer != NULL) {
-      BlockIo->ReadBlocks (
-               BlockIo,
-               BlockIo->Media->MediaId,
-               0,
-               BlockIo->Media->BlockSize,
-               Buffer
-               );
-      FreePool(Buffer);
-    }
-  }
-
-  //
-  // Detect the the default boot file from removable Media
-  //
-
-  //
-  // If fail to get bootable handle specified by a USB boot option, the BDS should try to find other bootable device in the same USB bus
-  // Try to locate the USB node device path first, if fail then use its previous PCI node to search
-  //
-  DupDevicePath = DuplicateDevicePath (DevicePath);
-  ASSERT (DupDevicePath != NULL);
-
-  UpdatedDevicePath = DupDevicePath;
-  Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &UpdatedDevicePath, &Handle);
-  //
-  // if the resulting device path point to a usb node, and the usb node is a dummy node, should only let device path only point to the previous Pci node
-  // Acpi()/Pci()/Usb() --> Acpi()/Pci()
-  //
-  if ((DevicePathType (UpdatedDevicePath) == MESSAGING_DEVICE_PATH) &&
-      (DevicePathSubType (UpdatedDevicePath) == MSG_USB_DP)) {
-    //
-    // Remove the usb node, let the device path only point to PCI node
-    //
-    SetDevicePathEndNode (UpdatedDevicePath);
-    UpdatedDevicePath = DupDevicePath;
-  } else {
-    UpdatedDevicePath = DevicePath;
-  }
-
-  //
-  // Get the device path size of boot option
-  //
-  Size = GetDevicePathSize(UpdatedDevicePath) - sizeof (EFI_DEVICE_PATH_PROTOCOL); // minus the end node
-  ReturnHandle = NULL;
-  gBS->LocateHandleBuffer (
-      ByProtocol,
-      &gEfiSimpleFileSystemProtocolGuid,
-      NULL,
-      &NumberSimpleFileSystemHandles,
-      &SimpleFileSystemHandles
-      );
-  for (Index = 0; Index < NumberSimpleFileSystemHandles; Index++) {
-    //
-    // Get the device path size of SimpleFileSystem handle
-    //
-    TempDevicePath = DevicePathFromHandle (SimpleFileSystemHandles[Index]);
-    TempSize = GetDevicePathSize (TempDevicePath)- sizeof (EFI_DEVICE_PATH_PROTOCOL); // minus the end node
-    //
-    // Check whether the device path of boot option is part of the  SimpleFileSystem handle's device path
-    //
-    if (Size <= TempSize && CompareMem (TempDevicePath, UpdatedDevicePath, Size)==0) {
-      //
-      // Load the default boot file \EFI\BOOT\boot{machinename}.EFI from removable Media
-      //  machinename is ia32, ia64, x64, ...
-      //
-      Hdr.Union = &HdrData;
-      Status = BdsLibGetImageHeader (
-                 SimpleFileSystemHandles[Index],
-                 EFI_REMOVABLE_MEDIA_FILE_NAME,
-                 &DosHeader,
-                 Hdr
-                 );
-      if (!EFI_ERROR (Status) &&
-        EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Hdr.Pe32->FileHeader.Machine) &&
-        Hdr.Pe32->OptionalHeader.Subsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {
-        ReturnHandle = SimpleFileSystemHandles[Index];
-        break;
-      }
-    }
-  }
-
-  FreePool(DupDevicePath);
-
-  if (SimpleFileSystemHandles != NULL) {
-    FreePool(SimpleFileSystemHandles);
-  }
-
-  gBS->RestoreTPL (OldTpl);
-
-  return ReturnHandle;
-}
-
-/**
-  Check to see if the network cable is plugged in. If the DevicePath is not
-  connected it will be connected.
-
-  @param  DevicePath             Device Path to check
-
-  @retval TRUE                   DevicePath points to an Network that is connected
-  @retval FALSE                  DevicePath does not point to a bootable network
-
-**/
-BOOLEAN
-BdsLibNetworkBootWithMediaPresent (
-  IN  EFI_DEVICE_PATH_PROTOCOL      *DevicePath
-  )
-{
-  EFI_STATUS                      Status;
-  EFI_DEVICE_PATH_PROTOCOL        *UpdatedDevicePath;
-  EFI_HANDLE                      Handle;
-  EFI_SIMPLE_NETWORK_PROTOCOL     *Snp;
-  BOOLEAN                         MediaPresent;
-  UINT32                          InterruptStatus;
-
-  MediaPresent = FALSE;
-
-  UpdatedDevicePath = DevicePath;
-  //
-  // Locate Load File Protocol for PXE boot option first
-  //
-  Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &UpdatedDevicePath, &Handle);
-  if (EFI_ERROR (Status)) {
-    //
-    // Device not present so see if we need to connect it
-    //
-    Status = BdsLibConnectDevicePath (DevicePath);
-    if (!EFI_ERROR (Status)) {
-      //
-      // This one should work after we did the connect
-      //
-      Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &UpdatedDevicePath, &Handle);
-    }
-  }
-
-  if (!EFI_ERROR (Status)) {
-    Status = gBS->HandleProtocol (Handle, &gEfiSimpleNetworkProtocolGuid, (VOID **)&Snp);
-    if (EFI_ERROR (Status)) {
-      //
-      // Failed to open SNP from this handle, try to get SNP from parent handle
-      //
-      UpdatedDevicePath = DevicePathFromHandle (Handle);
-      if (UpdatedDevicePath != NULL) {
-        Status = gBS->LocateDevicePath (&gEfiSimpleNetworkProtocolGuid, &UpdatedDevicePath, &Handle);
-        if (!EFI_ERROR (Status)) {
-          //
-          // SNP handle found, get SNP from it
-          //
-          Status = gBS->HandleProtocol (Handle, &gEfiSimpleNetworkProtocolGuid, (VOID **) &Snp);
-        }
-      }
-    }
-
-    if (!EFI_ERROR (Status)) {
-      if (Snp->Mode->MediaPresentSupported) {
-        if (Snp->Mode->State == EfiSimpleNetworkInitialized) {
-          //
-          // Invoke Snp->GetStatus() to refresh the media status
-          //
-          Snp->GetStatus (Snp, &InterruptStatus, NULL);
-
-          //
-          // In case some one else is using the SNP check to see if it's connected
-          //
-          MediaPresent = Snp->Mode->MediaPresent;
-        } else {
-          //
-          // No one is using SNP so we need to Start and Initialize so
-          // MediaPresent will be valid.
-          //
-          Status = Snp->Start (Snp);
-          if (!EFI_ERROR (Status)) {
-            Status = Snp->Initialize (Snp, 0, 0);
-            if (!EFI_ERROR (Status)) {
-              MediaPresent = Snp->Mode->MediaPresent;
-              Snp->Shutdown (Snp);
-            }
-            Snp->Stop (Snp);
-          }
-        }
-      } else {
-        MediaPresent = TRUE;
-      }
-    }
-  }
-
-  return MediaPresent;
-}
-
-/**
-  For a bootable Device path, return its boot type.
-
-  @param  DevicePath                      The bootable device Path to check
-
-  @retval BDS_EFI_MEDIA_HD_BOOT           If given device path contains MEDIA_DEVICE_PATH type device path node
-                                          which subtype is MEDIA_HARDDRIVE_DP
-  @retval BDS_EFI_MEDIA_CDROM_BOOT        If given device path contains MEDIA_DEVICE_PATH type device path node
-                                          which subtype is MEDIA_CDROM_DP
-  @retval BDS_EFI_ACPI_FLOPPY_BOOT        If given device path contains ACPI_DEVICE_PATH type device path node
-                                          which HID is floppy device.
-  @retval BDS_EFI_MESSAGE_ATAPI_BOOT      If given device path contains MESSAGING_DEVICE_PATH type device path node
-                                          and its last device path node's subtype is MSG_ATAPI_DP.
-  @retval BDS_EFI_MESSAGE_SCSI_BOOT       If given device path contains MESSAGING_DEVICE_PATH type device path node
-                                          and its last device path node's subtype is MSG_SCSI_DP.
-  @retval BDS_EFI_MESSAGE_USB_DEVICE_BOOT If given device path contains MESSAGING_DEVICE_PATH type device path node
-                                          and its last device path node's subtype is MSG_USB_DP.
-  @retval BDS_EFI_MESSAGE_MISC_BOOT       If the device path not contains any media device path node,  and
-                                          its last device path node point to a message device path node.
-  @retval BDS_LEGACY_BBS_BOOT             If given device path contains BBS_DEVICE_PATH type device path node.
-  @retval BDS_EFI_UNSUPPORT               An EFI Removable BlockIO device path not point to a media and message device,
-
-**/
-UINT32
-EFIAPI
-BdsGetBootTypeFromDevicePath (
-  IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath
-  )
-{
-  ACPI_HID_DEVICE_PATH          *Acpi;
-  EFI_DEVICE_PATH_PROTOCOL      *TempDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL      *LastDeviceNode;
-  UINT32                        BootType;
-
-  if (NULL == DevicePath) {
-    return BDS_EFI_UNSUPPORT;
-  }
-
-  TempDevicePath = DevicePath;
-
-  while (!IsDevicePathEndType (TempDevicePath)) {
-    switch (DevicePathType (TempDevicePath)) {
-      case BBS_DEVICE_PATH:
-         return BDS_LEGACY_BBS_BOOT;
-      case MEDIA_DEVICE_PATH:
-        if (DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP) {
-          return BDS_EFI_MEDIA_HD_BOOT;
-        } else if (DevicePathSubType (TempDevicePath) == MEDIA_CDROM_DP) {
-          return BDS_EFI_MEDIA_CDROM_BOOT;
-        }
-        break;
-      case ACPI_DEVICE_PATH:
-        Acpi = (ACPI_HID_DEVICE_PATH *) TempDevicePath;
-        if (EISA_ID_TO_NUM (Acpi->HID) == 0x0604) {
-          return BDS_EFI_ACPI_FLOPPY_BOOT;
-        }
-        break;
-      case MESSAGING_DEVICE_PATH:
-        //
-        // Get the last device path node
-        //
-        LastDeviceNode = NextDevicePathNode (TempDevicePath);
-        if (DevicePathSubType(LastDeviceNode) == MSG_DEVICE_LOGICAL_UNIT_DP) {
-          //
-          // if the next node type is Device Logical Unit, which specify the Logical Unit Number (LUN),
-          // skip it
-          //
-          LastDeviceNode = NextDevicePathNode (LastDeviceNode);
-        }
-        //
-        // if the device path not only point to driver device, it is not a messaging device path,
-        //
-        if (!IsDevicePathEndType (LastDeviceNode)) {
-          break;
-        }
-
-        switch (DevicePathSubType (TempDevicePath)) {
-        case MSG_ATAPI_DP:
-          BootType = BDS_EFI_MESSAGE_ATAPI_BOOT;
-          break;
-
-        case MSG_USB_DP:
-          BootType = BDS_EFI_MESSAGE_USB_DEVICE_BOOT;
-          break;
-
-        case MSG_SCSI_DP:
-          BootType = BDS_EFI_MESSAGE_SCSI_BOOT;
-          break;
-
-        case MSG_SATA_DP:
-          BootType = BDS_EFI_MESSAGE_SATA_BOOT;
-          break;
-
-        case MSG_MAC_ADDR_DP:
-        case MSG_VLAN_DP:
-        case MSG_IPv4_DP:
-        case MSG_IPv6_DP:
-          BootType = BDS_EFI_MESSAGE_MAC_BOOT;
-          break;
-
-        default:
-          BootType = BDS_EFI_MESSAGE_MISC_BOOT;
-          break;
-        }
-        return BootType;
-
-      default:
-        break;
-    }
-    TempDevicePath = NextDevicePathNode (TempDevicePath);
-  }
-
-  return BDS_EFI_UNSUPPORT;
-}
-
-/**
-  Check whether the Device path in a boot option point to a valid bootable device,
-  And if CheckMedia is true, check the device is ready to boot now.
-
-  @param  DevPath     the Device path in a boot option
-  @param  CheckMedia  if true, check the device is ready to boot now.
-
-  @retval TRUE        the Device path  is valid
-  @retval FALSE       the Device path  is invalid .
-
-**/
-BOOLEAN
-EFIAPI
-BdsLibIsValidEFIBootOptDevicePath (
-  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath,
-  IN BOOLEAN                      CheckMedia
-  )
-{
-  return BdsLibIsValidEFIBootOptDevicePathExt (DevPath, CheckMedia, NULL);
-}
-
-/**
-  Check whether the Device path in a boot option point to a valid bootable device,
-  And if CheckMedia is true, check the device is ready to boot now.
-  If Description is not NULL and the device path point to a fixed BlockIo
-  device, check the description whether conflict with other auto-created
-  boot options.
-
-  @param  DevPath     the Device path in a boot option
-  @param  CheckMedia  if true, check the device is ready to boot now.
-  @param  Description the description in a boot option
-
-  @retval TRUE        the Device path  is valid
-  @retval FALSE       the Device path  is invalid .
-
-**/
-BOOLEAN
-EFIAPI
-BdsLibIsValidEFIBootOptDevicePathExt (
-  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath,
-  IN BOOLEAN                      CheckMedia,
-  IN CHAR16                       *Description
-  )
-{
-  EFI_STATUS                Status;
-  EFI_HANDLE                Handle;
-  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *LastDeviceNode;
-  EFI_BLOCK_IO_PROTOCOL     *BlockIo;
-
-  TempDevicePath = DevPath;
-  LastDeviceNode = DevPath;
-
-  //
-  // Check if it's a valid boot option for network boot device.
-  // Check if there is EfiLoadFileProtocol installed. 
-  // If yes, that means there is a boot option for network.
-  //
-  Status = gBS->LocateDevicePath (
-                  &gEfiLoadFileProtocolGuid,
-                  &TempDevicePath,
-                  &Handle
-                  );
-  if (EFI_ERROR (Status)) {
-    //
-    // Device not present so see if we need to connect it
-    //
-    TempDevicePath = DevPath;
-    BdsLibConnectDevicePath (TempDevicePath);
-    Status = gBS->LocateDevicePath (
-                    &gEfiLoadFileProtocolGuid,
-                    &TempDevicePath,
-                    &Handle
-                    );
-  }
-
-  if (!EFI_ERROR (Status)) {
-    if (!IsDevicePathEnd (TempDevicePath)) {
-      //
-      // LoadFile protocol is not installed on handle with exactly the same DevPath
-      //
-      return FALSE;
-    }
-
-    if (CheckMedia) {
-      //
-      // Test if it is ready to boot now
-      //
-      if (BdsLibNetworkBootWithMediaPresent(DevPath)) {
-        return TRUE;
-      }
-    } else {
-      return TRUE;
-    }    
-  }
-
-  //
-  // If the boot option point to a file, it is a valid EFI boot option,
-  // and assume it is ready to boot now
-  //
-  while (!IsDevicePathEnd (TempDevicePath)) {
-    //
-    // If there is USB Class or USB WWID device path node, treat it as valid EFI
-    // Boot Option. BdsExpandUsbShortFormDevicePath () will be used to expand it
-    // to full device path.
-    //
-    if ((DevicePathType (TempDevicePath) == MESSAGING_DEVICE_PATH) &&
-        ((DevicePathSubType (TempDevicePath) == MSG_USB_CLASS_DP) ||
-         (DevicePathSubType (TempDevicePath) == MSG_USB_WWID_DP))) {
-      return TRUE;
-    }
-
-    LastDeviceNode = TempDevicePath;
-    TempDevicePath = NextDevicePathNode (TempDevicePath);
-  }
-  if ((DevicePathType (LastDeviceNode) == MEDIA_DEVICE_PATH) &&
-    (DevicePathSubType (LastDeviceNode) == MEDIA_FILEPATH_DP)) {
-    return TRUE;
-  }
-
-  //
-  // Check if it's a valid boot option for internal FV application
-  //
-  if (EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode) != NULL) {
-    //
-    // If the boot option point to internal FV application, make sure it is valid
-    //
-    TempDevicePath = DevPath;
-    Status = BdsLibUpdateFvFileDevicePath (
-               &TempDevicePath,
-               EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode)
-               );
-    if (Status == EFI_ALREADY_STARTED) {
-      return TRUE;
-    } else {
-      if (Status == EFI_SUCCESS) {
-        FreePool (TempDevicePath);
-      }
-      return FALSE;
-    }
-  }
-
-  //
-  // If the boot option point to a blockIO device:
-  //    if it is a removable blockIo device, it is valid.
-  //    if it is a fixed blockIo device, check its description confliction.
-  //
-  TempDevicePath = DevPath;
-  Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &TempDevicePath, &Handle);
-  if (EFI_ERROR (Status)) {
-    //
-    // Device not present so see if we need to connect it
-    //
-    Status = BdsLibConnectDevicePath (DevPath);
-    if (!EFI_ERROR (Status)) {
-      //
-      // Try again to get the Block Io protocol after we did the connect
-      //
-      TempDevicePath = DevPath;
-      Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &TempDevicePath, &Handle);
-    }
-  }
-
-  if (!EFI_ERROR (Status)) {
-    Status = gBS->HandleProtocol (Handle, &gEfiBlockIoProtocolGuid, (VOID **)&BlockIo);
-    if (!EFI_ERROR (Status)) {
-      if (CheckMedia) {
-        //
-        // Test if it is ready to boot now
-        //
-        if (BdsLibGetBootableHandle (DevPath) != NULL) {
-          return TRUE;
-        }
-      } else {
-        return TRUE;
-      }
-    }
-  } else {
-    //
-    // if the boot option point to a simple file protocol which does not consume block Io protocol, it is also a valid EFI boot option,
-    //
-    Status = gBS->LocateDevicePath (&gEfiSimpleFileSystemProtocolGuid, &TempDevicePath, &Handle);
-    if (!EFI_ERROR (Status)) {
-      if (CheckMedia) {
-        //
-        // Test if it is ready to boot now
-        //
-        if (BdsLibGetBootableHandle (DevPath) != NULL) {
-          return TRUE;
-        }
-      } else {
-        return TRUE;
-      }
-    }
-  }
-
-  return FALSE;
-}
-
-
-/**
-  According to a file guild, check a Fv file device path is valid. If it is invalid,
-  try to return the valid device path.
-  FV address maybe changes for memory layout adjust from time to time, use this function
-  could promise the Fv file device path is right.
-
-  @param  DevicePath             on input, the Fv file device path need to check on
-                                 output, the updated valid Fv file device path
-  @param  FileGuid               the Fv file guild
-
-  @retval EFI_INVALID_PARAMETER  the input DevicePath or FileGuid is invalid
-                                 parameter
-  @retval EFI_UNSUPPORTED        the input DevicePath does not contain Fv file
-                                 guild at all
-  @retval EFI_ALREADY_STARTED    the input DevicePath has pointed to Fv file, it is
-                                 valid
-  @retval EFI_SUCCESS            has successfully updated the invalid DevicePath,
-                                 and return the updated device path in DevicePath
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibUpdateFvFileDevicePath (
-  IN  OUT EFI_DEVICE_PATH_PROTOCOL      ** DevicePath,
-  IN  EFI_GUID                          *FileGuid
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL      *TempDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL      *LastDeviceNode;
-  EFI_STATUS                    Status;
-  EFI_GUID                      *GuidPoint;
-  UINTN                         Index;
-  UINTN                         FvHandleCount;
-  EFI_HANDLE                    *FvHandleBuffer;
-  EFI_FV_FILETYPE               Type;
-  UINTN                         Size;
-  EFI_FV_FILE_ATTRIBUTES        Attributes;
-  UINT32                        AuthenticationStatus;
-  BOOLEAN                       FindFvFile;
-  EFI_LOADED_IMAGE_PROTOCOL     *LoadedImage;
-  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
-  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FvFileNode;
-  EFI_HANDLE                    FoundFvHandle;
-  EFI_DEVICE_PATH_PROTOCOL      *NewDevicePath;
-
-  if ((DevicePath == NULL) || (*DevicePath == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-  if (FileGuid == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Check whether the device path point to the default the input Fv file
-  //
-  TempDevicePath = *DevicePath;
-  LastDeviceNode = TempDevicePath;
-  while (!IsDevicePathEnd (TempDevicePath)) {
-     LastDeviceNode = TempDevicePath;
-     TempDevicePath = NextDevicePathNode (TempDevicePath);
-  }
-  GuidPoint = EfiGetNameGuidFromFwVolDevicePathNode (
-                (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode
-                );
-  if (GuidPoint == NULL) {
-    //
-    // if this option does not points to a Fv file, just return EFI_UNSUPPORTED
-    //
-    return EFI_UNSUPPORTED;
-  }
-  if (!CompareGuid (GuidPoint, FileGuid)) {
-    //
-    // If the Fv file is not the input file guid, just return EFI_UNSUPPORTED
-    //
-    return EFI_UNSUPPORTED;
-  }
-
-  //
-  // Check whether the input Fv file device path is valid
-  //
-  TempDevicePath = *DevicePath;
-  FoundFvHandle = NULL;
-  Status = gBS->LocateDevicePath (
-                  &gEfiFirmwareVolume2ProtocolGuid,
-                  &TempDevicePath,
-                  &FoundFvHandle
-                  );
-  if (!EFI_ERROR (Status)) {
-    Status = gBS->HandleProtocol (
-                    FoundFvHandle,
-                    &gEfiFirmwareVolume2ProtocolGuid,
-                    (VOID **) &Fv
-                    );
-    if (!EFI_ERROR (Status)) {
-      //
-      // Set FV ReadFile Buffer as NULL, only need to check whether input Fv file exist there
-      //
-      Status = Fv->ReadFile (
-                    Fv,
-                    FileGuid,
-                    NULL,
-                    &Size,
-                    &Type,
-                    &Attributes,
-                    &AuthenticationStatus
-                    );
-      if (!EFI_ERROR (Status)) {
-        return EFI_ALREADY_STARTED;
-      }
-    }
-  }
-
-  //
-  // Look for the input wanted FV file in current FV
-  // First, try to look for in Bds own FV. Bds and input wanted FV file usually are in the same FV
-  //
-  FindFvFile = FALSE;
-  FoundFvHandle = NULL;
-  Status = gBS->HandleProtocol (
-             gImageHandle,
-             &gEfiLoadedImageProtocolGuid,
-             (VOID **) &LoadedImage
-             );
-  if (!EFI_ERROR (Status)) {
-    Status = gBS->HandleProtocol (
-                    LoadedImage->DeviceHandle,
-                    &gEfiFirmwareVolume2ProtocolGuid,
-                    (VOID **) &Fv
-                    );
-    if (!EFI_ERROR (Status)) {
-      Status = Fv->ReadFile (
-                    Fv,
-                    FileGuid,
-                    NULL,
-                    &Size,
-                    &Type,
-                    &Attributes,
-                    &AuthenticationStatus
-                    );
-      if (!EFI_ERROR (Status)) {
-        FindFvFile = TRUE;
-        FoundFvHandle = LoadedImage->DeviceHandle;
-      }
-    }
-  }
-  //
-  // Second, if fail to find, try to enumerate all FV
-  //
-  if (!FindFvFile) {
-    FvHandleBuffer = NULL;
-    gBS->LocateHandleBuffer (
-          ByProtocol,
-          &gEfiFirmwareVolume2ProtocolGuid,
-          NULL,
-          &FvHandleCount,
-          &FvHandleBuffer
-          );
-    for (Index = 0; Index < FvHandleCount; Index++) {
-      gBS->HandleProtocol (
-            FvHandleBuffer[Index],
-            &gEfiFirmwareVolume2ProtocolGuid,
-            (VOID **) &Fv
-            );
-
-      Status = Fv->ReadFile (
-                    Fv,
-                    FileGuid,
-                    NULL,
-                    &Size,
-                    &Type,
-                    &Attributes,
-                    &AuthenticationStatus
-                    );
-      if (EFI_ERROR (Status)) {
-        //
-        // Skip if input Fv file not in the FV
-        //
-        continue;
-      }
-      FindFvFile = TRUE;
-      FoundFvHandle = FvHandleBuffer[Index];
-      break;
-    }
-
-    if (FvHandleBuffer != NULL) {
-      FreePool (FvHandleBuffer);
-    }
-  }
-
-  if (FindFvFile) {
-    //
-    // Build the shell device path
-    //
-    NewDevicePath = DevicePathFromHandle (FoundFvHandle);
-    EfiInitializeFwVolDevicepathNode (&FvFileNode, FileGuid);
-    NewDevicePath = AppendDevicePathNode (NewDevicePath, (EFI_DEVICE_PATH_PROTOCOL *) &FvFileNode);
-    ASSERT (NewDevicePath != NULL);
-    *DevicePath = NewDevicePath;
-    return EFI_SUCCESS;
-  }
-  return EFI_NOT_FOUND;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c
deleted file mode 100644
index dfeefc01b8..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/** @file
-  BDS Lib functions which relate with connect the device
-
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "InternalBdsLib.h"
-
-
-/**
-  This function will connect all the system driver to controller
-  first, and then special connect the default console, this make
-  sure all the system controller available and the platform default
-  console connected.
-
-**/
-VOID
-EFIAPI
-BdsLibConnectAll (
-  VOID
-  )
-{
-  //
-  // Connect the platform console first
-  //
-  BdsLibConnectAllDefaultConsoles ();
-
-  //
-  // Generic way to connect all the drivers
-  //
-  BdsLibConnectAllDriversToAllControllers ();
-
-  //
-  // Here we have the assumption that we have already had
-  // platform default console
-  //
-  BdsLibConnectAllDefaultConsoles ();
-}
-
-
-/**
-  This function will connect all the system drivers to all controllers
-  first, and then connect all the console devices the system current
-  have. After this we should get all the device work and console available
-  if the system have console device.
-
-**/
-VOID
-BdsLibGenericConnectAll (
-  VOID
-  )
-{
-  //
-  // Most generic way to connect all the drivers
-  //
-  BdsLibConnectAllDriversToAllControllers ();
-  BdsLibConnectAllConsoles ();
-}
-
-/**
-  This function will create all handles associate with every device
-  path node. If the handle associate with one device path node can not
-  be created successfully, then still give chance to do the dispatch,
-  which load the missing drivers if possible.
-
-  @param  DevicePathToConnect   The device path which will be connected, it can be
-                                a multi-instance device path
-
-  @retval EFI_SUCCESS           All handles associate with every device path  node
-                                have been created
-  @retval EFI_OUT_OF_RESOURCES  There is no resource to create new handles
-  @retval EFI_NOT_FOUND         Create the handle associate with one device  path
-                                node failed
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectDevicePath (
-  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePathToConnect
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *CopyOfDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *Instance;
-  EFI_DEVICE_PATH_PROTOCOL  *RemainingDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *Next;
-  EFI_HANDLE                Handle;
-  EFI_HANDLE                PreviousHandle;
-  UINTN                     Size;
-  EFI_TPL                   CurrentTpl;
-
-  if (DevicePathToConnect == NULL) {
-    return EFI_SUCCESS;
-  }
-
-  CurrentTpl  = EfiGetCurrentTpl ();
-
-  DevicePath        = DuplicateDevicePath (DevicePathToConnect);
-  if (DevicePath == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  CopyOfDevicePath  = DevicePath;
-  
-  do {
-    //
-    // The outer loop handles multi instance device paths.
-    // Only console variables contain multiple instance device paths.
-    //
-    // After this call DevicePath points to the next Instance
-    //
-    Instance  = GetNextDevicePathInstance (&DevicePath, &Size);
-    if (Instance == NULL) {
-      FreePool (CopyOfDevicePath);
-      return EFI_OUT_OF_RESOURCES;
-    }
-    
-    Next      = Instance;
-    while (!IsDevicePathEndType (Next)) {
-      Next = NextDevicePathNode (Next);
-    }
-
-    SetDevicePathEndNode (Next);
-
-    //
-    // Start the real work of connect with RemainingDevicePath
-    //
-    PreviousHandle = NULL;
-    do {
-      //
-      // Find the handle that best matches the Device Path. If it is only a
-      // partial match the remaining part of the device path is returned in
-      // RemainingDevicePath.
-      //
-      RemainingDevicePath = Instance;
-      Status              = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &Handle);
-
-      if (!EFI_ERROR (Status)) {
-        if (Handle == PreviousHandle) {
-          //
-          // If no forward progress is made try invoking the Dispatcher.
-          // A new FV may have been added to the system an new drivers
-          // may now be found.
-          // Status == EFI_SUCCESS means a driver was dispatched
-          // Status == EFI_NOT_FOUND means no new drivers were dispatched
-          //
-          if (CurrentTpl == TPL_APPLICATION) {
-            //
-            // Dispatch calls LoadImage/StartImage which cannot run at TPL > TPL_APPLICATION
-            //
-            Status = gDS->Dispatch ();
-          } else {
-            //
-            // Always return EFI_NOT_FOUND here
-            // to prevent dead loop when control handle is found but connection failded case
-            //
-            Status = EFI_NOT_FOUND;
-          }
-        }
-
-        if (!EFI_ERROR (Status)) {
-          PreviousHandle = Handle;
-          //
-          // Connect all drivers that apply to Handle and RemainingDevicePath,
-          // the Recursive flag is FALSE so only one level will be expanded.
-          //
-          // Do not check the connect status here, if the connect controller fail,
-          // then still give the chance to do dispatch, because partial
-          // RemainingDevicepath may be in the new FV
-          //
-          // 1. If the connect fail, RemainingDevicepath and handle will not
-          //    change, so next time will do the dispatch, then dispatch's status
-          //    will take effect
-          // 2. If the connect success, the RemainingDevicepath and handle will
-          //    change, then avoid the dispatch, we have chance to continue the
-          //    next connection
-          //
-          gBS->ConnectController (Handle, NULL, RemainingDevicePath, FALSE);
-        }
-      }
-      //
-      // Loop until RemainingDevicePath is an empty device path
-      //
-    } while (!EFI_ERROR (Status) && !IsDevicePathEnd (RemainingDevicePath));
-
-  } while (DevicePath != NULL);
-
-  if (CopyOfDevicePath != NULL) {
-    FreePool (CopyOfDevicePath);
-  }
-  //
-  // All handle with DevicePath exists in the handle database
-  //
-  return Status;
-}
-
-/**
-  This function will connect all current system handles recursively. 
-  
-  gBS->ConnectController() service is invoked for each handle exist in system handler buffer.
-  If the handle is bus type handler, all childrens also will be connected recursively
-  by gBS->ConnectController().
-
-  @retval EFI_SUCCESS           All handles and it's child handle have been connected
-  @retval EFI_STATUS            Error status returned by of gBS->LocateHandleBuffer().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectAllEfi (
-  VOID
-  )
-{
-  EFI_STATUS  Status;
-  UINTN       HandleCount;
-  EFI_HANDLE  *HandleBuffer;
-  UINTN       Index;
-
-  Status = gBS->LocateHandleBuffer (
-                  AllHandles,
-                  NULL,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuffer
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
-  }
-
-  if (HandleBuffer != NULL) {
-    FreePool (HandleBuffer);
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  This function will disconnect all current system handles. 
-  
-  gBS->DisconnectController() is invoked for each handle exists in system handle buffer.
-  If handle is a bus type handle, all childrens also are disconnected recursively by
-  gBS->DisconnectController().
-
-  @retval EFI_SUCCESS           All handles have been disconnected
-  @retval EFI_STATUS            Error status returned by of gBS->LocateHandleBuffer().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibDisconnectAllEfi (
-  VOID
-  )
-{
-  EFI_STATUS  Status;
-  UINTN       HandleCount;
-  EFI_HANDLE  *HandleBuffer;
-  UINTN       Index;
-
-  //
-  // Disconnect all
-  //
-  Status = gBS->LocateHandleBuffer (
-                  AllHandles,
-                  NULL,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuffer
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    Status = gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);
-  }
-
-  if (HandleBuffer != NULL) {
-    FreePool (HandleBuffer);
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Connects all drivers to all controllers.
-  This function make sure all the current system driver will manage
-  the correspoinding controllers if have. And at the same time, make
-  sure all the system controllers have driver to manage it if have.
-
-**/
-VOID
-EFIAPI
-BdsLibConnectAllDriversToAllControllers (
-  VOID
-  )
-{
-  EFI_STATUS  Status;
-
-  do {
-    //
-    // Connect All EFI 1.10 drivers following EFI 1.10 algorithm
-    //
-    BdsLibConnectAllEfi ();
-
-    //
-    // Check to see if it's possible to dispatch an more DXE drivers.
-    // The BdsLibConnectAllEfi () may have made new DXE drivers show up.
-    // If anything is Dispatched Status == EFI_SUCCESS and we will try
-    // the connect again.
-    //
-    Status = gDS->Dispatch ();
-
-  } while (!EFI_ERROR (Status));
-
-}
-
-
-/**
-  Connect the specific Usb device which match the short form device path,
-  and whose bus is determined by Host Controller (Uhci or Ehci).
-
-  @param  HostControllerPI      Uhci (0x00) or Ehci (0x20) or Both uhci and ehci
-                                (0xFF)
-  @param  RemainingDevicePath   a short-form device path that starts with the first
-                                element  being a USB WWID or a USB Class device
-                                path
-
-  @return EFI_INVALID_PARAMETER  RemainingDevicePath is NULL pointer.
-                                 RemainingDevicePath is not a USB device path.
-                                 Invalid HostControllerPI type.
-  @return EFI_SUCCESS            Success to connect USB device
-  @return EFI_NOT_FOUND          Fail to find handle for USB controller to connect.
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectUsbDevByShortFormDP(
-  IN UINT8                      HostControllerPI,
-  IN EFI_DEVICE_PATH_PROTOCOL   *RemainingDevicePath
-  )
-{
-  EFI_STATUS                            Status;
-  EFI_HANDLE                            *HandleArray;
-  UINTN                                 HandleArrayCount;
-  UINTN                                 Index;
-  EFI_PCI_IO_PROTOCOL                   *PciIo;
-  UINT8                                 Class[3];
-  BOOLEAN                               AtLeastOneConnected;
-
-  //
-  // Check the passed in parameters
-  //
-  if (RemainingDevicePath == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if ((DevicePathType (RemainingDevicePath) != MESSAGING_DEVICE_PATH) ||
-      ((DevicePathSubType (RemainingDevicePath) != MSG_USB_CLASS_DP)
-      && (DevicePathSubType (RemainingDevicePath) != MSG_USB_WWID_DP)
-      )) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (HostControllerPI != 0xFF &&
-      HostControllerPI != 0x00 &&
-      HostControllerPI != 0x20) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Find the usb host controller firstly, then connect with the remaining device path
-  //
-  AtLeastOneConnected = FALSE;
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiPciIoProtocolGuid,
-                  NULL,
-                  &HandleArrayCount,
-                  &HandleArray
-                  );
-  if (!EFI_ERROR (Status)) {
-    for (Index = 0; Index < HandleArrayCount; Index++) {
-      Status = gBS->HandleProtocol (
-                      HandleArray[Index],
-                      &gEfiPciIoProtocolGuid,
-                      (VOID **)&PciIo
-                      );
-      if (!EFI_ERROR (Status)) {
-        //
-        // Check whether the Pci device is the wanted usb host controller
-        //
-        Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class);
-        if (!EFI_ERROR (Status)) {
-          if ((PCI_CLASS_SERIAL == Class[2]) &&
-              (PCI_CLASS_SERIAL_USB == Class[1])) {
-            if (HostControllerPI == Class[0] || HostControllerPI == 0xFF) {
-              Status = gBS->ConnectController (
-                              HandleArray[Index],
-                              NULL,
-                              RemainingDevicePath,
-                              FALSE
-                              );
-              if (!EFI_ERROR(Status)) {
-                AtLeastOneConnected = TRUE;
-              }
-            }
-          }
-        }
-      }
-    }
-
-    if (HandleArray != NULL) {
-      FreePool (HandleArray);
-    }
-
-    if (AtLeastOneConnected) {
-      return EFI_SUCCESS;
-    }
-  }
-
-  return EFI_NOT_FOUND;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c
deleted file mode 100644
index 2fffd9e4bc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c
+++ /dev/null
@@ -1,1061 +0,0 @@
-/** @file
-  BDS Lib functions which contain all the code to connect console device
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "InternalBdsLib.h"
-
-
-/**
-  Check if we need to save the EFI variable with "ConVarName" as name
-  as NV type
-  If ConVarName is NULL, then ASSERT().
-  
-  @param ConVarName The name of the EFI variable.
-
-  @retval TRUE    Set the EFI variable as NV type.
-  @retval FALSE   EFI variable as NV type can be set NonNV.
-**/
-BOOLEAN
-IsNvNeed (
-  IN CHAR16 *ConVarName
-  )
-{
-  CHAR16 *Ptr;
-
-  ASSERT (ConVarName != NULL);
-  
-  Ptr = ConVarName;
-
-  //
-  // If the variable includes "Dev" at last, we consider
-  // it does not support NV attribute.
-  //
-  while (*Ptr != L'\0') {
-    Ptr++;
-  }
-
-  if (((INTN)((UINTN)Ptr - (UINTN)ConVarName) / sizeof (CHAR16)) <= 3) {
-    return TRUE;
-  }
-  
-  if ((*(Ptr - 3) == 'D') && (*(Ptr - 2) == 'e') && (*(Ptr - 1) == 'v')) {
-    return FALSE;
-  } else {
-    return TRUE;
-  }
-}
-
-/**
-  Fill console handle in System Table if there are no valid console handle in.
-
-  Firstly, check the validation of console handle in System Table. If it is invalid,
-  update it by the first console device handle from EFI console variable. 
-
-  @param  VarName            The name of the EFI console variable.
-  @param  ConsoleGuid        Specified Console protocol GUID.
-  @param  ConsoleHandle      On IN,  console handle in System Table to be checked. 
-                             On OUT, new console handle in system table.
-  @param  ProtocolInterface  On IN,  console protocol on console handle in System Table to be checked. 
-                             On OUT, new console protocol on new console handle in system table.
-
-  @retval TRUE               System Table has been updated.
-  @retval FALSE              System Table hasn't been updated.
-
-**/
-BOOLEAN 
-UpdateSystemTableConsole (
-  IN     CHAR16                          *VarName,
-  IN     EFI_GUID                        *ConsoleGuid,
-  IN OUT EFI_HANDLE                      *ConsoleHandle,
-  IN OUT VOID                            **ProtocolInterface
-  )
-{
-  EFI_STATUS                Status;
-  UINTN                     DevicePathSize;
-  EFI_DEVICE_PATH_PROTOCOL  *FullDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *VarConsole;
-  EFI_DEVICE_PATH_PROTOCOL  *Instance;
-  VOID                      *Interface;
-  EFI_HANDLE                NewHandle;
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut;
-
-  ASSERT (VarName != NULL);
-  ASSERT (ConsoleHandle != NULL);
-  ASSERT (ConsoleGuid != NULL);
-  ASSERT (ProtocolInterface != NULL);
-
-  if (*ConsoleHandle != NULL) {
-    Status = gBS->HandleProtocol (
-                   *ConsoleHandle,
-                   ConsoleGuid,
-                   &Interface
-                   );
-    if (Status == EFI_SUCCESS && Interface == *ProtocolInterface) {
-      //
-      // If ConsoleHandle is valid and console protocol on this handle also
-      // also matched, just return.
-      //
-      return FALSE;
-    }
-  }
-  
-  //
-  // Get all possible consoles device path from EFI variable
-  //
-  VarConsole = BdsLibGetVariableAndSize (
-                VarName,
-                &gEfiGlobalVariableGuid,
-                &DevicePathSize
-                );
-  if (VarConsole == NULL) {
-    //
-    // If there is no any console device, just return.
-    //
-    return FALSE;
-  }
-
-  FullDevicePath = VarConsole;
-
-  do {
-    //
-    // Check every instance of the console variable
-    //
-    Instance  = GetNextDevicePathInstance (&VarConsole, &DevicePathSize);
-    if (Instance == NULL) {
-      FreePool (FullDevicePath);
-      ASSERT (FALSE);
-    }
-    
-    //
-    // Find console device handle by device path instance
-    //
-    Status = gBS->LocateDevicePath (
-                   ConsoleGuid,
-                   &Instance,
-                   &NewHandle
-                   );
-    if (!EFI_ERROR (Status)) {
-      //
-      // Get the console protocol on this console device handle
-      //
-      Status = gBS->HandleProtocol (
-                     NewHandle,
-                     ConsoleGuid,
-                     &Interface
-                     );
-      if (!EFI_ERROR (Status)) {
-        //
-        // Update new console handle in System Table.
-        //
-        *ConsoleHandle     = NewHandle;
-        *ProtocolInterface = Interface;
-        if (CompareGuid (ConsoleGuid, &gEfiSimpleTextOutProtocolGuid)) {
-          //
-          // If it is console out device, set console mode 80x25 if current mode is invalid.
-          //
-          TextOut = (EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *) Interface;
-          if (TextOut->Mode->Mode == -1) {
-            TextOut->SetMode (TextOut, 0);
-          }
-        }
-        return TRUE;
-      }
-    }
-
-  } while (Instance != NULL);
-
-  //
-  // No any available console devcie found.
-  //
-  return FALSE;
-}
-
-/**
-  This function update console variable based on ConVarName, it can
-  add or remove one specific console device path from the variable
-
-  @param  ConVarName               Console related variable name, ConIn, ConOut,
-                                   ErrOut.
-  @param  CustomizedConDevicePath  The console device path which will be added to
-                                   the console variable ConVarName, this parameter
-                                   can not be multi-instance.
-  @param  ExclusiveDevicePath      The console device path which will be removed
-                                   from the console variable ConVarName, this
-                                   parameter can not be multi-instance.
-
-  @retval EFI_UNSUPPORTED          The added device path is same to the removed one.
-  @retval EFI_SUCCESS              Success add or remove the device path from  the
-                                   console variable.
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibUpdateConsoleVariable (
-  IN  CHAR16                    *ConVarName,
-  IN  EFI_DEVICE_PATH_PROTOCOL  *CustomizedConDevicePath,
-  IN  EFI_DEVICE_PATH_PROTOCOL  *ExclusiveDevicePath
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *VarConsole;
-  UINTN                     DevicePathSize;
-  EFI_DEVICE_PATH_PROTOCOL  *NewDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *TempNewDevicePath;
-  UINT32                    Attributes;
-
-  VarConsole      = NULL;
-  DevicePathSize  = 0;
-
-  //
-  // Notes: check the device path point, here should check
-  // with compare memory
-  //
-  if (CustomizedConDevicePath == ExclusiveDevicePath) {
-    return EFI_UNSUPPORTED;
-  }
-  //
-  // Delete the ExclusiveDevicePath from current default console
-  //
-  VarConsole = BdsLibGetVariableAndSize (
-                ConVarName,
-                &gEfiGlobalVariableGuid,
-                &DevicePathSize
-                );
-
-  //
-  // Initialize NewDevicePath
-  //
-  NewDevicePath  = VarConsole;
-
-  //
-  // If ExclusiveDevicePath is even the part of the instance in VarConsole, delete it.
-  // In the end, NewDevicePath is the final device path.
-  //
-  if (ExclusiveDevicePath != NULL && VarConsole != NULL) {
-      NewDevicePath = BdsLibDelPartMatchInstance (VarConsole, ExclusiveDevicePath);
-  }
-  //
-  // Try to append customized device path to NewDevicePath.
-  //
-  if (CustomizedConDevicePath != NULL) {
-    if (!BdsLibMatchDevicePaths (NewDevicePath, CustomizedConDevicePath)) {
-      //
-      // Check if there is part of CustomizedConDevicePath in NewDevicePath, delete it.
-      //
-      NewDevicePath = BdsLibDelPartMatchInstance (NewDevicePath, CustomizedConDevicePath);
-      //
-      // In the first check, the default console variable will be _ModuleEntryPoint,
-      // just append current customized device path
-      //
-      TempNewDevicePath = NewDevicePath;
-      NewDevicePath = AppendDevicePathInstance (NewDevicePath, CustomizedConDevicePath);
-      if (TempNewDevicePath != NULL) {
-        FreePool(TempNewDevicePath);
-      }
-    }
-  }
-
-  //
-  // The attribute for ConInDev, ConOutDev and ErrOutDev does not include NV.
-  //
-  if (IsNvNeed(ConVarName)) {
-    //
-    // ConVarName has NV attribute.
-    //
-    Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE;
-  } else {
-    //
-    // ConVarName does not have NV attribute.
-    //
-    Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;
-  }
-
-  //
-  // Finally, Update the variable of the default console by NewDevicePath
-  //
-  DevicePathSize = GetDevicePathSize (NewDevicePath);
-  Status = SetVariableAndReportStatusCodeOnError (
-             ConVarName,
-             &gEfiGlobalVariableGuid,
-             Attributes,
-             DevicePathSize,
-             NewDevicePath
-             );
-  if ((DevicePathSize == 0) && (Status == EFI_NOT_FOUND)) {
-    Status = EFI_SUCCESS;
-  }
-
-  if (VarConsole == NewDevicePath) {
-    if (VarConsole != NULL) {
-      FreePool(VarConsole);
-    }
-  } else {
-    if (VarConsole != NULL) {
-      FreePool(VarConsole);
-    }
-    if (NewDevicePath != NULL) {
-      FreePool(NewDevicePath);
-    }
-  }
-
-  return Status;
-
-}
-
-
-/**
-  Connect the console device base on the variable ConVarName, if
-  device path of the ConVarName is multi-instance device path and
-  anyone of the instances is connected success, then this function
-  will return success.
-  If the handle associate with one device path node can not
-  be created successfully, then still give chance to do the dispatch,
-  which load the missing drivers if possible..
-
-  @param  ConVarName               Console related variable name, ConIn, ConOut,
-                                   ErrOut.
-
-  @retval EFI_NOT_FOUND            There is not any console devices connected
-                                   success
-  @retval EFI_SUCCESS              Success connect any one instance of the console
-                                   device path base on the variable ConVarName.
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectConsoleVariable (
-  IN  CHAR16                 *ConVarName
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *StartDevicePath;
-  UINTN                     VariableSize;
-  EFI_DEVICE_PATH_PROTOCOL  *Instance;
-  EFI_DEVICE_PATH_PROTOCOL  *Next;
-  EFI_DEVICE_PATH_PROTOCOL  *CopyOfDevicePath;
-  UINTN                     Size;
-  BOOLEAN                   DeviceExist;
-
-  Status      = EFI_SUCCESS;
-  DeviceExist = FALSE;
-
-  //
-  // Check if the console variable exist
-  //
-  StartDevicePath = BdsLibGetVariableAndSize (
-                      ConVarName,
-                      &gEfiGlobalVariableGuid,
-                      &VariableSize
-                      );
-  if (StartDevicePath == NULL) {
-    return EFI_UNSUPPORTED;
-  }
-
-  CopyOfDevicePath = StartDevicePath;
-  do {
-    //
-    // Check every instance of the console variable
-    //
-    Instance  = GetNextDevicePathInstance (&CopyOfDevicePath, &Size);
-    if (Instance == NULL) {
-      FreePool (StartDevicePath);
-      return EFI_UNSUPPORTED;
-    }
-    
-    Next      = Instance;
-    while (!IsDevicePathEndType (Next)) {
-      Next = NextDevicePathNode (Next);
-    }
-
-    SetDevicePathEndNode (Next);
-    //
-    // Connect the USB console
-    // USB console device path is a short-form device path that 
-    //  starts with the first element being a USB WWID
-    //  or a USB Class device path
-    //
-    if ((DevicePathType (Instance) == MESSAGING_DEVICE_PATH) &&
-       ((DevicePathSubType (Instance) == MSG_USB_CLASS_DP)
-       || (DevicePathSubType (Instance) == MSG_USB_WWID_DP)
-       )) {
-      Status = BdsLibConnectUsbDevByShortFormDP (0xFF, Instance);
-      if (!EFI_ERROR (Status)) {
-        DeviceExist = TRUE;
-      }
-    } else {
-      //
-      // Connect the instance device path
-      //
-      Status = BdsLibConnectDevicePath (Instance);
-
-      if (EFI_ERROR (Status)) {
-        //
-        // Delete the instance from the console varialbe
-        //
-        BdsLibUpdateConsoleVariable (ConVarName, NULL, Instance);
-      } else {
-        DeviceExist = TRUE;
-      }
-    }
-    FreePool(Instance);
-  } while (CopyOfDevicePath != NULL);
-
-  FreePool (StartDevicePath);
-
-  if (!DeviceExist) {
-    return EFI_NOT_FOUND;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  This function will search every simpletext device in current system,
-  and make every simpletext device as pertantial console device.
-
-**/
-VOID
-EFIAPI
-BdsLibConnectAllConsoles (
-  VOID
-  )
-{
-  UINTN                     Index;
-  EFI_DEVICE_PATH_PROTOCOL  *ConDevicePath;
-  UINTN                     HandleCount;
-  EFI_HANDLE                *HandleBuffer;
-
-  Index         = 0;
-  HandleCount   = 0;
-  HandleBuffer  = NULL;
-  ConDevicePath = NULL;
-
-  //
-  // Update all the console variables
-  //
-  gBS->LocateHandleBuffer (
-          ByProtocol,
-          &gEfiSimpleTextInProtocolGuid,
-          NULL,
-          &HandleCount,
-          &HandleBuffer
-          );
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    gBS->HandleProtocol (
-            HandleBuffer[Index],
-            &gEfiDevicePathProtocolGuid,
-            (VOID **) &ConDevicePath
-            );
-    BdsLibUpdateConsoleVariable (L"ConIn", ConDevicePath, NULL);
-  }
-
-  if (HandleBuffer != NULL) {
-    FreePool(HandleBuffer);
-    HandleBuffer = NULL;
-  }
-
-  gBS->LocateHandleBuffer (
-          ByProtocol,
-          &gEfiSimpleTextOutProtocolGuid,
-          NULL,
-          &HandleCount,
-          &HandleBuffer
-          );
-  for (Index = 0; Index < HandleCount; Index++) {
-    gBS->HandleProtocol (
-            HandleBuffer[Index],
-            &gEfiDevicePathProtocolGuid,
-            (VOID **) &ConDevicePath
-            );
-    BdsLibUpdateConsoleVariable (L"ConOut", ConDevicePath, NULL);
-    BdsLibUpdateConsoleVariable (L"ErrOut", ConDevicePath, NULL);
-  }
-
-  if (HandleBuffer != NULL) {
-    FreePool(HandleBuffer);
-  }
-
-  //
-  // Connect all console variables
-  //
-  BdsLibConnectAllDefaultConsoles ();
-
-}
-
-/**
-  This function will connect console device base on the console
-  device variable ConIn, ConOut and ErrOut.
-
-  @retval EFI_SUCCESS              At least one of the ConIn and ConOut device have
-                                   been connected success.
-  @retval EFI_STATUS               Return the status of BdsLibConnectConsoleVariable ().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectAllDefaultConsoles (
-  VOID
-  )
-{
-  EFI_STATUS                Status;
-  BOOLEAN                   SystemTableUpdated;
-
-  //
-  // Connect all default console variables
-  //
-
-  //
-  // It seems impossible not to have any ConOut device on platform,
-  // so we check the status here.
-  //
-  Status = BdsLibConnectConsoleVariable (L"ConOut");
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Insert the performance probe for Console Out
-  //
-  PERF_START (NULL, "ConOut", "BDS", 1);
-  PERF_END (NULL, "ConOut", "BDS", 0);
-
-  //
-  // Because possibly the platform is legacy free, in such case,
-  // ConIn devices (Serial Port and PS2 Keyboard ) does not exist,
-  // so we need not check the status.
-  //
-  BdsLibConnectConsoleVariable (L"ConIn");
-
-  //
-  // The _ModuleEntryPoint err out var is legal.
-  //
-  BdsLibConnectConsoleVariable (L"ErrOut");
-
-  SystemTableUpdated = FALSE;
-  //
-  // Fill console handles in System Table if no console device assignd.
-  //
-  if (UpdateSystemTableConsole (L"ConIn", &gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **) &gST->ConIn)) {
-    SystemTableUpdated = TRUE;
-  }
-  if (UpdateSystemTableConsole (L"ConOut", &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **) &gST->ConOut)) {
-    SystemTableUpdated = TRUE;
-  }
-  if (UpdateSystemTableConsole (L"ErrOut", &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **) &gST->StdErr)) {
-    SystemTableUpdated = TRUE;
-  }
-
-  if (SystemTableUpdated) {
-    //
-    // Update the CRC32 in the EFI System Table header
-    //
-    gST->Hdr.CRC32 = 0;
-    gBS->CalculateCrc32 (
-          (UINT8 *) &gST->Hdr,
-          gST->Hdr.HeaderSize,
-          &gST->Hdr.CRC32
-          );
-  }
-
-  //
-  // If any component set PcdTestKeyUsed to TRUE because use of a test key
-  // was detected, then display a warning message on the debug log and the console
-  //
-  if (PcdGetBool (PcdTestKeyUsed) == TRUE) {
-    DEBUG ((DEBUG_ERROR, "**********************************\n"));
-    DEBUG ((DEBUG_ERROR, "**  WARNING: Test Key is used.  **\n"));
-    DEBUG ((DEBUG_ERROR, "**********************************\n"));
-    Print (L"**  WARNING: Test Key is used.  **\n");
-  }
-
-  return EFI_SUCCESS;
-
-}
-
-/**
-  This function will connect console device except ConIn base on the console
-  device variable  ConOut and ErrOut.
-
-  @retval EFI_SUCCESS              At least one of the ConOut device have
-                                   been connected success.
-  @retval EFI_STATUS               Return the status of BdsLibConnectConsoleVariable ().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectAllDefaultConsolesWithOutConIn (
-  VOID
-  )
-{
-  EFI_STATUS                Status;
-  BOOLEAN                   SystemTableUpdated;
-
-  //
-  // Connect all default console variables except ConIn
-  //
-
-  //
-  // It seems impossible not to have any ConOut device on platform,
-  // so we check the status here.
-  //
-  Status = BdsLibConnectConsoleVariable (L"ConOut");
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Insert the performance probe for Console Out
-  //
-  PERF_START (NULL, "ConOut", "BDS", 1);
-  PERF_END (NULL, "ConOut", "BDS", 0);
-
-  //
-  // The _ModuleEntryPoint err out var is legal.
-  //
-  BdsLibConnectConsoleVariable (L"ErrOut");
-
-  SystemTableUpdated = FALSE;
-  //
-  // Fill console handles in System Table if no console device assignd.
-  //
-  if (UpdateSystemTableConsole (L"ConOut", &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **) &gST->ConOut)) {
-    SystemTableUpdated = TRUE;
-  }
-  if (UpdateSystemTableConsole (L"ErrOut", &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **) &gST->StdErr)) {
-    SystemTableUpdated = TRUE;
-  }
-
-  if (SystemTableUpdated) {
-    //
-    // Update the CRC32 in the EFI System Table header
-    //
-    gST->Hdr.CRC32 = 0;
-    gBS->CalculateCrc32 (
-          (UINT8 *) &gST->Hdr,
-          gST->Hdr.HeaderSize,
-          &gST->Hdr.CRC32
-          );
-  }
-
-  return EFI_SUCCESS;
-
-}
-
-/**
-  Use SystemTable Conout to stop video based Simple Text Out consoles from going
-  to the video device. Put up LogoFile on every video device that is a console.
-
-  @param[in]  LogoFile   File name of logo to display on the center of the screen.
-
-  @retval EFI_SUCCESS     ConsoleControl has been flipped to graphics and logo displayed.
-  @retval EFI_UNSUPPORTED Logo not found
-
-**/
-EFI_STATUS
-EFIAPI
-EnableQuietBoot (
-  IN  EFI_GUID  *LogoFile
-  )
-{
-  EFI_STATUS                    Status;
-  EFI_OEM_BADGING_PROTOCOL      *Badging;
-  UINT32                        SizeOfX;
-  UINT32                        SizeOfY;
-  INTN                          DestX;
-  INTN                          DestY;
-  UINT8                         *ImageData;
-  UINTN                         ImageSize;
-  UINTN                         BltSize;
-  UINT32                        Instance;
-  EFI_BADGING_FORMAT            Format;
-  EFI_BADGING_DISPLAY_ATTRIBUTE Attribute;
-  UINTN                         CoordinateX;
-  UINTN                         CoordinateY;
-  UINTN                         Height;
-  UINTN                         Width;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
-  EFI_UGA_DRAW_PROTOCOL         *UgaDraw;
-  UINT32                        ColorDepth;
-  UINT32                        RefreshRate;
-  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;
-  EFI_BOOT_LOGO_PROTOCOL        *BootLogo;
-  UINTN                         NumberOfLogos;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LogoBlt;
-  UINTN                         LogoDestX;
-  UINTN                         LogoDestY;
-  UINTN                         LogoHeight;
-  UINTN                         LogoWidth;
-  UINTN                         NewDestX;
-  UINTN                         NewDestY;
-  UINTN                         NewHeight;
-  UINTN                         NewWidth;
-  UINT64                        BufferSize;
-
-  UgaDraw = NULL;
-  //
-  // Try to open GOP first
-  //
-  Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **) &GraphicsOutput);
-  if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {
-    GraphicsOutput = NULL;
-    //
-    // Open GOP failed, try to open UGA
-    //
-    Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **) &UgaDraw);
-  }
-  if (EFI_ERROR (Status)) {
-    return EFI_UNSUPPORTED;
-  }
-
-  //
-  // Try to open Boot Logo Protocol.
-  //
-  BootLogo = NULL;
-  gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);
-
-  //
-  // Erase Cursor from screen
-  //
-  gST->ConOut->EnableCursor (gST->ConOut, FALSE);
-
-  Badging = NULL;
-  Status  = gBS->LocateProtocol (&gEfiOEMBadgingProtocolGuid, NULL, (VOID **) &Badging);
-
-  if (GraphicsOutput != NULL) {
-    SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;
-    SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;
-
-  } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {
-    Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate);
-    if (EFI_ERROR (Status)) {
-      return EFI_UNSUPPORTED;
-    }
-  } else {
-    return EFI_UNSUPPORTED;
-  }
-
-  Blt = NULL;
-  NumberOfLogos = 0;
-  LogoDestX = 0;
-  LogoDestY = 0;
-  LogoHeight = 0;
-  LogoWidth = 0;
-  NewDestX = 0;
-  NewDestY = 0;
-  NewHeight = 0;
-  NewWidth = 0;
-  Instance = 0;
-  while (1) {
-    ImageData = NULL;
-    ImageSize = 0;
-
-    if (Badging != NULL) {
-      //
-      // Get image from OEMBadging protocol.
-      //
-      Status = Badging->GetImage (
-                          Badging,
-                          &Instance,
-                          &Format,
-                          &ImageData,
-                          &ImageSize,
-                          &Attribute,
-                          &CoordinateX,
-                          &CoordinateY
-                          );
-      if (EFI_ERROR (Status)) {
-        goto Done;
-      }
-
-      //
-      // Currently only support BMP format.
-      //
-      if (Format != EfiBadgingFormatBMP) {
-        if (ImageData != NULL) {
-          FreePool (ImageData);
-        }
-        continue;
-      }
-    } else {
-      //
-      // Get the specified image from FV.
-      //
-      Status = GetSectionFromAnyFv (LogoFile, EFI_SECTION_RAW, 0, (VOID **) &ImageData, &ImageSize);
-      if (EFI_ERROR (Status)) {
-        return EFI_UNSUPPORTED;
-      }
-
-      CoordinateX = 0;
-      CoordinateY = 0;
-      if (!FeaturePcdGet(PcdBootlogoOnlyEnable)) {
-        Attribute   = EfiBadgingDisplayAttributeCenter;
-      } else {
-        Attribute   = EfiBadgingDisplayAttributeCustomized;
-      } 
-    }
-
-    if (Blt != NULL) {
-      FreePool (Blt);
-    }
-    Blt = NULL;
-    Status = TranslateBmpToGopBlt (
-              ImageData,
-              ImageSize,
-              &Blt,
-              &BltSize,
-              &Height,
-              &Width
-              );
-    if (EFI_ERROR (Status)) {
-      FreePool (ImageData);
-
-      if (Badging == NULL) {
-        return Status;
-      } else {
-        continue;
-      }
-    }
-
-    //
-    // Calculate the display position according to Attribute.
-    //
-    switch (Attribute) {
-    case EfiBadgingDisplayAttributeLeftTop:
-      DestX = CoordinateX;
-      DestY = CoordinateY;
-      break;
-
-    case EfiBadgingDisplayAttributeCenterTop:
-      DestX = (SizeOfX - Width) / 2;
-      DestY = CoordinateY;
-      break;
-
-    case EfiBadgingDisplayAttributeRightTop:
-      DestX = (SizeOfX - Width - CoordinateX);
-      DestY = CoordinateY;;
-      break;
-
-    case EfiBadgingDisplayAttributeCenterRight:
-      DestX = (SizeOfX - Width - CoordinateX);
-      DestY = (SizeOfY - Height) / 2;
-      break;
-
-    case EfiBadgingDisplayAttributeRightBottom:
-      DestX = (SizeOfX - Width - CoordinateX);
-      DestY = (SizeOfY - Height - CoordinateY);
-      break;
-
-    case EfiBadgingDisplayAttributeCenterBottom:
-      DestX = (SizeOfX - Width) / 2;
-      DestY = (SizeOfY - Height - CoordinateY);
-      break;
-
-    case EfiBadgingDisplayAttributeLeftBottom:
-      DestX = CoordinateX;
-      DestY = (SizeOfY - Height - CoordinateY);
-      break;
-
-    case EfiBadgingDisplayAttributeCenterLeft:
-      DestX = CoordinateX;
-      DestY = (SizeOfY - Height) / 2;
-      break;
-
-    case EfiBadgingDisplayAttributeCenter:
-      DestX = (SizeOfX - Width) / 2;
-      DestY = (SizeOfY - Height) / 2;
-      break;
-
-    case EfiBadgingDisplayAttributeCustomized:
-      DestX = (SizeOfX - Width) / 2;
-      DestY = ((SizeOfY * 382) / 1000) - Height / 2;
-      break;
-
-    default:
-      DestX = CoordinateX;
-      DestY = CoordinateY;
-      break;
-    }
-
-    if ((DestX >= 0) && (DestY >= 0)) {
-      if (GraphicsOutput != NULL) {
-        Status = GraphicsOutput->Blt (
-                            GraphicsOutput,
-                            Blt,
-                            EfiBltBufferToVideo,
-                            0,
-                            0,
-                            (UINTN) DestX,
-                            (UINTN) DestY,
-                            Width,
-                            Height,
-                            Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
-                            );
-      } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {
-        Status = UgaDraw->Blt (
-                            UgaDraw,
-                            (EFI_UGA_PIXEL *) Blt,
-                            EfiUgaBltBufferToVideo,
-                            0,
-                            0,
-                            (UINTN) DestX,
-                            (UINTN) DestY,
-                            Width,
-                            Height,
-                            Width * sizeof (EFI_UGA_PIXEL)
-                            );
-      } else {
-        Status = EFI_UNSUPPORTED;
-      }
-
-      //
-      // Report displayed Logo information.
-      //
-      if (!EFI_ERROR (Status)) {
-        NumberOfLogos++;
-
-        if (LogoWidth == 0) {
-          //
-          // The first Logo.
-          //
-          LogoDestX = (UINTN) DestX;
-          LogoDestY = (UINTN) DestY;
-          LogoWidth = Width;
-          LogoHeight = Height;
-        } else {
-          //
-          // Merge new logo with old one.
-          //
-          NewDestX = MIN ((UINTN) DestX, LogoDestX);
-          NewDestY = MIN ((UINTN) DestY, LogoDestY);
-          NewWidth = MAX ((UINTN) DestX + Width, LogoDestX + LogoWidth) - NewDestX;
-          NewHeight = MAX ((UINTN) DestY + Height, LogoDestY + LogoHeight) - NewDestY;
-
-          LogoDestX = NewDestX;
-          LogoDestY = NewDestY;
-          LogoWidth = NewWidth;
-          LogoHeight = NewHeight;
-        }
-      }
-    }
-
-    FreePool (ImageData);
-
-    if (Badging == NULL) {
-      break;
-    }
-  }
-
-Done:
-  if (BootLogo == NULL || NumberOfLogos == 0) {
-    //
-    // No logo displayed.
-    //
-    if (Blt != NULL) {
-      FreePool (Blt);
-    }
-
-    return Status;
-  }
-
-  //
-  // Advertise displayed Logo information.
-  //
-  if (NumberOfLogos == 1) {
-    //
-    // Only one logo displayed, use its Blt buffer directly for BootLogo protocol.
-    //
-    LogoBlt = Blt;
-    Status = EFI_SUCCESS;
-  } else {
-    //
-    // More than one Logo displayed, get merged BltBuffer using VideoToBuffer operation. 
-    //
-    if (Blt != NULL) {
-      FreePool (Blt);
-    }
-
-    //
-    // Ensure the LogoHeight * LogoWidth doesn't overflow
-    //
-    if (LogoHeight > DivU64x64Remainder ((UINTN) ~0, LogoWidth, NULL)) {
-      return EFI_UNSUPPORTED;
-    }
-    BufferSize = MultU64x64 (LogoWidth, LogoHeight);
-
-    //
-    // Ensure the BufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow
-    //
-    if (BufferSize > DivU64x32 ((UINTN) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) {
-      return EFI_UNSUPPORTED;
-    }
-
-    LogoBlt = AllocateZeroPool ((UINTN)BufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
-    if (LogoBlt == NULL) {
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    if (GraphicsOutput != NULL) {
-      Status = GraphicsOutput->Blt (
-                          GraphicsOutput,
-                          LogoBlt,
-                          EfiBltVideoToBltBuffer,
-                          LogoDestX,
-                          LogoDestY,
-                          0,
-                          0,
-                          LogoWidth,
-                          LogoHeight,
-                          LogoWidth * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
-                          );
-    } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {
-      Status = UgaDraw->Blt (
-                          UgaDraw,
-                          (EFI_UGA_PIXEL *) LogoBlt,
-                          EfiUgaVideoToBltBuffer,
-                          LogoDestX,
-                          LogoDestY,
-                          0,
-                          0,
-                          LogoWidth,
-                          LogoHeight,
-                          LogoWidth * sizeof (EFI_UGA_PIXEL)
-                          );
-    } else {
-      Status = EFI_UNSUPPORTED;
-    }
-  }
-
-  if (!EFI_ERROR (Status)) {
-    BootLogo->SetBootLogo (BootLogo, LogoBlt, LogoDestX, LogoDestY, LogoWidth, LogoHeight);
-  }
-  FreePool (LogoBlt);
-
-  return Status;
-}
-
-/**
-  Use SystemTable Conout to turn on video based Simple Text Out consoles. The 
-  Simple Text Out screens will now be synced up with all non video output devices
-
-  @retval EFI_SUCCESS     UGA devices are back in text mode and synced up.
-
-**/
-EFI_STATUS
-EFIAPI
-DisableQuietBoot (
-  VOID
-  )
-{
-
-  //
-  // Enable Cursor on Screen
-  //
-  gST->ConOut->EnableCursor (gST->ConOut, TRUE);
-  return EFI_SUCCESS;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c
deleted file mode 100644
index 313a1ea9f6..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c
+++ /dev/null
@@ -1,1575 +0,0 @@
-/** @file
-  Misc BDS library function
-
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "InternalBdsLib.h"
-
-
-#define MAX_STRING_LEN        200
-
-BOOLEAN   mFeaturerSwitch = TRUE;
-BOOLEAN   mResetRequired  = FALSE;
-
-extern UINT16 gPlatformBootTimeOutDefault;
-
-/**
-  The function will go through the driver option link list, load and start
-  every driver the driver option device path point to.
-
-  @param  BdsDriverLists        The header of the current driver option link list
-
-**/
-VOID
-EFIAPI
-BdsLibLoadDrivers (
-  IN LIST_ENTRY                   *BdsDriverLists
-  )
-{
-  EFI_STATUS                Status;
-  LIST_ENTRY                *Link;
-  BDS_COMMON_OPTION         *Option;
-  EFI_HANDLE                ImageHandle;
-  EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;
-  UINTN                     ExitDataSize;
-  CHAR16                    *ExitData;
-  BOOLEAN                   ReconnectAll;
-
-  ReconnectAll = FALSE;
-
-  //
-  // Process the driver option
-  //
-  for (Link = BdsDriverLists->ForwardLink; Link != BdsDriverLists; Link = Link->ForwardLink) {
-    Option = CR (Link, BDS_COMMON_OPTION, Link, BDS_LOAD_OPTION_SIGNATURE);
-    
-    //
-    // If a load option is not marked as LOAD_OPTION_ACTIVE,
-    // the boot manager will not automatically load the option.
-    //
-    if (!IS_LOAD_OPTION_TYPE (Option->Attribute, LOAD_OPTION_ACTIVE)) {
-      continue;
-    }
-    
-    //
-    // If a driver load option is marked as LOAD_OPTION_FORCE_RECONNECT,
-    // then all of the EFI drivers in the system will be disconnected and
-    // reconnected after the last driver load option is processed.
-    //
-    if (IS_LOAD_OPTION_TYPE (Option->Attribute, LOAD_OPTION_FORCE_RECONNECT)) {
-      ReconnectAll = TRUE;
-    }
-    
-    //
-    // Make sure the driver path is connected.
-    //
-    BdsLibConnectDevicePath (Option->DevicePath);
-
-    //
-    // Load and start the image that Driver#### describes
-    //
-    Status = gBS->LoadImage (
-                    FALSE,
-                    gImageHandle,
-                    Option->DevicePath,
-                    NULL,
-                    0,
-                    &ImageHandle
-                    );
-
-    if (!EFI_ERROR (Status)) {
-      gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &ImageInfo);
-
-      //
-      // Verify whether this image is a driver, if not,
-      // exit it and continue to parse next load option
-      //
-      if (ImageInfo->ImageCodeType != EfiBootServicesCode && ImageInfo->ImageCodeType != EfiRuntimeServicesCode) {
-        gBS->Exit (ImageHandle, EFI_INVALID_PARAMETER, 0, NULL);
-        continue;
-      }
-
-      if (Option->LoadOptionsSize != 0) {
-        ImageInfo->LoadOptionsSize  = Option->LoadOptionsSize;
-        ImageInfo->LoadOptions      = Option->LoadOptions;
-      }
-      //
-      // Before calling the image, enable the Watchdog Timer for
-      // the 5 Minute period
-      //
-      gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);
-
-      Status = gBS->StartImage (ImageHandle, &ExitDataSize, &ExitData);
-      DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Driver Return Status = %r\n", Status));
-
-      //
-      // Clear the Watchdog Timer after the image returns
-      //
-      gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);
-    }
-  }
-  
-  //
-  // Process the LOAD_OPTION_FORCE_RECONNECT driver option
-  //
-  if (ReconnectAll) {
-    BdsLibDisconnectAllEfi ();
-    BdsLibConnectAll ();
-  }
-
-}
-
-/**
-  Get the Option Number that does not used.
-  Try to locate the specific option variable one by one utile find a free number.
-
-  @param  VariableName          Indicate if the boot#### or driver#### option
-
-  @return The Minimal Free Option Number
-
-**/
-UINT16
-BdsLibGetFreeOptionNumber (
-  IN  CHAR16    *VariableName
-  )
-{
-  UINTN         Index;
-  CHAR16        StrTemp[10];
-  UINT16        *OptionBuffer;
-  UINTN         OptionSize;
-
-  //
-  // Try to find the minimum free number from 0, 1, 2, 3....
-  //
-  Index = 0;
-  do {
-    if (*VariableName == 'B') {
-      UnicodeSPrint (StrTemp, sizeof (StrTemp), L"Boot%04x", Index);
-    } else {
-      UnicodeSPrint (StrTemp, sizeof (StrTemp), L"Driver%04x", Index);
-    }
-    //
-    // try if the option number is used
-    //
-    OptionBuffer = BdsLibGetVariableAndSize (
-                     StrTemp,
-                     &gEfiGlobalVariableGuid,
-                     &OptionSize
-                     );
-    if (OptionBuffer == NULL) {
-      break;
-    }
-    FreePool(OptionBuffer);
-    Index++;
-  } while (TRUE);
-
-  return ((UINT16) Index);
-}
-
-
-/**
-  This function will register the new boot#### or driver#### option base on
-  the VariableName. The new registered boot#### or driver#### will be linked
-  to BdsOptionList and also update to the VariableName. After the boot#### or
-  driver#### updated, the BootOrder or DriverOrder will also be updated.
-
-  @param  BdsOptionList         The header of the boot#### or driver#### link list
-  @param  DevicePath            The device path which the boot#### or driver####
-                                option present
-  @param  String                The description of the boot#### or driver####
-  @param  VariableName          Indicate if the boot#### or driver#### option
-
-  @retval EFI_SUCCESS           The boot#### or driver#### have been success
-                                registered
-  @retval EFI_STATUS            Return the status of gRT->SetVariable ().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibRegisterNewOption (
-  IN  LIST_ENTRY                     *BdsOptionList,
-  IN  EFI_DEVICE_PATH_PROTOCOL       *DevicePath,
-  IN  CHAR16                         *String,
-  IN  CHAR16                         *VariableName
-  )
-{
-  EFI_STATUS                Status;
-  UINTN                     Index;
-  UINT16                    RegisterOptionNumber;
-  UINT16                    *TempOptionPtr;
-  UINTN                     TempOptionSize;
-  UINT16                    *OptionOrderPtr;
-  VOID                      *OptionPtr;
-  UINTN                     OptionSize;
-  UINT8                     *TempPtr;
-  EFI_DEVICE_PATH_PROTOCOL  *OptionDevicePath;
-  CHAR16                    *Description;
-  CHAR16                    OptionName[10];
-  BOOLEAN                   UpdateDescription;
-  UINT16                    BootOrderEntry;
-  UINTN                     OrderItemNum;
-
-  if (DevicePath == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  OptionPtr             = NULL;
-  OptionSize            = 0;
-  TempPtr               = NULL;
-  OptionDevicePath      = NULL;
-  Description           = NULL;
-  OptionOrderPtr        = NULL;
-  UpdateDescription     = FALSE;
-  Status                = EFI_SUCCESS;
-  ZeroMem (OptionName, sizeof (OptionName));
-
-  TempOptionSize = 0;
-  TempOptionPtr = BdsLibGetVariableAndSize (
-                    VariableName,
-                    &gEfiGlobalVariableGuid,
-                    &TempOptionSize
-                    );
-  //
-  // Compare with current option variable if the previous option is set in global variable.
-  //
-  for (Index = 0; Index < TempOptionSize / sizeof (UINT16); Index++) {
-    //
-    // TempOptionPtr must not be NULL if we have non-zero TempOptionSize.
-    //
-    ASSERT (TempOptionPtr != NULL);
-
-    if (*VariableName == 'B') {
-      UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", TempOptionPtr[Index]);
-    } else {
-      UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", TempOptionPtr[Index]);
-    }
-
-    OptionPtr = BdsLibGetVariableAndSize (
-                  OptionName,
-                  &gEfiGlobalVariableGuid,
-                  &OptionSize
-                  );
-    if (OptionPtr == NULL) {
-      continue;
-    }
-
-    //
-    // Validate the variable.
-    //
-    if (!ValidateOption(OptionPtr, OptionSize)) {
-      FreePool(OptionPtr);
-      continue;
-    }
-
-    TempPtr         =   OptionPtr;
-    TempPtr         +=  sizeof (UINT32) + sizeof (UINT16);
-    Description     =   (CHAR16 *) TempPtr;
-    TempPtr         +=  StrSize ((CHAR16 *) TempPtr);
-    OptionDevicePath =  (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;
-
-    //
-    // Notes: the description may will change base on the GetStringToken
-    //
-    if (CompareMem (OptionDevicePath, DevicePath, GetDevicePathSize (OptionDevicePath)) == 0) {
-      if (CompareMem (Description, String, StrSize (Description)) == 0) { 
-        //
-        // Got the option, so just return
-        //
-        FreePool (OptionPtr);
-        FreePool (TempOptionPtr);
-        return EFI_SUCCESS;
-      } else {
-        //
-        // Option description changed, need update.
-        //
-        UpdateDescription = TRUE;
-        FreePool (OptionPtr);
-        break;
-      }
-    }
-
-    FreePool (OptionPtr);
-  }
-
-  OptionSize          = sizeof (UINT32) + sizeof (UINT16) + StrSize (String);
-  OptionSize          += GetDevicePathSize (DevicePath);
-  OptionPtr           = AllocateZeroPool (OptionSize);
-  ASSERT (OptionPtr != NULL);
-  
-  TempPtr             = OptionPtr;
-  *(UINT32 *) TempPtr = LOAD_OPTION_ACTIVE;
-  TempPtr             += sizeof (UINT32);
-  *(UINT16 *) TempPtr = (UINT16) GetDevicePathSize (DevicePath);
-  TempPtr             += sizeof (UINT16);
-  CopyMem (TempPtr, String, StrSize (String));
-  TempPtr             += StrSize (String);
-  CopyMem (TempPtr, DevicePath, GetDevicePathSize (DevicePath));
-
-  if (UpdateDescription) {
-    //
-    // The number in option#### to be updated. 
-    // In this case, we must have non-NULL TempOptionPtr.
-    //
-    ASSERT (TempOptionPtr != NULL);
-    RegisterOptionNumber = TempOptionPtr[Index];
-  } else {
-    //
-    // The new option#### number
-    //
-    RegisterOptionNumber = BdsLibGetFreeOptionNumber(VariableName);
-  }
-
-  if (*VariableName == 'B') {
-    UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", RegisterOptionNumber);
-  } else {
-    UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", RegisterOptionNumber);
-  }
-
-  Status = gRT->SetVariable (
-                  OptionName,
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  OptionSize,
-                  OptionPtr
-                  );
-  //
-  // Return if only need to update a changed description or fail to set option.
-  //
-  if (EFI_ERROR (Status) || UpdateDescription) {
-    FreePool (OptionPtr);
-    if (TempOptionPtr != NULL) {
-      FreePool (TempOptionPtr);
-    }
-    return Status;
-  }
-
-  FreePool (OptionPtr);
-
-  //
-  // Update the option order variable
-  //
-
-  //
-  // If no option order
-  //
-  if (TempOptionSize == 0) {
-    BootOrderEntry = 0;
-    Status = gRT->SetVariable (
-                    VariableName,
-                    &gEfiGlobalVariableGuid,
-                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                    sizeof (UINT16),
-                    &BootOrderEntry
-                    );
-    if (TempOptionPtr != NULL) {
-      FreePool (TempOptionPtr);
-    }
-    return Status;
-  }
-  
-  //
-  // TempOptionPtr must not be NULL if TempOptionSize is not zero.
-  //
-  ASSERT (TempOptionPtr != NULL);
-  //
-  // Append the new option number to the original option order
-  //
-  OrderItemNum = (TempOptionSize / sizeof (UINT16)) + 1 ;
-  OptionOrderPtr = AllocateZeroPool ( OrderItemNum * sizeof (UINT16));
-  ASSERT (OptionOrderPtr!= NULL);
-  CopyMem (OptionOrderPtr, TempOptionPtr, (OrderItemNum - 1) * sizeof (UINT16));
-
-  OptionOrderPtr[Index] = RegisterOptionNumber;
-
-  Status = gRT->SetVariable (
-                  VariableName,
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  OrderItemNum * sizeof (UINT16),
-                  OptionOrderPtr
-                  );
-  FreePool (TempOptionPtr);
-  FreePool (OptionOrderPtr);
-
-  return Status;
-}
-
-/**
-  Returns the size of a device path in bytes.
-
-  This function returns the size, in bytes, of the device path data structure 
-  specified by DevicePath including the end of device path node. If DevicePath 
-  is NULL, then 0 is returned. If the length of the device path is bigger than
-  MaxSize, also return 0 to indicate this is an invalidate device path.
-
-  @param  DevicePath         A pointer to a device path data structure.
-  @param  MaxSize            Max valid device path size. If big than this size, 
-                             return error.
-  
-  @retval 0                  An invalid device path.
-  @retval Others             The size of a device path in bytes.
-
-**/
-UINTN
-GetDevicePathSizeEx (
-  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath,
-  IN UINTN                           MaxSize
-  )
-{
-  UINTN  Size;
-  UINTN  NodeSize;
-
-  if (DevicePath == NULL) {
-    return 0;
-  }
-
-  //
-  // Search for the end of the device path structure
-  //
-  Size = 0;
-  while (!IsDevicePathEnd (DevicePath)) {
-    NodeSize = DevicePathNodeLength (DevicePath);
-    if (NodeSize < END_DEVICE_PATH_LENGTH) {
-      return 0;
-    }
-    Size += NodeSize;
-    if (Size > MaxSize) {
-      return 0;
-    }
-    DevicePath = NextDevicePathNode (DevicePath);
-  }
-  Size += DevicePathNodeLength (DevicePath);
-  if (Size > MaxSize) {
-    return 0;
-  }
-
-  return Size;
-}
-
-/**
-  Returns the length of a Null-terminated Unicode string. If the length is 
-  bigger than MaxStringLen, return length 0 to indicate that this is an 
-  invalidate string.
-
-  This function returns the byte length of Unicode characters in the Null-terminated
-  Unicode string specified by String. 
-
-  If String is NULL, then ASSERT().
-  If String is not aligned on a 16-bit boundary, then ASSERT().
-
-  @param  String           A pointer to a Null-terminated Unicode string.
-  @param  MaxStringLen     Max string len in this string.
-
-  @retval 0                An invalid string.
-  @retval Others           The length of String.
-
-**/
-UINTN
-StrSizeEx (
-  IN      CONST CHAR16              *String,
-  IN      UINTN                     MaxStringLen
-  )
-{
-  UINTN                             Length;
-
-  ASSERT (String != NULL && MaxStringLen != 0);
-  ASSERT (((UINTN) String & BIT0) == 0);
-
-  for (Length = 0; *String != L'\0' && MaxStringLen != Length; String++, Length+=2);
-
-  if (*String != L'\0' && MaxStringLen == Length) {
-    return 0;
-  }
-
-  return Length + 2;
-}
-
-/**
-  Validate the EFI Boot#### variable (VendorGuid/Name)
-
-  @param  Variable              Boot#### variable data.
-  @param  VariableSize          Returns the size of the EFI variable that was read
-
-  @retval TRUE                  The variable data is correct.
-  @retval FALSE                 The variable data is corrupted.
-
-**/
-BOOLEAN 
-ValidateOption (
-  UINT8                     *Variable,
-  UINTN                     VariableSize
-  )
-{
-  UINT16                    FilePathSize;
-  UINT8                     *TempPtr;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  UINTN                     TempSize;
-
-  if (VariableSize <= sizeof (UINT16) + sizeof (UINT32)) {
-    return FALSE;
-  }
-
-  //
-  // Skip the option attribute
-  //
-  TempPtr    = Variable;
-  TempPtr   += sizeof (UINT32);
-
-  //
-  // Get the option's device path size
-  //
-  FilePathSize  = *(UINT16 *) TempPtr;
-  TempPtr      += sizeof (UINT16);
-
-  //
-  // Get the option's description string size
-  //
-  TempSize = StrSizeEx ((CHAR16 *) TempPtr, VariableSize - sizeof (UINT16) - sizeof (UINT32));
-  TempPtr += TempSize;
-
-  //
-  // Get the option's device path
-  //
-  DevicePath =  (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;
-  TempPtr   += FilePathSize;
-
-  //
-  // Validation boot option variable.
-  //
-  if ((FilePathSize == 0) || (TempSize == 0)) {
-    return FALSE;
-  }
-
-  if (TempSize + FilePathSize + sizeof (UINT16) + sizeof (UINT32) > VariableSize) {
-    return FALSE;
-  }
-
-  return (BOOLEAN) (GetDevicePathSizeEx (DevicePath, FilePathSize) != 0);
-}
-
-/**
-  Convert a single character to number.
-  It assumes the input Char is in the scope of L'0' ~ L'9' and L'A' ~ L'F'
-  
-  @param Char    The input char which need to change to a hex number.
-  
-**/
-UINTN
-CharToUint (
-  IN CHAR16                           Char
-  )
-{
-  if ((Char >= L'0') && (Char <= L'9')) {
-    return (UINTN) (Char - L'0');
-  }
-
-  if ((Char >= L'A') && (Char <= L'F')) {
-    return (UINTN) (Char - L'A' + 0xA);
-  }
-
-  ASSERT (FALSE);
-  return 0;
-}
-
-/**
-  Build the boot#### or driver#### option from the VariableName, the
-  build boot#### or driver#### will also be linked to BdsCommonOptionList.
-
-  @param  BdsCommonOptionList   The header of the boot#### or driver#### option
-                                link list
-  @param  VariableName          EFI Variable name indicate if it is boot#### or
-                                driver####
-
-  @retval BDS_COMMON_OPTION     Get the option just been created
-  @retval NULL                  Failed to get the new option
-
-**/
-BDS_COMMON_OPTION *
-EFIAPI
-BdsLibVariableToOption (
-  IN OUT LIST_ENTRY                   *BdsCommonOptionList,
-  IN  CHAR16                          *VariableName
-  )
-{
-  UINT32                    Attribute;
-  UINT16                    FilePathSize;
-  UINT8                     *Variable;
-  UINT8                     *TempPtr;
-  UINTN                     VariableSize;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  BDS_COMMON_OPTION         *Option;
-  VOID                      *LoadOptions;
-  UINT32                    LoadOptionsSize;
-  CHAR16                    *Description;
-  UINT8                     NumOff;
-
-  //
-  // Read the variable. We will never free this data.
-  //
-  Variable = BdsLibGetVariableAndSize (
-              VariableName,
-              &gEfiGlobalVariableGuid,
-              &VariableSize
-              );
-  if (Variable == NULL) {
-    return NULL;
-  }
-
-  //
-  // Validate Boot#### variable data.
-  //
-  if (!ValidateOption(Variable, VariableSize)) {
-    FreePool (Variable);
-    return NULL;
-  }
-
-  //
-  // Notes: careful defined the variable of Boot#### or
-  // Driver####, consider use some macro to abstract the code
-  //
-  //
-  // Get the option attribute
-  //
-  TempPtr   =  Variable;
-  Attribute =  *(UINT32 *) Variable;
-  TempPtr   += sizeof (UINT32);
-
-  //
-  // Get the option's device path size
-  //
-  FilePathSize =  *(UINT16 *) TempPtr;
-  TempPtr      += sizeof (UINT16);
-
-  //
-  // Get the option's description string
-  //
-  Description = (CHAR16 *) TempPtr;
-
-  //
-  // Get the option's description string size
-  //
-  TempPtr += StrSize((CHAR16 *) TempPtr);
-
-  //
-  // Get the option's device path
-  //
-  DevicePath =  (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;
-  TempPtr    += FilePathSize;
-
-  //
-  // Get load opion data.
-  //
-  LoadOptions     = TempPtr;
-  LoadOptionsSize = (UINT32) (VariableSize - (UINTN) (TempPtr - Variable));
-
-  //
-  // The Console variables may have multiple device paths, so make
-  // an Entry for each one.
-  //
-  Option = AllocateZeroPool (sizeof (BDS_COMMON_OPTION));
-  if (Option == NULL) {
-    FreePool (Variable);
-    return NULL;
-  }
-
-  Option->Signature   = BDS_LOAD_OPTION_SIGNATURE;
-  Option->DevicePath  = AllocateZeroPool (GetDevicePathSize (DevicePath));
-  ASSERT(Option->DevicePath != NULL);
-  CopyMem (Option->DevicePath, DevicePath, GetDevicePathSize (DevicePath));
-
-  Option->Attribute   = Attribute;
-  Option->Description = AllocateZeroPool (StrSize (Description));
-  ASSERT(Option->Description != NULL);
-  CopyMem (Option->Description, Description, StrSize (Description));
-
-  Option->LoadOptions = AllocateZeroPool (LoadOptionsSize);
-  ASSERT(Option->LoadOptions != NULL);
-  CopyMem (Option->LoadOptions, LoadOptions, LoadOptionsSize);
-  Option->LoadOptionsSize = LoadOptionsSize;
-
-  //
-  // Get the value from VariableName Unicode string
-  // since the ISO standard assumes ASCII equivalent abbreviations, we can be safe in converting this
-  // Unicode stream to ASCII without any loss in meaning.
-  //
-  if (*VariableName == 'B') {
-    NumOff = (UINT8) (sizeof (L"Boot") / sizeof (CHAR16) - 1);
-    Option->BootCurrent = (UINT16) (CharToUint (VariableName[NumOff+0]) * 0x1000) 
-               + (UINT16) (CharToUint (VariableName[NumOff+1]) * 0x100)
-               + (UINT16) (CharToUint (VariableName[NumOff+2]) * 0x10)
-               + (UINT16) (CharToUint (VariableName[NumOff+3]) * 0x1);
-  }
-  InsertTailList (BdsCommonOptionList, &Option->Link);
-  FreePool (Variable);
-  return Option;
-}
-
-/**
-  Process BootOrder, or DriverOrder variables, by calling
-  BdsLibVariableToOption () for each UINT16 in the variables.
-
-  @param  BdsCommonOptionList   The header of the option list base on variable
-                                VariableName
-  @param  VariableName          EFI Variable name indicate the BootOrder or
-                                DriverOrder
-
-  @retval EFI_SUCCESS           Success create the boot option or driver option
-                                list
-  @retval EFI_OUT_OF_RESOURCES  Failed to get the boot option or driver option list
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibBuildOptionFromVar (
-  IN  LIST_ENTRY                      *BdsCommonOptionList,
-  IN  CHAR16                          *VariableName
-  )
-{
-  UINT16            *OptionOrder;
-  UINTN             OptionOrderSize;
-  UINTN             Index;
-  BDS_COMMON_OPTION *Option;
-  CHAR16            OptionName[20];
-
-  //
-  // Zero Buffer in order to get all BOOT#### variables
-  //
-  ZeroMem (OptionName, sizeof (OptionName));
-
-  //
-  // Read the BootOrder, or DriverOrder variable.
-  //
-  OptionOrder = BdsLibGetVariableAndSize (
-                  VariableName,
-                  &gEfiGlobalVariableGuid,
-                  &OptionOrderSize
-                  );
-  if (OptionOrder == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  for (Index = 0; Index < OptionOrderSize / sizeof (UINT16); Index++) {
-    if (*VariableName == 'B') {
-      UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", OptionOrder[Index]);
-    } else {
-      UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", OptionOrder[Index]);
-    }
-
-    Option              = BdsLibVariableToOption (BdsCommonOptionList, OptionName);
-    if (Option != NULL) {
-      Option->BootCurrent = OptionOrder[Index];
-    }
-  }
-
-  FreePool (OptionOrder);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Get boot mode by looking up configuration table and parsing HOB list
-
-  @param  BootMode              Boot mode from PEI handoff HOB.
-
-  @retval EFI_SUCCESS           Successfully get boot mode
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibGetBootMode (
-  OUT EFI_BOOT_MODE       *BootMode
-  )
-{
-  *BootMode = GetBootModeHob ();
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Read the EFI variable (VendorGuid/Name) and return a dynamically allocated
-  buffer, and the size of the buffer. If failure return NULL.
-
-  @param  Name                  String part of EFI variable name
-  @param  VendorGuid            GUID part of EFI variable name
-  @param  VariableSize          Returns the size of the EFI variable that was read
-
-  @return                       Dynamically allocated memory that contains a copy of the EFI variable
-                                Caller is responsible freeing the buffer.
-  @retval NULL                  Variable was not read
-
-**/
-VOID *
-EFIAPI
-BdsLibGetVariableAndSize (
-  IN  CHAR16              *Name,
-  IN  EFI_GUID            *VendorGuid,
-  OUT UINTN               *VariableSize
-  )
-{
-  EFI_STATUS  Status;
-  UINTN       BufferSize;
-  VOID        *Buffer;
-
-  Buffer = NULL;
-
-  //
-  // Pass in a zero size buffer to find the required buffer size.
-  //
-  BufferSize  = 0;
-  Status      = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize, Buffer);
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    //
-    // Allocate the buffer to return
-    //
-    Buffer = AllocateZeroPool (BufferSize);
-    if (Buffer == NULL) {
-      *VariableSize = 0;
-      return NULL;
-    }
-    //
-    // Read variable into the allocated buffer.
-    //
-    Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize, Buffer);
-    if (EFI_ERROR (Status)) {
-      FreePool (Buffer);
-      BufferSize = 0;
-      Buffer     = NULL;
-    }
-  }
-
-  ASSERT (((Buffer == NULL) && (BufferSize == 0)) ||
-          ((Buffer != NULL) && (BufferSize != 0))
-          );
-  *VariableSize = BufferSize;
-  return Buffer;
-}
-
-/**
-  Delete the instance in Multi which matches partly with Single instance
-
-  @param  Multi                 A pointer to a multi-instance device path data
-                                structure.
-  @param  Single                A pointer to a single-instance device path data
-                                structure.
-
-  @return This function will remove the device path instances in Multi which partly
-          match with the Single, and return the result device path. If there is no
-          remaining device path as a result, this function will return NULL.
-
-**/
-EFI_DEVICE_PATH_PROTOCOL *
-EFIAPI
-BdsLibDelPartMatchInstance (
-  IN     EFI_DEVICE_PATH_PROTOCOL  *Multi,
-  IN     EFI_DEVICE_PATH_PROTOCOL  *Single
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL  *Instance;
-  EFI_DEVICE_PATH_PROTOCOL  *NewDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *TempNewDevicePath;
-  UINTN                     InstanceSize;
-  UINTN                     SingleDpSize;
-  UINTN                     Size;
-
-  NewDevicePath     = NULL;
-  TempNewDevicePath = NULL;
-
-  if (Multi == NULL || Single == NULL) {
-    return Multi;
-  }
-
-  Instance        =  GetNextDevicePathInstance (&Multi, &InstanceSize);
-  SingleDpSize    =  GetDevicePathSize (Single) - END_DEVICE_PATH_LENGTH;
-  InstanceSize    -= END_DEVICE_PATH_LENGTH;
-
-  while (Instance != NULL) {
-
-    Size = (SingleDpSize < InstanceSize) ? SingleDpSize : InstanceSize;
-
-    if ((CompareMem (Instance, Single, Size) != 0)) {
-      //
-      // Append the device path instance which does not match with Single
-      //
-      TempNewDevicePath = NewDevicePath;
-      NewDevicePath = AppendDevicePathInstance (NewDevicePath, Instance);
-      if (TempNewDevicePath != NULL) {
-        FreePool(TempNewDevicePath);
-      }
-    }
-    FreePool(Instance);
-    Instance = GetNextDevicePathInstance (&Multi, &InstanceSize);
-    InstanceSize  -= END_DEVICE_PATH_LENGTH;
-  }
-
-  return NewDevicePath;
-}
-
-/**
-  Function compares a device path data structure to that of all the nodes of a
-  second device path instance.
-
-  @param  Multi                 A pointer to a multi-instance device path data
-                                structure.
-  @param  Single                A pointer to a single-instance device path data
-                                structure.
-
-  @retval TRUE                  If the Single device path is contained within Multi device path.
-  @retval FALSE                 The Single device path is not match within Multi device path.
-
-**/
-BOOLEAN
-EFIAPI
-BdsLibMatchDevicePaths (
-  IN  EFI_DEVICE_PATH_PROTOCOL  *Multi,
-  IN  EFI_DEVICE_PATH_PROTOCOL  *Single
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePathInst;
-  UINTN                     Size;
-
-  if (Multi == NULL || Single  == NULL) {
-    return FALSE;
-  }
-
-  DevicePath      = Multi;
-  DevicePathInst  = GetNextDevicePathInstance (&DevicePath, &Size);
-
-  //
-  // Search for the match of 'Single' in 'Multi'
-  //
-  while (DevicePathInst != NULL) {
-    //
-    // If the single device path is found in multiple device paths,
-    // return success
-    //
-    if (CompareMem (Single, DevicePathInst, Size) == 0) {
-      FreePool (DevicePathInst);
-      return TRUE;
-    }
-
-    FreePool (DevicePathInst);
-    DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);
-  }
-
-  return FALSE;
-}
-
-/**
-  This function prints a series of strings.
-
-  @param  ConOut                Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
-  @param  ...                   A variable argument list containing series of
-                                strings, the last string must be NULL.
-
-  @retval EFI_SUCCESS           Success print out the string using ConOut.
-  @retval EFI_STATUS            Return the status of the ConOut->OutputString ().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibOutputStrings (
-  IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL   *ConOut,
-  ...
-  )
-{
-  VA_LIST     Args;
-  EFI_STATUS  Status;
-  CHAR16      *String;
-
-  Status = EFI_SUCCESS;
-  VA_START (Args, ConOut);
-
-  while (!EFI_ERROR (Status)) {
-    //
-    // If String is NULL, then it's the end of the list
-    //
-    String = VA_ARG (Args, CHAR16 *);
-    if (String == NULL) {
-      break;
-    }
-
-    Status = ConOut->OutputString (ConOut, String);
-
-    if (EFI_ERROR (Status)) {
-      break;
-    }
-  }
-  
-  VA_END(Args);
-  return Status;
-}
-
-//
-//  Following are BDS Lib functions which contain all the code about setup browser reset reminder feature.
-//  Setup Browser reset reminder feature is that an reset reminder will be given before user leaves the setup browser  if
-//  user change any option setting which needs a reset to be effective, and  the reset will be applied according to  the user selection.
-//
-
-
-/**
-  Enable the setup browser reset reminder feature.
-  This routine is used in platform tip. If the platform policy need the feature, use the routine to enable it.
-
-**/
-VOID
-EFIAPI
-EnableResetReminderFeature (
-  VOID
-  )
-{
-  mFeaturerSwitch = TRUE;
-}
-
-
-/**
-  Disable the setup browser reset reminder feature.
-  This routine is used in platform tip. If the platform policy do not want the feature, use the routine to disable it.
-
-**/
-VOID
-EFIAPI
-DisableResetReminderFeature (
-  VOID
-  )
-{
-  mFeaturerSwitch = FALSE;
-}
-
-
-/**
-  Record the info that  a reset is required.
-  A  module boolean variable is used to record whether a reset is required.
-
-**/
-VOID
-EFIAPI
-EnableResetRequired (
-  VOID
-  )
-{
-  mResetRequired = TRUE;
-}
-
-
-/**
-  Record the info that  no reset is required.
-  A  module boolean variable is used to record whether a reset is required.
-
-**/
-VOID
-EFIAPI
-DisableResetRequired (
-  VOID
-  )
-{
-  mResetRequired = FALSE;
-}
-
-
-/**
-  Check whether platform policy enable the reset reminder feature. The default is enabled.
-
-**/
-BOOLEAN
-EFIAPI
-IsResetReminderFeatureEnable (
-  VOID
-  )
-{
-  return mFeaturerSwitch;
-}
-
-
-/**
-  Check if  user changed any option setting which needs a system reset to be effective.
-
-**/
-BOOLEAN
-EFIAPI
-IsResetRequired (
-  VOID
-  )
-{
-  return mResetRequired;
-}
-
-
-/**
-  Check whether a reset is needed, and finish the reset reminder feature.
-  If a reset is needed, Popup a menu to notice user, and finish the feature
-  according to the user selection.
-
-**/
-VOID
-EFIAPI
-SetupResetReminder (
-  VOID
-  )
-{
-  EFI_INPUT_KEY                 Key;
-  CHAR16                        *StringBuffer1;
-  CHAR16                        *StringBuffer2;
-
-
-  //
-  //check any reset required change is applied? if yes, reset system
-  //
-  if (IsResetReminderFeatureEnable ()) {
-    if (IsResetRequired ()) {
-
-      StringBuffer1 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));
-      ASSERT (StringBuffer1 != NULL);
-      StringBuffer2 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));
-      ASSERT (StringBuffer2 != NULL);
-      StrCpy (StringBuffer1, L"Configuration changed. Reset to apply it Now.");
-      StrCpy (StringBuffer2, L"Press ENTER to reset");
-      //
-      // Popup a menu to notice user
-      //
-      do {
-        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);
-      } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
-
-      FreePool (StringBuffer1);
-      FreePool (StringBuffer2);
-
-      gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
-    }
-  }
-}
-
-/**
-  Get the headers (dos, image, optional header) from an image
-
-  @param  Device                SimpleFileSystem device handle
-  @param  FileName              File name for the image
-  @param  DosHeader             Pointer to dos header
-  @param  Hdr                   The buffer in which to return the PE32, PE32+, or TE header.
-
-  @retval EFI_SUCCESS           Successfully get the machine type.
-  @retval EFI_NOT_FOUND         The file is not found.
-  @retval EFI_LOAD_ERROR        File is not a valid image file.
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibGetImageHeader (
-  IN  EFI_HANDLE                  Device,
-  IN  CHAR16                      *FileName,
-  OUT EFI_IMAGE_DOS_HEADER        *DosHeader,
-  OUT EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr
-  )
-{
-  EFI_STATUS                       Status;
-  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  *Volume;
-  EFI_FILE_HANDLE                  Root;
-  EFI_FILE_HANDLE                  ThisFile;
-  UINTN                            BufferSize;
-  UINT64                           FileSize;
-  EFI_FILE_INFO                    *Info;
-
-  Root     = NULL;
-  ThisFile = NULL;
-  //
-  // Handle the file system interface to the device
-  //
-  Status = gBS->HandleProtocol (
-                  Device,
-                  &gEfiSimpleFileSystemProtocolGuid,
-                  (VOID *) &Volume
-                  );
-  if (EFI_ERROR (Status)) {
-    goto Done;
-  }
-
-  Status = Volume->OpenVolume (
-                     Volume,
-                     &Root
-                     );
-  if (EFI_ERROR (Status)) {
-    Root = NULL;
-    goto Done;
-  }
-  ASSERT (Root != NULL);
-  Status = Root->Open (Root, &ThisFile, FileName, EFI_FILE_MODE_READ, 0);
-  if (EFI_ERROR (Status)) {
-    goto Done;
-  }
-  ASSERT (ThisFile != NULL);
-
-  //
-  // Get file size
-  //
-  BufferSize  = SIZE_OF_EFI_FILE_INFO + 200;
-  do {
-    Info   = NULL;
-    Status = gBS->AllocatePool (EfiBootServicesData, BufferSize, (VOID **) &Info);
-    if (EFI_ERROR (Status)) {
-      goto Done;
-    }
-    Status = ThisFile->GetInfo (
-                         ThisFile,
-                         &gEfiFileInfoGuid,
-                         &BufferSize,
-                         Info
-                         );
-    if (!EFI_ERROR (Status)) {
-      break;
-    }
-    if (Status != EFI_BUFFER_TOO_SMALL) {
-      FreePool (Info);
-      goto Done;
-    }
-    FreePool (Info);
-  } while (TRUE);
-
-  FileSize = Info->FileSize;
-  FreePool (Info);
-
-  //
-  // Read dos header
-  //
-  BufferSize = sizeof (EFI_IMAGE_DOS_HEADER);
-  Status = ThisFile->Read (ThisFile, &BufferSize, DosHeader);
-  if (EFI_ERROR (Status) ||
-      BufferSize < sizeof (EFI_IMAGE_DOS_HEADER) ||
-      FileSize <= DosHeader->e_lfanew ||
-      DosHeader->e_magic != EFI_IMAGE_DOS_SIGNATURE) {
-    Status = EFI_LOAD_ERROR;
-    goto Done;
-  }
-
-  //
-  // Move to PE signature
-  //
-  Status = ThisFile->SetPosition (ThisFile, DosHeader->e_lfanew);
-  if (EFI_ERROR (Status)) {
-    Status = EFI_LOAD_ERROR;
-    goto Done;
-  }
-
-  //
-  // Read and check PE signature
-  //
-  BufferSize = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION);
-  Status = ThisFile->Read (ThisFile, &BufferSize, Hdr.Pe32);
-  if (EFI_ERROR (Status) ||
-      BufferSize < sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION) ||
-      Hdr.Pe32->Signature != EFI_IMAGE_NT_SIGNATURE) {
-    Status = EFI_LOAD_ERROR;
-    goto Done;
-  }
-
-  //
-  // Check PE32 or PE32+ magic
-  //
-  if (Hdr.Pe32->OptionalHeader.Magic != EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC &&
-      Hdr.Pe32->OptionalHeader.Magic != EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
-    Status = EFI_LOAD_ERROR;
-    goto Done;
-  }
-
- Done:
-  if (ThisFile != NULL) {
-    ThisFile->Close (ThisFile);
-  }
-  if (Root != NULL) {
-    Root->Close (Root);
-  }
-  return Status;
-}
-
-/**
-  This routine adjust the memory information for different memory type and 
-  save them into the variables for next boot.
-**/
-VOID
-BdsSetMemoryTypeInformationVariable (
-  VOID
-  )
-{
-  EFI_STATUS                   Status;
-  EFI_MEMORY_TYPE_INFORMATION  *PreviousMemoryTypeInformation;
-  EFI_MEMORY_TYPE_INFORMATION  *CurrentMemoryTypeInformation;
-  UINTN                        VariableSize;
-  UINTN                        Index;
-  UINTN                        Index1;
-  UINT32                       Previous;
-  UINT32                       Current;
-  UINT32                       Next;
-  EFI_HOB_GUID_TYPE            *GuidHob;
-  BOOLEAN                      MemoryTypeInformationModified;
-  BOOLEAN                      MemoryTypeInformationVariableExists;
-  EFI_BOOT_MODE                BootMode;
-
-  MemoryTypeInformationModified       = FALSE;
-  MemoryTypeInformationVariableExists = FALSE;
-
-
-  BootMode = GetBootModeHob ();
-  //
-  // In BOOT_IN_RECOVERY_MODE, Variable region is not reliable.
-  //
-  if (BootMode == BOOT_IN_RECOVERY_MODE) {
-    return;
-  }
-
-  //
-  // Only check the the Memory Type Information variable in the boot mode 
-  // other than BOOT_WITH_DEFAULT_SETTINGS because the Memory Type
-  // Information is not valid in this boot mode.
-  //
-  if (BootMode != BOOT_WITH_DEFAULT_SETTINGS) {
-    VariableSize = 0;
-    Status = gRT->GetVariable (
-                    EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME,
-                    &gEfiMemoryTypeInformationGuid,
-                    NULL, 
-                    &VariableSize, 
-                    NULL
-                    );
-    if (Status == EFI_BUFFER_TOO_SMALL) {
-      MemoryTypeInformationVariableExists = TRUE;
-    }
-  }
-
-  //
-  // Retrieve the current memory usage statistics.  If they are not found, then
-  // no adjustments can be made to the Memory Type Information variable.
-  //
-  Status = EfiGetSystemConfigurationTable (
-             &gEfiMemoryTypeInformationGuid,
-             (VOID **) &CurrentMemoryTypeInformation
-             );
-  if (EFI_ERROR (Status) || CurrentMemoryTypeInformation == NULL) {
-    return;
-  }
-
-  //
-  // Get the Memory Type Information settings from Hob if they exist,
-  // PEI is responsible for getting them from variable and build a Hob to save them.
-  // If the previous Memory Type Information is not available, then set defaults
-  //
-  GuidHob = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
-  if (GuidHob == NULL) {
-    //
-    // If Platform has not built Memory Type Info into the Hob, just return.
-    //
-    return;
-  }
-  PreviousMemoryTypeInformation = GET_GUID_HOB_DATA (GuidHob);
-  VariableSize = GET_GUID_HOB_DATA_SIZE (GuidHob);
-
-  //
-  // Use a heuristic to adjust the Memory Type Information for the next boot
-  //
-  DEBUG ((EFI_D_INFO, "Memory  Previous  Current    Next   \n"));
-  DEBUG ((EFI_D_INFO, " Type    Pages     Pages     Pages  \n"));
-  DEBUG ((EFI_D_INFO, "======  ========  ========  ========\n"));
-
-  for (Index = 0; PreviousMemoryTypeInformation[Index].Type != EfiMaxMemoryType; Index++) {
-
-    for (Index1 = 0; CurrentMemoryTypeInformation[Index1].Type != EfiMaxMemoryType; Index1++) {
-      if (PreviousMemoryTypeInformation[Index].Type == CurrentMemoryTypeInformation[Index1].Type) {
-        break;
-      }
-    }
-    if (CurrentMemoryTypeInformation[Index1].Type == EfiMaxMemoryType) {
-      continue;
-    }
-
-    //
-    // Previous is the number of pages pre-allocated
-    // Current is the number of pages actually needed
-    //
-    Previous = PreviousMemoryTypeInformation[Index].NumberOfPages;
-    Current  = CurrentMemoryTypeInformation[Index1].NumberOfPages;
-    Next     = Previous;
-
-    //
-    // Inconsistent Memory Reserved across bootings may lead to S4 fail
-    // Write next varible to 125% * current when the pre-allocated memory is:
-    //  1. More than 150% of needed memory and boot mode is BOOT_WITH_DEFAULT_SETTING
-    //  2. Less than the needed memory
-    //
-    if ((Current + (Current >> 1)) < Previous) {
-      if (BootMode == BOOT_WITH_DEFAULT_SETTINGS) {
-        Next = Current + (Current >> 2);
-      }
-    } else if (Current > Previous) {
-      Next = Current + (Current >> 2);
-    }
-    if (Next > 0 && Next < 4) {
-      Next = 4;
-    }
-
-    if (Next != Previous) {
-      PreviousMemoryTypeInformation[Index].NumberOfPages = Next;
-      MemoryTypeInformationModified = TRUE;
-    }
-
-    DEBUG ((EFI_D_INFO, "  %02x    %08x  %08x  %08x\n", PreviousMemoryTypeInformation[Index].Type, Previous, Current, Next));
-  }
-
-  //
-  // If any changes were made to the Memory Type Information settings, then set the new variable value;
-  // Or create the variable in first boot.
-  //
-  if (MemoryTypeInformationModified || !MemoryTypeInformationVariableExists) {
-    Status = SetVariableAndReportStatusCodeOnError (
-               EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME,
-               &gEfiMemoryTypeInformationGuid,
-               EFI_VARIABLE_NON_VOLATILE  | EFI_VARIABLE_BOOTSERVICE_ACCESS,
-               VariableSize,
-               PreviousMemoryTypeInformation
-               );
-
-    if (!EFI_ERROR (Status)) {
-      //
-      // If the Memory Type Information settings have been modified, then reset the platform
-      // so the new Memory Type Information setting will be used to guarantee that an S4
-      // entry/resume cycle will not fail.
-      //
-      if (MemoryTypeInformationModified && PcdGetBool (PcdResetOnMemoryTypeInformationChange)) {
-        DEBUG ((EFI_D_INFO, "Memory Type Information settings change. Warm Reset!!!\n"));
-        gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);
-      }
-    } else {
-      DEBUG ((EFI_D_ERROR, "Memory Type Information settings cannot be saved. OS S4 may fail!\n"));
-    }
-  }
-}
-
-/**
-  This routine is kept for backward compatibility.
-**/
-VOID
-EFIAPI
-BdsLibSaveMemoryTypeInformation (
-  VOID
-  )
-{
-}
-
-
-/**
-  Identify a user and, if authenticated, returns the current user profile handle.
-
-  @param[out]  User           Point to user profile handle.
-  
-  @retval EFI_SUCCESS         User is successfully identified, or user identification
-                              is not supported.
-  @retval EFI_ACCESS_DENIED   User is not successfully identified
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibUserIdentify (
-  OUT EFI_USER_PROFILE_HANDLE         *User
-  )
-{
-  EFI_STATUS                          Status;
-  EFI_USER_MANAGER_PROTOCOL           *Manager;
-  
-  Status = gBS->LocateProtocol (
-                  &gEfiUserManagerProtocolGuid,
-                  NULL,
-                  (VOID **) &Manager
-                  );
-  if (EFI_ERROR (Status)) {
-    return EFI_SUCCESS;
-  }
-
-  return Manager->Identify (Manager, User);
-}
-
-/**
-  Set the variable and report the error through status code upon failure.
-
-  @param  VariableName           A Null-terminated string that is the name of the vendor's variable.
-                                 Each VariableName is unique for each VendorGuid. VariableName must
-                                 contain 1 or more characters. If VariableName is an empty string,
-                                 then EFI_INVALID_PARAMETER is returned.
-  @param  VendorGuid             A unique identifier for the vendor.
-  @param  Attributes             Attributes bitmask to set for the variable.
-  @param  DataSize               The size in bytes of the Data buffer. Unless the EFI_VARIABLE_APPEND_WRITE, 
-                                 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS, or 
-                                 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero 
-                                 causes the variable to be deleted. When the EFI_VARIABLE_APPEND_WRITE attribute is 
-                                 set, then a SetVariable() call with a DataSize of zero will not cause any change to 
-                                 the variable value (the timestamp associated with the variable may be updated however 
-                                 even if no new data value is provided,see the description of the 
-                                 EFI_VARIABLE_AUTHENTICATION_2 descriptor below. In this case the DataSize will not 
-                                 be zero since the EFI_VARIABLE_AUTHENTICATION_2 descriptor will be populated). 
-  @param  Data                   The contents for the variable.
-
-  @retval EFI_SUCCESS            The firmware has successfully stored the variable and its data as
-                                 defined by the Attributes.
-  @retval EFI_INVALID_PARAMETER  An invalid combination of attribute bits, name, and GUID was supplied, or the
-                                 DataSize exceeds the maximum allowed.
-  @retval EFI_INVALID_PARAMETER  VariableName is an empty string.
-  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the variable and its data.
-  @retval EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.
-  @retval EFI_WRITE_PROTECTED    The variable in question is read-only.
-  @retval EFI_WRITE_PROTECTED    The variable in question cannot be deleted.
-  @retval EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 
-                                 or EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACESS being set, but the AuthInfo 
-                                 does NOT pass the validation check carried out by the firmware.
-
-  @retval EFI_NOT_FOUND          The variable trying to be updated or deleted was not found.
-**/
-EFI_STATUS
-SetVariableAndReportStatusCodeOnError (
-  IN CHAR16     *VariableName,
-  IN EFI_GUID   *VendorGuid,
-  IN UINT32     Attributes,
-  IN UINTN      DataSize,
-  IN VOID       *Data
-  )
-{
-  EFI_STATUS                 Status;
-  EDKII_SET_VARIABLE_STATUS  *SetVariableStatus;
-  UINTN                      NameSize;
-
-  Status = gRT->SetVariable (
-                  VariableName,
-                  VendorGuid,
-                  Attributes,
-                  DataSize,
-                  Data
-                  );
-  if (EFI_ERROR (Status)) {
-    NameSize = StrSize (VariableName);
-    SetVariableStatus = AllocatePool (sizeof (EDKII_SET_VARIABLE_STATUS) + NameSize + DataSize);
-    if (SetVariableStatus != NULL) {
-      CopyGuid (&SetVariableStatus->Guid, VendorGuid);
-      SetVariableStatus->NameSize   = NameSize;
-      SetVariableStatus->DataSize   = DataSize;
-      SetVariableStatus->SetStatus  = Status;
-      SetVariableStatus->Attributes = Attributes;
-      CopyMem (SetVariableStatus + 1,                          VariableName, NameSize);
-      if ((Data != NULL) && (DataSize != 0)) {
-        CopyMem (((UINT8 *) (SetVariableStatus + 1)) + NameSize, Data,         DataSize);
-      }
-
-      REPORT_STATUS_CODE_EX (
-        EFI_ERROR_CODE,
-        PcdGet32 (PcdErrorCodeSetVariable),
-        0,
-        NULL,
-        &gEdkiiStatusCodeDataTypeVariableGuid,
-        SetVariableStatus,
-        sizeof (EDKII_SET_VARIABLE_STATUS) + NameSize + DataSize
-        );
-
-      FreePool (SetVariableStatus);
-    }
-  }
-
-  return Status;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/DevicePath.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/DevicePath.c
deleted file mode 100644
index a0b9da880d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/DevicePath.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/** @file
-  BDS internal function define the default device path string, it can be
-  replaced by platform device path.
-
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "InternalBdsLib.h"
-
-/**
-  This function converts an input device structure to a Unicode string.
-
-  @param DevPath                  A pointer to the device path structure.
-
-  @return A new allocated Unicode string that represents the device path.
-
-**/
-CHAR16 *
-EFIAPI
-DevicePathToStr (
-  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath
-  )
-{
-  return ConvertDevicePathToText (DevPath, TRUE, TRUE);
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
deleted file mode 100644
index 795a9de4b8..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
+++ /dev/null
@@ -1,143 +0,0 @@
-## @file
-#  General BDS library.
-#  
-#  General BDS defines and produce general interfaces for platform BDS driver including:
-#  1) BDS boot policy interface;
-#  2) BDS boot device connect interface;
-#  3) BDS Misc interfaces for mainting boot variable, ouput string, etc.
-#  
-#  Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#  
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = GenericBdsLib
-  MODULE_UNI_FILE                = GenericBdsLib.uni
-  FILE_GUID                      = e405ec31-ccaa-4dd4-83e8-0aec01703f7e
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = GenericBdsLib|DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION 
-  CONSTRUCTOR                    = GenericBdsLibConstructor
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  DevicePath.c
-  BdsConnect.c
-  BdsMisc.c
-  BdsConsole.c
-  BdsBoot.c
-  InternalBdsLib.h
-  String.h
-  String.c
-  GenericBdsStrings.uni
-  
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
-  ShellPkg/ShellPkg.dec
-  NetworkPkg/NetworkPkg.dec
-
-[LibraryClasses]
-  DevicePathLib
-  PeCoffGetEntryPointLib
-  BaseLib
-  HobLib
-  UefiRuntimeServicesTableLib
-  DxeServicesTableLib
-  MemoryAllocationLib
-  UefiLib
-  UefiBootServicesTableLib
-  BaseMemoryLib
-  DebugLib
-  PrintLib
-  PcdLib
-  PerformanceLib
-  TimerLib
-  DxeServicesLib
-  HiiLib
-  ReportStatusCodeLib
-  NetLib
-  BmpSupportLib
-
-[Guids]
-  ## SOMETIMES_CONSUMES ## HOB         # The hob holding memory type information
-  ## SOMETIMES_CONSUMES ## SystemTable # The identifier of memory type information type in system table
-  ## SOMETIMES_CONSUMES ## Variable:L"MemoryTypeInformation"
-  ## SOMETIMES_PRODUCES ## Variable:L"MemoryTypeInformation"
-  gEfiMemoryTypeInformationGuid                 
-  ## SOMETIMES_CONSUMES ## Variable:L"BootXXXX"    # Boot option variable
-  ## SOMETIMES_PRODUCES ## Variable:L"BootXXXX"    # Boot option variable
-  ## SOMETIMES_CONSUMES ## Variable:L"DriverXXXX"  # Driver load option.
-  ## SOMETIMES_PRODUCES ## Variable:L"DriverXXXX"  # Driver load option.
-  ## SOMETIMES_CONSUMES ## Variable:L"BootNext"    # Next Boot Option
-  ## SOMETIMES_PRODUCES ## Variable:L"BootNext"    # Next Boot Option
-  ## SOMETIMES_CONSUMES ## Variable:L"BootOrder"   # The boot option array
-  ## SOMETIMES_PRODUCES ## Variable:L"BootOrder"   # The boot option array
-  ## SOMETIMES_CONSUMES ## Variable:L"DriverOrder" # The driver order list
-  ## SOMETIMES_CONSUMES ## Variable:L"ConIn"       # The device path of console in device
-  ## SOMETIMES_PRODUCES ## Variable:L"ConIn"       # The device path of console in device
-  ## SOMETIMES_CONSUMES ## Variable:L"ConOut"      # The device path of console out device
-  ## SOMETIMES_PRODUCES ## Variable:L"ConOut"      # The device path of console out device
-  ## SOMETIMES_CONSUMES ## Variable:L"ErrOut"      # The device path of error out device
-  ## SOMETIMES_PRODUCES ## Variable:L"ErrOut"      # The device path of error out device
-  ## SOMETIMES_PRODUCES ## Variable:L"BootCurrent" # The boot option of current boot
-  ## SOMETIMES_PRODUCES ## Variable:L"BootNext"    # The number of next boot option
-  gEfiGlobalVariableGuid
-  gEfiFileInfoGuid                              ## SOMETIMES_CONSUMES ## GUID
-  gLastEnumLangGuid                             ## SOMETIMES_PRODUCES ## Variable:L"LastEnumLang" # Platform language at last time enumeration.
-  gHdBootDevicePathVariablGuid                  ## SOMETIMES_PRODUCES ## Variable:L"HDDP" # The device path of Boot file on Hard device.
-  gBdsLibStringPackageGuid                      ## CONSUMES ## HII # HII String PackageList Guid
-  ## SOMETIMES_PRODUCES ## Variable:L"LegacyDevOrder"
-  ## SOMETIMES_CONSUMES ## Variable:L"LegacyDevOrder"
-  gEfiLegacyDevOrderVariableGuid
-  gEdkiiStatusCodeDataTypeVariableGuid          ## SOMETIMES_CONSUMES ## GUID
-  gUefiShellFileGuid
-
-[Protocols]
-  gEfiSimpleFileSystemProtocolGuid              ## SOMETIMES_CONSUMES
-  gEfiLoadFileProtocolGuid                      ## SOMETIMES_CONSUMES
-  gEfiSimpleTextOutProtocolGuid                 ## CONSUMES
-  gEfiPciIoProtocolGuid                         ## SOMETIMES_CONSUMES
-  gEfiLoadedImageProtocolGuid                   ## SOMETIMES_CONSUMES
-  gEfiSimpleNetworkProtocolGuid                 ## SOMETIMES_CONSUMES
-  gEfiDebugPortProtocolGuid                     ## SOMETIMES_CONSUMES
-  gEfiSimpleTextInProtocolGuid                  ## CONSUMES
-  gEfiBlockIoProtocolGuid                       ## SOMETIMES_CONSUMES
-  gEfiFirmwareVolume2ProtocolGuid               ## SOMETIMES_CONSUMES
-  gEfiLegacyBiosProtocolGuid                    ## SOMETIMES_CONSUMES
-  gEfiCpuArchProtocolGuid                       ## CONSUMES
-  gEfiDevicePathProtocolGuid                    ## CONSUMES
-  gEfiAcpiS3SaveProtocolGuid                    ## SOMETIMES_CONSUMES
-  gEfiGraphicsOutputProtocolGuid                ## SOMETIMES_CONSUMES
-  gEfiUgaDrawProtocolGuid |gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport ## SOMETIMES_CONSUMES
-  gEfiOEMBadgingProtocolGuid                    ## SOMETIMES_CONSUMES
-  gEfiHiiFontProtocolGuid                       ## CONSUMES
-  gEfiUserManagerProtocolGuid                   ## SOMETIMES_CONSUMES
-  gEfiUsbIoProtocolGuid                         ## SOMETIMES_CONSUMES
-  gEfiBootLogoProtocolGuid                      ## SOMETIMES_CONSUMES
-
-[FeaturePcd]
-  gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport                   ## CONSUMES
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootlogoOnlyEnable ## CONSUMES
-
-[Pcd]
-  gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange ## SOMETIMES_CONSUMES
-  gEfiMdeModulePkgTokenSpaceGuid.PcdProgressCodeOsLoaderLoad  ## SOMETIMES_CONSUMES
-  gEfiMdeModulePkgTokenSpaceGuid.PcdProgressCodeOsLoaderStart ## SOMETIMES_CONSUMES
-  gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable      ## CONSUMES
-  gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed                       ## CONSUMES
-
-#
-# [BootMode] 
-#   RECOVERY_FULL    ## SOMETIMES_CONSUMES # Memory Type Information variable
-#
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.uni b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.uni
deleted file mode 100644
index c853d3409e..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.uni
+++ /dev/null
@@ -1,19 +0,0 @@
-// /** @file
-// General BDS library.
-//
-// General BDS defines and produce general interfaces for platform BDS driver including:
-// 1) BDS boot policy interface;
-// 2) BDS boot device connect interface;
-// 3) BDS Misc interfaces for mainting boot variable, ouput string, etc.
-//
-// Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
-//
-// SPDX-License-Identifier: BSD-2-Clause-Patent
-//
-// **/
-
-
-#string STR_MODULE_ABSTRACT             #language en-US "General BDS library"
-
-#string STR_MODULE_DESCRIPTION          #language en-US "General BDS defines and produces general interfaces for a platform BDS driver including: 1) BDS boot policy interface; 2) BDS boot device connect interface; 3) BDS Misc interfaces for maintaining boot variable, output string, etc."
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsStrings.uni b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsStrings.uni
deleted file mode 100644
index 59a75e548b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsStrings.uni
+++ /dev/null
@@ -1,30 +0,0 @@
-///** @file
-//  
-//  String definitions for Boot Option description.
-//  
-//  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
-//  SPDX-License-Identifier: BSD-2-Clause-Patent
-//  
-//**/
-
-/=#
-
-#langdef   en-US "English"
-#langdef   fr-FR "Français"
-
-#string STR_DESCRIPTION_FLOPPY         #language en-US  "EFI Floppy"
-                                       #language fr-FR  "fr-FR: EFI Floppy"
-#string STR_DESCRIPTION_CD_DVD         #language en-US  "EFI DVD/CDROM"
-                                       #language fr-FR  "fr-FR: EFI DVD/CDROM"
-#string STR_DESCRIPTION_HARDDRIVE      #language en-US  "EFI Hard Drive"
-                                       #language fr-FR  "fr-FR: EFI Hard Drive"
-#string STR_DESCRIPTION_USB            #language en-US  "EFI USB Device"
-                                       #language fr-FR  "fr-FR: EFI USB Device"
-#string STR_DESCRIPTION_SCSI           #language en-US  "EFI SCSI Device"
-                                       #language fr-FR  "fr-FR: EFI SCSI Device"
-#string STR_DESCRIPTION_MISC           #language en-US  "EFI Misc Device"
-                                       #language fr-FR  "fr-FR: EFI Misc Device"
-#string STR_DESCRIPTION_NETWORK        #language en-US  "EFI Network "
-                                       #language fr-FR  "fr-FR: EFI Network "
-#string STR_DESCRIPTION_NON_BLOCK      #language en-US  "EFI Non-Block Boot Device"
-                                       #language fr-FR  "fr-FR: EFI Non-Block Boot Device"
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
deleted file mode 100644
index 025f06572b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/** @file
-  BDS library definition, include the file and data structure
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _INTERNAL_BDS_LIB_H_
-#define _INTERNAL_BDS_LIB_H_
-
-#include <FrameworkDxe.h>
-
-#include <IndustryStandard/Pci.h>
-#include <IndustryStandard/PeImage.h>
-
-#include <Protocol/BlockIo.h>
-#include <Protocol/LoadedImage.h>
-#include <Protocol/Cpu.h>
-#include <Protocol/SimpleFileSystem.h>
-#include <Protocol/LoadFile.h>
-#include <Protocol/DebugPort.h>
-#include <Protocol/DevicePath.h>
-#include <Protocol/SimpleTextIn.h>
-#include <Protocol/LegacyBios.h>
-#include <Protocol/SimpleTextOut.h>
-#include <Protocol/SimpleNetwork.h>
-#include <Protocol/FirmwareVolume2.h>
-#include <Protocol/PciIo.h>
-#include <Protocol/AcpiS3Save.h>
-#include <Protocol/OEMBadging.h>
-#include <Protocol/GraphicsOutput.h>
-#include <Protocol/UgaDraw.h>
-#include <Protocol/HiiFont.h>
-#include <Protocol/HiiImage.h>
-#include <Protocol/UsbIo.h>
-#include <Protocol/BootLogo.h>
-
-#include <Guid/MemoryTypeInformation.h>
-#include <Guid/FileInfo.h>
-#include <Guid/GlobalVariable.h>
-#include <Guid/PcAnsi.h>
-#include <Guid/BdsLibHii.h>
-#include <Guid/HdBootVariable.h>
-#include <Guid/LastEnumLang.h>
-#include <Guid/LegacyDevOrder.h>
-#include <Guid/StatusCodeDataTypeVariable.h>
-
-#include <Library/PrintLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/DxeServicesTableLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/HobLib.h>
-#include <Library/BaseLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/PerformanceLib.h>
-#include <Library/PcdLib.h>
-#include <Library/PeCoffGetEntryPointLib.h>
-#include <Library/GenericBdsLib.h>
-#include <Library/TimerLib.h>
-#include <Library/PcdLib.h>
-#include <Library/DxeServicesLib.h>
-#include <Library/ReportStatusCodeLib.h>
-#include <Library/BmpSupportLib.h>
-
-#if !defined (EFI_REMOVABLE_MEDIA_FILE_NAME)
-    #if defined (MDE_CPU_EBC)
-        //
-        // Uefi specification only defines the default boot file name for IA32, X64
-        // and IPF processor, so need define boot file name for EBC architecture here.
-        //
-        #define EFI_REMOVABLE_MEDIA_FILE_NAME L"\\EFI\\BOOT\\BOOTEBC.EFI"
-    #else
-        #error "Can not determine the default boot file name for unknown processor type!"
-    #endif
-#endif
-
-/**
-  Get the headers (dos, image, optional header) from an image
-
-  @param  Device                SimpleFileSystem device handle
-  @param  FileName              File name for the image
-  @param  DosHeader             Pointer to dos header
-  @param  Hdr                   The buffer in which to return the PE32, PE32+, or TE header.
-
-  @retval EFI_SUCCESS           Successfully get the machine type.
-  @retval EFI_NOT_FOUND         The file is not found.
-  @retval EFI_LOAD_ERROR        File is not a valid image file.
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibGetImageHeader (
-  IN  EFI_HANDLE                  Device,
-  IN  CHAR16                      *FileName,
-  OUT EFI_IMAGE_DOS_HEADER        *DosHeader,
-  OUT EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr
-  );
-
-/**
-  This routine adjust the memory information for different memory type and 
-  save them into the variables for next boot.
-**/
-VOID
-BdsSetMemoryTypeInformationVariable (
-  VOID
-  );
-
-/**
-  Validate the EFI Boot#### or Driver#### variable (VendorGuid/Name)
-
-  @param  Variable              Boot#### variable data.
-  @param  VariableSize          Returns the size of the EFI variable that was read
-
-  @retval TRUE                  The variable data is correct.
-  @retval FALSE                 The variable data is corrupted.
-
-**/
-BOOLEAN 
-ValidateOption (
-  UINT8                     *Variable,
-  UINTN                     VariableSize
-  );
-
-/**
-  Set the variable and report the error through status code upon failure.
-
-  @param  VariableName           A Null-terminated string that is the name of the vendor's variable.
-                                 Each VariableName is unique for each VendorGuid. VariableName must
-                                 contain 1 or more characters. If VariableName is an empty string,
-                                 then EFI_INVALID_PARAMETER is returned.
-  @param  VendorGuid             A unique identifier for the vendor.
-  @param  Attributes             Attributes bitmask to set for the variable.
-  @param  DataSize               The size in bytes of the Data buffer. Unless the EFI_VARIABLE_APPEND_WRITE, 
-                                 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS, or 
-                                 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero 
-                                 causes the variable to be deleted. When the EFI_VARIABLE_APPEND_WRITE attribute is 
-                                 set, then a SetVariable() call with a DataSize of zero will not cause any change to 
-                                 the variable value (the timestamp associated with the variable may be updated however 
-                                 even if no new data value is provided,see the description of the 
-                                 EFI_VARIABLE_AUTHENTICATION_2 descriptor below. In this case the DataSize will not 
-                                 be zero since the EFI_VARIABLE_AUTHENTICATION_2 descriptor will be populated). 
-  @param  Data                   The contents for the variable.
-
-  @retval EFI_SUCCESS            The firmware has successfully stored the variable and its data as
-                                 defined by the Attributes.
-  @retval EFI_INVALID_PARAMETER  An invalid combination of attribute bits, name, and GUID was supplied, or the
-                                 DataSize exceeds the maximum allowed.
-  @retval EFI_INVALID_PARAMETER  VariableName is an empty string.
-  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the variable and its data.
-  @retval EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.
-  @retval EFI_WRITE_PROTECTED    The variable in question is read-only.
-  @retval EFI_WRITE_PROTECTED    The variable in question cannot be deleted.
-  @retval EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 
-                                 or EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACESS being set, but the AuthInfo 
-                                 does NOT pass the validation check carried out by the firmware.
-
-  @retval EFI_NOT_FOUND          The variable trying to be updated or deleted was not found.
-**/
-EFI_STATUS
-SetVariableAndReportStatusCodeOnError (
-  IN CHAR16     *VariableName,
-  IN EFI_GUID   *VendorGuid,
-  IN UINT32     Attributes,
-  IN UINTN      DataSize,
-  IN VOID       *Data
-  );
-
-#endif // _BDS_LIB_H_
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.c
deleted file mode 100644
index f36860d5a1..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/** @file
-  String support
-
-Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-#include "String.h"
-
-/**
-  Get string by string id from HII Interface
-
-
-  @param Id              String ID.
-
-  @retval  CHAR16 *  String from ID.
-  @retval  NULL      If error occurs.
-
-**/
-CHAR16 *
-BdsLibGetStringById (
-  IN  EFI_STRING_ID   Id
-  )
-{
-  return HiiGetString (gBdsLibStringPackHandle, Id, NULL);
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.h b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.h
deleted file mode 100644
index 53cabe64a9..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/** @file
-  String support
-
-Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _STRING_H_
-#define _STRING_H_
-
-#include <Library/HiiLib.h>
-#include <Library/DebugLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/UefiLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-
-extern EFI_HII_HANDLE gBdsLibStringPackHandle;
-
-//
-// This is the VFR compiler generated header file which defines the
-// string identifiers.
-//
-
-extern UINT8  GenericBdsLibStrings[];
-
-/**
-  Get string by string id from HII Interface
-
-
-  @param Id              String ID.
-
-  @retval  CHAR16 *  String from ID.
-  @retval  NULL      If error occurs.
-
-**/
-CHAR16 *
-BdsLibGetStringById (
-  IN  EFI_STRING_ID   Id
-  );
-
-#endif // _STRING_H_
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index 15a4251cf8..b0fbbdb9cb 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -9,12 +9,10 @@
 #**/
 
 [Defines]
-DEFINE FLASH_BASE       = 0xFF800000     #The base address of the 4Mb FLASH Device.
-DEFINE FLASH_SIZE       = 0x00800000     #The flash size in bytes of the 4Mb FLASH Device.
-DEFINE FLASH_BLOCK_SIZE = 0x1000        #The block size in bytes of the 4Mb FLASH Device.
-DEFINE FLASH_NUM_BLOCKS = 0x800           #The number of blocks in 4Mb FLASH Device.
-DEFINE FLASH_AREA_BASE_ADDRESS                                = 0xFF800000
-DEFINE FLASH_AREA_SIZE                                        = 0x00800000
+DEFINE FLASH_BASE       = 0xFF800000     #The base address of the 8Mb FLASH Device.
+DEFINE FLASH_SIZE       = 0x00800000     #The flash size in bytes of the 8Mb FLASH Device.
+DEFINE FLASH_BLOCK_SIZE = 0x1000         #The block size in bytes of the 8Mb FLASH Device.
+DEFINE FLASH_NUM_BLOCKS = 0x800          #The number of blocks in 8Mb FLASH Device.
 
 DEFINE FLASH_REGION_VLVMICROCODE_OFFSET                       = 0x00400000
 DEFINE FLASH_REGION_VLVMICROCODE_SIZE                         = 0x00040000
@@ -62,8 +60,11 @@ [FD.Vlv]
 #
 #Flash location override based on actual flash map
 #
-SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaBaseAddress            = $(FLASH_AREA_BASE_ADDRESS)
-SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaSize                   = $(FLASH_AREA_SIZE)
+SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaBaseAddress            = $(FLASH_BASE)
+SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaSize                   = $(FLASH_SIZE)
+
+SET gPlatformModuleTokenSpaceGuid.PcdBiosRomBase                     = $(FLASH_BASE)
+SET gPlatformModuleTokenSpaceGuid.PcdBiosRomSize                     = $(FLASH_SIZE)
 
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress = $(FLASH_REGION_VLVMICROCODE_BASE) + 0x60
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize = $(FLASH_REGION_VLVMICROCODE_SIZE) - 0x60
@@ -401,12 +402,9 @@ [FV.FVMAIN]
 INF UefiCpuPkg/CpuDxe/CpuDxe.inf
 INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
 INF MdeModulePkg/Universal/Metronome/Metronome.inf
-INF IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
-!if $(ARCH) == IA32
-INF USE=IA32 MdeModulePkg/Logo/Logo.inf
-!else
-INF USE=X64 MdeModulePkg/Logo/Logo.inf
-!endif
+INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+INF MdeModulePkg/Logo/LogoDxe.inf
+INF MdeModulePkg/Application/UiApp/UiApp.inf
 INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
 INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index b8ac61d710..107c160b76 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -9,34 +9,32 @@
 #**/
 
 [Defines]
-DEFINE FLASH_BASE       = 0xFFC00000     #The base address of the 4Mb FLASH Device.
-DEFINE FLASH_SIZE       = 0x00400000     #The flash size in bytes of the 4Mb FLASH Device.
-DEFINE FLASH_BLOCK_SIZE = 0x1000        #The block size in bytes of the 4Mb FLASH Device.
-DEFINE FLASH_NUM_BLOCKS = 0x400           #The number of blocks in 4Mb FLASH Device.
-DEFINE FLASH_AREA_BASE_ADDRESS                                = 0xFF800000
-DEFINE FLASH_AREA_SIZE                                        = 0x00800000
+DEFINE FLASH_BASE       = 0xFF800000     #The base address of the 8Mb FLASH Device.
+DEFINE FLASH_SIZE       = 0x00800000     #The flash size in bytes of the 8Mb FLASH Device.
+DEFINE FLASH_BLOCK_SIZE = 0x1000         #The block size in bytes of the 8Mb FLASH Device.
+DEFINE FLASH_NUM_BLOCKS = 0x800          #The number of blocks in 8Mb FLASH Device.
 
-DEFINE FLASH_REGION_VLVMICROCODE_OFFSET                       = 0x00000000
+DEFINE FLASH_REGION_VLVMICROCODE_OFFSET                       = 0x00400000
 DEFINE FLASH_REGION_VLVMICROCODE_SIZE                         = 0x00040000
 DEFINE FLASH_REGION_VLVMICROCODE_BASE                         = 0xFFC00000
 
-DEFINE FLASH_REGION_VPD_OFFSET                                = 0x00040000
+DEFINE FLASH_REGION_VPD_OFFSET                                = 0x00440000
 DEFINE FLASH_REGION_VPD_SIZE                                  = 0x0003E000
 
-DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_OFFSET = 0x0007E000
+DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_OFFSET = 0x0047E000
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_SIZE   = 0x00002000
 
 
-DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET   = 0x00080000
+DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET   = 0x00480000
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_SIZE     = 0x00040000
 
-DEFINE FLASH_REGION_FVMAIN_OFFSET                             = 0x00110000
-DEFINE FLASH_REGION_FVMAIN_SIZE                               = 0x00215000
+DEFINE FLASH_REGION_FVMAIN_OFFSET                             = 0x00510000
+DEFINE FLASH_REGION_FVMAIN_SIZE                               = 0x00210000
 
-DEFINE FLASH_REGION_FV_RECOVERY2_OFFSET                       = 0x00325000
-DEFINE FLASH_REGION_FV_RECOVERY2_SIZE                         = 0x0006B000
+DEFINE FLASH_REGION_FV_RECOVERY2_OFFSET                       = 0x00720000
+DEFINE FLASH_REGION_FV_RECOVERY2_SIZE                         = 0x00070000
 
-DEFINE FLASH_REGION_FV_RECOVERY_OFFSET                        = 0x00390000
+DEFINE FLASH_REGION_FV_RECOVERY_OFFSET                        = 0x00790000
 DEFINE FLASH_REGION_FV_RECOVERY_SIZE                          = 0x00070000
 
 ################################################################################
@@ -62,8 +60,11 @@ [FD.Vlv]
 #
 #Flash location override based on actual flash map
 #
-SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaBaseAddress            = $(FLASH_AREA_BASE_ADDRESS)
-SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaSize                   = $(FLASH_AREA_SIZE)
+SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaBaseAddress            = $(FLASH_BASE)
+SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaSize                   = $(FLASH_SIZE)
+
+SET gPlatformModuleTokenSpaceGuid.PcdBiosRomBase                     = $(FLASH_BASE)
+SET gPlatformModuleTokenSpaceGuid.PcdBiosRomSize                     = $(FLASH_SIZE)
 
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress = $(FLASH_REGION_VLVMICROCODE_BASE) + 0x60
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize = $(FLASH_REGION_VLVMICROCODE_SIZE) - 0x60
@@ -84,9 +85,12 @@ [FD.Vlv]
 # Fv Size can be adjusted; FVMAIN_COMPACT can be reduced to 0x120000, and FV_RECOVERY can be enlarged to 0x80000
 #
 ################################################################################
-# Since the Fce tool don't have gcc version, we can't handle default variable in Linux,
-# so we hardcode the default value of variable here.
-# Please note that we MUST update the binary once the default value is changed.
+
+  #
+  # IFWI Header
+  #
+0x0000|0x1000
+FILE=Vlv2TbltDevicePkg/Stitch/IFWIHeader/IFWI_HEADER.bin
 
 #
   # CPU Microcodes
@@ -347,12 +351,9 @@ [FV.FVMAIN]
 INF UefiCpuPkg/CpuDxe/CpuDxe.inf
 INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
 INF MdeModulePkg/Universal/Metronome/Metronome.inf
-INF IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
-!if $(ARCH) == IA32
-INF USE=IA32 MdeModulePkg/Logo/Logo.inf
-!else
-INF USE=X64 MdeModulePkg/Logo/Logo.inf
-!endif
+INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+INF MdeModulePkg/Logo/LogoDxe.inf
+INF MdeModulePkg/Application/UiApp/UiApp.inf
 INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
 INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index 3910281c49..e4c6750c70 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -118,7 +118,6 @@ [LibraryClasses.common]
   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
   UefiCpuLib|UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
-  GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
   FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
@@ -523,6 +522,8 @@ [PcdsFixedAtBuild.common]
   #
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackSize|0x4000
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
+
   #
   # Clear unused single certificate PCD
   #
@@ -933,19 +934,18 @@ [Components.X64]
   }
   MdeModulePkg/Universal/Metronome/Metronome.inf
 
-  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
+  MdeModulePkg/Universal/BdsDxe/BdsDxe.inf {
     <LibraryClasses>
-      OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
-      IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
-      BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
-      PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
+      PlatformBootManagerLib|Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
   }
-
-  $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
+  MdeModulePkg/Logo/LogoDxe.inf
+  MdeModulePkg/Application/UiApp/UiApp.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+  }
 
   MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index 2ae594e5be..f5795e5ab0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -116,7 +116,6 @@ [LibraryClasses.common]
   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
   UefiCpuLib|UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
-  GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
   FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
@@ -520,6 +519,8 @@ [PcdsFixedAtBuild.common]
   #
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackSize|0x4000
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
+
   #
   # Clear unused single certificate PCD
   #
@@ -917,19 +918,18 @@ [Components.IA32]
   }
   MdeModulePkg/Universal/Metronome/Metronome.inf
 
-  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
+  MdeModulePkg/Universal/BdsDxe/BdsDxe.inf {
     <LibraryClasses>
-      OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
-      IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
-      BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
-      PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
+      PlatformBootManagerLib|Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
   }
-
-  $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
+  MdeModulePkg/Logo/LogoDxe.inf
+  MdeModulePkg/Application/UiApp/UiApp.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+  }
 
   MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index 5cdc9bebc8..a930a85a35 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -118,7 +118,6 @@ [LibraryClasses.common]
   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
   UefiCpuLib|UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
-  GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
   FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
@@ -522,6 +521,8 @@ [PcdsFixedAtBuild.common]
   #
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackSize|0x4000
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
+
   #
   # Clear unused single certificate PCD
   #
@@ -932,19 +933,18 @@ [Components.X64]
   }
   MdeModulePkg/Universal/Metronome/Metronome.inf
 
-  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
+  MdeModulePkg/Universal/BdsDxe/BdsDxe.inf {
     <LibraryClasses>
-      OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
-      IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
-      BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
-      PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
+      PlatformBootManagerLib|Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
   }
-
-  $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
+  MdeModulePkg/Logo/LogoDxe.inf
+  MdeModulePkg/Application/UiApp/UiApp.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+  }
 
   MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c b/Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c
deleted file mode 100644
index 3e58a6d22a..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-
-**/
-
-/**
-  The user Entry Point for Application. The user code starts with this function
-  as the real entry point for the image goes into a library that calls this
-  function.
-
-  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
-  @param[in] SystemTable    A pointer to the EFI System Table.
-
-  @retval EFI_SUCCESS       The entry point is executed successfully.
-  @retval other             Some error occurs when executing this entry point.
-
-**/
-EFI_STATUS
-EFIAPI
-InitializeUserInterface (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf b/Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf
deleted file mode 100644
index f7a0a83b80..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-#
-# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = UiApp
-  FILE_GUID                      = 462CAA21-7614-4503-836E-8AB6F4662331
-  MODULE_TYPE                    = UEFI_APPLICATION
-  VERSION_STRING                 = 1.0
-  ENTRY_POINT                    = InitializeUserInterface
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  FrontPage.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-
-[LibraryClasses]
-  UefiApplicationEntryPoint
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 11/14] Vlv2TbltDevicePkg: Update boot mode/state behaviors
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (9 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 10/14] Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:08   ` [edk2-devel] " Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 12/14] Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols Michael D Kinney
                   ` (3 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

* Add platform specific PcdBootState PCD to remove Intel Framework
  dependency
* Set PcdUserPhysicalPresence to TRUE to Enable UEFI Secure Boot
  Setup Menus
* Remove unused code when NOCS_S3_SUPPORT is not set
* Update PlatformBootManagerLib to not perform a connect all
  when FastBoot is enabled.
* Add support for BOOT_ON_FLASH_UPDATE
* Remove logic in CheckSystemConfigSave() that was generating
  an ASSERT() when setup changes were saved.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../DxePlatformBootManagerLib/BdsPlatform.c   | 33 ++++++-
 .../DxePlatformBootManagerLib.inf             |  4 +-
 .../PlatformDxe/PlatformDxe.inf               |  1 -
 .../Vlv2TbltDevicePkg/PlatformPei/BootMode.c  | 99 +------------------
 .../Vlv2TbltDevicePkg/PlatformPei/Platform.c  |  8 --
 .../Vlv2TbltDevicePkg/PlatformPei/Platform.h  | 27 +----
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |  8 ++
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |  2 +
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |  2 +
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |  2 +
 .../PlatformSetupDxe/PlatformSetupDxe.inf     |  1 -
 .../PlatformSetupDxe/SetupInfoRecords.c       | 51 ----------
 12 files changed, 51 insertions(+), 187 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
index 4dd3827a6e..7fbbf281c6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
@@ -1,7 +1,7 @@
 /** @file
   This file include all platform action which can be customized by IBV/OEM.
 
-Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -1164,7 +1164,7 @@ PlatformBootManagerBeforeConsole (
   // Fill ConIn/ConOut in Full Configuration boot mode
   //
   gBootMode = GetBootModeHob();
-  DEBUG ((DEBUG_INFO, "PlatformBootManagerInit - %x\n", gBootMode));
+  DEBUG ((DEBUG_INFO, "PlatformBootManagerBeforeConsole: BootMode = %x\n", gBootMode));
 
   if (gBootMode == BOOT_WITH_FULL_CONFIGURATION ||
       gBootMode == BOOT_WITH_DEFAULT_SETTINGS ||
@@ -1263,7 +1263,18 @@ ConnectSequence (
   IN EFI_BOOT_MODE         BootMode
   )
 {
-  EfiBootManagerConnectAll ();
+  switch (BootMode) {
+  case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
+  case BOOT_WITH_MINIMAL_CONFIGURATION:
+  case BOOT_ON_S4_RESUME:
+    break;
+  case BOOT_WITH_FULL_CONFIGURATION:
+  case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
+  case BOOT_WITH_DEFAULT_SETTINGS:
+  default:
+    EfiBootManagerConnectAll ();
+    break;
+  }
 }
 
 /**
@@ -1311,6 +1322,7 @@ PlatformBootManagerAfterConsole (
   VOID
   )
 {
+  EFI_STATUS                    Status;
   EFI_BOOT_MODE                 LocalBootMode;
 
   DEBUG ((DEBUG_INFO, "PlatformBootManagerAfterConsole\n"));
@@ -1319,7 +1331,7 @@ PlatformBootManagerAfterConsole (
   // Get current Boot Mode
   //
   LocalBootMode = gBootMode;
-  DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode));
+  DEBUG ((DEBUG_INFO, "PlatformBootManagerAfterConsole: BootMode = %x\n", gBootMode));
 
   //
   // Logo show
@@ -1372,6 +1384,19 @@ PlatformBootManagerAfterConsole (
     break;
   }
 
+  //
+  // Use a DynamicHii type pcd to save the boot status, which is used to
+  // control configuration mode, such as FULL/MINIMAL/NO_CHANGES configuration.
+  //
+  DEBUG ((DEBUG_INFO, "PcdBootState = %d\n", PcdGetBool(PcdBootState)));
+  if (PcdGetBool(PcdBootState)) {
+    Status = PcdSetBoolS(PcdBootState, FALSE);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "Set PcdBootState to FALSE failed.\n"));
+    }
+    DEBUG ((DEBUG_INFO, "PcdBootState = %d\n", PcdGetBool(PcdBootState)));
+  }
+
   Print (L"Press F7 for BootMenu!\n");
 
   EfiBootManagerRefreshAllBootOption ();
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
index b04169ad33..0579a18660 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
@@ -1,7 +1,7 @@
 ### @file
 # Component name for module DxePlatformBootManagerLib
 #
-# Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -48,6 +48,7 @@ [Packages]
   MdeModulePkg/MdeModulePkg.dec
   SecurityPkg/SecurityPkg.dec
   MinPlatformPkg/MinPlatformPkg.dec
+  Vlv2TbltDevicePkg/PlatformPkg.dec
 
 [Pcd]
   gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable                    ## CONSUMES
@@ -66,6 +67,7 @@ [Pcd]
   gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleInputDevicePath  ## CONSUMES
   gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleOutputDevicePath ## CONSUMES
   gMinPlatformPkgTokenSpaceGuid.PcdTrustedStorageDevicePath       ## CONSUMES
+  gPlatformModuleTokenSpaceGuid.PcdBootState
 
 [Sources]
   BdsPlatform.c
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index a9ef744ef7..9fee691365 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -84,7 +84,6 @@ [Guids]
   gEfiGlobalVariableGuid
   gEfiEventExitBootServicesGuid
   gEfiVlv2VariableGuid
-  gEfiSecureBootEnableDisableGuid
   gEfiEndOfDxeEventGroupGuid
 
 [Protocols]
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/BootMode.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/BootMode.c
index 9fdcb620a3..5269b1ed39 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/BootMode.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/BootMode.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2018, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -84,6 +82,7 @@ CapsulePpiNotifyCallback (
     if (Status == EFI_SUCCESS) {
       if (Capsule->CheckCapsuleUpdate ((EFI_PEI_SERVICES**)PeiServices) == EFI_SUCCESS) {
         BootMode = BOOT_ON_FLASH_UPDATE;
+        DEBUG ((EFI_D_ERROR, "Setting BootMode to BOOT_ON_FLASH_UPDATE\n"));
         Status = (*PeiServices)->SetBootMode((const EFI_PEI_SERVICES **)PeiServices, BootMode);
         ASSERT_EFI_ERROR (Status);
       }
@@ -93,98 +92,6 @@ CapsulePpiNotifyCallback (
   return Status;
 }
 
-#ifdef NOCS_S3_SUPPORT
-EFI_STATUS
-UpdateBootMode (
-  IN CONST EFI_PEI_SERVICES     **PeiServices
-  )
-{
-  EFI_STATUS      Status;
-  EFI_BOOT_MODE   BootMode;
-  UINT16          SleepType;
-  CHAR16          *strBootMode;
-
-  Status = (*PeiServices)->GetBootMode(PeiServices, &BootMode);
-  ASSERT_EFI_ERROR (Status);
-  if (BootMode  == BOOT_IN_RECOVERY_MODE){
-    return Status;
-  }
-
-  //
-  // Let's assume things are OK if not told otherwise
-  //
-  BootMode = BOOT_WITH_FULL_CONFIGURATION;
-
-  if (GetSleepTypeAfterWakeup (PeiServices, &SleepType)) {
-    switch (SleepType) {
-      case V_PCH_ACPI_PM1_CNT_S3:
-        BootMode = BOOT_ON_S3_RESUME;
-        Status = (*PeiServices)->NotifyPpi (PeiServices, &mCapsuleNotifyList[0]);
-        ASSERT_EFI_ERROR (Status);
-        break;
-
-      case V_PCH_ACPI_PM1_CNT_S4:
-        BootMode = BOOT_ON_S4_RESUME;
-        break;
-
-      case V_PCH_ACPI_PM1_CNT_S5:
-        BootMode = BOOT_ON_S5_RESUME;
-        break;
-    } // switch (SleepType)
-  }
-
-  if (IsFastBootEnabled (PeiServices)) {
-    DEBUG ((EFI_D_INFO, "Prioritizing Boot mode to BOOT_WITH_MINIMAL_CONFIGURATION\n"));
-    PrioritizeBootMode (&BootMode, BOOT_WITH_MINIMAL_CONFIGURATION);
-  }
-
-  switch (BootMode) {
-    case BOOT_WITH_FULL_CONFIGURATION:
-      strBootMode = L"BOOT_WITH_FULL_CONFIGURATION";
-      break;
-    case BOOT_WITH_MINIMAL_CONFIGURATION:
-      strBootMode = L"BOOT_WITH_MINIMAL_CONFIGURATION";
-      break;
-    case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
-      strBootMode = L"BOOT_ASSUMING_NO_CONFIGURATION_CHANGES";
-      break;
-    case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
-      strBootMode = L"BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS";
-      break;
-    case BOOT_WITH_DEFAULT_SETTINGS:
-      strBootMode = L"BOOT_WITH_DEFAULT_SETTINGS";
-      break;
-    case BOOT_ON_S4_RESUME:
-      strBootMode = L"BOOT_ON_S4_RESUME";
-      break;
-    case BOOT_ON_S5_RESUME:
-      strBootMode = L"BOOT_ON_S5_RESUME";
-      break;
-    case BOOT_ON_S2_RESUME:
-      strBootMode = L"BOOT_ON_S2_RESUME";
-      break;
-    case BOOT_ON_S3_RESUME:
-      strBootMode = L"BOOT_ON_S3_RESUME";
-
-      break;
-    case BOOT_ON_FLASH_UPDATE:
-      strBootMode = L"BOOT_ON_FLASH_UPDATE";
-      break;
-    case BOOT_IN_RECOVERY_MODE:
-      strBootMode = L"BOOT_IN_RECOVERY_MODE";
-      break;
-    default:
-      strBootMode = L"Unknown boot mode";
-  } // switch (BootMode)
-
-  DEBUG ((EFI_D_ERROR, "Setting BootMode to %s\n", strBootMode));
-  Status = (*PeiServices)->SetBootMode(PeiServices, BootMode);
-  ASSERT_EFI_ERROR (Status);
-
-  return Status;
-}
-#endif
-
 /**
   Get sleep type after wakeup
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
index aa03f6ea95..90998871dc 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
@@ -813,14 +813,6 @@ PeiInitPlatform (
     sizeof (EFI_PLATFORM_INFO_HOB)
     );
 
-  //
-  // Set the new boot mode for MRC
-  //
-#ifdef NOCS_S3_SUPPORT
-  Status = UpdateBootMode (PeiServices);
-  ASSERT_EFI_ERROR (Status);
-#endif
-
   DEBUG((EFI_D_INFO, "Setup MMIO size ... \n\n"));
 
   //
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.h
index e1817b28c6..4f71e519e0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.h
@@ -1,12 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 **/
 
 
@@ -24,26 +21,6 @@ typedef struct {
 
 #define STALL_PEIM_FROM_THIS(a) CR (a, STALL_CALLBACK_STATE_INFORMATION, StallNotify, STALL_PEIM_SIGNATURE)
 
-#ifdef NOCS_S3_SUPPORT
-
-/**
-  Peform the boot mode determination logic
-  If the box is closed, then
-  1. If it's first time to boot, it's boot with full config .
-  2. If the ChassisIntrution is selected, force to be a boot with full config
-  3. Otherwise it's boot with no change.
-
-  @param  PeiServices General purpose services available to every PEIM.
-  @param  BootMode The detected boot mode.
-
-  @retval EFI_SUCCESS if the boot mode could be set
-**/
-EFI_STATUS
-UpdateBootMode (
-  IN CONST EFI_PEI_SERVICES     **PeiServices
-  );
-#endif
-
 /**
   This function reset the entire platform, including all processor and devices, and
   reboots the system.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index 5b255f4b05..a5c7062cbb 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -161,6 +161,14 @@ [PcdsDynamic,PcdsDynamicEx]
   gPlatformModuleTokenSpaceGuid.PcdInConfigMode|FALSE|BOOLEAN|0x80000001
   gPlatformModuleTokenSpaceGuid.PcdConnectUSBKeyboardonWaitForKeyStroke|FALSE|BOOLEAN|0x80000002
   gPlatformModuleTokenSpaceGuid.PcdEnableWatchdogSwSmiInputValue|0|UINT8|0x80000003
+
+  ## Indicates if the machine has completed one boot cycle before.
+  #  After the complete boot, BootState will be set to FALSE.<BR><BR>
+  #   TRUE  - The complete boot cycle has not happened before.<BR>
+  #   FALSE - The complete boot cycle has happened before.<BR>
+  # @Prompt Boot State Flag
+  gPlatformModuleTokenSpaceGuid.PcdBootState|TRUE|BOOLEAN|0x80000004
+
 #
 #device firmware update support
 #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index e4c6750c70..2123745ccd 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -680,6 +680,7 @@ [PcdsPatchableInModule.common]
 [PcdsDynamicHii.common.DEFAULT]
   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|5 # Variable: L"Timeout"
   gEfiMdePkgTokenSpaceGuid.PcdHardwareErrorRecordLevel|L"HwErrRecSupport"|gEfiGlobalVariableGuid|0x0|1 # Variable: L"HwErrRecSupport"
+  gPlatformModuleTokenSpaceGuid.PcdBootState|L"BootState"|gPlatformModuleTokenSpaceGuid|0x0|TRUE
 
 [PcdsDynamicDefault.common.DEFAULT]
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0
@@ -733,6 +734,7 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
+  gEfiSecurityPkgTokenSpaceGuid.PcdUserPhysicalPresence|TRUE
 
 [PcdsDynamicExDefault.X64.DEFAULT]
 !if $(RECOVERY_ENABLE)
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index f5795e5ab0..086668d570 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -677,6 +677,7 @@ [PcdsPatchableInModule.common]
 [PcdsDynamicHii.common.DEFAULT]
   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|5 # Variable: L"Timeout"
   gEfiMdePkgTokenSpaceGuid.PcdHardwareErrorRecordLevel|L"HwErrRecSupport"|gEfiGlobalVariableGuid|0x0|1 # Variable: L"HwErrRecSupport"
+  gPlatformModuleTokenSpaceGuid.PcdBootState|L"BootState"|gPlatformModuleTokenSpaceGuid|0x0|TRUE
 
 [PcdsDynamicDefault.common.DEFAULT]
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0
@@ -730,6 +731,7 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
+  gEfiSecurityPkgTokenSpaceGuid.PcdUserPhysicalPresence|TRUE
 
 [PcdsDynamicExDefault.X64.DEFAULT]
 !if $(RECOVERY_ENABLE)
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index a930a85a35..5f2dd65ec8 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -679,6 +679,7 @@ [PcdsPatchableInModule.common]
 [PcdsDynamicHii.common.DEFAULT]
   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|5 # Variable: L"Timeout"
   gEfiMdePkgTokenSpaceGuid.PcdHardwareErrorRecordLevel|L"HwErrRecSupport"|gEfiGlobalVariableGuid|0x0|1 # Variable: L"HwErrRecSupport"
+  gPlatformModuleTokenSpaceGuid.PcdBootState|L"BootState"|gPlatformModuleTokenSpaceGuid|0x0|TRUE
 
 [PcdsDynamicDefault.common.DEFAULT]
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0
@@ -732,6 +733,7 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
+  gEfiSecurityPkgTokenSpaceGuid.PcdUserPhysicalPresence|TRUE
 
 [PcdsDynamicExDefault.X64.DEFAULT]
 !if $(RECOVERY_ENABLE)
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
index b745574421..85e8b1e8d6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
@@ -93,7 +93,6 @@ [Guids]
   gEfiIfrTianoGuid                              ## CONSUMES ## Guid
   gEfiPlatformInfoGuid
   gEfiNormalSetupGuid
-  gEfiSecureBootEnableDisableGuid
   gOsSelectionVariableGuid
   gEfiGlobalVariableGuid
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
index efd4a723e1..be99356d0f 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
@@ -1448,60 +1448,9 @@ CheckSystemConfigLoad(SYSTEM_CONFIGURATION *SystemConfigPtr)
   }
 }
 
-
-//
-// "SecureBootEnable" variable for the Secure boot feature enable/disable.
-//
-#define EFI_SECURE_BOOT_ENABLE_NAME      L"SecureBootEnable"
-extern EFI_GUID gEfiSecureBootEnableDisableGuid;
-
-
 VOID
 CheckSystemConfigSave(SYSTEM_CONFIGURATION *SystemConfigPtr)
 {
-  EFI_STATUS              Status;
-  UINT8                   SecureBootCfg;
-  BOOLEAN                 SecureBootNotFound;
-  UINTN                   DataSize;
-
-
-    //
-    // Secure Boot configuration changes
-	//
-    DataSize = sizeof(SecureBootCfg);
-    SecureBootNotFound = FALSE;
-    Status = gRT->GetVariable (
-                    EFI_SECURE_BOOT_ENABLE_NAME,
-                    &gEfiSecureBootEnableDisableGuid,
-                    NULL,
-                    &DataSize,
-                    &SecureBootCfg
-                    );
-
-    if (EFI_ERROR(Status)) {
-      SecureBootNotFound = TRUE;
-    }
-    if (SecureBootNotFound) {
-      Status = gRT->GetVariable (
-                      EFI_SECURE_BOOT_ENABLE_NAME,
-                      &gEfiSecureBootEnableDisableGuid,
-                      NULL,
-                      &DataSize,
-                      &SecureBootCfg
-                      );
-      ASSERT_EFI_ERROR(Status);
-    }
-    if ((SecureBootCfg) != SystemConfigPtr->SecureBoot) {
-      SecureBootCfg = !SecureBootCfg;
-      Status = gRT->SetVariable (
-                      EFI_SECURE_BOOT_ENABLE_NAME,
-                      &gEfiSecureBootEnableDisableGuid,
-                      EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
-                      sizeof (UINT8),
-                      &SecureBootCfg
-                      );
-    }
-
 }
 
 VOID
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 12/14] Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (10 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 11/14] Vlv2TbltDevicePkg: Update boot mode/state behaviors Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:08   ` [edk2-devel] " Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 13/14] Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol Michael D Kinney
                   ` (2 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

Change use of Intel Framework SMM Protocols to PI SMM
Protocols. This removes Intel Framework dependencies.
The PI SMM Protocols added are:

* gEfiSmmPowerButtonDispatch2ProtocolGuid
* gEfiSmmSxDispatch2ProtocolGuid
* gEfiSmmSwDispatch2ProtocolGuid

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Vlv2TbltDevicePkg/PlatformSmm/Platform.c  | 112 +++++++++++-------
 .../PlatformSmm/PlatformSmm.inf               |  16 +--
 .../PlatformSmm/SmmPlatform.h                 | 104 +++++++---------
 3 files changed, 114 insertions(+), 118 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
index fb9d090ada..c78174ed08 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
@@ -101,14 +101,14 @@ InitializePlatformSmm (
   EFI_STATUS                                Status;
   UINT8                                     Index;
   EFI_HANDLE                                Handle;
-  EFI_SMM_POWER_BUTTON_DISPATCH_CONTEXT     PowerButtonContext;
-  EFI_SMM_POWER_BUTTON_DISPATCH_PROTOCOL    *PowerButtonDispatch;
+  EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT     PowerButtonContext;
+  EFI_SMM_POWER_BUTTON_DISPATCH2_PROTOCOL   *PowerButtonDispatch;
   EFI_SMM_ICHN_DISPATCH_CONTEXT             IchnContext;
   EFI_SMM_ICHN_DISPATCH_PROTOCOL            *IchnDispatch;
-  EFI_SMM_SX_DISPATCH_PROTOCOL              *SxDispatch;
-  EFI_SMM_SX_DISPATCH_CONTEXT               EntryDispatchContext;
-  EFI_SMM_SW_DISPATCH_PROTOCOL              *SwDispatch;
-  EFI_SMM_SW_DISPATCH_CONTEXT               SwContext;
+  EFI_SMM_SX_DISPATCH2_PROTOCOL             *SxDispatch;
+  EFI_SMM_SX_REGISTER_CONTEXT               EntryDispatchContext;
+  EFI_SMM_SW_DISPATCH2_PROTOCOL             *SwDispatch;
+  EFI_SMM_SW_REGISTER_CONTEXT               SwContext;
   UINTN                                     VarSize;
   EFI_BOOT_MODE                             BootMode;
 
@@ -171,18 +171,18 @@ InitializePlatformSmm (
   //
   // Get the Power Button protocol
   //
-  Status = gBS->LocateProtocol(
-                  &gEfiSmmPowerButtonDispatchProtocolGuid,
-                  NULL,
-                  (void **)&PowerButtonDispatch
-                  );
+  Status = gSmst->SmmLocateProtocol(
+                    &gEfiSmmPowerButtonDispatch2ProtocolGuid,
+                    NULL,
+                    (VOID **)&PowerButtonDispatch
+                    );
   ASSERT_EFI_ERROR(Status);
 
   if (BootMode != BOOT_ON_FLASH_UPDATE) {
     //
     // Register for the power button event
     //
-    PowerButtonContext.Phase = PowerButtonEntry;
+    PowerButtonContext.Phase = EfiPowerButtonEntry;
     Status = PowerButtonDispatch->Register(
                                     PowerButtonDispatch,
                                     PowerButtonCallback,
@@ -194,11 +194,11 @@ InitializePlatformSmm (
   //
   // Get the Sx dispatch protocol
   //
-  Status = gBS->LocateProtocol (
-                  &gEfiSmmSxDispatchProtocolGuid,
-                  NULL,
-                                  (void **)&SxDispatch
-                  );
+  Status = gSmst->SmmLocateProtocol(
+                    &gEfiSmmSxDispatch2ProtocolGuid,
+                    NULL,
+                    (VOID **)&SxDispatch
+                    );
   ASSERT_EFI_ERROR(Status);
 
   //
@@ -209,7 +209,7 @@ InitializePlatformSmm (
 
   Status = SxDispatch->Register (
                          SxDispatch,
-                           (EFI_SMM_SX_DISPATCH)SxSleepEntryCallBack,
+                         SxSleepEntryCallBack,
                          &EntryDispatchContext,
                          &Handle
                          );
@@ -247,11 +247,11 @@ InitializePlatformSmm (
   //
   //  Get the Sw dispatch protocol
   //
-  Status = gBS->LocateProtocol (
-                  &gEfiSmmSwDispatchProtocolGuid,
-                  NULL,
-                                  (void **)&SwDispatch
-                  );
+  Status = gSmst->SmmLocateProtocol (
+                    &gEfiSmmSwDispatch2ProtocolGuid,
+                    NULL,
+                    (VOID **)&SwDispatch
+                    );
   ASSERT_EFI_ERROR(Status);
 
   //
@@ -341,11 +341,13 @@ InitializePlatformSmm (
   return EFI_SUCCESS;
 }
 
-VOID
+EFI_STATUS
 EFIAPI
 SmmReadyToBootCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   EFI_STATUS Status;
@@ -371,6 +373,7 @@ SmmReadyToBootCallback (
     mSetSmmVariableProtocolSmiAllowed = FALSE;
   }
 
+  return EFI_SUCCESS;
 }
 
 /**
@@ -385,8 +388,10 @@ SmmReadyToBootCallback (
 EFI_STATUS
 EFIAPI    
 SxSleepEntryCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   EFI_STATUS              Status;
@@ -479,11 +484,13 @@ SetAfterG3On (
   When a power button event happens, it shuts off the machine
 
 **/
-VOID
+EFI_STATUS
 EFIAPI
 PowerButtonCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_POWER_BUTTON_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   //
@@ -538,6 +545,8 @@ PowerButtonCallback (
   // Should not return
   //
   CpuDeadLoop();
+
+  return EFI_SUCCESS;
 }
 
 
@@ -547,11 +556,13 @@ PowerButtonCallback (
   @param DispatchContext - The predefined context which contained sleep type and phase
 
 **/
-VOID
+EFI_STATUS
 EFIAPI
 S5SleepAcLossCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   //
@@ -561,6 +572,7 @@ S5SleepAcLossCallBack (
   if (mAcLossVariable == 1) {
     SetAfterG3On (TRUE);
   }
+  return EFI_SUCCESS;
 }
 
 /**
@@ -571,11 +583,13 @@ S5SleepAcLossCallBack (
   @retval Clears the Save State bit in the clock.
 
 **/
-VOID
+EFI_STATUS
 EFIAPI
 S4S5CallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
 
@@ -590,6 +604,7 @@ S4S5CallBack (
     IoWrite32(GPIO_BASE_ADDRESS + R_PCH_GPIO_SC_LVL, Data32);
   }
 
+  return EFI_SUCCESS;
 }
 
 
@@ -624,16 +639,18 @@ S4S5ProgClock()
    Enable SCI
 
   @param DispatchHandle  - EFI Handle
-  @param DispatchContext - Pointer to the EFI_SMM_SW_DISPATCH_CONTEXT
+  @param DispatchContext - Pointer to the EFI_SMM_SW_REGISTER_CONTEXT
 
   @retval Nothing
 
 **/
-VOID
+EFI_STATUS
 EFIAPI
 EnableAcpiCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   UINT32 SmiEn;
@@ -690,7 +707,7 @@ EnableAcpiCallback (
   Pm1Cnt |= B_PCH_ACPI_PM1_CNT_SCI_EN;
   IoWrite16(mAcpiBaseAddr + R_PCH_ACPI_PM1_CNT, Pm1Cnt);
 
-
+  return EFI_SUCCESS;
 }
 
 /**
@@ -710,16 +727,18 @@ EnableAcpiCallback (
    Disable SCI
 
   @param DispatchHandle  - EFI Handle
-  @param DispatchContext - Pointer to the EFI_SMM_SW_DISPATCH_CONTEXT
+  @param DispatchContext - Pointer to the EFI_SMM_SW_REGISTER_CONTEXT
 
   @retval Nothing
 
 **/
-VOID
+EFI_STATUS
 EFIAPI
 DisableAcpiCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   UINT16 Pm1Cnt;
@@ -737,6 +756,7 @@ DisableAcpiCallback (
   Pm1Cnt &= ~B_PCH_ACPI_PM1_CNT_SCI_EN;
   IoWrite16(mAcpiBaseAddr + R_PCH_ACPI_PM1_CNT, Pm1Cnt);
 
+  return EFI_SUCCESS;
 }
 
 /**
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
index 73c3b6f2d0..9aff4a4895 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
@@ -36,6 +36,7 @@ [Sources]
 [LibraryClasses]
   UefiDriverEntryPoint
   UefiBootServicesTableLib
+  SmmServicesTableLib
   DebugLib
   IoLib
   BaseLib
@@ -52,15 +53,14 @@ [Guids]
 [Protocols]
   gEfiSmmIchnDispatchProtocolGuid
   gEfiGlobalNvsAreaProtocolGuid
-  gEfiSmmSwDispatchProtocolGuid
-  gEfiSmmPowerButtonDispatchProtocolGuid
-  gEfiSmmSxDispatchProtocolGuid
+  gEfiSmmSwDispatch2ProtocolGuid
+  gEfiSmmPowerButtonDispatch2ProtocolGuid
+  gEfiSmmSxDispatch2ProtocolGuid
   gEfiSmmVariableProtocolGuid
 
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
 
@@ -68,11 +68,11 @@ [Pcd.common]
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
 
 [Depex]
-  gEfiSmmAccess2ProtocolGuid               AND
-  gEfiSmmPowerButtonDispatchProtocolGuid  AND
-  gEfiSmmSxDispatchProtocolGuid           AND
+  gEfiSmmAccess2ProtocolGuid              AND
+  gEfiSmmPowerButtonDispatch2ProtocolGuid AND
+  gEfiSmmSxDispatch2ProtocolGuid          AND
   gEfiSmmIchnDispatchProtocolGuid         AND
-  gEfiSmmSwDispatchProtocolGuid           AND
+  gEfiSmmSwDispatch2ProtocolGuid          AND
   gEfiVariableArchProtocolGuid            AND
   gEfiVariableWriteArchProtocolGuid       AND
   gEfiGlobalNvsAreaProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
index bcb1d8ae92..735a562e3e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
@@ -21,18 +21,16 @@ Abstract:
 
 
 
-#include <Protocol/SmmBase.h>
-#include <Protocol/FirmwareVolume.h>
-#include <Protocol/SmmPowerButtonDispatch.h>
-#include <Protocol/SmmSxDispatch.h>
-#include <Protocol/SmmSwDispatch.h>
+#include <Protocol/SmmBase2.h>
+#include <Protocol/SmmPowerButtonDispatch2.h>
+#include <Protocol/SmmSxDispatch2.h>
 #include <Protocol/SmmSwDispatch2.h>
 #include <Protocol/SmmIchnDispatch.h>
-#include <Protocol/SmmAccess.h>
+#include <Protocol/SmmAccess2.h>
 #include <Protocol/SmmVariable.h>
 #include <Protocol/PciRootBridgeIo.h>
 #include <Protocol/LoadedImage.h>
-#include "Protocol/GlobalNvsArea.h"
+#include <Protocol/GlobalNvsArea.h>
 #include <Guid/SetupVariable.h>
 #include <Guid/EfiVpdData.h>
 #include <Guid/PciLanInfo.h>
@@ -42,6 +40,7 @@ Abstract:
 #include "PlatformBaseAddresses.h"
 
 #include <Library/UefiBootServicesTableLib.h>
+#include <Library/SmmServicesTableLib.h>
 #include <Library/S3BootScriptLib.h>
 #include <Library/IoLib.h>
 #include <Library/DebugLib.h>
@@ -130,53 +129,59 @@ extern EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *mPciRootBridgeIo;
 //
 // Callback function prototypes
 //
-VOID
+EFI_STATUS
 EFIAPI
 PowerButtonCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_POWER_BUTTON_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
-VOID
-S5SleepWakeOnLanCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
-  );
-
-VOID
+EFI_STATUS
 EFIAPI
 S5SleepAcLossCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
 
-VOID
+EFI_STATUS
 EFIAPI    
 S4S5CallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
-VOID
+EFI_STATUS
 EFIAPI    
 EnableAcpiCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
-VOID
+EFI_STATUS
 EFIAPI
 DisableAcpiCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
-VOID
+EFI_STATUS
 EFIAPI
 SmmReadyToBootCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
 VOID
@@ -185,46 +190,18 @@ DummyTco1Callback (
   IN  EFI_SMM_ICHN_DISPATCH_CONTEXT           *DispatchContext
   );
 
-
-VOID
-PerrSerrCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_ICHN_DISPATCH_CONTEXT           *DispatchContext
-  );
-
-VOID
-RiCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_ICHN_DISPATCH_CONTEXT           *DispatchContext
-  );
-
-
 VOID
 SetAfterG3On (
   BOOLEAN Enable
   );
 
-VOID
-TurnOffVregUsb (
-  );
-
-VOID
-PStateSupportCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT             *DispatchContext
-  );
-
-VOID
-PStateTransitionCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT             *DispatchContext
-  );
-
 EFI_STATUS
 EFIAPI    
 SxSleepEntryCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
 EFI_STATUS
@@ -232,6 +209,5 @@ SaveRuntimeScriptTable (
   VOID
   );
 
-
 #endif
 
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 13/14] Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (11 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 12/14] Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:08   ` Sun, Zailiang
  2019-07-01  2:55 ` [edk2-platforms Patch 14/14] Vlv2TbltDevicePkg/PlatformInitPei: Update MemoryTypeInformation Michael D Kinney
  2019-07-01  4:04 ` [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Gary Lin
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

Remove use of ACPI Support Protocol from IntelFrameworkPkg
and use the ACPI Table Protocol and ACPI SDT Protocol from
the MdePkg.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../AcpiPlatform/AcpiPlatform.c               | 72 +++++--------------
 .../AcpiPlatform/AcpiPlatform.h               |  2 +-
 .../AcpiPlatform/AcpiPlatform.inf             |  5 +-
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |  1 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |  2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |  2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |  2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |  2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |  2 +-
 9 files changed, 26 insertions(+), 64 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
index 13d904b834..962baf561d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
@@ -35,8 +35,7 @@ Abstract:
 #include <Guid/SetupVariable.h>
 #include <Guid/PlatformInfo.h>
 #include <Guid/BoardFeatures.h>
-#include <Protocol/AcpiSupport.h>
-#include <Protocol/AcpiS3Save.h>
+#include <Protocol/AcpiTable.h>
 #include <Library/CpuIA32.h>
 #include <SetupMode.h>
 #include <Guid/AcpiTableStorage.h>
@@ -142,15 +141,15 @@ LocateSupportProtocol (
     //
     // See if it has the ACPI storage file.
     //
-    Status = ((EFI_FIRMWARE_VOLUME_PROTOCOL *) (*Instance))->ReadFile (
-                                                              *Instance,
-                                                              &gEfiAcpiTableStorageGuid,
-                                                              NULL,
-                                                              &Size,
-                                                              &FileType,
-                                                              &Attributes,
-                                                              &FvStatus
-                                                              );
+    Status = ((EFI_FIRMWARE_VOLUME2_PROTOCOL *) (*Instance))->ReadFile (
+                                                                *Instance,
+                                                                &gEfiAcpiTableStorageGuid,
+                                                                NULL,
+                                                                &Size,
+                                                                &FileType,
+                                                                &Attributes,
+                                                                &FvStatus
+                                                                );
 
     //
     // If we found it, then we are done.
@@ -633,13 +632,11 @@ OnReadyToBoot (
   )
 {
   EFI_STATUS                  Status;
-  EFI_ACPI_TABLE_VERSION      TableVersion;
-  EFI_ACPI_SUPPORT_PROTOCOL   *AcpiSupport;
   SYSTEM_CONFIGURATION        SetupVarBuffer;
   UINTN                       VariableSize;
   EFI_PLATFORM_CPU_INFO       *PlatformCpuInfoPtr = NULL;
   EFI_PLATFORM_CPU_INFO       PlatformCpuInfo;
-  EFI_PEI_HOB_POINTERS          GuidHob;
+  EFI_PEI_HOB_POINTERS        GuidHob;
 
   if (mFirstNotify) {
     return;
@@ -701,23 +698,6 @@ OnReadyToBoot (
               );
     ASSERT_EFI_ERROR (Status);
   }
-
-  //
-  // Find the AcpiSupport protocol.
-  //
-  Status = LocateSupportProtocol (&gEfiAcpiSupportProtocolGuid, (VOID **) &AcpiSupport, 0);
-  ASSERT_EFI_ERROR (Status);
-
-  TableVersion = EFI_ACPI_TABLE_VERSION_2_0;
-
-  //
-  // Publish ACPI 1.0 or 2.0 Tables.
-  //
-  Status = AcpiSupport->PublishTables (
-                          AcpiSupport,
-                          TableVersion
-                          );
-  ASSERT_EFI_ERROR (Status);
 }
 
 VOID
@@ -759,8 +739,8 @@ AcpiPlatformEntryPoint (
 {
   EFI_STATUS                    Status;
   EFI_STATUS                    AcpiStatus;
-  EFI_ACPI_SUPPORT_PROTOCOL     *AcpiSupport;
-  EFI_FIRMWARE_VOLUME2_PROTOCOL  *FwVol;
+  EFI_ACPI_TABLE_PROTOCOL       *AcpiTable;
+  EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol;
   INTN                          Instance;
   EFI_ACPI_COMMON_HEADER        *CurrentTable;
   UINTN                         TableHandle;
@@ -821,9 +801,9 @@ AcpiPlatformEntryPoint (
   }
 
   //
-  // Find the AcpiSupport protocol.
+  // Find the AcpiTable protocol.
   //
-  Status = LocateSupportProtocol (&gEfiAcpiSupportProtocolGuid, (VOID **) &AcpiSupport, 0);
+  Status = LocateSupportProtocol (&gEfiAcpiTableProtocolGuid, (VOID **) &AcpiTable, 0);
   ASSERT_EFI_ERROR (Status);
 
   //
@@ -1171,11 +1151,10 @@ AcpiPlatformEntryPoint (
           // Add the table.
           //
           TableHandle = 0;
-          AcpiStatus = AcpiSupport->SetAcpiTable (
-                                      AcpiSupport,
+          AcpiStatus = AcpiTable->InstallAcpiTable (
+                                      AcpiTable,
                                       CurrentTable,
-                                      TRUE,
-                                      TableVersion,
+                                      Size,
                                       &TableHandle
                                       );
           ASSERT_EFI_ERROR (AcpiStatus);
@@ -1189,21 +1168,6 @@ AcpiPlatformEntryPoint (
     }
   }
 
-  //
-  // Publish ACPI 1.0 or 2.0 Tables.
-  //
-//  Status = AcpiSupport->PublishTables (
-//                          AcpiSupport,
-//                          TableVersion
-//                          );
-//  ASSERT_EFI_ERROR (Status);
-
-//  Status = EfiCreateEventReadyToBootEx (
-//             TPL_NOTIFY,
-//             OnReadyToBoot,
-//             NULL,
-//             &Event
-//             );
   Event = NULL;
   OnReadyToBoot (Event, NULL);
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
index b27ca661ff..8289eecc6d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
@@ -30,7 +30,7 @@ Abstract:
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/UefiRuntimeServicesTableLib.h>
 #include <Library/DebugLib.h>
-#include <Protocol/FirmwareVolume.h>
+#include <Protocol/FirmwareVolume2.h>
 #include <Library/PcdLib.h>
 #include <IndustryStandard/HighPrecisionEventTimerTable.h>
 #include <IndustryStandard/Acpi.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
index ce4db9fa85..6f843d6d2e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
@@ -34,7 +34,6 @@ [sources.common]
 [Packages]
   Vlv2TbltDevicePkg/PlatformPkg.dec
   MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -64,7 +63,7 @@ [Guids]
 [Protocols]
   gEnhancedSpeedstepProtocolGuid
   gEfiPlatformCpuProtocolGuid
-  gEfiAcpiSupportProtocolGuid
+  gEfiAcpiTableProtocolGuid
   gEfiFirmwareVolume2ProtocolGuid
   gEfiMpServiceProtocolGuid
   gEfiGlobalNvsAreaProtocolGuid
@@ -78,5 +77,5 @@ [Pcd]
 [Depex]
   gEfiVariableArchProtocolGuid        AND
   gEfiVariableWriteArchProtocolGuid   AND
-  gEfiAcpiSupportProtocolGuid AND
+  gEfiAcpiTableProtocolGuid AND
   gEfiMpServiceProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index a5c7062cbb..abe9d7e3a0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -44,7 +44,6 @@ [Guids]
   gEfiSetupVariableGuid                   = { 0xec87d643, 0xeba4, 0x4bb5, { 0xa1, 0xe5, 0x3f, 0x3e, 0x36, 0xb2, 0x0d, 0xa9 } }
   gEfiPlatformInfoGuid                    = { 0x1e2acc41, 0xe26a, 0x483d, { 0xaf, 0xc7, 0xa0, 0x56, 0xc3, 0x4e, 0x08, 0x7b } }
   gMfgModeVariableGuid                    = { 0xEF14FD78, 0x0793, 0x4e2b, { 0xAC, 0x6D, 0x06, 0x28, 0x47, 0xE0, 0x17, 0x91 } }
-  gEfiAcpiTableStorageGuid                = { 0x7e374e25, 0x8e01, 0x4fee, { 0x87, 0xf2, 0x39, 0x0c, 0x23, 0xc6, 0x06, 0xcd } }
   gACPIOSFRMfgStringVariableGuid          = { 0x72234213, 0x0fd7, 0x48a1, { 0xa5, 0x9f, 0xb4, 0x1b, 0xc1, 0x07, 0xfb, 0xcd } }
   gACPIOSFRRefDataBlockVariableGuid       = { 0x72234213, 0x0fd7, 0x48a1, { 0xa5, 0x9f, 0xb4, 0x1b, 0xc1, 0x07, 0xfb, 0xcd } }
   gACPIOSFRModelStringVariableGuid        = { 0xca1bcad9, 0xe021, 0x4547, { 0xa1, 0xb0, 0x5b, 0x22, 0xc7, 0xf6, 0x87, 0xf4 } }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index b0fbbdb9cb..0661c778c1 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -504,7 +504,7 @@ [FV.FVMAIN]
   #
 INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
 INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
-INF IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
+INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
 INF RuleOverride = ACPITABLE2 Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
 INF RuleOverride = ACPITABLE Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index 107c160b76..06bdebb10b 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -453,7 +453,7 @@ [FV.FVMAIN]
   #
 INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
 INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
-INF IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
+INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
 INF RuleOverride = ACPITABLE2 Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
 INF RuleOverride = ACPITABLE Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index 2123745ccd..b558caa61f 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -1108,7 +1108,7 @@ [Components.X64]
   }
   MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
+  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
   Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index 086668d570..99ada0ef0a 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -1092,7 +1092,7 @@ [Components.IA32]
   }
   MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
+  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
   Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index 5f2dd65ec8..87404d2d82 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -1107,7 +1107,7 @@ [Components.X64]
   }
   MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
+  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
   Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* [edk2-platforms Patch 14/14] Vlv2TbltDevicePkg/PlatformInitPei: Update MemoryTypeInformation
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (12 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 13/14] Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol Michael D Kinney
@ 2019-07-01  2:55 ` Michael D Kinney
  2019-07-01  4:08   ` Sun, Zailiang
  2019-07-01  4:04 ` [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Gary Lin
  14 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01  2:55 UTC (permalink / raw)
  To: devel; +Cc: Zailiang Sun, Yi Qian

Reduce extra reboots when UEFI Shell is run followed by an OS boot.
The extra reboot is due to use of EfiLoaderCode that exceeds the
MemoryTypeInformation bin size.  EfiLoaderCode should not be tracked.
Remove all memory types that should not be tracked, and update the
remaining bin sizes based on observed memory usage on an X64 DEBUG
profile.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../PlatformInitPei/MemoryPeim.c              | 21 +++++--------------
 1 file changed, 5 insertions(+), 16 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryPeim.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryPeim.c
index e6189b7713..64b606637a 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryPeim.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryPeim.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -40,19 +38,10 @@ Abstract:
 
 EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
   { EfiACPIReclaimMemory,       0x40  },    // 0x40 pages = 256k for ASL
-  { EfiACPIMemoryNVS,           0x100 },    // 0x100 pages = 1 MB for S3, SMM, HII, etc
-  { EfiReservedMemoryType,      0x600 },    // 48k for BIOS Reserved
-  { EfiMemoryMappedIO,          0     },
-  { EfiMemoryMappedIOPortSpace, 0     },
-  { EfiPalCode,                 0     },
-  { EfiRuntimeServicesCode,     0x200 },
+  { EfiACPIMemoryNVS,           0x40  },    // 0x40 pages = 256k MB for S3, SMM, HII, etc
+  { EfiReservedMemoryType,      0x80  },    // 512k for BIOS Reserved
+  { EfiRuntimeServicesCode,     0x100 },
   { EfiRuntimeServicesData,     0x100 },
-  { EfiLoaderCode,              0x100 },
-  { EfiLoaderData,              0x100 },
-  { EfiBootServicesCode,        0x800 },
-  { EfiBootServicesData,        0x2500},
-  { EfiConventionalMemory,      0     },
-  { EfiUnusableMemory,          0     },
   { EfiMaxMemoryType,           0     }
 };
 
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
                   ` (13 preceding siblings ...)
  2019-07-01  2:55 ` [edk2-platforms Patch 14/14] Vlv2TbltDevicePkg/PlatformInitPei: Update MemoryTypeInformation Michael D Kinney
@ 2019-07-01  4:04 ` Gary Lin
  2019-07-01 23:07   ` Michael D Kinney
  14 siblings, 1 reply; 42+ messages in thread
From: Gary Lin @ 2019-07-01  4:04 UTC (permalink / raw)
  To: devel@edk2.groups.io, michael.d.kinney@intel.com; +Cc: Yi Qian, Zailiang Sun

On Sun, Jun 30, 2019 at 07:55:39PM -0700,  Michael D Kinney  wrote:
> The following changes remove all dependencies on the IntelFrameworkPkg and 
> IntelFrameworkModulePkg from the Vlv2TbltDevicePkg platform builds.  These 
> changes do depend on updates binaries on the edk2-non-osi repository.
> 
Hi Michael,

I am amending the bash scripts for gcc. The firmware I built is using the
binaries from Development190216 and could boot into Linux successfully with
some workarounds for Wpce791, Bds, and InteFspWrapper. The patches you posted
eliminate those parts I have to work around. 

Just want to know if you need any assistance for the gcc build? I could
rebase my work upon your patches and send them later.

Thanks,

Gary Lin

> * Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid
> * Vlv2TbltDevicePkg: Reduce Intel Framework dependencies
> * Vlv2TbltDevicePkg: Remove unused modules/libraries
> * Vlv2TbltDevicePkg: Switch from ISA to SIO modules
> * Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol
> * Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol
> * Vlv2TbltDevicePkg: Remove use of BIOS ID tools
> * Vlv2TbltDevicePkg: Remove use of Data Hub Protocol
> * Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI
> * Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe
> * Vlv2TbltDevicePkg: Update boot mode/state behaviors
> * Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols
> * Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol
> 
> Cc: Zailiang Sun <zailiang.sun@intel.com>
> Cc: Yi Qian <yi.qian@intel.com>
> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
> 
> Michael D Kinney (14):
>   Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid
>   Vlv2TbltDevicePkg: Reduce Intel Framework dependencies
>   Vlv2TbltDevicePkg: Remove unused modules/libraries
>   Vlv2TbltDevicePkg: Switch from ISA to SIO modules
>   Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol
>   Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol
>   Vlv2TbltDevicePkg: Remove use of BIOS ID tools
>   Vlv2TbltDevicePkg: Remove use of Data Hub Protocol
>   Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI
>   Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe
>   Vlv2TbltDevicePkg: Update boot mode/state behaviors
>   Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols
>   Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol
>   Vlv2TbltDevicePkg/PlatformInitPei: Update MemoryTypeInformation
> 
>  .../AcpiPlatform/AcpiPlatform.c               |  137 +-
>  .../AcpiPlatform/AcpiPlatform.h               |   11 +-
>  .../AcpiPlatform/AcpiPlatform.inf             |   14 +-
>  Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env  |   25 -
>  Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env  |   25 -
>  .../Intel/Vlv2TbltDevicePkg/BiosIdx64D.env    |   25 -
>  .../Intel/Vlv2TbltDevicePkg/BiosIdx64R.env    |   25 -
>  .../BootScriptSaveDxe/BootScriptSaveDxe.inf   |   60 -
>  .../InternalBootScriptSave.h                  |  102 -
>  .../BootScriptSaveDxe/ScriptSave.c            |  626 ---
>  .../Intel/Vlv2TbltDevicePkg/Build_IFWI.bat    |   33 -
>  .../Library/FmpDeviceLib/FmpDeviceLib.c       |   12 +-
>  .../FspAzaliaConfigData/AzaliaConfig.bin      |  Bin 3708 -> 0 bytes
>  .../FspSupport/BootModePei/BootModePei.c      |   42 -
>  .../FspSupport/BootModePei/BootModePei.inf    |   40 -
>  .../FspHobProcessLibVlv2.c                    |  421 --
>  .../FspHobProcessLibVlv2.inf                  |   74 -
>  .../FspPlatformSecLibVlv2.c                   |  144 -
>  .../FspPlatformSecLibVlv2.inf                 |   82 -
>  .../Ia32/AsmSaveSecContext.asm                |   45 -
>  .../SecFspPlatformSecLibVlv2/Ia32/Fsp.inc     |   45 -
>  .../Ia32/PeiCoreEntry.asm                     |  135 -
>  .../Ia32/SecEntry.asm                         |  338 --
>  .../SecFspPlatformSecLibVlv2/Ia32/Stack.S     |   71 -
>  .../SecFspPlatformSecLibVlv2/Ia32/Stack.asm   |   76 -
>  .../SecFspPlatformSecLibVlv2/PlatformInit.c   |   36 -
>  .../SecFspPlatformSecLibVlv2/SaveSecContext.c |  108 -
>  .../SecGetPerformance.c                       |   83 -
>  .../SecPlatformInformation.c                  |   77 -
>  .../SecFspPlatformSecLibVlv2/SecRamInitData.c |   16 -
>  .../SecTempRamSupport.c                       |  149 -
>  .../SecFspPlatformSecLibVlv2/UartInit.c       |  192 -
>  Platform/Intel/Vlv2TbltDevicePkg/GenBiosId    |  Bin 12236 -> 0 bytes
>  .../Intel/Vlv2TbltDevicePkg/GenBiosId.exe     |  Bin 384000 -> 0 bytes
>  .../Vlv2TbltDevicePkg/Include/Guid/BiosId.h   |   30 -
>  .../Vlv2TbltDevicePkg/Include/Guid/IdccData.h |  104 -
>  .../Vlv2TbltDevicePkg/Include/Guid/ItkData.h  |   18 +-
>  .../Include/Guid/PlatformInfo.h               |    9 +-
>  .../Include/Library/BiosIdLib.h               |   22 +-
>  .../Include/Library/EfiRegTableLib.h          |   51 +-
>  .../Include/Protocol/LpcWpc83627Policy.h      |   92 -
>  .../Include/Protocol/LpcWpce791Policy.h       |   55 -
>  .../Include/Protocol/TpmMp.h                  |  136 -
>  .../Include/Protocol/UsbPolicy.h              |  126 -
>  .../Library/BiosIdLib/BiosIdLib.c             |  279 +-
>  .../Library/BiosIdLib/BiosIdLib.inf           |   21 +-
>  .../DxePlatformBootManagerLib/BdsPlatform.c   | 1434 ++++++
>  .../DxePlatformBootManagerLib/BdsPlatform.h   |  253 +
>  .../DxePlatformBootManagerLib.inf             |   97 +
>  .../DxePlatformBootManagerLib/MemoryTest.c    |   83 +
>  .../PlatformBootOption.c                      |  559 ++
>  .../Library/EfiRegTableLib/EfiRegTableLib.c   |   57 +-
>  .../Library/EfiRegTableLib/EfiRegTableLib.inf |   12 +-
>  .../Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c |   46 -
>  .../Library/I2CLib/I2CLibNull.inf             |   39 -
>  .../Library/I2CLibDxe/I2CLib.c                |  735 ---
>  .../Library/I2CLibDxe/I2CLibDxe.inf           |   39 -
>  .../Library/I2CLibDxe/I2CRegs.h               |  126 -
>  .../Library/I2CLibPei/I2CAccess.h             |   44 -
>  .../Library/I2CLibPei/I2CDelayPei.c           |   46 -
>  .../Library/I2CLibPei/I2CDelayPei.h           |   30 -
>  .../Library/I2CLibPei/I2CIoLibPei.c           |  178 -
>  .../Library/I2CLibPei/I2CIoLibPei.h           |  153 -
>  .../Library/I2CLibPei/I2CLibPei.c             |  638 ---
>  .../Library/I2CLibPei/I2CLibPei.h             |  280 -
>  .../Library/I2CLibPei/I2CLibPei.inf           |   40 -
>  .../BoardClkGens/BoardClkGens.c               |   23 +-
>  .../BoardClkGens/BoardClkGens.h               |    8 +-
>  .../MultiPlatformLib/BoardGpios/BoardGpios.c  |   12 +-
>  .../MultiPlatformLib/BoardGpios/BoardGpios.h  |    7 +-
>  .../MultiPlatformLib/MultiPlatformLib.h       |   11 +-
>  .../MultiPlatformLib/MultiPlatformLib.inf     |   11 +-
>  .../Library/PlatformBdsLib/BdsPlatform.c      | 3098 ------------
>  .../Library/PlatformBdsLib/BdsPlatform.h      |  516 --
>  .../Library/PlatformBdsLib/PlatformBdsLib.inf |  128 -
>  .../PlatformBdsLib/PlatformBdsStrings.uni     |   30 -
>  .../Library/PlatformBdsLib/PlatformData.c     |  306 --
>  .../Library/PlatformFspLib/PlatformFspLib.c   |   44 -
>  .../Library/PlatformFspLib/PlatformFspLib.inf |   49 -
>  .../SerialPortLib/PlatformSerialPortLib.h     |   53 -
>  .../Library/SerialPortLib/SerialPortLib.c     |  246 -
>  .../Library/SerialPortLib/SerialPortLib.inf   |   52 -
>  .../Library/SerialPortLib/SioInit.c           |  127 -
>  .../Library/SerialPortLib/SioInit.h           |   62 -
>  .../Library/SmbusLib/CommonHeader.h           |   26 -
>  .../Library/SmbusLib/SmbusLib.c               |  873 ----
>  .../Library/SmbusLib/SmbusLib.inf             |   46 -
>  .../Metronome/LegacyMetronome.c               |  185 -
>  .../Metronome/LegacyMetronome.h               |   64 -
>  .../Vlv2TbltDevicePkg/Metronome/Metronome.inf |   49 -
>  .../MonoStatusCode/MonoStatusCode.h           |   47 +-
>  .../MonoStatusCode/MonoStatusCode.inf         |    9 +-
>  .../Library/GenericBdsLib/BdsBoot.c           | 4490 -----------------
>  .../Library/GenericBdsLib/BdsConnect.c        |  429 --
>  .../Library/GenericBdsLib/BdsConsole.c        | 1061 ----
>  .../Library/GenericBdsLib/BdsMisc.c           | 1575 ------
>  .../Library/GenericBdsLib/DevicePath.c        |   27 -
>  .../Library/GenericBdsLib/GenericBdsLib.inf   |  143 -
>  .../Library/GenericBdsLib/GenericBdsLib.uni   |   19 -
>  .../GenericBdsLib/GenericBdsStrings.uni       |   30 -
>  .../Library/GenericBdsLib/InternalBdsLib.h    |  173 -
>  .../Library/GenericBdsLib/String.c            |   26 -
>  .../Library/GenericBdsLib/String.h            |   42 -
>  .../PciPlatform/PciPlatform.c                 |    7 +-
>  .../PciPlatform/PciPlatform.inf               |    9 +-
>  .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c   |  951 ++++
>  .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h   |  363 ++
>  .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf |   38 +
>  .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.c   |    8 +-
>  .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.h   |   17 +-
>  .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf |    8 +-
>  .../Vlv2TbltDevicePkg/PlatformDxe/BoardId.c   |   45 +-
>  .../PlatformDxe/ClockControl.c                |   80 +-
>  .../PlatformDxe/Configuration.h               |    8 +-
>  .../PlatformDxe/IchRegTable.c                 |    8 +-
>  .../Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c  |   72 -
>  .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  |  533 +-
>  .../PlatformDxe/PlatformDxe.h                 |  521 +-
>  .../PlatformDxe/PlatformDxe.inf               |   28 +-
>  .../PlatformDxe/SioPlatformPolicy.c           |   82 -
>  .../PlatformGopPolicy/PlatformGopPolicy.inf   |   15 +-
>  .../Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c  |  319 --
>  .../PlatformInitPei/MemoryCallback.c          |    8 +-
>  .../PlatformInitPei/MemoryPeim.c              |   21 +-
>  .../PlatformInitPei/PchInitPeim.c             |   10 +-
>  .../PlatformInitPei/PlatformEarlyInit.c       |  209 +-
>  .../PlatformInitPei/PlatformEarlyInit.h       |   31 +-
>  .../PlatformInitPei/PlatformInitPei.inf       |   29 +-
>  .../Vlv2TbltDevicePkg/PlatformPei/BootMode.c  |   99 +-
>  .../PlatformPei/CommonHeader.h                |   12 +-
>  .../PlatformPei/MemoryCallback.c              |    8 +-
>  .../Vlv2TbltDevicePkg/PlatformPei/Platform.c  |   24 +-
>  .../Vlv2TbltDevicePkg/PlatformPei/Platform.h  |   27 +-
>  .../PlatformPei/PlatformPei.inf               |   12 +-
>  .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |   28 +-
>  .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |  286 +-
>  .../Vlv2TbltDevicePkg/PlatformPkgConfig.dsc   |   22 +-
>  .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |  299 +-
>  .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |  561 +-
>  .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |  562 +--
>  .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |  563 +--
>  .../PlatformSetupDxe/PlatformSetupDxe.h       |   30 +-
>  .../PlatformSetupDxe/PlatformSetupDxe.inf     |   17 +-
>  .../PlatformSetupDxe/SetupFunctions.c         |   38 +-
>  .../PlatformSetupDxe/SetupInfoRecords.c       |  572 +--
>  .../Vlv2TbltDevicePkg/PlatformSmm/Platform.c  |  196 +-
>  .../PlatformSmm/PlatformSmm.inf               |   34 +-
>  .../Vlv2TbltDevicePkg/PlatformSmm/S3Save.c    |   53 +-
>  .../PlatformSmm/SmmPlatform.h                 |  111 +-
>  .../PlatformSmm/SmmScriptSave.c               |  252 -
>  .../PlatformSmm/SmmScriptSave.h               |   50 -
>  .../Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf |    6 +-
>  .../SmBiosMiscDxe/CommonHeader.h              |   10 +-
>  .../SmBiosMiscDxe/DataHubRecords.h            | 2934 +++++++++++
>  .../MiscBaseBoardManufacturerFunction.c       |    8 +-
>  .../SmBiosMiscDxe/MiscBiosVendorFunction.c    |    9 +-
>  .../SmBiosMiscDxe/MiscMemoryDeviceFunction.c  |  318 +-
>  .../SmBiosMiscDxe/MiscOemType0x94Function.c   |   45 +-
>  .../SmBiosMiscDxe/MiscProcessorCacheData.c    |   11 +-
>  .../MiscProcessorCacheFunction.c              |  273 +-
>  .../MiscProcessorInformationFunction.c        |  203 +-
>  .../MiscSubclassDriverDataTable.c             |   14 +-
>  .../MiscSubclassDriverEntryPoint.c            |   13 +-
>  .../MiscSystemManufacturerFunction.c          |   10 +-
>  .../SmBiosMiscDxe/SmBiosMiscDxe.inf           |   18 +-
>  .../SmmSwDispatch2OnSmmSwDispatchThunk.c      |  459 --
>  .../SmmSwDispatch2OnSmmSwDispatchThunk.inf    |   54 -
>  .../SmramSaveInfoHandlerSmm.c                 |  164 -
>  .../SmramSaveInfoHandlerSmm.inf               |   60 -
>  .../Stitch/IFWIHeader/Vacant.bin              |  Bin 3928064 -> 0 bytes
>  .../Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat   |  270 -
>  .../Stitch/MNW2_Stitch_Config.txt             |   10 -
>  .../Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c |   33 -
>  .../Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf   |   32 -
>  .../VlvPlatformInitDxe/IgdOpRegion.c          |   20 +-
>  .../VlvPlatformInitDxe/IgdOpRegion.h          |   27 +-
>  .../VlvPlatformInitDxe/VlvPlatformInitDxe.inf |   14 +-
>  .../Vlv2TbltDevicePkg/Wpce791/LpcDriver.c     |  340 --
>  .../Vlv2TbltDevicePkg/Wpce791/LpcDriver.h     |  112 -
>  .../Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c    |  366 --
>  .../Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h    |  103 -
>  .../Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c  |  126 -
>  .../Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h  |  101 -
>  .../Vlv2TbltDevicePkg/Wpce791/Wpce791.inf     |   63 -
>  Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat  |   47 +-
>  Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh   |   52 +-
>  .../Include/Protocol/SmmIchnDispatch.h        |  183 +
>  .../Vlv2DeviceRefCodePkg.dec                  |    5 +-
>  188 files changed, 8321 insertions(+), 28666 deletions(-)
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootScriptSaveDxe.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/InternalBootScriptSave.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/ScriptSave.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/AsmSaveSecContext.asm
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Fsp.inc
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/PeiCoreEntry.asm
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.asm
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/PlatformInit.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SaveSecContext.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecGetPerformance.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecPlatformInformation.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecRamInitData.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecTempRamSupport.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/UartInit.c
>  delete mode 100755 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId.exe
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc83627Policy.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpce791Policy.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPolicy.h
>  create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
>  create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.h
>  create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
>  create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/MemoryTest.c
>  create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/PlatformBootOption.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLib.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLibDxe.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRegs.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAccess.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsStrings.uni
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformData.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/PlatformSerialPortLib.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/CommonHeader.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/DevicePath.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.uni
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsStrings.uni
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.h
>  create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c
>  create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h
>  create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatformPolicy.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.h
>  create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRecords.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIHeader/Vacant.bin
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Config.txt
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h
>  delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf
>  create mode 100644 Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmIchnDispatch.h
> 
> -- 
> 2.21.0.windows.1
> 
> 
> 
> 
> 

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-platforms Patch 01/14] Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid
  2019-07-01  2:55 ` [edk2-platforms Patch 01/14] Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid Michael D Kinney
@ 2019-07-01  4:06   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:06 UTC (permalink / raw)
  To: Kinney, Michael D, devel@edk2.groups.io; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: Kinney, Michael D 
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-platforms Patch 01/14] Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid

* Add the gEfiSmmIchnDispatchProtocolGuid from the IntelFrameworkPkg
  to the Si specific Vlv2TbltDevicePkg.  This removes a dependency
  on the IntelFrameworkPkg and adds a Si specific protocol to a Si
  package.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Include/Protocol/SmmIchnDispatch.h        | 183 ++++++++++++++++++
 .../Vlv2DeviceRefCodePkg.dec                  |   5 +-
 2 files changed, 186 insertions(+), 2 deletions(-)  create mode 100644 Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmIchnDispatch.h

diff --git a/Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmIchnDispatch.h b/Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmIchnDispatch.h
new file mode 100644
index 0000000000..3cf86c0ff9
--- /dev/null
+++ b/Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmIchnDispatc
+++ h.h
@@ -0,0 +1,183 @@
+/** @file
+  Provides the parent dispatch service for a given SMI source generator.
+  The EFI_SMM_ICHN_DISPATCH_PROTOCOL provides the ability to install 
+child handlers for
+  the given event types.
+
+Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Revision Reference:
+  This Protocol is defined in Framework of EFI SMM Core Interface Spec  
+ Version 0.9.
+
+**/
+
+#ifndef _EFI_SMM_ICHN_DISPATCH_H_
+#define _EFI_SMM_ICHN_DISPATCH_H_
+
+
+//
+// Global ID for the ICH SMI Protocol
+//
+#define EFI_SMM_ICHN_DISPATCH_PROTOCOL_GUID \
+  { \
+    0xc50b323e, 0x9075, 0x4f2a, {0xac, 0x8e, 0xd2, 0x59, 0x6a, 0x10, 
+0x85, 0xcc } \
+  }
+
+typedef struct _EFI_SMM_ICHN_DISPATCH_PROTOCOL  
+EFI_SMM_ICHN_DISPATCH_PROTOCOL;
+
+//
+// Related Definitions
+//
+//
+// ICHN Specific SMIs.  These are miscellaneous SMI sources that are 
+supported by the // ICHN specific SMI implementation.  These may change 
+over time.  TrapNumber is only // valid if the Type is Trap.
+//
+typedef enum {
+  //
+  // NOTE: NEVER delete items from this list/enumeration!  Doing so 
+will prevent other versions
+  // of the code from compiling.  If the ICH version your driver is 
+written for doesn't support
+  // some of these SMIs, then simply return EFI_UNSUPPORTED when a 
+child/client tries to register
+  // for them.
+  //
+  IchnMch,
+  IchnPme,
+  IchnRtcAlarm,
+  IchnRingIndicate,
+  IchnAc97Wake,
+  IchnSerialIrq,
+  IchnY2KRollover,
+  IchnTcoTimeout,
+  IchnOsTco,
+  IchnNmi,
+  IchnIntruderDetect,
+  IchnBiosWp,
+  IchnMcSmi,
+  IchnPmeB0,
+  IchnThrmSts,
+  IchnSmBus,
+  IchnIntelUsb2,
+  IchnMonSmi7,
+  IchnMonSmi6,
+  IchnMonSmi5,
+  IchnMonSmi4,
+  IchnDevTrap13,
+  IchnDevTrap12,
+  IchnDevTrap11,
+  IchnDevTrap10,
+  IchnDevTrap9,
+  IchnDevTrap8,
+  IchnDevTrap7,
+  IchnDevTrap6,
+  IchnDevTrap5,
+  IchnDevTrap3,
+  IchnDevTrap2,
+  IchnDevTrap1,
+  IchnDevTrap0,
+  IchnIoTrap3,
+  IchnIoTrap2,
+  IchnIoTrap1,
+  IchnIoTrap0,
+  IchnPciExpress,
+  IchnMonitor,
+  IchnSpi,
+  IchnQRT,
+  IchnGpioUnlock,
+  //
+  // INSERT NEW ITEMS JUST BEFORE THIS LINE
+  //
+  NUM_ICHN_TYPES  // the number of items in this enumeration } 
+EFI_SMM_ICHN_SMI_TYPE;
+
+typedef struct {
+  EFI_SMM_ICHN_SMI_TYPE Type;
+} EFI_SMM_ICHN_DISPATCH_CONTEXT;
+
+//
+// Member functions
+//
+/**
+  Dispatch function for a ICHN specific SMI handler.
+
+  @param  DispatchHandle        The handle of this dispatch function.
+  @param  DispatchContext       The pointer to the dispatch function's context.
+                                The DispatchContext fields are filled in
+                                by the dispatching driver prior to
+                                invoking this dispatch function.
+
+  @return None
+
+**/
+typedef
+VOID
+(EFIAPI *EFI_SMM_ICHN_DISPATCH)(
+  IN  EFI_HANDLE                      DispatchHandle,
+  IN  EFI_SMM_ICHN_DISPATCH_CONTEXT   *DispatchContext
+  );
+
+/**
+  Register a child SMI source dispatch function with a parent SMM driver.
+
+  @param  This                  The pointer to the EFI_SMM_ICHN_DISPATCH_PROTOCOL instance.
+  @param  DispatchFunction      The function to install.
+  @param  DispatchContext       The pointer to the dispatch function's context.
+                                The caller fills in this context before calling
+                                the register function to indicate to the register
+                                function the ICHN SMI source for which the dispatch
+                                function should be invoked.
+  @param  DispatchHandle        The handle generated by the dispatcher to track the function
+                                instance.
+
+  @retval EFI_SUCCESS           The dispatch function has been successfully
+                                registered and the SMI source has been enabled.
+  @retval EFI_DEVICE_ERROR      The driver could not enable the SMI source.
+  @retval EFI_OUT_OF_RESOURCES  Not enough memory (system or SMM) to manage this
+                                child.
+  @retval EFI_INVALID_PARAMETER DispatchContext is invalid. The ICHN input value
+                                is not within valid range.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SMM_ICHN_REGISTER)(
+  IN EFI_SMM_ICHN_DISPATCH_PROTOCOL            *This,
+  IN EFI_SMM_ICHN_DISPATCH                     DispatchFunction,
+  IN EFI_SMM_ICHN_DISPATCH_CONTEXT             *DispatchContext,
+  OUT EFI_HANDLE                               *DispatchHandle
+  );
+
+/**
+  Unregister a child SMI source dispatch function with a parent SMM 
+driver
+
+  @param  This                  The pointer to the EFI_SMM_ICHN_DISPATCH_PROTOCOL instance.
+  @param  DispatchHandle        The handle of the service to remove.
+
+  @retval EFI_SUCCESS           The dispatch function has been successfully
+                                unregistered, and the SMI source has been disabled,
+                                if there are no other registered child dispatch
+                                functions for this SMI source.
+  @retval EFI_INVALID_PARAMETER The handle is invalid.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SMM_ICHN_UNREGISTER)(
+  IN EFI_SMM_ICHN_DISPATCH_PROTOCOL            *This,
+  IN EFI_HANDLE                                DispatchHandle
+  );
+
+//
+// Interface structure for the SMM ICHN specific SMI Dispatch Protocol 
+//
+/**
+  Provides the parent dispatch service for a given SMI source generator.
+**/
+struct _EFI_SMM_ICHN_DISPATCH_PROTOCOL {
+  EFI_SMM_ICHN_REGISTER   Register;     ///< Installs a child service to be dispatched by this protocol.
+  EFI_SMM_ICHN_UNREGISTER UnRegister;   ///< Removes a child service dispatched by this protocol.
+};
+
+extern EFI_GUID gEfiSmmIchnDispatchProtocolGuid;
+
+#endif
diff --git a/Silicon/Intel/Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec b/Silicon/Intel/Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
index 6117f179ba..1af1ed757c 100644
--- a/Silicon/Intel/Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
+++ b/Silicon/Intel/Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
@@ -1,6 +1,6 @@
 ##  @file  Vlv2DeviceRefCodePkg.dec
 #
-# Copyright (c) 2012  - 2015, Intel Corporation. All rights reserved
+# Copyright (c) 2012  - 2019, Intel Corporation. All rights reserved
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent  # @@ -32,7 +32,7 @@ [Ppis]
   gEfiPeiReadOnlyVariable2PpiGuid       = { 0x2ab86ef5, 0xecb5, 0x4134, {0xb5, 0x56, 0x38, 0x54, 0xca, 0x1f, 0xe1, 0xb4}}
   gPchPeiInitPpiGuid                    = { 0xACB93B08, 0x5CDC, 0x4A8F, {0x93, 0xD4, 0x6, 0xE3, 0x42, 0xDF, 0x18, 0x2E}}
   gPttPassThruPpiGuid                   = { 0xc5068bac, 0xa7dc, 0x42f1, {0xae, 0x80, 0xca, 0xa2, 0x4b, 0xb4, 0x90, 0x4b}}
-  
+
 [Protocols]
   gEfiGlobalNvsAreaProtocolGuid         = { 0x074e1e48, 0x8132, 0x47a1, {0x8c, 0x2c, 0x3f, 0x14, 0xad, 0x9a, 0x66, 0xdc}}
   gPpmPlatformPolicyProtocolGuid        = { 0xddabfeac, 0xef63, 0x452c, {0x8f, 0x39, 0xed, 0x7f, 0xae, 0xd8, 0x26, 0x5e}}
@@ -41,6 +41,7 @@ [Protocols]
   gEfiSdHostIoProtocolGuid              = { 0xb63f8ec7, 0xa9c9, 0x4472, {0xa4, 0xc0, 0x4d, 0x8b, 0xf3, 0x65, 0xcc, 0x51}}
   gEfiSpiProtocolGuid                   = { 0x1156efc6, 0xea32, 0x4396, {0xb5, 0xd5, 0x26, 0x93, 0x2e, 0x83, 0xc3, 0x13}}
   gEfiSmmSpiProtocolGuid                = { 0xD9072C35, 0xEB8F, 0x43AD, {0xA2, 0x20, 0x34, 0xD4, 0x0E, 0x2A, 0x82, 0x85}}
+  gEfiSmmIchnDispatchProtocolGuid       = { 0xc50b323e, 0x9075, 0x4f2a, { 0xac, 0x8e, 0xd2, 0x59, 0x6a, 0x10, 0x85, 0xcc}}
   gEfiSmmIchnDispatchExProtocolGuid     = { 0x3920405B, 0xC897, 0x44DA, {0x88, 0xF3, 0x4C, 0x49, 0x8A, 0x6F, 0xF7, 0x36}}
   gEfiPchS3SupportProtocolGuid          = { 0xE287D20B, 0xD897, 0x4E1E, {0xA5, 0xD9, 0x97, 0x77, 0x63, 0x93, 0x6A, 0x04}}
   gPchResetProtocolGuid                 = { 0xDB63592C, 0xB8CC, 0x44C8, {0x91, 0x8C, 0x51, 0xF5, 0x34, 0x59, 0x8A, 0x5A}}
--
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-platforms Patch 02/14] Vlv2TbltDevicePkg: Reduce Intel Framework dependencies
  2019-07-01  2:55 ` [edk2-platforms Patch 02/14] Vlv2TbltDevicePkg: Reduce Intel Framework dependencies Michael D Kinney
@ 2019-07-01  4:06   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:06 UTC (permalink / raw)
  To: Kinney, Michael D, devel@edk2.groups.io; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: Kinney, Michael D 
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-platforms Patch 02/14] Vlv2TbltDevicePkg: Reduce Intel Framework dependencies

* Use BaseSerialPortLib16550 from MdeModulePkg.
* Remove unused DxeSmmDriverEntryPoint library instance mapping
  from the IntelFrameworkPkg.
* Remove all references to PS/2 Keyboard/Mouse that are not
  available on MinnowMax.
* Remove VgaClassDxe module from IntelFrameworkModulePkg that is
  not used.
* Remove DatahubStatusCodeHandlerDxe module from the
  IntelFrameworkModulePkg that is not used.
* Remove LegacyRegionDxe module from the IntelFrameworkModulePkg
  The Legacy Region Protocol produced by this module is not used.
* Remove VLV2 specific Metronome module that uses the CPU I/O
  Protocol defined in the IntelFrameworkPkg.  Instead, use the
  Metronome module from the MdeModulePkg that produces the
  Metronome Arch Protocol from a TimerLib instance.
* Remove use of MpCpu.inf from DSC/FDF file.
* Update DSC/FDF/source files to assume MINNOW2_FSP_BUILD is FALSE.
* Update DSC/FDF/source files to assume FTPM_ENABLE is FALSE.
* Remove TXT binary
* Use PcAtChisetPkg HpetDxe module instead of the VLV2 specific
  SmartTimer module that has an IntelFramework dependency.
* Remove SEC_ENABLE define and dependent modules.
* Remove IdeBusDxe module from DSC files.  IdeBusDxe is listed
  in DSC file, but not the FDF file, so it is not used.  This
  removes an IntelFrameworkModulkePkg dependency.
* Remove commented out SDIO and PiSmmCommunicationPei modules
* Remove unused Intel Framework S3Lib
* Remove use of PCD from the IntelFrameworkModulePkg
  PcdEbdaReservedMemorySize.
* Remove EdkCompatibilityPkg related [BuildOptions] sections
* Remove unused DEFINES from DSC/FDF
* Remove unused references to Ppi/Cache.h from Vlv2SocBinPkg.dec
* Remove unused references to gPeiCachePpiGuid from Vlv2SocBinPkg.dec
* Remove unused references to gEfiHtBistHobGuid from Vlv2SocBinPkg.dec
* Remove unused references to gEfiCpuTokenSpaceGuid PCDs from
  Vlv2SocBinPkg.dec
* Remove unused IntelPchLegacyInterrupt module
* Remove CpuIoDxe module from IntelFrameworkModulePkg
* Remove duplicate declaration of gEfiAcpiSupportProtocolGuid
  from Vlv2Tblt2DevicePkg
* Remove duplicate declaration of PcdShellFile from Vlv2Tblt2DevicePkg
* Remove unused gEfiAcpiTableProtocolGuid from AcpiPlatform.inf
* Add E7006X3 UNDI module to FDF files
* Remove gEfiSimpleNetworkProtocolGuid dependency.
  If gEfiSimpleNetworkProtocolGuid is not produced, still
  allow all SMBIOS records to be produced.  The MAC address
  from Simple Network Protocol is being used as a system
  serial number.  If Simple Network Protocol is not available,
  then default to a serial number of 0.
* Remove unused dependency on IntelFspWrapperPkg
* Remove Intel Framework S3 support.
* Remove use of the gEfiSmmPeiSmramMemoryReserveGuid GUIDed HOB.
* Remove production of unused gEfiFindFvPpiGuid.
* Update IA32 only builds to use a unique BUILD_OUTPUT directory

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../AcpiPlatform/AcpiPlatform.c               |  33 +-
 .../AcpiPlatform/AcpiPlatform.h               |   8 +-
 .../AcpiPlatform/AcpiPlatform.inf             |   5 -
 .../Intel/Vlv2TbltDevicePkg/Build_IFWI.bat    |  33 --
 .../Include/Library/EfiRegTableLib.h          |  11 +-
 .../Library/EfiRegTableLib/EfiRegTableLib.inf |  12 +-
 .../MultiPlatformLib/MultiPlatformLib.h       |   7 +-
 .../MultiPlatformLib/MultiPlatformLib.inf     |   9 +-
 .../Library/PlatformBdsLib/BdsPlatform.c      |   6 -
 .../MonoStatusCode/MonoStatusCode.h           |  47 +-
 .../MonoStatusCode/MonoStatusCode.inf         |   9 +-
 .../PciPlatform/PciPlatform.inf               |   8 +-
 .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.h   |  17 +-
 .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf |   8 +-
 .../PlatformDxe/Configuration.h               |   8 +-
 .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  | 524 +----------------
 .../PlatformDxe/PlatformDxe.h                 | 515 +----------------
 .../PlatformDxe/PlatformDxe.inf               |  20 +-
 .../PlatformGopPolicy/PlatformGopPolicy.inf   |  12 +-
 .../PlatformInitPei/MemoryCallback.c          |   8 +-
 .../PlatformInitPei/PlatformEarlyInit.c       | 209 +------
 .../PlatformInitPei/PlatformEarlyInit.h       |  21 +-
 .../PlatformInitPei/PlatformInitPei.inf       |  29 +-
 .../PlatformPei/CommonHeader.h                |  11 +-
 .../PlatformPei/MemoryCallback.c              |   8 +-
 .../Vlv2TbltDevicePkg/PlatformPei/Platform.c  |  16 +-
 .../PlatformPei/PlatformPei.inf               |  11 +-
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |  16 +-
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   | 254 +++------
 .../Vlv2TbltDevicePkg/PlatformPkgConfig.dsc   |  21 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      | 234 +++-----
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   | 532 ++++-------------
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     | 533 ++++-------------
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      | 534 ++++--------------
 .../PlatformSetupDxe/PlatformSetupDxe.h       |  28 +-
 .../PlatformSetupDxe/PlatformSetupDxe.inf     |  14 +-
 .../PlatformSetupDxe/SetupInfoRecords.c       |  43 +-
 .../Vlv2TbltDevicePkg/PlatformSmm/Platform.c  |  83 +--
 .../PlatformSmm/PlatformSmm.inf               |  17 +-
 .../Vlv2TbltDevicePkg/PlatformSmm/S3Save.c    |  53 +-
 .../PlatformSmm/SmmPlatform.h                 |   7 +-
 .../Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf |   6 +-
 .../MiscBaseBoardManufacturerFunction.c       |   8 +-
 .../SmBiosMiscDxe/MiscOemType0x94Function.c   |  42 +-
 .../MiscSystemManufacturerFunction.c          |  10 +-
 .../SmBiosMiscDxe/SmBiosMiscDxe.inf           |  15 +-
 .../VlvPlatformInitDxe/IgdOpRegion.c          |  11 +-
 .../VlvPlatformInitDxe/IgdOpRegion.h          |  27 +-
 .../VlvPlatformInitDxe/VlvPlatformInitDxe.inf |   8 +-
 Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat  |  39 +-
 50 files changed, 599 insertions(+), 3541 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
index 5c03f66edb..1f4d575b73 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
@@ -638,7 +638,6 @@ OnReadyToBoot (
   EFI_STATUS                  Status;
   EFI_ACPI_TABLE_VERSION      TableVersion;
   EFI_ACPI_SUPPORT_PROTOCOL   *AcpiSupport;
-  EFI_ACPI_S3_SAVE_PROTOCOL   *AcpiS3Save;
   SYSTEM_CONFIGURATION        SetupVarBuffer;
   UINTN                       VariableSize;
   EFI_PLATFORM_CPU_INFO       *PlatformCpuInfoPtr = NULL;
@@ -722,15 +721,6 @@ OnReadyToBoot (
                           TableVersion
                           );
   ASSERT_EFI_ERROR (Status);
-
-  //
-  // S3 script save.
-  //
-  Status = gBS->LocateProtocol (&gEfiAcpiS3SaveProtocolGuid, NULL, (VOID **) &AcpiS3Save);
-  if (!EFI_ERROR (Status)) {
-    AcpiS3Save->S3Save (AcpiS3Save, NULL);
-  }
-
 }
 
 VOID
@@ -1261,12 +1251,23 @@ AcpiPlatformEntryPoint (
     }
   }
 
-  Status = EfiCreateEventReadyToBootEx (
-             TPL_NOTIFY,
-             OnReadyToBoot,
-             NULL,
-             &Event
-             );
+  //
+  // Publish ACPI 1.0 or 2.0 Tables.
+  //
+//  Status = AcpiSupport->PublishTables (
+//                          AcpiSupport,
+//                          TableVersion
+//                          );
+//  ASSERT_EFI_ERROR (Status);
+
+//  Status = EfiCreateEventReadyToBootEx (
+//             TPL_NOTIFY,
+//             OnReadyToBoot,
+//             NULL,
+//             &Event
+//             );
+  Event = NULL;
+  OnReadyToBoot (Event, NULL);
 
   //
   // Finished.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
index 598756846a..f45590ea24 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
@@ -1,12 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   AcpiPlatform.h
@@ -26,7 +23,6 @@ Abstract:
 //
 // Statements that include other header files.
 //
-#include <FrameworkDxe.h>
 #include <PiDxe.h>
 #include <Base.h>
 #include <Library/UefiLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
index c59920db03..817ad58a81 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
@@ -37,7 +37,6 @@ [Packages]
   IntelFrameworkPkg/IntelFrameworkPkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
 
 [LibraryClasses]
@@ -63,13 +62,9 @@ [Guids]
   gEfiVlv2VariableGuid
 
 [Protocols]
-  gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
   gEnhancedSpeedstepProtocolGuid
   gEfiPlatformCpuProtocolGuid
   gEfiAcpiSupportProtocolGuid
-  gEfiAcpiS3SaveProtocolGuid
-  gEfiCpuIoProtocolGuid
-  gEfiPs2PolicyProtocolGuid
   gEfiFirmwareVolume2ProtocolGuid
   gEfiMpServiceProtocolGuid
   gEfiGlobalNvsAreaProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Build_IFWI.bat b/Platform/Intel/Vlv2TbltDevicePkg/Build_IFWI.bat
index 887206703a..44759c617f 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Build_IFWI.bat
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Build_IFWI.bat
@@ -114,7 +114,6 @@ if /i "%~1"=="/yL" (
     goto OptLoop
 )
 
-
 :: Require 2 input parameters
 if "%~2"=="" goto Usage
 
@@ -122,10 +121,6 @@ if "%~2"=="" goto Usage
 set Platform_Type=%~1
 set Build_Target=%~2
 
-if "%~3"=="" (
-    set "IFWI_Suffix= "
-) else set "IFWI_Suffix=/S %~3"
-
 :: Build BIOS
 echo ======================================================================
 echo Build_IFWI:  Calling BIOS build Script...
@@ -139,34 +134,6 @@ if %ERRORLEVEL% NEQ 0 (
 )
 echo.
 echo Finished Building BIOS.
-@REM Set BIOS_ID environment variable here.
-call %WORKSPACE%\Conf\BiosId.bat
-echo BIOS_ID=%BIOS_ID%
-
-:: Set the Board_Id, Build_Type, Version_Major, and Version_Minor environment variables
-find /v "#" %WORKSPACE%\Conf\BiosId.env > ver_strings
-for /f "tokens=1,3" %%i in (ver_strings) do set %%i=%%j
-del /f/q ver_strings >nul
-set BIOS_Name=%BOARD_ID%_%Arch%_%BUILD_TYPE%_%VERSION_MAJOR%_%VERSION_MINOR%.ROM
-
-:: Start Integration process
-echo ======================================================================
-echo Build_IFWI:  Calling IFWI Stitching Script...
-pushd %PLATFORM_PATH%\%PLATFORM_PACKAGE%\Stitch
-
-  :: IFWIStitch.bat [/nG] [/nM] [/nB] [/B BIOS.rom] [/C StitchConfig] [/S IFWISuffix]
-  call IFWIStitch.bat %Stitch_Flags% /B %BIOS_Name% %IFWI_Suffix%
-   
- @echo off
-popd
-if %ERRORLEVEL% NEQ 0 (
-    echo echo  -- Error Stitching %BIOS_Nam% & echo.
-    set exitCode=1
-)
-echo.
-echo Build_IFWI is finished.
-echo The final IFWI file is located in %ROOT_DIR%\Vlv2TbltDevicePkg\Stitch\
-echo ======================================================================
 goto Exit
 
 :Usage
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
index 915f8b39d9..12e44efed0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
@@ -1,12 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   EfiRegTableLib.h
@@ -31,10 +28,6 @@ Abstract:
 #include <Library/BaseLib.h>
 #include <Library/DebugLib.h>
 #include <Library/UefiLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Protocol/CpuIo.h>
-#include <Protocol/BootScriptSave.h>
-#include <Framework/BootScript.h>
 #include <Protocol/PciRootBridgeIo.h>
 
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
index 9cb8841d65..472fc4e0f6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
@@ -2,12 +2,9 @@
 #
 #/*++
 #
-# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

+# Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-
 #
 #  Module Name:
 #
@@ -40,8 +37,3 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-
-
-[LibraryClasses]
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
index 807ca20acb..3fa9f7b129 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
@@ -3,11 +3,11 @@
 
   This file includes package header files, library classes.
 
-  Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

+
 **/
 
 #ifndef _MULTIPLATFORM_LIB_H_
@@ -52,7 +52,6 @@
 #include <Ppi/Speaker.h>
 #include <Guid/FirmwareFileSystem.h>
 #include <Guid/MemoryTypeInformation.h>
-#include <Ppi/Cache.h>
 #include <Ppi/Reset.h>
 #include <Ppi/EndOfPeiPhase.h>
 #include <Ppi/MemoryDiscovered.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
index 758e47ca70..a4942a097c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
@@ -1,11 +1,8 @@
 #
 #
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
-#
-#
 #
 #  Module Name:
 #
@@ -59,13 +56,11 @@ [Packages]
   Vlv2TbltDevicePkg/PlatformPkg.dec
   IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  Vlv2SocBinPkg/Vlv2SocBinPkg.dec
 
 [LibraryClasses]
   DebugLib
   HobLib
   IoLib
-#  PeiKscLib
 
 [Ppis]
   gEfiPeiReadOnlyVariable2PpiGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
index 4d5997d6e9..4adca1b465 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
@@ -1789,9 +1789,6 @@ PlatformBdsPolicyBehavior (
     #ifdef TPM_ENABLED
     TcgPhysicalPresenceLibProcessRequest();
     #endif
-    #ifdef FTPM_ENABLE
-    Tcg2PhysicalPresenceLibProcessRequest(NULL);
-    #endif
 
     if (EsrtManagement != NULL) {
       EsrtManagement->LockEsrtRepository();
@@ -1997,9 +1994,6 @@ FULL_CONFIGURATION:
     }
    #ifdef TPM_ENABLED
    TcgPhysicalPresenceLibProcessRequest();
-   #endif
-   #ifdef FTPM_ENABLE
-   Tcg2PhysicalPresenceLibProcessRequest(NULL);
    #endif
 
     if (EsrtManagement != NULL) {
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.h b/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.h
index 0b256093a6..80a84d0d21 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   MonoStatusCode.h
@@ -24,41 +22,18 @@ Abstract:
 //
 // Statements that include other files.
 //
-#include "PiPei.h"
+#include <PiPei.h>
 
-#include "Pi/PiBootMode.h"
-
-#include "Ppi/StatusCode.h"
-#include "Ppi/MemoryDiscovered.h"
-#include "Ppi/FvLoadFile.h"
-
-#include "Library/HobLib.h"
-#include "Library/DebugLib.h"
-#include "Library/IoLib.h"
-#include "Library/SerialPortLib.h"
-#include "Protocol/StatusCode.h"
-
-
-#ifndef _STATUS_CODE_ENABLER_H_
-#define _STATUS_CODE_ENABLER_H_
-
-#ifdef EFI_DEBUG
-
-#define EFI_STATUS_CODE_ENABLER_HOB_GUID \
-  { \
-    0x5ffc6cf3, 0x71ad, 0x46f5, 0xbd, 0x8b, 0x7e, 0x8f, 0xfe, 0x19, 0x7, 0xd7 \
-  }
-
-extern EFI_GUID gEfiSerialStatusCodeEnablerHobGuid;
-
-typedef struct _EFI_STATUS_CODE_INFO {
-  BOOLEAN    StatusCodeDisable;
-} EFI_STATUS_CODE_INFO;
-
-#endif
-#endif
+#include <Pi/PiBootMode.h>
 
+#include <Ppi/StatusCode.h>
+#include <Ppi/MemoryDiscovered.h>
 
+#include <Library/HobLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/SerialPortLib.h>
+#include <Protocol/StatusCode.h>
 
 //
 // Platform specific function Declarations.  These must be implemented in a
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf b/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
index f1be5b8d6c..d429310ac4 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
@@ -1,9 +1,8 @@
 #
 #
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
 #
 #  Module Name:
 #
@@ -34,10 +33,8 @@ [sources.common]
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
-  Vlv2SocBinPkg/Vlv2SocBinPkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
 
 [LibraryClasses]
   PeimEntryPoint
@@ -52,7 +49,6 @@ [LibraryClasses]
 [Ppis]
   gEfiPeiMemoryDiscoveredPpiGuid
   gEfiPeiStatusCodePpiGuid
-  gEfiPeiFvFileLoaderPpiGuid
 
 [Protocols]
   gEfiStatusCodeRuntimeProtocolGuid
@@ -62,7 +58,6 @@ [Pcd]
 
 [Guids]
   gEfiPlatformCpuInfoGuid
-  gEfiHtBistHobGuid
   gEfiStatusCodeDataTypeStringGuid              ## CONSUMES
 
 [Depex]
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
index a0837917d8..18012a1d53 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
@@ -1,11 +1,8 @@
 #/*++
 #
-# Copyright (c)  2003  - 2018, Intel Corporation. All rights reserved
-#                                                                                  

+# Copyright (c)  2003  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-
 #
 #  Module Name:
 #
@@ -46,7 +43,6 @@ [Packages]
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
 
 [LibraryClasses]
   HobLib
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.h
index b13611f4f8..dfe3d1a0c7 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.h
@@ -1,12 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
   PlatformCpuInfoDxe.h
 
@@ -18,12 +15,10 @@ Abstract:
 #ifndef _PLATFORM_CPU_INFO_DRIVER_H_
 #define _PLATFORM_CPU_INFO_DRIVER_H_
 
-#include "PiDxe.h"
-#include "Library/HobLib.h"
-#include "Guid/GlobalVariable.h"
-#include "Guid/AcpiVariableCompatibility.h"
-#include "Guid/PlatformCpuInfo.h"
-#include "Library/UefiRuntimeServicesTableLib.h"
+#include <PiDxe.h>
+#include <Library/HobLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Guid/PlatformCpuInfo.h>
 #include <Guid/Vlv2Variable.h>
 
 #endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
index f2ade1b105..ac9c7f1ba1 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
@@ -1,10 +1,8 @@
 #/*++
 #
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
-
 #
 #  Module Name:
 #
@@ -36,9 +34,7 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2SocBinPkg/Vlv2SocBinPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
 
 [LibraryClasses]
   HobLib
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Configuration.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Configuration.h
index 23e03111c9..676f500530 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Configuration.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Configuration.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
     Configuration.h
@@ -89,8 +87,6 @@ Abstract:
 #define VAR_EQ_CONFIG_MODE_DECIMAL_NAME L"67"
 #define VAR_EQ_CPU_EE_NAME              0x0045  // E
 #define VAR_EQ_CPU_EE_DECIMAL_NAME  L"69"
-#define VAR_EQ_FLOPPY_MODE_NAME         0x0046  // F
-#define VAR_EQ_FLOPPY_MODE_DECIMAL_NAME L"70"
 #define VAR_EQ_HT_MODE_NAME             0x0048  // H
 #define VAR_EQ_HT_MODE_DECIMAL_NAME     L"72"
 #define VAR_EQ_AHCI_MODE_NAME           0x0049  // I
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
index 2a4a0b92e1..1d90117af6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
@@ -1,13 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
 
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   
-
-
 Module Name:
 
 
@@ -23,9 +19,7 @@ Abstract:
 #include "PlatformDxe.h"
 #include "Platform.h"
 #include "PchCommonDefinitions.h"
-#include <Protocol/UsbPolicy.h>
 #include <Protocol/PchPlatformPolicy.h>
-#include <Protocol/TpmMp.h>
 #include <Protocol/CpuIo2.h>
 #include <Library/S3BootScriptLib.h>
 #include <Guid/PciLanInfo.h>
@@ -63,10 +57,8 @@ GPIO_CONF_PAD_INIT mTB_BL_GpioInitData_SC_TRI_Exit_boot_Service[] =
 EFI_GUID mSystemHiiExportDatabase = EFI_HII_EXPORT_DATABASE_GUID;
 EFI_GUID mPlatformDriverGuid = EFI_PLATFORM_DRIVER_GUID;
 SYSTEM_CONFIGURATION  mSystemConfiguration;
-SYSTEM_PASSWORDS      mSystemPassword;
 EFI_HANDLE            mImageHandle;
 BOOLEAN               mMfgMode = FALSE;
-VOID                  *mDxePlatformStringPack;
 UINT32                mPlatformBootMode = PLATFORM_NORMAL_MODE;
 extern CHAR16 gItkDataVarName[];
 
@@ -77,8 +69,6 @@ EFI_EVENT  mReadyToBootEvent;
 
 UINT8 mSmbusRsvdAddresses[] = PLATFORM_SMBUS_RSVD_ADDRESSES;
 UINT8 mNumberSmbusAddress = sizeof( mSmbusRsvdAddresses ) / sizeof( mSmbusRsvdAddresses[0] );
-UINT32 mSubsystemVidDid;
-UINT32 mSubsystemAudioVidDid;
 
 UINTN   mPciLanCount = 0;
 VOID    *mPciLanInfo = NULL;
@@ -89,9 +79,6 @@ static EFI_SPEAKER_IF_PROTOCOL mSpeakerInterface = {
   GenerateBeepTone
 };
 
-EFI_USB_POLICY_PROTOCOL         mUsbPolicyData = {0};
-
-
 CFIO_PNP_INIT mTB_BL_GpioInitData_SC_TRI_S0ix_Exit_boot_Service[] =
 {
   {0x410 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_clkout1_pconf0
@@ -179,11 +166,6 @@ VOID
 UpdateDVMTSetup(
   );
 
-VOID
-InitPlatformUsbPolicy (
-  VOID
-  );
-
 VOID
 InitRC6Policy(
   VOID
@@ -427,14 +409,8 @@ SpiBiosProtectionFunction(
 
   BiosFlaLower0 = PcdGet32(PcdFlashMicroCodeAddress)-PcdGet32(PcdFlashAreaBaseAddress);
   BiosFlaLimit0 = PcdGet32(PcdFlashMicroCodeSize)-1;  
-  #ifdef MINNOW2_FSP_BUILD
-  BiosFlaLower1 = PcdGet32(PcdFlashFvFspBase)-PcdGet32(PcdFlashAreaBaseAddress);
-  BiosFlaLimit1 = (PcdGet32(PcdFlashFvRecoveryBase)-PcdGet32(PcdFlashFvFspBase)+PcdGet32(PcdFlashFvRecoverySize))-1;
-  #else
   BiosFlaLower1 = PcdGet32(PcdFlashFvMainBase)-PcdGet32(PcdFlashAreaBaseAddress);
   BiosFlaLimit1 = (PcdGet32(PcdFlashFvRecoveryBase)-PcdGet32(PcdFlashFvMainBase)+PcdGet32(PcdFlashFvRecoverySize))-1;
-  #endif
-
   
   mPciD31F0RegBase = MmPciAddress (0,
                          DEFAULT_PCI_BUS_NUMBER_PCH,
@@ -611,8 +587,6 @@ TristateLpcGpioS0i3Config (
 }
 
 
-EFI_BOOT_SCRIPT_SAVE_PROTOCOL *mBootScriptSave;
-
 /**
   Event Notification during exit boot service to enabel ACPI mode
 
@@ -862,8 +836,6 @@ InitializePlatform (
   //
   //  Add usb policy
   //
-  InitPlatformUsbPolicy();
-  InitSioPlatformPolicy();
   InitializeClockRouting();
   InitializeSlotInfo();
   InitTcoReset();
@@ -949,7 +921,7 @@ InitializePlatform (
                     );
   if (!EFI_ERROR (Status)) {
       Status = gBS->RegisterProtocolNotify (
-                      &gExitPmAuthProtocolGuid,
+                      &gEfiEndOfDxeEventGroupGuid,
                       RtcEvent,
                       &RtcCallbackReg
                       );
@@ -1042,58 +1014,6 @@ ReadyToBootFunction (
   VOID       *Context
   )
 {
-  EFI_STATUS                      Status;
-  EFI_ISA_ACPI_PROTOCOL           *IsaAcpi;
-  EFI_ISA_ACPI_DEVICE_ID          IsaDevice;
-  UINTN                           Size;
-  UINT16                          State;
-  EFI_TPM_MP_DRIVER_PROTOCOL      *TpmMpDriver;
-  EFI_CPU_IO_PROTOCOL             *CpuIo;
-  UINT8                           Data;
-  UINT8                           ReceiveBuffer [64];
-  UINT32                          ReceiveBufferSize;
-
-  UINT8 TpmForceClearCommand [] =              {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0A,
-                                                0x00, 0x00, 0x00, 0x5D};
-  UINT8 TpmPhysicalPresenceCommand [] =        {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0C,
-                                                0x40, 0x00, 0x00, 0x0A,
-                                                0x00, 0x00};
-  UINT8 TpmPhysicalDisableCommand [] =         {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0A,
-                                                0x00, 0x00, 0x00, 0x70};
-  UINT8 TpmPhysicalEnableCommand [] =          {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0A,
-                                                0x00, 0x00, 0x00, 0x6F};
-  UINT8 TpmPhysicalSetDeactivatedCommand [] =  {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0B,
-                                                0x00, 0x00, 0x00, 0x72,
-                                                0x00};
-  UINT8 TpmSetOwnerInstallCommand [] =         {0x00, 0xC1,
-                                                0x00, 0x00, 0x00, 0x0B,
-                                                0x00, 0x00, 0x00, 0x71,
-                                                0x00};
-
-  Size = sizeof(UINT16);
-  Status = gRT->GetVariable (
-                  VAR_EQ_FLOPPY_MODE_DECIMAL_NAME,
-                  &gEfiNormalSetupGuid,
-                  NULL,
-                  &Size,
-                  &State
-                  );
-
-  //
-  // Disable Floppy Controller if needed
-  //
-  Status = gBS->LocateProtocol (&gEfiIsaAcpiProtocolGuid, NULL, (VOID **) &IsaAcpi);
-  if (!EFI_ERROR(Status) && (State == 0x00)) {
-    IsaDevice.HID = EISA_PNP_ID(0x604);
-    IsaDevice.UID = 0;
-    Status = IsaAcpi->EnableDevice(IsaAcpi, &IsaDevice, FALSE);
-  }
-
   //
   // save LAN info to a variable
   //
@@ -1111,386 +1031,6 @@ ReadyToBootFunction (
     gBS->FreePool (mPciLanInfo);
     mPciLanInfo = NULL;
   }
-  
-
-  //
-  // Handle ACPI OS TPM requests here
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiCpuIoProtocolGuid,
-                  NULL,
-                  (VOID **)&CpuIo
-                  );
-  Status = gBS->LocateProtocol (
-                  &gEfiTpmMpDriverProtocolGuid,
-                  NULL,
-                  (VOID **)&TpmMpDriver
-                  );
-  if (!EFI_ERROR (Status))
-  {
-    Data = ReadCmosBank1Byte (CpuIo, ACPI_TPM_REQUEST);
-
-    //
-    // Clear pending ACPI TPM request indicator
-    //
-    WriteCmosBank1Byte (CpuIo, ACPI_TPM_REQUEST, 0x00);
-    if (Data != 0)
-    {
-      WriteCmosBank1Byte (CpuIo, ACPI_TPM_LAST_REQUEST, Data);
-
-      //
-      // Assert Physical Presence for these commands
-      //
-      TpmPhysicalPresenceCommand [11] = 0x20;
-      ReceiveBufferSize = sizeof(ReceiveBuffer);
-      Status = TpmMpDriver->Transmit (
-                              TpmMpDriver, TpmPhysicalPresenceCommand,
-                              sizeof (TpmPhysicalPresenceCommand),
-                              ReceiveBuffer, &ReceiveBufferSize
-                              );
-      //
-      // PF PhysicalPresence = TRUE
-      //
-      TpmPhysicalPresenceCommand [11] = 0x08;
-      ReceiveBufferSize = sizeof(ReceiveBuffer);
-      Status = TpmMpDriver->Transmit (
-                              TpmMpDriver, TpmPhysicalPresenceCommand,
-                              sizeof (TpmPhysicalPresenceCommand),
-                              ReceiveBuffer,
-                              &ReceiveBufferSize
-                              );
-      if (Data == 0x01)
-      {
-        //
-        // TPM_PhysicalEnable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver, TpmPhysicalEnableCommand,
-                                sizeof (TpmPhysicalEnableCommand),
-                                ReceiveBuffer, &ReceiveBufferSize
-                                );
-      }
-      if (Data == 0x02)
-      {
-        //
-        // TPM_PhysicalDisable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver, TpmPhysicalDisableCommand,
-                                sizeof (TpmPhysicalDisableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-      }
-      if (Data == 0x03)
-      {
-        //
-        // TPM_PhysicalSetDeactivated=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer, &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);
-      }
-      if (Data == 0x04)
-      {
-        //
-        // TPM_PhysicalSetDeactivated=TRUE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x01;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x05)
-      {
-        //
-        // TPM_ForceClear
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmForceClearCommand,
-                                sizeof (TpmForceClearCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x06)
-      {
-        //
-        // TPM_PhysicalEnable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalEnableCommand,
-                                sizeof (TpmPhysicalEnableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalSetDeactivated=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x07)
-      {
-        //
-        // TPM_PhysicalSetDeactivated=TRUE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x01;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalDisable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalDisableCommand,
-                                sizeof (TpmPhysicalDisableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x08)
-      {
-        //
-        // TPM_SetOwnerInstall=TRUE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmSetOwnerInstallCommand [10] = 0x01;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmSetOwnerInstallCommand,
-                                sizeof (TpmSetOwnerInstallCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-      }
-      if (Data == 0x09)
-      {
-        //
-        // TPM_SetOwnerInstall=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmSetOwnerInstallCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmSetOwnerInstallCommand,
-                                sizeof (TpmSetOwnerInstallCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-      }
-      if (Data == 0x0A)
-      {
-        //
-        // TPM_PhysicalEnable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalEnableCommand,
-                                sizeof (TpmPhysicalEnableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalSetDeactivated=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // Do TPM_SetOwnerInstall=TRUE on next reboot
-        //
-
-        WriteCmosBank1Byte (CpuIo, ACPI_TPM_REQUEST, 0xF0);
-
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x0B)
-      {
-        //
-        // TPM_SetOwnerInstall=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmSetOwnerInstallCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmSetOwnerInstallCommand,
-                                sizeof (TpmSetOwnerInstallCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalSetDeactivated=TRUE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x01;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalDisable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalDisableCommand,
-                                sizeof (TpmPhysicalDisableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0x0E)
-      {
-        //
-        // TPM_ForceClear
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmForceClearCommand,
-                                sizeof (TpmForceClearCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalEnable
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalEnableCommand,
-                                sizeof (TpmPhysicalEnableCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        //
-        // TPM_PhysicalSetDeactivated=FALSE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmPhysicalSetDeactivatedCommand [10] = 0x00;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmPhysicalSetDeactivatedCommand,
-                                sizeof (TpmPhysicalSetDeactivatedCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        gRT->ResetSystem (
-               EfiResetWarm,
-               EFI_SUCCESS,
-               0,
-               NULL
-               );
-      }
-      if (Data == 0xF0)
-      {
-        //
-        // Second part of ACPI TPM request 0x0A: OEM custom TPM_SetOwnerInstall=TRUE
-        //
-        ReceiveBufferSize = sizeof(ReceiveBuffer);
-        TpmSetOwnerInstallCommand [10] = 0x01;
-        Status = TpmMpDriver->Transmit (
-                                TpmMpDriver,
-                                TpmSetOwnerInstallCommand,
-                                sizeof (TpmSetOwnerInstallCommand),
-                                ReceiveBuffer,
-                                &ReceiveBufferSize
-                                );
-        WriteCmosBank1Byte (CpuIo, ACPI_TPM_LAST_REQUEST, 0x0A);
-      }
-      //
-      // Deassert Physical Presence
-      //
-      TpmPhysicalPresenceCommand [11] = 0x10;
-      ReceiveBufferSize = sizeof(ReceiveBuffer);
-      Status = TpmMpDriver->Transmit (
-                              TpmMpDriver,
-                              TpmPhysicalPresenceCommand,
-                              sizeof (TpmPhysicalPresenceCommand),
-                              ReceiveBuffer,
-                              &ReceiveBufferSize
-                              );
-    }
-  }
-
-  return;
 }
 
 /**
@@ -1722,66 +1262,6 @@ UpdateDVMTSetup(
   }
 }
 
-VOID
-InitPlatformUsbPolicy (
-  VOID
-  )
-
-{
-  EFI_HANDLE              Handle;
-  EFI_STATUS              Status;
-
-  Handle = NULL;
-
-  mUsbPolicyData.Version                       = (UINT8)USB_POLICY_PROTOCOL_REVISION_2;
-  mUsbPolicyData.UsbMassStorageEmulationType   = mSystemConfiguration.UsbBIOSINT13DeviceEmulation;
-  if(mUsbPolicyData.UsbMassStorageEmulationType == 3) {
-    mUsbPolicyData.UsbEmulationSize = mSystemConfiguration.UsbBIOSINT13DeviceEmulationSize;
-  } else {
-    mUsbPolicyData.UsbEmulationSize = 0;
-  }
-  mUsbPolicyData.UsbZipEmulationType         = mSystemConfiguration.UsbZipEmulation;
-  mUsbPolicyData.UsbOperationMode              = HIGH_SPEED;
-
-  //
-  //  Some chipset need Period smi, 0 = LEGACY_PERIOD_UN_SUPP
-  //
-  mUsbPolicyData.USBPeriodSupport      = LEGACY_PERIOD_UN_SUPP;
-
-  //
-  //  Some platform need legacyfree, 0 = LEGACY_FREE_UN_SUPP
-  //
-  mUsbPolicyData.LegacyFreeSupport    = LEGACY_FREE_UN_SUPP;
-
-  //
-  //  Set Code base , TIANO_CODE_BASE =0x01, ICBD =0x00
-  //
-  mUsbPolicyData.CodeBase    = (UINT8)ICBD_CODE_BASE;
-
-  //
-  //  Some chispet 's LpcAcpibase are diffrent,set by platform or chipset,
-  //  default is Ich  acpibase =0x040. acpitimerreg=0x08.
-  mUsbPolicyData.LpcAcpiBase     = 0x40;
-  mUsbPolicyData.AcpiTimerReg    = 0x08;
-
-  //
-  //  Set for reduce usb post time
-  //
-  mUsbPolicyData.UsbTimeTue           = 0x00;
-  mUsbPolicyData.InternelHubExist     = 0x00;  //TigerPoint doesn't have RMH
-  mUsbPolicyData.EnumWaitPortStableStall    = 100;
-
-
-  Status = gBS->InstallProtocolInterface (
-                  &Handle,
-                  &gUsbPolicyGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &mUsbPolicyData
-                  );
-  ASSERT_EFI_ERROR(Status);
-
-}
-
 UINT8
 ReadCmosBank1Byte (
   IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
index 8f5df3257e..621fb08274 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
@@ -1,10 +1,8 @@
 /*++
 
-  Copyright (c) 2004  - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                                   
-
 
 Module Name:
 
@@ -42,25 +40,17 @@ Abstract:
 #include <Library/BiosIdLib.h>
 #include <Protocol/GlobalNvsArea.h>
 #include <Protocol/PciRootBridgeIo.h>
-#include <Protocol/IsaAcpi.h>
-#include <Framework/FrameworkInternalFormRepresentation.h>
-#include <Protocol/FrameworkHii.h>
-#include <Protocol/FrameworkFormCallback.h>
-#include <Protocol/CpuIo.h>
-#include <Protocol/BootScriptSave.h>
-#include <Framework/BootScript.h>
+#include <Protocol/CpuIo2.h>
 #include <Guid/GlobalVariable.h>
 #include <Guid/BoardFeatures.h>
 #include <Guid/DataHubRecords.h>
 #include <Protocol/DataHub.h>
 #include <Protocol/PciIo.h>
 #include <Protocol/Speaker.h>
-#include <Protocol/ExitPmAuth.h>
 #include <IndustryStandard/Pci22.h>
 #include <Guid/SetupVariable.h>
 #include <Guid/PlatformInfo.h>
 #include "Configuration.h"
-#define _EFI_H_    //skip efi.h
 #include "PchAccess.h"
 #include "VlvAccess.h"
 #include "BoardIdDecode.h"
@@ -86,25 +76,9 @@ Abstract:
 
 #define B_RTC_DATE_ALARM_MASK       0x3F
 
-//
-// Default CPU Alternate Duty Cycle (255=100%, 0=0%)
-//
-#define DEF_CPU_ALT_DUTY_CYCLE 0xFF
-
-#define MAX_ONBOARD_SATA_DEVICE 2
-
-#define DXE_DEVICE_ENABLED  1
-#define DXE_DEVICE_DISABLED 0
-
-#define AZALIA_MAX_LOOP_TIME  0x10000
-
 //
 // Platform driver GUID
 //
-#define EFI_PLATFORM_DRIVER_GUID \
-  { 0x056E7324, 0xA718, 0x465b, 0x9A, 0x84, 0x22, 0x8F, 0x06, 0x64, 0x2B, 0x4F }
-
-#define PASSWORD_MAX_SIZE               20
 #define PLATFORM_NORMAL_MODE          0x01
 #define PLATFORM_SAFE_MODE            0x02
 #define PLATFORM_RECOVERY_MODE        0x04
@@ -119,33 +93,10 @@ Abstract:
 #define EFI_CU_PLATFORM_DXE_STEP4                    (EFI_OEM_SPECIFIC | 0x00000015)
 #define EFI_CU_PLATFORM_DXE_INIT_DONE                (EFI_OEM_SPECIFIC | 0x00000016)
 
-
-#define EFI_SECTION_STRING                  0x1C
-#define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
-#define PREFIX_BLANK                        0x04
-
 #pragma pack(1)
 
 typedef UINT64 EFI_BOARD_FEATURES;
 
-//
-//BUGBUG: should remove these EDK hii definition once Hii transtion is done
-//
-typedef UINT16  STRING_REF;
-typedef UINT16  EFI_FORM_LABEL;
-
-typedef enum {
-  EfiUserPassword,
-  EfiAdminPassword
-} EFI_PASSWORD_TYPE;
-
-typedef struct {
-  CHAR16            TempPassword[PASSWORD_MAX_SIZE];
-  CHAR16            EncodedPassword[PASSWORD_MAX_SIZE];
-  VOID              *PasswordLocation;
-  EFI_PASSWORD_TYPE PasswordType;
-} EFI_PASSWORD_DATA;
-
 typedef struct {
   CHAR8 AaNumber[7];
   UINT8 BoardId;
@@ -155,111 +106,11 @@ typedef struct {
   UINT64 AcpiOemTableId;
 } BOARD_ID_DECODE;
 
-typedef
-EFI_STATUS
-(EFIAPI *EFI_FORM_ROUTINE) (
-  SYSTEM_CONFIGURATION *SetupBuffer
-  );
-
-typedef struct{
-  UINT16 DeviceNumber;
-  UINT16 FunctionNumber;
-}PCI_DEVICE_FUNC_INFO;
-
-typedef struct{
-  CHAR16 PortNumber[4];
-  STRING_REF SataDeviceInfoStringId;
-}SATA_DEVICE_STRING_INFO;
-
-typedef struct {
-  UINT16  Signature;
-  UINT8   Size;
-  UINT32  EntryPoint;
-  UINT8   Reserve[17];
-  UINT16  PciDataOff;
-  UINT16  ExpansionOff;
-} PNP_OPTION_ROM_HEADER;
-
-typedef struct {
-  UINT32  Signature;
-  UINT8   Revision;
-  UINT8   Length;
-  UINT16  NextHeader;
-  UINT8   Reserve;
-  UINT8   CheckSum;
-  UINT32  DeviceId;
-  UINT16  ManufactureStrOff;
-  UINT16  ProductStrOff;
-} PNP_EXPANSION_HEADER;
-
-typedef struct {
-  BOOLEAN                         Enable;
-  UINT8                           VerbTableNum;
-  UINT16                          CodecSSID;
-  EFI_PHYSICAL_ADDRESS            HDABar;
-  EFI_PHYSICAL_ADDRESS            UpperHDABar;
-  UINT8                           SDIPresent;
-  BOOLEAN                         Pme;
-  BOOLEAN                         LegacyFrontPanelAudio;
-  BOOLEAN                         HighDefinitionFrontPanelAudio;
-} EFI_AZALIA_S3;
-
-//
-//following structs are from R8. Remove them once R8->R9 transition is done
-//
-typedef struct {
-  CHAR16      *OptionString;  // Passed in string to generate a token for in a truly dynamic form creation
-  STRING_REF  StringToken;    // This is used when creating a single op-code without generating a StringToken (have one already)
-  UINT16      Value;
-  UINT8       Flags;
-  UINT16      Key;
-} IFR_OPTION;
-
-
-
-typedef struct {
-  UINT8   Number;
-  UINT32  HorizontalResolution;
-  UINT32  VerticalResolution;
-} PANEL_RESOLUTION;
-
 #pragma pack()
 
 //
 // Prototypes
 //
-EFI_STATUS
-EFIAPI
-EfiMain (
-  IN EFI_HANDLE         ImageHandle,
-  IN EFI_SYSTEM_TABLE   *SystemTable
-  );
-
-EFI_STATUS
-ProcessEventLog (
-  );
-
-EFI_STATUS
-FindDataRecords (
-  );
-
-EFI_STATUS
-ProcessPasswords(
-  );
-
-VOID
-MemorySetup(
-  );
-
-
-UINTN
-EfiValueToString (
-  IN  OUT CHAR16  *Buffer,
-  IN  INT64       Value,
-  IN  UINTN       Flags,
-  IN  UINTN       Width
-  );
-
 VOID
 EFIAPI
 ReadyToBootFunction (
@@ -267,60 +118,6 @@ ReadyToBootFunction (
   VOID       *Context
   );
 
-VOID
-InstallHiiDataAndGetSettings(
-  IN EFI_HII_STRING_PACK            *StringPack,
-      //
-  ... // 0 or more of => IN EFI_HII_IFR_PACK *IfrPack,
-      // Terminate list with NULL
-      //
-  );
-
-EFI_STATUS
-ReadOrInitSetupVariable(
-  IN UINTN         RequiredVariableSize,
-  IN UINTN         RequiredPasswordSize,
-  IN VOID          *DefaultData,
-  IN VOID          *MfgDefaultData,
-  OUT VOID         *SetupVariableData,
-  OUT VOID         *SystemPassword
-  );
-
-VOID
-EfiLogicalOrMem(
-  IN VOID   *Destination,
-  IN VOID   *Source,
-  IN UINTN  Length
-  );
-
-EFI_STATUS
-GetStringFromToken (
-  IN      EFI_GUID                  *ProducerGuid,
-  IN      STRING_REF                Token,
-  OUT     CHAR16                    **String
-  );
-
-UINT32
-ConvertBase2ToRaw (
-  IN  EFI_EXP_BASE2_DATA             *Data);
-
-UINT32
-ConvertBase10ToRaw (
-  IN  EFI_EXP_BASE10_DATA             *Data);
-
-CHAR16 *
-GetStringById (
-  IN  STRING_REF   Id,
-  EFI_HII_HANDLE   StringPackHandle
-  );
-
-VOID
-EFIAPI
-SetupDataFilter (
-  IN EFI_EVENT    Event,
-  IN VOID*        Context
-  );
-
 VOID
 EFIAPI
 IdeDataFilter (
@@ -328,20 +125,6 @@ IdeDataFilter (
   IN VOID*        Context
   );
 
-VOID
-EFIAPI
-UpdateAhciRaidDiskInfo (
-  IN EFI_EVENT    Event,
-  IN VOID*        Context
-  );
-
-VOID
-EFIAPI
-EventLogFilter (
-  IN EFI_EVENT    Event,
-  IN VOID*        Context
-  );
-
 VOID
 SwapEntries (
   IN  CHAR8 *Data
@@ -353,45 +136,12 @@ AsciiToUnicode (
   IN    CHAR16    *UnicodeString
   );
 
-UINT16
-ConfigModeStateGet();
-
-VOID
-SetSkus();
-
-VOID
-CPUSetupItems();
-
-EFI_STATUS
-SecurityDriverCallback (
-  IN EFI_FORM_CALLBACK_PROTOCOL       *This,
-  IN UINT16                           KeyValue,
-  IN EFI_IFR_DATA_ARRAY               *Data,
-  OUT EFI_HII_CALLBACK_PACKET         **Packet
-  );
-
-VOID
-SetPasswordState (
-  );
-
-VOID
-EncodePassword (
-  IN  CHAR16                      *Password
-  );
-
 VOID
 EFIAPI
 PciBusEvent (
   IN EFI_EVENT    Event,
   IN VOID*        Context
   );
-VOID
-AsfInitialize(
-  );
-
-VOID
-InitializeAsf (
-  );
 
 UINT8
 ReadCmosBank1Byte (
@@ -410,204 +160,6 @@ VOID
 InitializeBoardId (
   );
 
-EFI_STATUS
-InstallBootCallbackRoutine(
-  );
-
-EFI_STATUS
-InstallConfigurationCallbackRoutine(
-  );
-
-EFI_STATUS
-InstallPerformanceCallbackRoutine(
-  );
-
-EFI_STATUS
-InstallSecurityCallbackRoutine (
-  );
-
-EFI_STATUS
-InstallMainCallbackRoutine (
-  );
-
-EFI_STATUS
-MemoryConfigurationUpdate (
-  UINT16                *Key,
-  EFI_FORM_LABEL        *Label,
-  UINT16                *OpcodeCount,
-  UINT8                 **OpcodeData,
-  EFI_FORM_ROUTINE      *Routine
-  );
-
-EFI_STATUS
-MemoryConfigurationCallbackRoutine (
-  SYSTEM_CONFIGURATION  *SetupBuffer
-  );
-
-EFI_STATUS
-MemoryConfigurationCalculateSpeed(
-  SYSTEM_CONFIGURATION  *SetupBuffer
-  );
-
-VOID
-UpdateMemoryString(
-  IN  STRING_REF                  TokenToUpdate,
-  IN  CHAR16                      *NewString
-  );
-
-VOID
-InitFeaturePolicy (
-  IN EFI_PLATFORM_INFO_HOB      *PlatformInfo
-  );
-
-VOID
-InitializeSetupVarHide (
-  );
-
-VOID
-PreparePCIePCISlotInformation(
-  VOID
-  );
-
-
-EFI_STATUS
-BootConfigurationUpdate (
-  IN  OUT SYSTEM_CONFIGURATION  *SystemConfiguration
-  );
-
-EFI_STATUS
-InitializeBootConfiguration(
-  VOID
-  );
-
-UINT16
-GetStringSize(
-  IN      CHAR16 *ThisString
-  );
-
-UINT16
-GetDriveCount (
-  IN      STRING_REF *BootMap
-  );
-
-CHAR16 *
-GetBootString (
-  IN      STRING_REF    Id,
-      OUT UINTN        *Length
-  );
-
-EFI_STATUS
-BootCfgCreateTwoOptionOneOf(
-  IN      UINT16                QuestionId,
-  IN      EFI_FORM_LABEL        Label,
-  IN      STRING_REF            OptionPrompt,
-  IN      STRING_REF            OptionHelp,
-  IN      STRING_REF            OptionOneString,
-  IN      STRING_REF            OptionTwoString,
-  IN      UINT8                 OptionOneFlags,
-  IN      UINT8                 OptionTwoFlags,
-  IN      UINT16                KeyValueOne,
-  IN      UINT16                KeyValueTwo
-  );
-
-EFI_STATUS
-ReplaceOpcodeWithText(
-  IN      STRING_REF            OptionPrompt,
-  IN      STRING_REF            OptionHelp,
-  IN      STRING_REF            OptionOneString,
-  IN      EFI_FORM_LABEL        Label
-  );
-
-EFI_STATUS
-CreateDriveBootOrderOpcode(
-  IN      VOID                 *Data,
-  IN      STRING_REF           *BootMap,
-  IN      EFI_FORM_LABEL        Label,
-  IN      UINT16                QuestionId,
-  IN      STRING_REF            OptionOneString,
-  IN      STRING_REF            OptionTwoString
-  );
-
-VOID
-SetHyperBootCfgFlags(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-VOID
-GetHyperBootCfgFlags(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-VOID
-PrepareBootCfgForHyperBoot(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-BOOLEAN
-BootCfgChanged(
-  IN      SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-EFI_STATUS
-InsertOpcodeAtIndex(
-  IN      SYSTEM_CONFIGURATION *SystemConfiguration,
-  IN  OUT IFR_OPTION           *OptionList,
-  IN      IFR_OPTION            IfrOption,
-  IN      UINT16                OptionCount
-  );
-
-VOID
-ConfigureBootOrderStrings(
-  IN      SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-VOID
-InitializeAllBootStrings(
-  VOID
-  );
-
-VOID
-SaveUsbCfgSettings(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-VOID
-RestoreUsbCfgSettings(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-EFI_STATUS
-UpdateBootDevicePriority(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-EFI_STATUS
-DisableHyperBoot(
-  IN  OUT SYSTEM_CONFIGURATION *SystemConfiguration
-  );
-
-BOOLEAN
-CheckForUserPassword(
-  VOID
-  );
-
-EFI_STATUS
-EFIAPI
-HyperBootPasswordCallback(
-  IN  OUT VOID*  Data
-  );
-
-EFI_STATUS
-EFIAPI
-HyperBootF9Callback (
-  IN VOID*  Data
-  );
-
-EFI_STATUS
-InstallHiiEvents(
-  VOID
-  );
-
 EFI_STATUS
 EFIAPI
 ProgramToneFrequency (
@@ -637,73 +189,13 @@ AdjustDefaultRtcTimeCallback (
   IN VOID             *Context
   );
 
-typedef struct _GOP_DISPLAY_BRIGHTNESS_PROTOCOL GOP_DISPLAY_BRIGHTNESS_PROTOCOL;
-
-typedef
-EFI_STATUS
-(EFIAPI *GET_MAXIMUM_BRIGHTNESS_LEVEL) (
-  IN  GOP_DISPLAY_BRIGHTNESS_PROTOCOL *This,
-  OUT UINT32 *MaxBrightnessLevel
-  );
-
-
-typedef
-EFI_STATUS
-(EFIAPI *GET_CURRENT_BRIGHTNESS_LEVEL) (
-  IN  GOP_DISPLAY_BRIGHTNESS_PROTOCOL *This,
-  OUT UINT32 *MaxBrightnessLevel
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *SET_BRIGHTNESS_LEVEL) (
-  IN  GOP_DISPLAY_BRIGHTNESS_PROTOCOL *This,
-  IN  UINT32  BrightnessLevel
-  );
-
-struct _GOP_DISPLAY_BRIGHTNESS_PROTOCOL {
-  UINT32  Revision;
-  GET_MAXIMUM_BRIGHTNESS_LEVEL GetMaxBrightnessLevel;
-  GET_CURRENT_BRIGHTNESS_LEVEL GetCurrentBrightnessLevel;
-  SET_BRIGHTNESS_LEVEL SetBrightnessLevel;
-};
-
 //
 // Global externs
 //
-extern UINT8 MaintenanceBin[];
-extern UINT8 MainBin[];
-extern UINT8 ConfigurationBin[];
-extern UINT8 MemoryConfigurationBin[];
-extern UINT8 PerformanceBin[];
-extern UINT8 SecurityBin[];
-extern UINT8 BootBin[];
-extern UINT8 PowerBin[];
-extern UINT8 SystemSetupBin[];
-
-extern VOID                 *mDxePlatformStringPack;
-extern EFI_HII_PROTOCOL     *mHii;
 extern SYSTEM_CONFIGURATION mSystemConfiguration;
-extern FRAMEWORK_EFI_HII_HANDLE       mMaintenanceHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mMainHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mConfigurationHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mPerformanceHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mPowerHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mBootHiiHandle;
-extern FRAMEWORK_EFI_HII_HANDLE       mSecurityHiiHandle;
-
-extern SYSTEM_PASSWORDS     mSystemPassword;
-extern EFI_PASSWORD_DATA    mAdminPassword;
-extern EFI_PASSWORD_DATA    mUserPassword;
 
 extern EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *mPciRootBridgeIo;
 
-//
-//extern EFI_REG_TABLE mSubsystemIdRegs[];
-//
-extern UINT32 mSubsystemVidDid;
-extern UINT32 mSubsystemAudioVidDid;
-
 extern UINT8 mBoardIdIndex;
 extern BOOLEAN mFoundAANum;
 extern EFI_BOARD_FEATURES mBoardFeatures;
@@ -718,5 +210,4 @@ extern BOOLEAN mMfgMode;
 extern UINT32 mPlatformBootMode;
 extern CHAR8 BoardAaNumber[];
 
-extern EFI_GUID gEfiGlobalNvsAreaProtocolGuid;
 #endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index 4d1949d05d..e8652f2a84 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -1,6 +1,6 @@
 ## @file
 #
-#  Copyright (c)  1999  - 2016, Intel Corporation. All rights reserved
+#  Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -50,13 +50,10 @@ [sources.common]
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   SecurityPkg/SecurityPkg.dec
   CryptoPkg/CryptoPkg.dec
-  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
 
 [LibraryClasses]
   BaseLib
@@ -91,24 +88,18 @@ [Guids]
   gEfiEventExitBootServicesGuid
   gEfiVlv2VariableGuid
   gEfiSecureBootEnableDisableGuid
+  gEfiEndOfDxeEventGroupGuid
 
 [Protocols]
   gEfiPciRootBridgeIoProtocolGuid    # CONSUMES  ## GUID
   gEfiVariableArchProtocolGuid
   gEfiVariableWriteArchProtocolGuid
   gEfiHiiConfigAccessProtocolGuid
-  gEfiBootScriptSaveProtocolGuid
-  gEfiCpuIoProtocolGuid
+  gEfiCpuIo2ProtocolGuid
   gEfiDevicePathProtocolGuid
   gEfiDiskInfoProtocolGuid
-  gEfiPs2PolicyProtocolGuid
-  gEfiIsaAcpiProtocolGuid
-  gEfiDataHubProtocolGuid
   gEfiPciIoProtocolGuid
   gDxePchPlatformPolicyProtocolGuid
-  gEfiTpmMpDriverProtocolGuid
-  gEfiLpcWpce791PolicyProtocolGuid
-  gUsbPolicyGuid
   gEfiSpeakerInterfaceProtocolGuid
   gDxeVlvPlatformPolicyGuid
   gEfiSmbiosSlotPopulationGuid
@@ -121,7 +112,6 @@ [Protocols]
   gEfiGlobalNvsAreaProtocolGuid
   gEfiCpuIo2ProtocolGuid
   gIgdOpRegionProtocolGuid
-  gExitPmAuthProtocolGuid
   gEdkiiVariableLockProtocolGuid
 
 [Pcd.common]
@@ -134,15 +124,13 @@ [Pcd.common]
   gPlatformModuleTokenSpaceGuid.PcdFlashFvMainBase
   gPlatformModuleTokenSpaceGuid.PcdFlashFvRecoveryBase
   gPlatformModuleTokenSpaceGuid.PcdFlashFvRecoverySize
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase
 
 
 [Depex]
   gEfiPciRootBridgeIoProtocolGuid     AND
   gEfiVariableArchProtocolGuid        AND
   gEfiVariableWriteArchProtocolGuid   AND
-  gEfiBootScriptSaveProtocolGuid      AND
-  gEfiCpuIoProtocolGuid               AND
+  gEfiCpuIo2ProtocolGuid               AND
   gDxePchPlatformPolicyProtocolGuid   AND
   gEfiGlobalNvsAreaProtocolGuid
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
index 948793f719..c00553e224 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
@@ -1,15 +1,10 @@
 #
 #
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#                                                                                  
# SPDX-License-Identifier: BSD-2-Clause-Patent
 #
 ##
 
-
 [Defines]
   INF_VERSION                    = 0x00010005
   BASE_NAME                      = PlatformGOPPolicy
@@ -29,14 +24,13 @@ [Sources.common]
 
 [Packages]
   MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
+
 [LibraryClasses]
   BaseLib
   DebugLib
   UefiDriverEntryPoint
   UefiRuntimeServicesTableLib
-#  DxeKscLib
 
 [Guids]
   gBmpImageGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryCallback.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryCallback.c
index 070848ed1e..074bf7debb 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryCallback.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryCallback.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   MemoryCallback.c
@@ -158,12 +156,10 @@ MemoryDiscoveredPpiNotifyCallback (
     IoWrite16 (ACPI_BASE_ADDRESS + R_PCH_ACPI_PM1_CNT, Pm1Cnt);
   }
 
-  #ifndef MINNOW2_FSP_BUILD
   //
   // Set PEI cache mode here
   //
   SetPeiCacheMode (PeiServices);
-  #endif
 
   //
   //  Pulish memory tyoe info
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c
index a359c95920..ec636a4cd9 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   PlatformEarlyInit.c
@@ -70,10 +67,6 @@ static EFI_PEI_PPI_DESCRIPTOR       mInstallSpeakerInterfacePpi = {
 static EFI_PEI_RESET_PPI            mResetPpi = { IchReset };
 
 
-static EFI_PEI_FIND_FV_PPI mEfiFindFvPpi = {
-  (EFI_PEI_FIND_FV_FINDFV)FindFv
-};
-
 static EFI_PEI_PPI_DESCRIPTOR       mPpiList[] = {
   {
     EFI_PEI_PPI_DESCRIPTOR_PPI,
@@ -81,14 +74,9 @@ static EFI_PEI_PPI_DESCRIPTOR       mPpiList[] = {
     NULL
   },
   {
-    EFI_PEI_PPI_DESCRIPTOR_PPI,
+    (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
     &gEfiPeiResetPpiGuid,
     &mResetPpi
-  },
-  {
-    (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
-    &gEfiFindFvPpiGuid,
-    &mEfiFindFvPpi
   }
 };
 
@@ -815,158 +803,6 @@ PlatformEarlyInitEntry (
   EFI_PLATFORM_INFO_HOB       *PlatformInfo;
   EFI_PEI_HOB_POINTERS        Hob;
   EFI_PLATFORM_CPU_INFO       PlatformCpuInfo;
-  EFI_SMRAM_HOB_DESCRIPTOR_BLOCK  *DescriptorBlock;
-  EFI_SMRAM_HOB_DESCRIPTOR_BLOCK  *NewDescriptorBlock;
-  UINTN                           Index;
-  UINTN                           MaxIndex;
-  UINT64                          Base;
-  UINT64                          Size;
-  UINT64                          NewSize;
-
-  //
-  // Make sure base and size of the SMRAM region is aligned
-  //
-  Hob.Raw = GetFirstGuidHob (&gEfiSmmPeiSmramMemoryReserveGuid);
-  if (Hob.Raw != NULL) {
-    DescriptorBlock = GET_GUID_HOB_DATA (Hob.Raw);
-    DEBUG ((DEBUG_INFO, "SMM PEI SMRAM Memory Reserved HOB\n"));
-    for (Index = 0; Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) {
-      DEBUG((DEBUG_INFO, "  SMRAM Descriptor[%02x]: Start=%016lx  Size=%016lx  State=%02x\n",
-        Index,
-        DescriptorBlock->Descriptor[Index].PhysicalStart,
-        DescriptorBlock->Descriptor[Index].PhysicalSize,
-        DescriptorBlock->Descriptor[Index].RegionState
-        ));
-    }
-
-    //
-    // Find the largest usable range of SMRAM between 1MB and 4GB
-    //
-    for (Index = 0, MaxIndex = 0, Size = 0; Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) {
-      //
-      // Skip any SMRAM region that is already allocated, needs testing, or needs ECC initialization
-      //
-      if ((DescriptorBlock->Descriptor[Index].RegionState & (EFI_ALLOCATED | EFI_NEEDS_TESTING | EFI_NEEDS_ECC_INITIALIZATION)) != 0) {
-        continue;
-      }
-      //
-      // Skip any SMRAM region below 1MB
-      //
-      if (DescriptorBlock->Descriptor[Index].CpuStart < BASE_1MB) {
-        continue;
-      }
-      //
-      // Skip any SMRAM region that is above 4GB or crosses the 4GB boundary
-      //
-      if ((DescriptorBlock->Descriptor[Index].CpuStart + DescriptorBlock->Descriptor[Index].PhysicalSize) >= BASE_4GB) {
-        continue;
-      }
-      //
-      // Cache the largest SMRAM region index
-      //
-      if (DescriptorBlock->Descriptor[Index].PhysicalSize >= DescriptorBlock->Descriptor[MaxIndex].PhysicalSize) {
-        MaxIndex = Index;
-      }
-    }
-
-    //
-    // Find the extent of the contiguous SMRAM region that surrounds the largest usable SMRAM range
-    //
-    Base = DescriptorBlock->Descriptor[MaxIndex].CpuStart;
-    Size = DescriptorBlock->Descriptor[MaxIndex].PhysicalSize;
-    for (Index = 0; Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) {
-      if (DescriptorBlock->Descriptor[Index].CpuStart < Base &&
-          Base == (DescriptorBlock->Descriptor[Index].CpuStart + DescriptorBlock->Descriptor[Index].PhysicalSize)) {
-        Base  = DescriptorBlock->Descriptor[Index].CpuStart;
-        Size += DescriptorBlock->Descriptor[Index].PhysicalSize;
-      } else if ((Base + Size) == DescriptorBlock->Descriptor[Index].CpuStart) {
-        Size += DescriptorBlock->Descriptor[Index].PhysicalSize;
-      }
-    }
-
-    //
-    // Round SMRAM region up to nearest power of 2 that is at least 4KB
-    //
-    NewSize = MAX (LShiftU64 (1, HighBitSet64 (Size - 1) + 1), SIZE_4KB);
-    if ((Base & ~(NewSize - 1)) != Base) {
-      //
-      // SMRAM region Base Address has smaller alignment than SMRAM region Size
-      // This is not compatible with SMRR settings
-      //
-      DEBUG((DEBUG_ERROR, "ERROR: SMRAM Region Size has larger alignment than SMRAM Region Base\n"));
-      DEBUG((DEBUG_ERROR, "  SMRAM Region Base=%016lx  Size=%016lx\n", Base, NewSize));
-      ASSERT (FALSE);
-    } else if (Size != NewSize) {
-      //
-      // See if the size difference can be added to an adjacent descriptor that is already allocated
-      //
-      for (Index = 0; Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) {
-        if ((DescriptorBlock->Descriptor[Index].CpuStart + DescriptorBlock->Descriptor[Index].PhysicalSize) == (Base + Size)) {
-          if (((DescriptorBlock->Descriptor[Index].RegionState) & EFI_ALLOCATED) != 0) {
-            DescriptorBlock->Descriptor[Index].PhysicalSize += (NewSize - Size);
-            Size = NewSize;
-            break;
-          }
-        }
-      }
-
-      if (Size != NewSize) {
-        //
-        // Add an allocated descriptor to the SMM PEI SMRAM Memory Reserved HOB to accomodate the larger size.
-        //
-        Index = DescriptorBlock->NumberOfSmmReservedRegions;
-        NewDescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)BuildGuidHob (
-          &gEfiSmmPeiSmramMemoryReserveGuid,
-          sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK) + ((Index + 1) * sizeof (EFI_SMRAM_DESCRIPTOR))
-          );
-        ASSERT (NewDescriptorBlock != NULL);
-
-        //
-        // Copy old EFI_SMRAM_HOB_DESCRIPTOR_BLOCK to new allocated region
-        //
-        CopyMem (
-          NewDescriptorBlock,
-          DescriptorBlock,
-          sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK) + (Index * sizeof (EFI_SMRAM_DESCRIPTOR))
-          );
-
-        //
-        // Make sure last descriptor in NewDescriptorBlock contains last descriptor from DescriptorBlock
-        //
-        CopyMem (
-          &NewDescriptorBlock->Descriptor[Index],
-          &NewDescriptorBlock->Descriptor[Index - 1],
-          sizeof (EFI_SMRAM_DESCRIPTOR)
-          );
-
-        //
-        // Fill next to last descriptor with an allocated descriptor that aligns the total size of SMRAM
-        //
-        NewDescriptorBlock->Descriptor[Index - 1].CpuStart      = Base + Size;
-        NewDescriptorBlock->Descriptor[Index - 1].PhysicalStart = Base + Size;
-        NewDescriptorBlock->Descriptor[Index - 1].PhysicalSize  = NewSize - Size;
-        NewDescriptorBlock->Descriptor[Index - 1].RegionState   = DescriptorBlock->Descriptor[MaxIndex].RegionState | EFI_ALLOCATED;
-        NewDescriptorBlock->NumberOfSmmReservedRegions++;
-
-        //
-        // Invalidate the original gEfiSmmPeiSmramMemoryReserveGuid HOB
-        //
-        ZeroMem (&Hob.Guid->Name, sizeof (&Hob.Guid->Name));
-      }
-
-      Hob.Raw = GetFirstGuidHob (&gEfiSmmPeiSmramMemoryReserveGuid);
-      DescriptorBlock = GET_GUID_HOB_DATA (Hob.Raw);
-      DEBUG ((DEBUG_INFO, "SMM PEI SMRAM Memory Reserved HOB - Updated\n"));
-      for (Index = 0; Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) {
-        DEBUG((DEBUG_INFO, "  SMRAM Descriptor[%02x]: Start=%016lx  Size=%016lx  State=%02x\n",
-          Index,
-          DescriptorBlock->Descriptor[Index].PhysicalStart,
-          DescriptorBlock->Descriptor[Index].PhysicalSize,
-          DescriptorBlock->Descriptor[Index].RegionState
-          ));
-      }
-    }
-  }
 
   //
   // Initialize SmbusPolicy PPI
@@ -1118,45 +954,6 @@ PlatformEarlyInitEntry (
   return Status;
 }
 
-/**
-
-  Return the mainblockcompact Fv.
-
-  @param FvNumber    Our enumeration of the firmware volumes we care about.
-
-  @param FvAddress  Base Address of the memory containing the firmware volume
-
-  @retval EFI_SUCCESS
-  @retval EFI_NOT_FOUND
-
-**/
-EFI_STATUS
-EFIAPI
-FindFv (
-  IN EFI_PEI_FIND_FV_PPI          *This,
-  IN CONST EFI_PEI_SERVICES             **PeiServices,
-  IN OUT UINT8                    *FvNumber,
-  OUT EFI_FIRMWARE_VOLUME_HEADER  **FVAddress
-  )
-{
-	//
-  // At present, we only have one Fv to search
-  //
-  if (*FvNumber == 0) {
-    *FvNumber = 1;
-    *FVAddress = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FixedPcdGet32 (PcdFlashFvMainBase);
-    return EFI_SUCCESS;
-  }
-  else if (*FvNumber == 1) {
-    *FvNumber = 2;
-    *FVAddress = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FixedPcdGet32 (PcdFlashFvRecovery2Base);
-    return EFI_SUCCESS;
-  }
-  else { // Not the one Fv we care about
-    return EFI_NOT_FOUND;
-  }
-}
-
 EFI_STATUS
 EFIAPI
 CpuOnlyReset (
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
index 29749277d7..9631d49a84 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   PlatformEarlyInit.h
@@ -30,7 +28,7 @@ Abstract:
 #define _EFI_PLATFORM_EARLY_INIT_H_
 
 #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
-#include <FrameworkPei.h>
+#include <PiPei.h>
 #include "PlatformBaseAddresses.h"
 #include "PchAccess.h"
 #include "VlvAccess.h"
@@ -43,7 +41,6 @@ Abstract:
 #include <Guid/PlatformInfo.h>
 #include <Guid/SetupVariable.h>
 #include <Ppi/AtaController.h>
-#include <Ppi/FindFv.h>
 #include <Ppi/BootInRecoveryMode.h>
 #include <Ppi/ReadOnlyVariable2.h>
 #include <Ppi/Capsule.h>
@@ -60,7 +57,6 @@ Abstract:
 
 #include <IndustryStandard/Pci22.h>
 #include <Ppi/Speaker.h>
-#include <Guid/FirmwareFileSystem.h>
 #include <Guid/MemoryTypeInformation.h>
 #include <Ppi/Cache.h>
 #include <Ppi/Smbus.h>
@@ -73,12 +69,10 @@ Abstract:
 #include <Guid/GlobalVariable.h>
 #include <Ppi/RecoveryModule.h>
 #include <Ppi/DeviceRecoveryModule.h>
-#include <Guid/Capsule.h>
 #include <Guid/RecoveryDevice.h>
 #include <Ppi/MasterBootMode.h>
 #include <Guid/PlatformCpuInfo.h>
 #include <Guid/OsSelection.h>
-#include <Guid/SmramMemoryReserve.h>
 #include <Register/Msr.h>
 
 #define SMC_LAN_ON       0x46
@@ -1379,15 +1373,6 @@ CheckIfJumperSetForRecovery(
   VOID
   );
 
-EFI_STATUS
-EFIAPI    
-FindFv (
-  IN EFI_PEI_FIND_FV_PPI              *This,
-  IN CONST EFI_PEI_SERVICES             **PeiServices,
-  IN OUT UINT8                    *FvNumber,
-  OUT EFI_FIRMWARE_VOLUME_HEADER  **FVAddress
-  );
-
 BOOLEAN
 IsA16Inverted (
   );
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf
index 54277b1e8b..eeb9a4a023 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf
@@ -1,10 +1,8 @@
 #
 #
-# Copyright (c)  1999  - 2016, Intel Corporation. All rights reserved
-#                                                                                  
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
-#
 #
 #  Module Name:
 #
@@ -17,13 +15,13 @@
 #--*/
 
 [defines]
-INF_VERSION 				   = 0x00010005
-BASE_NAME					   = PlatformEarlyInit
-FILE_GUID					   = 0A5EA2E1-BE0B-44a0-A775-F429C9A018A0
-MODULE_TYPE 				   = PEIM
-VERSION_STRING				   = 1.0
-PI_SPECIFICATION_VERSION	   = 0x0001000A
-ENTRY_POINT 				   = PlatformEarlyInitEntry
+INF_VERSION               = 0x00010005
+BASE_NAME                 = PlatformEarlyInit
+FILE_GUID                 = 0A5EA2E1-BE0B-44a0-A775-F429C9A018A0
+MODULE_TYPE               = PEIM
+VERSION_STRING            = 1.0
+PI_SPECIFICATION_VERSION  = 0x0001000A
+ENTRY_POINT               = PlatformEarlyInitEntry
 
 [sources.common]
   BootMode.c
@@ -44,19 +42,15 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2SocBinPkg/Vlv2SocBinPkg.dec
   UefiCpuPkg/UefiCpuPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
 
 [LibraryClasses]
   PeimEntryPoint
   DebugLib
   HobLib
   IoLib
-#  PeiKscLib
   MultiPlatformLib
   PcdLib
   PchPlatformLib
@@ -71,14 +65,12 @@ [Ppis]
   gEfiPeiResetPpiGuid
   gEfiEndOfPeiSignalPpiGuid
   gPeiSmbusPolicyPpiGuid
-  gEfiFindFvPpiGuid
   gPeiCapsulePpiGuid
   gEfiPeiBootInRecoveryModePpiGuid
   gEfiPeiRecoveryModulePpiGuid
   gEfiPeiDeviceRecoveryModulePpiGuid
   gPeiCachePpiGuid
   gEfiPeiMasterBootModePpiGuid
-  gEfiPeiSmbusPpiGuid
   gPchInitPpiGuid
   gPchUsbPolicyPpiGuid
 
@@ -96,7 +88,6 @@ [Guids]
   gEfiNormalSetupGuid
   gEfiMemoryTypeInformationGuid
   gOsSelectionVariableGuid
-  gEfiSmmPeiSmramMemoryReserveGuid
 
 [Pcd.common]
   gPlatformModuleTokenSpaceGuid.PcdFlashFvMainBase
@@ -111,7 +102,7 @@ [Pcd.common]
 
 [Pcd]
   gEfiVLVTokenSpaceGuid.PcdMeasuredBootEnable
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootState
+  gPlatformModuleTokenSpaceGuid.PcdBootState
 
 [Depex]
   gEfiPeiReadOnlyVariable2PpiGuid  AND gPeiCachePpiGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
index 283993b44c..a533f3918c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 **/
 
 #ifndef __COMMON_HEADER_H_
@@ -13,18 +11,15 @@
 
 
 
-#include <FrameworkPei.h>
+#include <PiPei.h>
 
 #include <IndustryStandard/SmBus.h>
 #include <IndustryStandard/Pci22.h>
 #include <Ppi/AtaController.h>
-#include <Guid/Capsule.h>
-#include <Ppi/Cache.h>
 #include <Ppi/MasterBootMode.h>
 #include <Guid/MemoryTypeInformation.h>
 #include <Guid/RecoveryDevice.h>
 #include <Ppi/ReadOnlyVariable2.h>
-#include <Ppi/FvLoadFile.h>
 #include <Ppi/DeviceRecoveryModule.h>
 #include <Ppi/Capsule.h>
 #include <Ppi/Reset.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/MemoryCallback.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/MemoryCallback.c
index 7dcc2c3ce9..1932aa7125 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/MemoryCallback.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/MemoryCallback.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
   This file includes a memory call back function notified when MRC is done,
   following action is performed in this file,
     1. ICH initialization after MRC.
@@ -21,7 +18,6 @@
 
 #include "CommonHeader.h"
 #include "Platform.h"
-#include <Ppi/Cache.h>
 #include <Library/BaseCryptLib.h>
 #include <Library/PciLib.h>
 #include "VlvAccess.h"
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
index eba1dfff30..aa03f6ea95 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
 **/
@@ -816,15 +813,6 @@ PeiInitPlatform (
     sizeof (EFI_PLATFORM_INFO_HOB)
     );
 
-
-#ifdef FTPM_ENABLE
-  Status = FtpmPolicyInit(PeiServices, &SystemConfiguration);
-  if (EFI_ERROR (Status)) {
-    DEBUG((EFI_D_ERROR, "fTPM init failed.\n"));
-  }
-#endif
-
-
   //
   // Set the new boot mode for MRC
   //
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
index c976273ce3..28a5274c40 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
@@ -1,9 +1,9 @@
 #
 #
-# Copyright (c)  1999  - 2018, Intel Corporation. All rights reserved
-#                                                                                  
+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
+#
 #
 # This PEIM includes 3 parts, pre memory initialization, MRC
 #  wrapper and post memory initialization.
@@ -63,9 +63,7 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  Vlv2SocBinPkg/Vlv2SocBinPkg.dec
   UefiCpuPkg/UefiCpuPkg.dec
   CryptoPkg/CryptoPkg.dec
 
@@ -89,14 +87,11 @@ [Ppis]
   gEfiPeiReadOnlyVariable2PpiGuid
   gEfiPeiResetPpiGuid
   gEfiEndOfPeiSignalPpiGuid
-  gEfiFindFvPpiGuid
   gPeiCapsulePpiGuid
   gEfiPeiBootInRecoveryModePpiGuid
   gEfiPeiRecoveryModulePpiGuid
   gEfiPeiDeviceRecoveryModulePpiGuid
-  gPeiCachePpiGuid
   gEfiPeiMasterBootModePpiGuid
-  gEfiPeiSmbusPpiGuid
   gPeiMfgMemoryTestPpiGuid
   gPeiSha256HashPpiGuid
   gVlvMmioPolicyPpiGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index 4653f63a66..9951aa4a58 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -2,14 +2,9 @@
 # Platform Package
 #
 # This package provides platform specific modules.
-# Copyright (c) 2009  - 2015, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2009  - 2019, Intel Corporation. All rights reserved.<BR>
 #
-
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#
-
-#
 #
 #**/
 
@@ -66,9 +61,6 @@ [Protocols]
   gEfiActiveBiosProtocolGuid              = { 0xebbe2d1b, 0x1647, 0x4bda, { 0xab, 0x9a, 0x78, 0x63, 0xe3, 0x96, 0xd4, 0x1a } }
   gEfiPlatformCpuProtocolGuid             = { 0xbd26cdc9, 0xa092, 0x462a, { 0x87, 0x7a, 0x5a, 0xb6, 0xad, 0xce, 0x48, 0x12 } }
   gDxePchPlatformPolicyProtocolGuid       = { 0x4b0165a9, 0x61d6, 0x4e23, { 0xa0, 0xb5, 0x3e, 0xc7, 0x9c, 0x2e, 0x30, 0xd5 } }
-  gEfiTpmMpDriverProtocolGuid             = { 0xde161cfe, 0x1e60, 0x42a1, { 0x8c, 0xc3, 0xee, 0x7e, 0xf0, 0x73, 0x52, 0x12 } }
-  gEfiLpcWpce791PolicyProtocolGuid        = { 0xab2bee2f, 0xc1a6, 0x4399, { 0x85, 0x3d, 0xc0, 0x7c, 0x77, 0x4f, 0xfd, 0x0d } }
-  gUsbPolicyGuid                          = { 0xf617b358, 0x12cf, 0x414a, { 0xa0, 0x69, 0x60, 0x67, 0x7b, 0xda, 0x13, 0xb4 } }
   gEfiSpeakerInterfaceProtocolGuid        = { 0x400b4476, 0x3081, 0x11d6, { 0x87, 0xed, 0x00, 0x06, 0x29, 0x45, 0xc3, 0xb9 } }
   gDxeVlvPlatformPolicyGuid               = { 0x5bab88ba, 0xe0e2, 0x4674, { 0xb6, 0xad, 0xb8, 0x12, 0xf6, 0x88, 0x1c, 0xd6 } }
   gEfiSmbiosSlotPopulationGuid            = { 0xef7bf7d6, 0xf8ff, 0x4a76, { 0x82, 0x47, 0xc0, 0xd0, 0xd1, 0xcc, 0x49, 0xc0 } }
@@ -80,9 +72,6 @@ [Protocols]
   gEfiPlatformIdeInitProtocolGuid         = { 0x377c66a3, 0x8fe7, 0x4ee8, { 0x85, 0xb8, 0xf1, 0xa2, 0x82, 0x56, 0x9e, 0x3b } }
   gEfiPciPlatformProtocolGuid             = { 0x07d75280, 0x27d4, 0x4d69, { 0x90, 0xd0, 0x56, 0x43, 0xe2, 0x38, 0xb3, 0x41 } }
   gEnhancedSpeedstepProtocolGuid          = { 0x91a1ddcf, 0x5374, 0x4939, { 0x89, 0x51, 0xd7, 0x29, 0x3f, 0x1a, 0x78, 0x6f } }
-  gEfiAcpiSupportProtocolGuid             = { 0xdbff9d55, 0x89b7, 0x46da, { 0xbd, 0xdf, 0x67, 0x7d, 0x3d, 0xc0, 0x24, 0x1d } }
-  gEfiAcpiS3SaveProtocolGuid              = { 0x125f2de1, 0xfb85, 0x440c, { 0xa5, 0x4c, 0x4d, 0x99, 0x35, 0x8a, 0x8d, 0x38 } }
-  gEfiCpuIoProtocolGuid                   = { 0xB0732526, 0x38C8, 0x4b40, { 0x88, 0x77, 0x61, 0xC7, 0xB0, 0x6A, 0xAC, 0x45 } }
   gPlatformGOPPolicyGuid                  = { 0xec2e931b, 0x3281, 0x48a5, { 0x81, 0x07, 0xdf, 0x8a, 0x8b, 0xed, 0x3c, 0x5d } }
   gEfiGopDisplayBrightnessProtocolGuid    = { 0x6ff23f1d, 0x877c, 0x4b1b, { 0x93, 0xfc, 0xf1, 0x42, 0xb2, 0xee, 0xa6, 0xa7 } }
   gEfiUsbKeyboardConnectGuid              = { 0xad9c4381, 0x1ede, 0x430c, { 0x8d, 0x42, 0x23, 0x76, 0x7c, 0x46, 0x5d, 0x52 } }
@@ -130,9 +119,6 @@ [PcdsFixedAtBuild]
 
   gEfiPchTokenSpaceGuid.PcdPchAcpiIoPortBaseAddress|0x400|UINT16|0x0000000B
 
-   ## FFS filename to find the shell application.
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile|{ 0xB7, 0xD6, 0x7A, 0xC5, 0x15, 0x05, 0xA8, 0x40, 0x9D, 0x21, 0x55, 0x16, 0x52, 0x85, 0x4E, 0x37 }|VOID*|0x40000004
-
   gEfiIchTokenSpaceGuid.PcdPeiIchUhciControllerIoPortBaseAddress|0x4000|UINT16|0x30000017
   gEfiIchTokenSpaceGuid.PcdPeiIchEhciControllerMemoryBaseAddress|0xFC000000|UINT32|0x30000019
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index 5827386977..87b905c95b 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -9,45 +9,34 @@
 #**/
 
 [Defines]
-DEFINE FLASH_BASE       = 0xFFC00000     #The base address of the 4Mb FLASH Device.
-DEFINE FLASH_SIZE       = 0x00400000     #The flash size in bytes of the 4Mb FLASH Device.
+DEFINE FLASH_BASE       = 0xFF800000     #The base address of the 4Mb FLASH Device.
+DEFINE FLASH_SIZE       = 0x00800000     #The flash size in bytes of the 4Mb FLASH Device.
 DEFINE FLASH_BLOCK_SIZE = 0x1000        #The block size in bytes of the 4Mb FLASH Device.
-DEFINE FLASH_NUM_BLOCKS = 0x400           #The number of blocks in 4Mb FLASH Device.
+DEFINE FLASH_NUM_BLOCKS = 0x800           #The number of blocks in 4Mb FLASH Device.
 DEFINE FLASH_AREA_BASE_ADDRESS                                = 0xFF800000
 DEFINE FLASH_AREA_SIZE                                        = 0x00800000
 
-DEFINE FLASH_REGION_VLVMICROCODE_OFFSET                       = 0x00000000
+DEFINE FLASH_REGION_VLVMICROCODE_OFFSET                       = 0x00400000
 DEFINE FLASH_REGION_VLVMICROCODE_SIZE                         = 0x00040000
 DEFINE FLASH_REGION_VLVMICROCODE_BASE                         = 0xFFC00000
 
-DEFINE FLASH_REGION_VPD_OFFSET                                = 0x00040000
+DEFINE FLASH_REGION_VPD_OFFSET                                = 0x00440000
 DEFINE FLASH_REGION_VPD_SIZE                                  = 0x0003E000
 
-DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_OFFSET = 0x0007E000
+DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_OFFSET = 0x0047E000
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_SIZE   = 0x00002000
 
 
-DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET   = 0x00080000
+DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET   = 0x00480000
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_SIZE     = 0x00040000
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-DEFINE FLASH_REGION_FSPBIN_OFFSET                             = 0x000C0000
-DEFINE FLASH_REGION_FSPBIN_SIZE                               = 0x00048000
-DEFINE FLASH_REGION_FSPBIN_BASE                               = 0xFFCC0000
-
-DEFINE FLASH_REGION_AZALIABIN_OFFSET                          = 0x00108000
-DEFINE FLASH_REGION_AZALIABIN_SIZE                            = 0x00008000
-DEFINE FLASH_REGION_AZALIABIN_BASE                            = 0xFFD08000
-
-!endif
-
-DEFINE FLASH_REGION_FVMAIN_OFFSET                             = 0x00110000
+DEFINE FLASH_REGION_FVMAIN_OFFSET                             = 0x00510000
 DEFINE FLASH_REGION_FVMAIN_SIZE                               = 0x00210000
 
-DEFINE FLASH_REGION_FV_RECOVERY2_OFFSET                       = 0x00320000
+DEFINE FLASH_REGION_FV_RECOVERY2_OFFSET                       = 0x00720000
 DEFINE FLASH_REGION_FV_RECOVERY2_SIZE                         = 0x00070000
 
-DEFINE FLASH_REGION_FV_RECOVERY_OFFSET                        = 0x00390000
+DEFINE FLASH_REGION_FV_RECOVERY_OFFSET                        = 0x00790000
 DEFINE FLASH_REGION_FV_RECOVERY_SIZE                          = 0x00070000
 
 ################################################################################
@@ -79,17 +68,6 @@ [FD.Vlv]
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress = $(FLASH_REGION_VLVMICROCODE_BASE) + 0x60
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize = $(FLASH_REGION_VLVMICROCODE_SIZE) - 0x60
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-# put below PCD value setting into dsc file
-#SET gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress                = $(FLASH_REGION_VLVMICROCODE_BASE)
-#SET gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize             = $(FLASH_REGION_VLVMICROCODE_SIZE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset                    = 0x60
-#SET gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress                   = $(FLASH_AREA_BASE_ADDRESS)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize                      = $(FLASH_AREA_SIZE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase                          = $(FLASH_REGION_FSPBIN_BASE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize                          = $(FLASH_REGION_FSPBIN_SIZE)
-
-!endif
 ################################################################################
 #
 # Following are lists of FD Region layout which correspond to the locations of different
@@ -106,6 +84,13 @@ [FD.Vlv]
 # Fv Size can be adjusted; FVMAIN_COMPACT can be reduced to 0x120000, and FV_RECOVERY can be enlarged to 0x80000
 #
 ################################################################################
+
+  #
+  # IFWI Header
+  #
+0x0000|0x1000
+FILE=Vlv2TbltDevicePkg/Stitch/IFWIHeader/IFWI_HEADER.bin
+
   #
   # CPU Microcodes
   #
@@ -173,18 +158,6 @@ [FD.Vlv]
 $(FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET)|$(FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_SIZE)
 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-
-  $(FLASH_REGION_FSPBIN_OFFSET)|$(FLASH_REGION_FSPBIN_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase|gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize
-  FILE = Vlv2SocBinPkg/FspBinary/FvFsp.bin
-
-
-  $(FLASH_REGION_AZALIABIN_OFFSET)|$(FLASH_REGION_AZALIABIN_SIZE)
-  FILE = Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin
-
-!endif
-
   #
   # Main Block
   #
@@ -258,7 +231,7 @@ [FV.FVRECOVERY_COMPONENTS]
 READ_LOCK_CAP      = TRUE
 READ_LOCK_STATUS   = TRUE
 
-INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
+INF  RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
 INF  MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf
 INF  MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf
 INF  MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPei.inf
@@ -299,28 +272,22 @@ [FV.FVRECOVERY2]
 
 
 
-INF $(PLATFORM_PACKAGE)/PlatformInitPei/PlatformInitPei.inf
+INF Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
 INF UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MpS3.inf
-!endif
+INF UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
 
-# INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PiSmmCommunicationPei.inf
 !if $(TPM_ENABLED) == TRUE
 INF SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf
 INF SecurityPkg/Tcg/TcgPei/TcgPei.inf
 INF SecurityPkg/Tcg/PhysicalPresencePei/PhysicalPresencePei.inf
 !endif
-!if $(FTPM_ENABLE) == TRUE
-INF  SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf #use PCD config
-!endif
 INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
 !if $(ACPI50_ENABLE) == TRUE
@@ -359,31 +326,15 @@ [FV.FVRECOVERY]
 READ_LOCK_STATUS   = TRUE
 FvNameGuid         = B73FE497-B92E-416e-8326-45AD0D270091
 
-
-!if $(MINNOW2_FSP_BUILD) == TRUE
-INF IntelFspWrapperPkg/FspWrapperSecCore/FspWrapperSecCore.inf
-!else
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
-!endif
-
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
 INF MdeModulePkg/Core/Pei/PeiMain.inf
-!if $(MINNOW2_FSP_BUILD) == TRUE
-INF Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
-INF IntelFspWrapperPkg/FspInitPei/FspInitPei.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
 INF MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
 INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
 
-INF $(PLATFORM_PACKAGE)/PlatformPei/PlatformPei.inf
+INF Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/fTPMInitPeim.inf
-!endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   INF  SourceLevelDebugPkg/DebugAgentPei/DebugAgentPei.inf
@@ -397,12 +348,10 @@ [FV.FVRECOVERY]
 !endif
 !endif
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
 !if $(PCIESC_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf
 !endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf
 
 INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
 
@@ -440,10 +389,6 @@ [FV.FVMAIN]
   # EDK II Related Platform codes
   #
 
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  INF IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.inf
-  !endif
-
 INF MdeModulePkg/Core/Dxe/DxeMain.inf
 INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 !if $(ACPI50_ENABLE) == TRUE
@@ -452,14 +397,14 @@ [FV.FVMAIN]
 !endif
 
 
-INF IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
 INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
 INF MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
 INF MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
 INF MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterSmm.inf
 INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
 INF UefiCpuPkg/CpuDxe/CpuDxe.inf
-INF $(PLATFORM_PACKAGE)/Metronome/Metronome.inf
+INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
+INF MdeModulePkg/Universal/Metronome/Metronome.inf
 INF IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
 !if $(ARCH) == IA32
 INF USE=IA32 MdeModulePkg/Logo/Logo.inf
@@ -469,13 +414,12 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
 INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
-INF IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
 
 INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf
 INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf
-INF $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbSmm.inf
+INF Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbSmm.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
 !if $(SECURE_BOOT_ENABLE)
 INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
 !endif
@@ -485,89 +429,62 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
 INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
 INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
-INF $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbRuntimeDxe.inf
+INF Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbRuntimeDxe.inf
 
 
-INF $(PLATFORM_PACKAGE)/PlatformSetupDxe/PlatformSetupDxe.inf
+INF Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
 !if $(DATAHUB_ENABLE) == TRUE
 INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf
 !endif
-INF IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
 INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
 
   #
   # EDK II Related Silicon codes
   #
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
 
-!if $(USE_HPET_TIMER) == TRUE
 INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
-!else
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmartTimer.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/IntelPchLegacyInterrupt.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
 !if $(PCIESC_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
 !endif
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
-!else
-INF IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
-INF Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
-!endif
-!if $(MINNOW2_FSP_BUILD) == FALSE
-  !if $(SEC_ENABLE) == TRUE
-  INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/HeciDrv.inf
-  INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SeCPolicyInitDxe.inf
-  !endif
-!endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
 !if $(TPM_ENABLED) == TRUE
 INF SecurityPkg/Tcg/TcgConfigDxe/TcgConfigDxe.inf
 INF SecurityPkg/Tcg/TcgDxe/TcgDxe.inf
 INF RuleOverride = DRIVER_ACPITABLE SecurityPkg/Tcg/TcgSmm/TcgSmm.inf
 !endif
-!if $(FTPM_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/Tpm2DeviceSeCPei.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Tpm2DeviceSeCDxe.inf
-INF SecurityPkg/Tcg/MemoryOverwriteControl/TcgMor.inf
-INF SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/FtpmSmm.inf
-!endif
 
 #
 # EDK II Related Platform codes
 #
-INF $(PLATFORM_PACKAGE)/PlatformSmm/PlatformSmm.inf
-INF $(PLATFORM_PACKAGE)/PlatformInfoDxe/PlatformInfoDxe.inf
-INF $(PLATFORM_PACKAGE)/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
-INF $(PLATFORM_PACKAGE)/PlatformDxe/PlatformDxe.inf
-INF $(PLATFORM_PACKAGE)/PciPlatform/PciPlatform.inf
-INF $(PLATFORM_PACKAGE)/SaveMemoryConfig/SaveMemoryConfig.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
-INF $(PLATFORM_PACKAGE)/PpmPolicy/PpmPolicy.inf
-INF $(PLATFORM_PACKAGE)/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+INF Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
+INF Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
+INF Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+INF Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+INF Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+INF Vlv2TbltDevicePkg/SaveMemoryConfig/SaveMemoryConfig.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
+INF Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
 !if $(GOP_DRIVER_ENABLE) == TRUE
- INF $(PLATFORM_PACKAGE)/PlatformGopPolicy/PlatformGopPolicy.inf
+ INF Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
  FILE DRIVER = FF0C8745-3270-4439-B74F-3E45F8C77064 {
   SECTION DXE_DEPEX_EXP = {gPlatformGOPPolicyGuid}
   SECTION PE32 = Vlv2SocBinPkg/GOP/7.2.1011/RELEASE_VS2008x86/$(DXE_ARCHITECTURE)/IntelGopDriver.efi
@@ -575,7 +492,7 @@ [FV.FVMAIN]
 }
 !endif
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
   #
   # SMM
   #
@@ -586,25 +503,22 @@ [FV.FVMAIN]
 INF UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
 INF MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf
 INF UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
-INF $(PLATFORM_PACKAGE)/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
 
-#
-# Remove the following two SMM binary modules that prevent platform from booting to UEFI Shell
-#
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/GraphicDxeInitSmm.inf
 
   #
   # ACPI
   #
 INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
-INF $(PLATFORM_PACKAGE)/BootScriptSaveDxe/BootScriptSaveDxe.inf
+INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 INF IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
 INF RuleOverride = ACPITABLE2 Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
-INF RuleOverride = ACPITABLE $(PLATFORM_RC_PACKAGE)/AcpiTablesPCAT/AcpiTables.inf
+INF RuleOverride = ACPITABLE Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
 
-INF $(PLATFORM_PACKAGE)/AcpiPlatform/AcpiPlatform.inf
+INF Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
 
 INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
@@ -613,26 +527,17 @@ [FV.FVMAIN]
   #
 INF MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
 
 
 #
 # ISA
 #
-INF $(PLATFORM_PACKAGE)/Wpce791/Wpce791.inf
-INF IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
-INF IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
+INF Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 !if $(SOURCE_DEBUG_ENABLE) != TRUE
 INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
 !endif
-#INF IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf
-#INF IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf
 
-#
-# SDIO
-#
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcHost.inf
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcMediaDevice.inf
 #
 # IDE/SCSI/AHCI
 #
@@ -642,7 +547,7 @@ [FV.FVMAIN]
 
 INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
 !if $(SATA_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
 #
 
 #
@@ -659,7 +564,6 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
 INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
 INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
-INF IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
 INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
 INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
 INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
@@ -682,9 +586,9 @@ [FV.FVMAIN]
   # SMBIOS
   #
 INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
-INF $(PLATFORM_PACKAGE)/SmBiosMiscDxe/SmBiosMiscDxe.inf
+INF Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
 
 
 #
@@ -719,8 +623,14 @@ [FV.FVMAIN]
 !if $(NETWORK_ENABLE) == TRUE
   FILE DRIVER = 22DE1691-D65D-456a-993E-A253DD1F308C {
     SECTION PE32 = Vlv2SocBinPkg/UNDI/RtkUndiDxe/$(DXE_ARCHITECTURE)/RtkUndiDxe.efi
-    SECTION UI = "UNDI"
+    SECTION UI = "RtkUndiDxe"
   }
+  !if $(DXE_ARCHITECTURE) == "X64"
+    FILE DRIVER = 7C7467E9-8BB3-4BF1-8694-6FED7D25D13E {
+      SECTION PE32 = Vlv2SocBinPkg/UNDI/I211PcieUndiDxe/$(DXE_ARCHITECTURE)/E7006X3.EFI
+      SECTION UI = "E7006X3"
+    }
+  !endif
 !endif
 
 !if $(CAPSULE_ENABLE)
@@ -908,7 +818,7 @@ [Rule.Common.UEFI_DRIVER.BINARY]
 
 [Rule.Common.UEFI_DRIVER.NATIVE_BINARY]
   FILE DRIVER = $(NAMED_GUID) {
-    DXE_DEPEX DXE_DEPEX Optional      $(WORKSPACE)/$(PLATFORM_PACKAGE)/IntelGopDepex/IntelGopDriver.depex
+    DXE_DEPEX DXE_DEPEX Optional      $(WORKSPACE)/Vlv2TbltDevicePkg/IntelGopDepex/IntelGopDriver.depex
     PE32      PE32                    |.efi
     UI        STRING="$(MODULE_NAME)" Optional
     VERSION   STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
index 61eca30be1..d5068b514c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
@@ -1,11 +1,9 @@
 #/** @file
 # platform configuration file.
 #
-# Copyright (c) 2012  - 2016, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

+# Copyright (c) 2012  - 2019, Intel Corporation. All rights reserved.<BR>
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

 #
 #**/
 
@@ -13,12 +11,6 @@
 # TRUE is ENABLE. FASLE is DISABLE.
 #
 
-#
-# FSP selection
-#
-DEFINE MINNOW2_FSP_BUILD = FALSE
-
-
 DEFINE SCSI_ENABLE = TRUE
 
 
@@ -31,14 +23,6 @@
 # Feature selection
 #
 
-#
-# Select system timer which is used to produce Timer Arch Protocol:
-# TRUE  - HPET timer is used.
-# FALSE - 8254 timer is used.
-#
-DEFINE USE_HPET_TIMER = TRUE
-
-
 #
 # Feature selection
 #
@@ -65,7 +49,6 @@
 
 DEFINE GOP_DRIVER_ENABLE = TRUE
 DEFINE DATAHUB_ENABLE = TRUE
-DEFINE DATAHUB_STATUS_CODE_ENABLE = TRUE
 DEFINE USB_ENABLE = TRUE
 
 DEFINE ISA_SERIAL_STATUS_CODE_ENABLE = TRUE
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index a6859d3b6d..110efe28c3 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -30,17 +30,6 @@ [Defines]
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET   = 0x00080000
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_SIZE     = 0x00040000
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-DEFINE FLASH_REGION_FSPBIN_OFFSET                             = 0x000C0000
-DEFINE FLASH_REGION_FSPBIN_SIZE                               = 0x00048000
-DEFINE FLASH_REGION_FSPBIN_BASE                               = 0xFFCC0000
-
-DEFINE FLASH_REGION_AZALIABIN_OFFSET                          = 0x00108000
-DEFINE FLASH_REGION_AZALIABIN_SIZE                            = 0x00008000
-DEFINE FLASH_REGION_AZALIABIN_BASE                            = 0xFFD08000
-
-!endif
-
 DEFINE FLASH_REGION_FVMAIN_OFFSET                             = 0x00110000
 DEFINE FLASH_REGION_FVMAIN_SIZE                               = 0x00215000
 
@@ -79,17 +68,6 @@ [FD.Vlv]
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress = $(FLASH_REGION_VLVMICROCODE_BASE) + 0x60
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize = $(FLASH_REGION_VLVMICROCODE_SIZE) - 0x60
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-# put below PCD value setting into dsc file
-#SET gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress                = $(FLASH_REGION_VLVMICROCODE_BASE)
-#SET gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize             = $(FLASH_REGION_VLVMICROCODE_SIZE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset                    = 0x60
-#SET gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress                   = $(FLASH_AREA_BASE_ADDRESS)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize                      = $(FLASH_AREA_SIZE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase                          = $(FLASH_REGION_FSPBIN_BASE)
-#SET gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize                          = $(FLASH_REGION_FSPBIN_SIZE)
-
-!endif
 ################################################################################
 #
 # Following are lists of FD Region layout which correspond to the locations of different
@@ -129,18 +107,6 @@ [FD.Vlv]
 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
 FILE = Vlv2TbltDevicePkg/Stitch/Gcc/NvStorageFtwSpare.bin
 
-!if $(MINNOW2_FSP_BUILD) == TRUE
-
-  $(FLASH_REGION_FSPBIN_OFFSET)|$(FLASH_REGION_FSPBIN_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase|gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize
-  FILE = Vlv2SocBinPkg/FspBinary/FvFsp.bin
-
-
-  $(FLASH_REGION_AZALIABIN_OFFSET)|$(FLASH_REGION_AZALIABIN_SIZE)
-  FILE = Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin
-
-!endif
-
   #
   # Main Block
   #
@@ -214,7 +180,7 @@ [FV.FVRECOVERY_COMPONENTS]
 READ_LOCK_CAP      = TRUE
 READ_LOCK_STATUS   = TRUE
 
-INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
+INF  RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
 INF  MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf
 INF  MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf
 INF  MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPei.inf
@@ -253,30 +219,21 @@ [FV.FVRECOVERY2]
 READ_LOCK_STATUS   = TRUE
 FvNameGuid         = B73FE497-B92E-416e-8326-45AD0D270092
 
-
-
-INF $(PLATFORM_PACKAGE)/PlatformInitPei/PlatformInitPei.inf
-
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
+INF Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
 INF UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MpS3.inf
-!endif
+INF UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
 
-# INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PiSmmCommunicationPei.inf
 !if $(TPM_ENABLED) == TRUE
 INF SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf
 INF SecurityPkg/Tcg/TcgPei/TcgPei.inf
 INF SecurityPkg/Tcg/PhysicalPresencePei/PhysicalPresencePei.inf
 !endif
-!if $(FTPM_ENABLE) == TRUE
-INF  SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf #use PCD config
-!endif
 INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
 !if $(ACPI50_ENABLE) == TRUE
@@ -315,31 +272,15 @@ [FV.FVRECOVERY]
 READ_LOCK_STATUS   = TRUE
 FvNameGuid         = B73FE497-B92E-416e-8326-45AD0D270091
 
-
-!if $(MINNOW2_FSP_BUILD) == TRUE
-INF IntelFspWrapperPkg/FspWrapperSecCore/FspWrapperSecCore.inf
-!else
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
-!endif
-
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
 INF MdeModulePkg/Core/Pei/PeiMain.inf
-!if $(MINNOW2_FSP_BUILD) == TRUE
-INF Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
-INF IntelFspWrapperPkg/FspInitPei/FspInitPei.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
 INF MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
 INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
 
-INF $(PLATFORM_PACKAGE)/PlatformPei/PlatformPei.inf
+INF Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/fTPMInitPeim.inf
-!endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   INF  SourceLevelDebugPkg/DebugAgentPei/DebugAgentPei.inf
@@ -353,12 +294,10 @@ [FV.FVRECOVERY]
 !endif
 !endif
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
 !if $(PCIESC_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf
 !endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf
 
 INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
 
@@ -396,10 +335,6 @@ [FV.FVMAIN]
   # EDK II Related Platform codes
   #
 
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  INF IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.inf
-  !endif
-
 INF MdeModulePkg/Core/Dxe/DxeMain.inf
 INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 !if $(ACPI50_ENABLE) == TRUE
@@ -408,14 +343,14 @@ [FV.FVMAIN]
 !endif
 
 
-INF IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
 INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
 INF MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
 INF MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
 INF MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterSmm.inf
 INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
 INF UefiCpuPkg/CpuDxe/CpuDxe.inf
-INF $(PLATFORM_PACKAGE)/Metronome/Metronome.inf
+INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
+INF MdeModulePkg/Universal/Metronome/Metronome.inf
 INF IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
 !if $(ARCH) == IA32
 INF USE=IA32 MdeModulePkg/Logo/Logo.inf
@@ -425,13 +360,12 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
 INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
-INF IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
 
 INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf
 INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf
-INF $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbSmm.inf
+INF Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbSmm.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
 !if $(SECURE_BOOT_ENABLE)
 INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
 !endif
@@ -441,89 +375,62 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
 INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
 INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
-INF $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbRuntimeDxe.inf
+INF Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbRuntimeDxe.inf
 
 
-INF $(PLATFORM_PACKAGE)/PlatformSetupDxe/PlatformSetupDxe.inf
+INF Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
 !if $(DATAHUB_ENABLE) == TRUE
 INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf
 !endif
-INF IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
 INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
 
   #
   # EDK II Related Silicon codes
   #
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
 
-!if $(USE_HPET_TIMER) == TRUE
 INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
-!else
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmartTimer.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/IntelPchLegacyInterrupt.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
 
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
-!endif
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
 !if $(PCIESC_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
 !endif
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
-!if $(MINNOW2_FSP_BUILD) == FALSE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
-!else
-INF IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
-INF Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
-!endif
-!if $(MINNOW2_FSP_BUILD) == FALSE
-  !if $(SEC_ENABLE) == TRUE
-  INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/HeciDrv.inf
-  INF  RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SeCPolicyInitDxe.inf
-  !endif
-!endif
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
 !if $(TPM_ENABLED) == TRUE
 INF SecurityPkg/Tcg/TcgConfigDxe/TcgConfigDxe.inf
 INF SecurityPkg/Tcg/TcgDxe/TcgDxe.inf
 INF RuleOverride = DRIVER_ACPITABLE SecurityPkg/Tcg/TcgSmm/TcgSmm.inf
 !endif
-!if $(FTPM_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/Tpm2DeviceSeCPei.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Tpm2DeviceSeCDxe.inf
-INF SecurityPkg/Tcg/MemoryOverwriteControl/TcgMor.inf
-INF SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/FtpmSmm.inf
-!endif
 
 #
 # EDK II Related Platform codes
 #
-INF $(PLATFORM_PACKAGE)/PlatformSmm/PlatformSmm.inf
-INF $(PLATFORM_PACKAGE)/PlatformInfoDxe/PlatformInfoDxe.inf
-INF $(PLATFORM_PACKAGE)/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
-INF $(PLATFORM_PACKAGE)/PlatformDxe/PlatformDxe.inf
-INF $(PLATFORM_PACKAGE)/PciPlatform/PciPlatform.inf
-INF $(PLATFORM_PACKAGE)/SaveMemoryConfig/SaveMemoryConfig.inf
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
-INF $(PLATFORM_PACKAGE)/PpmPolicy/PpmPolicy.inf
-INF $(PLATFORM_PACKAGE)/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+INF Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
+INF Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
+INF Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+INF Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+INF Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+INF Vlv2TbltDevicePkg/SaveMemoryConfig/SaveMemoryConfig.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
+INF Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
 !if $(GOP_DRIVER_ENABLE) == TRUE
- INF $(PLATFORM_PACKAGE)/PlatformGopPolicy/PlatformGopPolicy.inf
+ INF Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
  FILE DRIVER = FF0C8745-3270-4439-B74F-3E45F8C77064 {
   SECTION DXE_DEPEX_EXP = {gPlatformGOPPolicyGuid}
   SECTION PE32 = Vlv2SocBinPkg/GOP/7.2.1011/RELEASE_VS2008x86/$(DXE_ARCHITECTURE)/IntelGopDriver.efi
@@ -531,7 +438,7 @@ [FV.FVMAIN]
 }
 !endif
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
   #
   # SMM
   #
@@ -542,25 +449,22 @@ [FV.FVMAIN]
 INF UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
 INF MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf
 INF UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
-INF $(PLATFORM_PACKAGE)/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
 
-#
-# Remove the following two SMM binary modules that prevent platform from booting to UEFI Shell
-#
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/GraphicDxeInitSmm.inf
 
   #
   # ACPI
   #
 INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
-INF $(PLATFORM_PACKAGE)/BootScriptSaveDxe/BootScriptSaveDxe.inf
+INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 INF IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
 INF RuleOverride = ACPITABLE2 Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
-INF RuleOverride = ACPITABLE $(PLATFORM_RC_PACKAGE)/AcpiTablesPCAT/AcpiTables.inf
+INF RuleOverride = ACPITABLE Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
 
-INF $(PLATFORM_PACKAGE)/AcpiPlatform/AcpiPlatform.inf
+INF Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
 
 INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
@@ -569,26 +473,17 @@ [FV.FVMAIN]
   #
 INF MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
 
 
 #
 # ISA
 #
-INF $(PLATFORM_PACKAGE)/Wpce791/Wpce791.inf
-INF IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
-INF IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
+INF Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 !if $(SOURCE_DEBUG_ENABLE) != TRUE
 INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
 !endif
-#INF IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf
-#INF IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf
 
-#
-# SDIO
-#
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcHost.inf
-#INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcMediaDevice.inf
 #
 # IDE/SCSI/AHCI
 #
@@ -598,7 +493,7 @@ [FV.FVMAIN]
 
 INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
 !if $(SATA_ENABLE) == TRUE
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
 #
 
 #
@@ -615,7 +510,6 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
 INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
 INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
-INF IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
 INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
 INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
 INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
@@ -638,9 +532,9 @@ [FV.FVMAIN]
   # SMBIOS
   #
 INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
-INF $(PLATFORM_PACKAGE)/SmBiosMiscDxe/SmBiosMiscDxe.inf
+INF Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-INF RuleOverride = BINARY $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
+INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
 
 
 #
@@ -675,8 +569,14 @@ [FV.FVMAIN]
 !if $(NETWORK_ENABLE) == TRUE
   FILE DRIVER = 22DE1691-D65D-456a-993E-A253DD1F308C {
     SECTION PE32 = Vlv2SocBinPkg/UNDI/RtkUndiDxe/$(DXE_ARCHITECTURE)/RtkUndiDxe.efi
-    SECTION UI = "UNDI"
+    SECTION UI = "RtkUndiDxe"
   }
+  !if $(DXE_ARCHITECTURE) == "X64"
+    FILE DRIVER = 7C7467E9-8BB3-4BF1-8694-6FED7D25D13E {
+      SECTION PE32 = Vlv2SocBinPkg/UNDI/I211PcieUndiDxe/$(DXE_ARCHITECTURE)/E7006X3.EFI
+      SECTION UI = "E7006X3"
+    }
+  !endif
 !endif
 
 !if $(CAPSULE_ENABLE)
@@ -786,11 +686,7 @@ [Rule.Common.SEC]
 [Rule.Common.SEC.BINARY]
   FILE SEC = $(NAMED_GUID) RELOCS_STRIPPED {
     PE32  PE32    Align = 8       |.efi
-!if $(MINNOW2_FSP_BUILD) == TRUE
-    RAW   RAW                     |.raw
-!else
     RAW   BIN     Align = 16      |.com
-!endif
   }
 
 [Rule.Common.PEI_CORE]
@@ -868,7 +764,7 @@ [Rule.Common.UEFI_DRIVER.BINARY]
 
 [Rule.Common.UEFI_DRIVER.NATIVE_BINARY]
   FILE DRIVER = $(NAMED_GUID) {
-    DXE_DEPEX DXE_DEPEX Optional      $(WORKSPACE)/$(PLATFORM_PACKAGE)/IntelGopDepex/IntelGopDriver.depex
+    DXE_DEPEX DXE_DEPEX Optional      $(WORKSPACE)/Vlv2TbltDevicePkg/IntelGopDepex/IntelGopDriver.depex
     PE32      PE32                    |.efi
     UI        STRING="$(MODULE_NAME)" Optional
     VERSION   STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index 0a57587e82..25d1beb400 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -18,25 +18,11 @@ [Defines]
   PLATFORM_GUID                       = 465B0A0B-7AC1-443b-8F67-7B8DEC145F90
   PLATFORM_VERSION                    = 0.1
   DSC_SPECIFICATION                   = 0x00010005
-
-  #
-  # Set platform specific package/folder name, same as passed from PREBUILD script.
-  # PLATFORM_PACKAGE would be the same as PLATFORM_NAME as well as package build folder
-  # DEFINE only takes effect at R9 DSC and FDF.
-  #
-  DEFINE      PLATFORM_PACKAGE                = Vlv2TbltDevicePkg
-  DEFINE      PLATFORM_RC_PACKAGE             = Vlv2DeviceRefCodePkg
-  DEFINE      PLATFORM_BINARY_PACKAGE         = Vlv2SocBinPkg
-  OUTPUT_DIRECTORY                    = Build/$(PLATFORM_PACKAGE)
+  OUTPUT_DIRECTORY                    = Build/Vlv2TbltDevicePkg
   SUPPORTED_ARCHITECTURES             = IA32|X64
   BUILD_TARGETS                       = DEBUG|RELEASE
   SKUID_IDENTIFIER                    = DEFAULT
 
-  DEFINE CPU_ARCH                 =ValleyView2
-  DEFINE PROJECT_SC_FAMILY        =IntelPch
-  DEFINE PROJECT_SC_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/SouthCluster
-  DEFINE PROJECT_VLV_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/NorthCluster
-
   DEFINE RC_BINARY_RELEASE        = TRUE
   #
   # Platform On/Off features are defined here
@@ -47,22 +33,18 @@ [Defines]
   #   3.BayleyBay
   #     ENBDT_PF_ENABLE  = TRUE
   #
-  !include $(PLATFORM_PACKAGE)/AutoPlatformCFG.txt
-  !include $(PLATFORM_PACKAGE)/PlatformPkgConfig.dsc
+  !include Vlv2TbltDevicePkg/AutoPlatformCFG.txt
+  !include Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
 
   DEFINE PLATFORMX64_ENABLE = TRUE
 
 !if $(X64_CONFIG) == TRUE
   DEFINE      DXE_ARCHITECTURE        = X64
-  DEFINE      EDK_DXE_ARCHITECTURE    = X64
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 64
 !else
   DEFINE      DXE_ARCHITECTURE        = IA32
-  DEFINE      EDK_DXE_ARCHITECTURE    = Ia32
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 32
 !endif
 
-  FLASH_DEFINITION                    = $(PLATFORM_PACKAGE)/PlatformPkgGcc.fdf
+  FLASH_DEFINITION                    = Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
 !if $(LFMA_ENABLE) == TRUE
   FIX_LOAD_TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
   DEFINE   TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
@@ -73,10 +55,6 @@ [Defines]
 
   DEFINE   PLATFORM_PCIEXPRESS_BASE   = 0E0000000
 
-  DEFINE SEC_ENABLE = FALSE
-  DEFINE SEC_DEBUG_INFO_ENABLE = FALSE
-  DEFINE FTPM_ENABLE = FALSE
-
 ################################################################################
 #
 # SKU Identification section - list of all SKU IDs supported by this
@@ -100,7 +78,6 @@ [LibraryClasses.common]
   DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
   UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
   UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
-  DxeSmmDriverEntryPoint|IntelFrameworkPkg/Library/DxeSmmDriverEntryPoint/DxeSmmDriverEntryPoint.inf
 
   #
   # Basic
@@ -144,8 +121,7 @@ [LibraryClasses.common]
   GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
-  PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLib.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   #
   # Framework
@@ -168,10 +144,6 @@ [LibraryClasses.common]
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
 !endif
 
-!if $(S3_ENABLE) == TRUE
-  S3Lib|IntelFrameworkModulePkg/Library/PeiS3Lib/PeiS3Lib.inf
-!endif
-
   OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
 !if $(CAPSULE_ENABLE) == TRUE
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
@@ -199,27 +171,27 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|$(PLATFORM_PACKAGE)/Library/SmbusLib/SmbusLib.inf
-  SmmLib|$(PLATFORM_PACKAGE)/Library/PchSmmLib/PchSmmLib.inf
+  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
   # Platform
   #
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
-  ResetSystemLib|$(PLATFORM_PACKAGE)/Library/ResetSystemLib/ResetSystemLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  ResetSystemLib|Vlv2TbltDevicePkg/Library/ResetSystemLib/ResetSystemLib.inf
 
-  PlatformCmosLib|$(PLATFORM_PACKAGE)/Library/PlatformCmosLib/PlatformCmosLib.inf
+  PlatformCmosLib|Vlv2TbltDevicePkg/Library/PlatformCmosLib/PlatformCmosLib.inf
 
   #
   # Misc
   #
-  MonoStatusCodeLib|$(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf
+  MonoStatusCodeLib|Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
 !if $(TARGET) == RELEASE
   DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
@@ -231,10 +203,11 @@ [LibraryClasses.common]
 
 !endif
 
+  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
+
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   PeCoffExtraActionLib|SourceLevelDebugPkg/Library/PeCoffExtraActionLibDebug/PeCoffExtraActionLibDebug.inf
   DebugCommunicationLib|SourceLevelDebugPkg/Library/DebugCommunicationLibSerialPort/DebugCommunicationLibSerialPort.inf
-  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
   SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !else
   PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
@@ -249,10 +222,10 @@ [LibraryClasses.common]
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
 !endif
 
- BiosIdLib|$(PLATFORM_PACKAGE)/Library/BiosIdLib/BiosIdLib.inf
- CpuIA32Lib|$(PLATFORM_PACKAGE)/Library/CpuIA32Lib/CpuIA32Lib.inf
+ BiosIdLib|Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
+ CpuIA32Lib|Vlv2TbltDevicePkg/Library/CpuIA32Lib/CpuIA32Lib.inf
 
-  StallSmmLib|$(PLATFORM_PACKAGE)/Library/StallSmmLib/StallSmmLib.inf
+  StallSmmLib|Vlv2TbltDevicePkg/Library/StallSmmLib/StallSmmLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
@@ -266,13 +239,10 @@ [LibraryClasses.common]
   AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
 !endif
   VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
-!if $(RC_BINARY_RELEASE) == TRUE
-  I2cLib|Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
-!endif
   ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
   FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
   SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
-!if $(FTPM_ENABLE) == TRUE || $(NETWORK_ISCSI_ENABLE) == TRUE
+!if $(NETWORK_ISCSI_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
   IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
@@ -283,12 +253,6 @@ [LibraryClasses.common]
 
 
   Tpm2CommandLib|SecurityPkg/Library/Tpm2CommandLib/Tpm2CommandLib.inf
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  FspApiLib|IntelFspWrapperPkg/Library/BaseFspApiLib/BaseFspApiLib.inf
-  FspPlatformInfoLib|IntelFspWrapperPkg/Library/BaseFspPlatformInfoLibSample/BaseFspPlatformInfoLibSample.inf
-  FspPlatformSecLib|Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
-  FspHobProcessLib|Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
-!endif
 
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
 
@@ -309,14 +273,14 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
   ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
   ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf
-  MultiPlatformLib|$(PLATFORM_PACKAGE)/Library/MultiPlatformLib/MultiPlatformLib.inf
+  MultiPlatformLib|Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
   MpInitLib|UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
 
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(TARGET) == RELEASE
@@ -324,7 +288,7 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxPeiLib.inf
@@ -333,13 +297,6 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgentLib.inf
 !endif
 
- !if $(MINNOW2_FSP_BUILD) == TRUE
- PlatformFspLib|Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
- !endif
-!if $(FTPM_ENABLE) == TRUE
-  Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCPei/Tpm2DeviceLibSeC.inf
-!endif
-
 [LibraryClasses.X64]
   #
   # DXE phase common
@@ -356,7 +313,7 @@ [LibraryClasses.X64]
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.inf
-  EfiRegTableLib|$(PLATFORM_PACKAGE)/Library/EfiRegTableLib/EfiRegTableLib.inf
+  EfiRegTableLib|Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
@@ -371,14 +328,14 @@ [LibraryClasses.X64.DXE_DRIVER]
   CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgentLib.inf
 !endif
 
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
 
 [LibraryClasses.X64.DXE_CORE]
   HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
@@ -386,7 +343,7 @@ [LibraryClasses.X64.DXE_CORE]
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
@@ -411,7 +368,7 @@ [LibraryClasses.X64.DXE_SMM_DRIVER]
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgentLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
 
@@ -485,12 +442,6 @@ [PcdsFeatureFlag.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|FALSE
-!endif
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmEnableBspElection|FALSE
-!if $(DATAHUB_STATUS_CODE_ENABLE) == TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|TRUE
-!else
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|FALSE
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE
 !if $(TARGET) == RELEASE
@@ -516,59 +467,20 @@ [PcdsFeatureFlag.common]
 !endif
 
 
-  ## This PCD specifies whether PS2 keyboard does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2KbdExtendedVerification|FALSE
-
-  ## This PCD specifies whether PS2 mouse does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2MouseExtendedVerification|FALSE
-
 !if $(VARIABLE_INFO_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|FALSE
 !endif
 
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
-
 !if $(SOURCE_DEBUG_ENABLE)
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmDebug|TRUE
 !endif
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
+
 [PcdsFixedAtBuild.common]
-!if $(MINNOW2_FSP_BUILD) == TRUE
-# $(FLASH_REGION_VLVMICROCODE_BASE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress|0xFFC00000
-# $(FLASH_REGION_VLVMICROCODE_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize|0x00040000
-  gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset|0x60
-# $(FLASH_AREA_BASE_ADDRESS)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress|0xFF800000
-# $(FLASH_AREA_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize|0x00800000
-# $(FLASH_REGION_FSPBIN_BASE)
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase|0xFFCC0000
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  # in FSP, when this got used, the memory already is up
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-!else
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-!endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-
-!else
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-  !else
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-  !endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-  gEfiCpuTokenSpaceGuid.PcdPeiTemporaryRamStackSize|0x3C00
-!endif
-
-
 !if $(SECURE_BOOT_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x22000
 !else
@@ -576,11 +488,8 @@ [PcdsFixedAtBuild.common]
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize|0x00000800
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize|0x400
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDRamSize|0x400000
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdS3AcpiReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdSrIovSupport|FALSE
   gEfiMdeModulePkgTokenSpaceGuid.PcdAriSupport|FALSE
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmApSyncTimeout|1000
 !if $(S4_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|TRUE
 !else
@@ -598,13 +507,9 @@ [PcdsFixedAtBuild.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries|60
 !endif
 
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdEbdaReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable|$(TOP_MEMORY_ADDRESS)
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserSubtitleTextColor|0x0
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldTextColor|0x01
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDEnabled|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVbeEnable|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVgaEnable|TRUE
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17
@@ -650,11 +555,6 @@ [PcdsFixedAtBuild.IA32]
 [PcdsPatchableInModule.common]
   gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0x$(PLATFORM_PCIEXPRESS_BASE)
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLegacyBiosCacheLegacyRegion|FALSE
-
-  ## This PCD specifies whether to use the optimized timing for best PS2 detection performance.
-  #  Note this PCD could be set to TRUE for best boot performance and set to FALSE for best device compatibility.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFastPS2Detection|TRUE
 
   #######################################################################################################
   #
@@ -829,10 +729,6 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdFTPMStatus|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateSmmDataPtr|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0
-  gEfiCpuTokenSpaceGuid.PcdCpuS3DataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuHotPlugDataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuCallbackSignal|0
-  gEfiCpuTokenSpaceGuid.PcdCpuConfigContextBuffer|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
@@ -845,24 +741,7 @@ [PcdsDynamicExDefault.X64.DEFAULT]
 
 [Components.IA32]
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
-
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspWrapperSecCore/FspWrapperSecCore.inf {
-    !if $(TARGET) == DEBUG
-
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
-  IntelFspWrapperPkg/FspInitPei/FspInitPei.inf {
-    !if $(TARGET) == DEBUG
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  !endif
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
 
   MdeModulePkg/Core/Pei/PeiMain.inf {
 !if $(TARGET) == DEBUG
@@ -873,31 +752,23 @@ [Components.IA32]
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 
-  $(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf {
+  Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf {
 !if $(TARGET) == DEBUG
     <PcdsFixedAtBuild>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2E
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <BuildOptions>
-      !if $(FTPM_ENABLE)==TRUE
-        *_*_IA32_CC_FLAGS = /D FTPM_ENABLE
-      !endif
   }
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-$(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/fTPMInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
 !endif
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformPei/PlatformPei.inf {
+  Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf {
     <BuildOptions>
       *_*_IA32_CC_FLAGS      = -DRC_BINARY_RELEASE
   !if $(TARGET) == DEBUG
@@ -917,10 +788,6 @@ [Components.IA32]
     }
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/Tpm2DeviceSeCPei.inf
-!endif
-
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/PhysicalPresencePei/PhysicalPresencePei.inf
   SecurityPkg/Tcg/TcgPei/TcgPei.inf {
@@ -931,7 +798,7 @@ [Components.IA32]
 }
 !endif
 
- $(PLATFORM_PACKAGE)/PlatformInitPei/PlatformInitPei.inf {
+ Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
     <LibraryClasses>
@@ -940,34 +807,33 @@ [Components.IA32]
 !endif
       PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/FvInfoPei/FvInfoPei.inf
+  Vlv2TbltDevicePkg/FvInfoPei/FvInfoPei.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
   MdeModulePkg/Universal/PCD/Pei/Pcd.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
   UefiCpuPkg/CpuIoPei/CpuIoPei.inf
   UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MpS3.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PiSmmCommunicationPei.inf
+  UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
 
 !if $(RECOVERY_ENABLE)
   #
   # Recovery
   #
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
   MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf
   MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf
   MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPei.inf
@@ -993,17 +859,6 @@ [Components.IA32]
  MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
  MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
 
-!if $(FTPM_ENABLE) == TRUE
-   SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      NULL|SecurityPkg/Library\HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
-  }
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1013,7 +868,7 @@ [Components.IA32]
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTablePei/FirmwarePerformancePei.inf{
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 
 !endif
@@ -1021,17 +876,6 @@ [Components.IA32]
   MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf
 !endif
 [Components.X64]
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.inf {
-    !if $(TARGET) == DEBUG
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-
-  !endif
   #
   # EDK II Related Platform codes
   #
@@ -1049,24 +893,10 @@ [Components.X64]
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
 !endif
   }
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf {
-    <PcdsPatchableInModule>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-    <PcdsFixedAtBuild>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x27
-    <LibraryClasses>
-    !if $(TARGET) != RELEASE
-          DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-       <BuildOptions>
-        ICC:*_*_*_CC_FLAGS = -D MDEPKG_NDEBUG
-        GCC:RELEASE_*_*_CC_FLAGS = -D MDEPKG_NDEBUG
-  }
   MdeModulePkg/Universal/PCD/Dxe/Pcd.inf {
     <LibraryClasses>
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
   }
-  IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
   UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
 
   MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
@@ -1099,13 +929,9 @@ [Components.X64]
 
 !if $(TPM_ENABLED) == TRUE
       NULL|SecurityPkg/Library/DxeTpmMeasureBootLib/DxeTpmMeasureBootLib.inf
-!endif
-!if $(FTPM_ENABLE) == TRUE
-      NULL|SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MpCpu.inf
-  $(PLATFORM_PACKAGE)/Metronome/Metronome.inf
+  MdeModulePkg/Universal/Metronome/Metronome.inf
 
   IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
     <LibraryClasses>
@@ -1115,12 +941,8 @@ [Components.X64]
       PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
-    !if $(FTPM_ENABLE) == TRUE
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-    !else
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
-    !endif
   }
 
   $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
@@ -1132,11 +954,11 @@ [Components.X64]
   MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf {
     <LibraryClasses>
       NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbSmm.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbSmm.inf
   MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
 !if $(SECURE_BOOT_ENABLE) == TRUE
   SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf {
     <LibraryClasses>
@@ -1158,9 +980,9 @@ [Components.X64]
   PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
   MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
 
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbRuntimeDxe.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbRuntimeDxe.inf
 
-  $(PLATFORM_PACKAGE)/PlatformSetupDxe/PlatformSetupDxe.inf
+  Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
 !if $(DATAHUB_ENABLE) == TRUE
   IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
@@ -1168,38 +990,30 @@ [Components.X64]
       gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
   }
 !endif
-  IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
-  !if $(USE_HPET_TIMER) == TRUE
-    PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
-  !else
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmartTimer.inf
-  !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
+  PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/IntelPchLegacyInterrupt.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
     <PcdsPatchableInModule>
         gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
 
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
-
-  IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
 
   #
   # Performance Application; Set PERFORMANCE_ENABLE=TRUE for normal boot performance and smm performance data
@@ -1219,35 +1033,9 @@ [Components.X64]
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
 
-!if $(SEC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/HeciDrv.inf {
-!if $(SEC_DEBUG_INFO_ENABLE) == TRUE
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=1
-!else
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=0
-!endif
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SeCPolicyInitDxe.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Tpm2DeviceSeCDxe.inf
-  SecurityPkg/Tcg/MemoryOverwriteControl/TcgMor.inf
-  SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf{
-    <LibraryClasses>
-      NULL|SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library\DxePcdLib/DxePcdLib.inf
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/FtpmSmm.inf
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1274,24 +1062,23 @@ [Components.X64]
   #
   # EDK II Related Platform codes
   #
-  $(PLATFORM_PACKAGE)/PlatformSmm/PlatformSmm.inf{
+  Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf{
     <LibraryClasses>
     !if $(TARGET) != RELEASE
           DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
     !endif
           PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/PlatformInfoDxe/PlatformInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformDxe/PlatformDxe.inf
+  Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
 
-  $(PLATFORM_PACKAGE)/PciPlatform/PciPlatform.inf
-  $(PLATFORM_PACKAGE)/SaveMemoryConfig/SaveMemoryConfig.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
-  $(PLATFORM_PACKAGE)/PpmPolicy/PpmPolicy.inf
-  $(PLATFORM_PACKAGE)/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+  Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+  Vlv2TbltDevicePkg/SaveMemoryConfig/SaveMemoryConfig.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
+  Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
 !if $(GOP_DRIVER_ENABLE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformGopPolicy/PlatformGopPolicy.inf
+  Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
 
 !endif
 
@@ -1302,13 +1089,15 @@ [Components.X64]
   MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf
   MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf
   UefiCpuPkg/CpuDxe/CpuDxe.inf
+  UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
   UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
   UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
   MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf
   UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
-  $(PLATFORM_PACKAGE)/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/GraphicDxeInitSmm.inf
 
   #
   # ACPI
@@ -1321,14 +1110,14 @@ [Components.X64]
     <LibraryClasses>
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
+  MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  $(PLATFORM_PACKAGE)/BootScriptSaveDxe/BootScriptSaveDxe.inf
   IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
-  $(PLATFORM_RC_PACKAGE)/AcpiTablesPCAT/AcpiTables.inf
+  Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
 
-  $(PLATFORM_PACKAGE)/AcpiPlatform/AcpiPlatform.inf
+  Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
 
   MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
@@ -1338,31 +1127,23 @@ [Components.X64]
   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
 
 
-#
-# ISA
-#
-  $(PLATFORM_PACKAGE)/Wpce791/Wpce791.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf
-#
-# SDIO
-#
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcHost.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcMediaDevice.inf
+  #
+  # ISA
+  #
+  Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
+  MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf
+
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/FirmwarePerformanceDxe.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/FirmwarePerformanceSmm.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 !endif
 
@@ -1370,7 +1151,6 @@ [Components.X64]
 # IDE/SCSI/AHCI
 #
   MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
-  IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/IdeBusDxe.inf
   MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
   MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
   MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
@@ -1394,7 +1174,7 @@ [Components.X64]
       gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000
   }
 !if $(SATA_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
 !endif
   MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
 !if $(SCSI_ENABLE) == TRUE
@@ -1407,7 +1187,6 @@ [Components.X64]
   MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
   MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
   MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
-  IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
   MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
   MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
@@ -1431,9 +1210,9 @@ [Components.X64]
   # SMBIOS
   #
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
-  $(PLATFORM_PACKAGE)/SmBiosMiscDxe/SmBiosMiscDxe.inf
+  Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
@@ -1448,12 +1227,6 @@ [Components.X64]
   #
 !include NetworkPkg/Network.dsc.inc
 
-!if $(NETWORK_ENABLE) == TRUE
-  !if $(CSM_ENABLE) == TRUE
-    IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Snp16Dxe.inf
-  !endif
-!endif
-
 !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE)
   MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf
   MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
@@ -1471,7 +1244,7 @@ [Components.X64]
     <LibraryClasses>
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
 !endif
 
@@ -1483,11 +1256,7 @@ [BuildOptions]
 #
 # Define token for different Platform
 #
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  DEFINE MINNOW2_FSP_OPTION = -DMINNOW2_FSP_BUILD
-!else
   DEFINE MINNOW2_FSP_OPTION =
-!endif
 
 !if $(ENBDT_PF_BUILD) == TRUE
   DEFINE ENBDT_PF_ENABLE = -DENBDT_PF_ENABLE=1
@@ -1526,11 +1295,6 @@ [BuildOptions]
   DEFINE X64_BUILD_ENABLE =
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  DEFINE DSC_FTPM_BUILD_OPTIONS = -DFTPM_ENABLE
-!else
-  DEFINE DSC_FTPM_BUILD_OPTIONS =
-!endif
 !if $(TPM_ENABLED) == TRUE
   DEFINE DSC_TPM_BUILD_OPTIONS = -DTPM_ENABLED
 !else
@@ -1538,7 +1302,7 @@ [BuildOptions]
 !endif
 
 
-  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
+  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
 !if $(PERFORMANCE_ENABLE) == TRUE
   DEFINE PDB_BUILD_OPTION = /Zi
 !endif
@@ -1570,76 +1334,6 @@ [BuildOptions.common.EDKII.DXE_SMM_DRIVER, BuildOptions.common.EDKII.SMM_CORE]
   MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096
   GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000
 
-[BuildOptions.Common.EDK]
-
-#
-# Define token for different Platform
-#
-!if $(ENBDT_PF_BUILD) == TRUE
-  DEFINE ENBDT_PF_ENABLE = -DENBDT_PF_ENABLE=1
-!else
-  DEFINE ENBDT_PF_ENABLE = -DENBDT_PF_ENABLE=0
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-  RELEASE_*_*_DLINK_FLAGS = -DEBUG
-!endif
-
-!if $(S3_ENABLE) == TRUE
-  DEFINE DSC_S3_BUILD_OPTIONS = -DEFI_S3_RESUME
-!else
-  DEFINE DSC_S3_BUILD_OPTIONS =
-!endif
-
-!if $(ENBDT_S3_SUPPORT) == TRUE
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS = -DNOCS_S3_SUPPORT
-!else
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS =
-!endif
-
-!if $(X64_CONFIG) == TRUE
-  DEFINE X64_BUILD_ENABLE = -DX64_BUILD_ENABLE=1
-!else
-  DEFINE X64_BUILD_ENABLE =
-!endif
-
-
-  DEFINE EDK_GLUE_LIB_DEBUG  =
-  DEFINE DEBUG_BUILD_OPTIONS = -D EFI_DEBUG -D DEBUG_MODE=1  /GL- $(EDK_GLUE_LIB_DEBUG) -DEDKII_GLUE_DebugPrintErrorLevel=(EFI_D_ERROR)
-  DEFINE EDK_DSC_FEATURE_BUILD_OPTIONS = $(DSC_S3_BUILD_OPTIONS) $(DSC_ACPI_BUILD_OPTIONS) $(DSC_SEC_BUILD_OPTIONS) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(SOFTSDV_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(QT_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS) -D$(PROJECT_SC_CHIPSET)
-
-  DEFINE EDK_DSC_OTHER_BUILD_OPTIONS = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS) $(SV_BUILD_OPTIONS) $(INTEL_FASTBOOT_BUILD_OPTION)
-  DEFINE EDK_DSC_GLOBAL_BUILD_OPTIONS = $(ENBDT_PF_ENABLE) $(EDK_DSC_FEATURE_BUILD_OPTIONS) $(EDK_DSC_OTHER_BUILD_OPTIONS) -D EFI_SPECIFICATION_VERSION=0x00020000  -D PI_SPECIFICATION_VERSION=0x00000009  -D TIANO_RELEASE_VERSION=0x00080006 -D SUPPORT_DEPRECATED_PCI_CFG_PPI -D CSM_SMMENTRY_PORT8DATA8 -D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE) -D MAX_VARIABLE_SIZE=0x2000 -D EFI_FIRMWARE_VENDOR="L/"INTEL/"" -D EFI_BUILD_VERSION="L/"EDKII/"" -DEFI_PEI_REPORT_STATUS_CODE_ON $(ENBDT_S3_SUPPORT_OPTIONS)
-
-  *_*_IA32_ASM_FLAGS         = -DEFI32 -D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h -DNOCS_S3_SUPPORT
-  DEBUG_*_IA32_CC_FLAGS      = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_CC_FLAGS    = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_VFRPP_FLAGS   = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_VFRPP_FLAGS = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_APP_FLAGS     = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_APP_FLAGS   = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_PP_FLAGS      = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_PP_FLAGS    = -D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_IA32_ASLPP_FLAGS       = -D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASLCC_FLAGS       = -D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASM16_FLAGS       = -D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
-
-  *_*_X64_ASM_FLAGS          = -DEFIX64 -D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h -DNOCS_S3_SUPPORT
-  DEBUG_*_X64_CC_FLAGS       = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_CC_FLAGS     = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_VFRPP_FLAGS    = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_VFRPP_FLAGS  = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_APP_FLAGS      = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_APP_FLAGS    = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_PP_FLAGS       = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_PP_FLAGS     = -D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_X64_ASLPP_FLAGS        = -D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASLCC_FLAGS        = -D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASM16_FLAGS        = -D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
- # *_*_*_BUILD_FLAGS = -s
-  *_*_*_VFR_FLAGS   = -c
-  *_*_*_BUILD_FLAGS = -c
-
 [BuildOptions.Common.EDKII]
   *_*_IA32_ASM_FLAGS     = $(VP_BUILD_OPTIONS) -D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h -DNOCS_S3_SUPPORT
 
@@ -1654,25 +1348,3 @@ [BuildOptions.Common.EDKII]
   *_*_X64_APP_FLAGS      = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_PP_FLAGS       = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_ASLPP_FLAGS    = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
-
-
-[Components.X64]
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cBus.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cHost.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cPortA0Pio.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cMmioDeviceDxe.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index 933a7ec760..8a5c42577d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -18,25 +18,11 @@ [Defines]
   PLATFORM_GUID                       = 465B0A0B-7AC1-443b-8F67-7B8DEC145F90
   PLATFORM_VERSION                    = 0.1
   DSC_SPECIFICATION                   = 0x00010005
-
-  #
-  # Set platform specific package/folder name, same as passed from PREBUILD script.
-  # PLATFORM_PACKAGE would be the same as PLATFORM_NAME as well as package build folder
-  # DEFINE only takes effect at R9 DSC and FDF.
-  #
-  DEFINE      PLATFORM_PACKAGE                = Vlv2TbltDevicePkg
-  DEFINE      PLATFORM_RC_PACKAGE             = Vlv2DeviceRefCodePkg
-  DEFINE      PLATFORM_BINARY_PACKAGE         = Vlv2SocBinPkg
-  OUTPUT_DIRECTORY                    = Build/$(PLATFORM_PACKAGE)
+  OUTPUT_DIRECTORY                    = Build/Vlv2TbltDevicePkgIA32
   SUPPORTED_ARCHITECTURES             = IA32
   BUILD_TARGETS                       = DEBUG|RELEASE
   SKUID_IDENTIFIER                    = DEFAULT
 
-  DEFINE CPU_ARCH                 =ValleyView2
-  DEFINE PROJECT_SC_FAMILY        =IntelPch
-  DEFINE PROJECT_SC_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/SouthCluster
-  DEFINE PROJECT_VLV_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/NorthCluster
-
   DEFINE RC_BINARY_RELEASE        = TRUE
   #
   # Platform On/Off features are defined here
@@ -47,20 +33,16 @@ [Defines]
   #   3.BayleyBay
   #     ENBDT_PF_ENABLE  = TRUE
   #
-  !include $(PLATFORM_PACKAGE)/AutoPlatformCFG.txt
-  !include $(PLATFORM_PACKAGE)/PlatformPkgConfig.dsc
+  !include Vlv2TbltDevicePkg/AutoPlatformCFG.txt
+  !include Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
 
 !if $(X64_CONFIG) == TRUE
   DEFINE      DXE_ARCHITECTURE        = X64
-  DEFINE      EDK_DXE_ARCHITECTURE    = X64
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 64
 !else
   DEFINE      DXE_ARCHITECTURE        = IA32
-  DEFINE      EDK_DXE_ARCHITECTURE    = Ia32
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 32
 !endif
 
-  FLASH_DEFINITION                    = $(PLATFORM_PACKAGE)/PlatformPkg.fdf
+  FLASH_DEFINITION                    = Vlv2TbltDevicePkg/PlatformPkg.fdf
 !if $(LFMA_ENABLE) == TRUE
   FIX_LOAD_TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
   DEFINE   TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
@@ -71,10 +53,6 @@ [Defines]
 
   DEFINE   PLATFORM_PCIEXPRESS_BASE   = 0E0000000
 
-  DEFINE SEC_ENABLE = FALSE
-  DEFINE SEC_DEBUG_INFO_ENABLE = FALSE
-  DEFINE FTPM_ENABLE = FALSE
-
 ################################################################################
 #
 # SKU Identification section - list of all SKU IDs supported by this
@@ -98,7 +76,6 @@ [LibraryClasses.common]
   DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
   UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
   UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
-  DxeSmmDriverEntryPoint|IntelFrameworkPkg/Library/DxeSmmDriverEntryPoint/DxeSmmDriverEntryPoint.inf
 
   #
   # Basic
@@ -142,8 +119,7 @@ [LibraryClasses.common]
   GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
-  PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLib.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   #
   # Framework
@@ -166,10 +142,6 @@ [LibraryClasses.common]
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
 !endif
 
-!if $(S3_ENABLE) == TRUE
-  S3Lib|IntelFrameworkModulePkg/Library/PeiS3Lib/PeiS3Lib.inf
-!endif
-
   OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
 !if $(CAPSULE_ENABLE) == TRUE
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
@@ -197,27 +169,27 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|$(PLATFORM_PACKAGE)/Library/SmbusLib/SmbusLib.inf
-  SmmLib|$(PLATFORM_PACKAGE)/Library/PchSmmLib/PchSmmLib.inf
+  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
   # Platform
   #
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
-  ResetSystemLib|$(PLATFORM_PACKAGE)/Library/ResetSystemLib/ResetSystemLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  ResetSystemLib|Vlv2TbltDevicePkg/Library/ResetSystemLib/ResetSystemLib.inf
 
-  PlatformCmosLib|$(PLATFORM_PACKAGE)/Library/PlatformCmosLib/PlatformCmosLib.inf
+  PlatformCmosLib|Vlv2TbltDevicePkg/Library/PlatformCmosLib/PlatformCmosLib.inf
 
   #
   # Misc
   #
-  MonoStatusCodeLib|$(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf
+  MonoStatusCodeLib|Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
 !if $(TARGET) == RELEASE
   DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
@@ -229,10 +201,11 @@ [LibraryClasses.common]
 
 !endif
 
+  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
+
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   PeCoffExtraActionLib|SourceLevelDebugPkg/Library/PeCoffExtraActionLibDebug/PeCoffExtraActionLibDebug.inf
   DebugCommunicationLib|SourceLevelDebugPkg/Library/DebugCommunicationLibSerialPort/DebugCommunicationLibSerialPort.inf
-  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
   SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !else
   PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
@@ -247,10 +220,10 @@ [LibraryClasses.common]
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
 !endif
 
- BiosIdLib|$(PLATFORM_PACKAGE)/Library/BiosIdLib/BiosIdLib.inf
- CpuIA32Lib|$(PLATFORM_PACKAGE)/Library/CpuIA32Lib/CpuIA32Lib.inf
+ BiosIdLib|Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
+ CpuIA32Lib|Vlv2TbltDevicePkg/Library/CpuIA32Lib/CpuIA32Lib.inf
 
-  StallSmmLib|$(PLATFORM_PACKAGE)/Library/StallSmmLib/StallSmmLib.inf
+  StallSmmLib|Vlv2TbltDevicePkg/Library/StallSmmLib/StallSmmLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
@@ -264,13 +237,10 @@ [LibraryClasses.common]
   AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
 !endif
   VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
-!if $(RC_BINARY_RELEASE) == TRUE
-  I2cLib|Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
-!endif
   ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
   FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
   SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
-!if $(FTPM_ENABLE) == TRUE || $(NETWORK_ISCSI_ENABLE) == TRUE
+!if $(NETWORK_ISCSI_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
   IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
@@ -281,13 +251,6 @@ [LibraryClasses.common]
 
 
   Tpm2CommandLib|SecurityPkg/Library/Tpm2CommandLib/Tpm2CommandLib.inf
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  FspApiLib|IntelFspWrapperPkg/Library/BaseFspApiLib/BaseFspApiLib.inf
-  FspPlatformInfoLib|IntelFspWrapperPkg/Library/BaseFspPlatformInfoLibSample/BaseFspPlatformInfoLibSample.inf
-  FspPlatformSecLib|Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
-  FspHobProcessLib|Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
-!endif
-
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
 
 [LibraryClasses.IA32.SEC]
@@ -307,14 +270,14 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
   ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
   ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf
-  MultiPlatformLib|$(PLATFORM_PACKAGE)/Library/MultiPlatformLib/MultiPlatformLib.inf
+  MultiPlatformLib|Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
   MpInitLib|UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
 
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(TARGET) == RELEASE
@@ -322,7 +285,7 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxPeiLib.inf
@@ -331,13 +294,6 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgentLib.inf
 !endif
 
- !if $(MINNOW2_FSP_BUILD) == TRUE
- PlatformFspLib|Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
- !endif
-!if $(FTPM_ENABLE) == TRUE
-  Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCPei/Tpm2DeviceLibSeC.inf
-!endif
-
 [LibraryClasses.IA32]
   #
   # DXE phase common
@@ -354,7 +310,7 @@ [LibraryClasses.IA32]
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.inf
-  EfiRegTableLib|$(PLATFORM_PACKAGE)/Library/EfiRegTableLib/EfiRegTableLib.inf
+  EfiRegTableLib|Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
@@ -369,14 +325,14 @@ [LibraryClasses.IA32.DXE_DRIVER]
   CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgentLib.inf
 !endif
 
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
 
 [LibraryClasses.IA32.DXE_CORE]
   HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
@@ -384,7 +340,7 @@ [LibraryClasses.IA32.DXE_CORE]
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
@@ -409,7 +365,7 @@ [LibraryClasses.IA32.DXE_SMM_DRIVER]
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgentLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
 
@@ -483,12 +439,6 @@ [PcdsFeatureFlag.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|FALSE
-!endif
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmEnableBspElection|FALSE
-!if $(DATAHUB_STATUS_CODE_ENABLE) == TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|TRUE
-!else
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|FALSE
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE
 !if $(TARGET) == RELEASE
@@ -514,59 +464,20 @@ [PcdsFeatureFlag.common]
 !endif
 
 
-  ## This PCD specifies whether PS2 keyboard does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2KbdExtendedVerification|FALSE
-
-  ## This PCD specifies whether PS2 mouse does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2MouseExtendedVerification|FALSE
-
 !if $(VARIABLE_INFO_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|FALSE
 !endif
 
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
-
 !if $(SOURCE_DEBUG_ENABLE)
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmDebug|TRUE
 !endif
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
+
 [PcdsFixedAtBuild.common]
-!if $(MINNOW2_FSP_BUILD) == TRUE
-# $(FLASH_REGION_VLVMICROCODE_BASE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress|0xFFC00000
-# $(FLASH_REGION_VLVMICROCODE_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize|0x00040000
-  gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset|0x60
-# $(FLASH_AREA_BASE_ADDRESS)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress|0xFF800000
-# $(FLASH_AREA_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize|0x00800000
-# $(FLASH_REGION_FSPBIN_BASE)
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase|0xFFCC0000
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  # in FSP, when this got used, the memory already is up
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-!else
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-!endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-
-!else
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-  !else
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-  !endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-  gEfiCpuTokenSpaceGuid.PcdPeiTemporaryRamStackSize|0x3C00
-!endif
-
-
 !if $(SECURE_BOOT_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x22000
 !else
@@ -574,11 +485,8 @@ [PcdsFixedAtBuild.common]
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize|0x00000800
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize|0x400
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDRamSize|0x400000
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdS3AcpiReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdSrIovSupport|FALSE
   gEfiMdeModulePkgTokenSpaceGuid.PcdAriSupport|FALSE
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmApSyncTimeout|1000
 !if $(S4_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|TRUE
 !else
@@ -596,13 +504,9 @@ [PcdsFixedAtBuild.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries|60
 !endif
 
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdEbdaReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable|$(TOP_MEMORY_ADDRESS)
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserSubtitleTextColor|0x0
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldTextColor|0x01
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDEnabled|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVbeEnable|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVgaEnable|TRUE
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17
@@ -648,11 +552,6 @@ [PcdsFixedAtBuild.IA32]
 [PcdsPatchableInModule.common]
   gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0x$(PLATFORM_PCIEXPRESS_BASE)
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLegacyBiosCacheLegacyRegion|FALSE
-
-  ## This PCD specifies whether to use the optimized timing for best PS2 detection performance.
-  #  Note this PCD could be set to TRUE for best boot performance and set to FALSE for best device compatibility.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFastPS2Detection|TRUE
 
   #######################################################################################################
   #
@@ -827,10 +726,6 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdFTPMStatus|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateSmmDataPtr|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0
-  gEfiCpuTokenSpaceGuid.PcdCpuS3DataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuHotPlugDataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuCallbackSignal|0
-  gEfiCpuTokenSpaceGuid.PcdCpuConfigContextBuffer|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
@@ -843,24 +738,7 @@ [PcdsDynamicExDefault.X64.DEFAULT]
 
 [Components.IA32]
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
-
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspWrapperSecCore/FspWrapperSecCore.inf {
-    !if $(TARGET) == DEBUG
-
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
-  IntelFspWrapperPkg/FspInitPei/FspInitPei.inf {
-    !if $(TARGET) == DEBUG
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  !endif
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
 
   MdeModulePkg/Core/Pei/PeiMain.inf {
 !if $(TARGET) == DEBUG
@@ -871,31 +749,23 @@ [Components.IA32]
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 
-  $(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf {
+  Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf {
 !if $(TARGET) == DEBUG
     <PcdsFixedAtBuild>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2E
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <BuildOptions>
-      !if $(FTPM_ENABLE)==TRUE
-        *_*_IA32_CC_FLAGS = /D FTPM_ENABLE
-      !endif
   }
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-$(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/fTPMInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
 !endif
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformPei/PlatformPei.inf {
+  Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf {
     <BuildOptions>
       *_*_IA32_CC_FLAGS      = /DRC_BINARY_RELEASE
   !if $(TARGET) == DEBUG
@@ -915,10 +785,6 @@ [Components.IA32]
     }
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/Tpm2DeviceSeCPei.inf
-!endif
-
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/PhysicalPresencePei/PhysicalPresencePei.inf
   SecurityPkg/Tcg/TcgPei/TcgPei.inf {
@@ -929,7 +795,7 @@ [Components.IA32]
 }
 !endif
 
- $(PLATFORM_PACKAGE)/PlatformInitPei/PlatformInitPei.inf {
+ Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
     <LibraryClasses>
@@ -938,34 +804,33 @@ [Components.IA32]
 !endif
       PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/FvInfoPei/FvInfoPei.inf
+  Vlv2TbltDevicePkg/FvInfoPei/FvInfoPei.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
   MdeModulePkg/Universal/PCD/Pei/Pcd.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
   UefiCpuPkg/CpuIoPei/CpuIoPei.inf
   UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MpS3.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PiSmmCommunicationPei.inf
+  UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
 
 !if $(RECOVERY_ENABLE)
   #
   # Recovery
   #
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
   MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf
   MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf
   MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPei.inf
@@ -991,17 +856,6 @@ [Components.IA32]
  MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
  MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
 
-!if $(FTPM_ENABLE) == TRUE
-   SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      NULL|SecurityPkg/Library\HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
-  }
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1011,7 +865,7 @@ [Components.IA32]
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTablePei/FirmwarePerformancePei.inf{
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 
 !endif
@@ -1019,17 +873,6 @@ [Components.IA32]
   MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf
 !endif
 [Components.IA32]
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.inf {
-    !if $(TARGET) == DEBUG
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-
-  !endif
   #
   # EDK II Related Platform codes
   #
@@ -1047,24 +890,10 @@ [Components.IA32]
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
 !endif
   }
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf {
-    <PcdsPatchableInModule>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-    <PcdsFixedAtBuild>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x27
-    <LibraryClasses>
-    !if $(TARGET) != RELEASE
-          DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-       <BuildOptions>
-        ICC:*_*_*_CC_FLAGS = /D MDEPKG_NDEBUG
-        GCC:*_*_*_CC_FLAGS = -D MDEPKG_NDEBUG
-  }
   MdeModulePkg/Universal/PCD/Dxe/Pcd.inf {
     <LibraryClasses>
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
   }
-  IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
   UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
 
   MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
@@ -1084,13 +913,9 @@ [Components.IA32]
 
 !if $(TPM_ENABLED) == TRUE
       NULL|SecurityPkg/Library/DxeTpmMeasureBootLib/DxeTpmMeasureBootLib.inf
-!endif
-!if $(FTPM_ENABLE) == TRUE
-      NULL|SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MpCpu.inf
-  $(PLATFORM_PACKAGE)/Metronome/Metronome.inf
+  MdeModulePkg/Universal/Metronome/Metronome.inf
 
   IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
     <LibraryClasses>
@@ -1100,12 +925,8 @@ [Components.IA32]
       PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
-    !if $(FTPM_ENABLE) == TRUE
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-    !else
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
-    !endif
   }
 
   $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
@@ -1117,11 +938,11 @@ [Components.IA32]
   MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf {
     <LibraryClasses>
       NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbSmm.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbSmm.inf
   MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
 !if $(SECURE_BOOT_ENABLE) == TRUE
   SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf {
     <LibraryClasses>
@@ -1143,9 +964,9 @@ [Components.IA32]
   PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
   MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
 
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbRuntimeDxe.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbRuntimeDxe.inf
 
-  $(PLATFORM_PACKAGE)/PlatformSetupDxe/PlatformSetupDxe.inf
+  Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
 !if $(DATAHUB_ENABLE) == TRUE
   IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
@@ -1153,38 +974,30 @@ [Components.IA32]
       gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
   }
 !endif
-  IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
-  !if $(USE_HPET_TIMER) == TRUE
-    PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
-  !else
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmartTimer.inf
-  !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
+  PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/IntelPchLegacyInterrupt.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
     <PcdsPatchableInModule>
         gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
 
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
-
-  IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
 
   #
   # Performance Application; Set PERFORMANCE_ENABLE=TRUE for normal boot performance and smm performance data
@@ -1204,35 +1017,9 @@ [Components.IA32]
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
 
-!if $(SEC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/HeciDrv.inf {
-!if $(SEC_DEBUG_INFO_ENABLE) == TRUE
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=1
-!else
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=0
-!endif
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SeCPolicyInitDxe.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Tpm2DeviceSeCDxe.inf
-  SecurityPkg/Tcg/MemoryOverwriteControl/TcgMor.inf
-  SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf{
-    <LibraryClasses>
-      NULL|SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library\DxePcdLib/DxePcdLib.inf
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/FtpmSmm.inf
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1259,24 +1046,23 @@ [Components.IA32]
   #
   # EDK II Related Platform codes
   #
-  $(PLATFORM_PACKAGE)/PlatformSmm/PlatformSmm.inf{
+  Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf{
     <LibraryClasses>
     !if $(TARGET) != RELEASE
           DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
     !endif
           PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/PlatformInfoDxe/PlatformInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformDxe/PlatformDxe.inf
+  Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
 
-  $(PLATFORM_PACKAGE)/PciPlatform/PciPlatform.inf
-  $(PLATFORM_PACKAGE)/SaveMemoryConfig/SaveMemoryConfig.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
-  $(PLATFORM_PACKAGE)/PpmPolicy/PpmPolicy.inf
-  $(PLATFORM_PACKAGE)/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+  Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+  Vlv2TbltDevicePkg/SaveMemoryConfig/SaveMemoryConfig.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
+  Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
 !if $(GOP_DRIVER_ENABLE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformGopPolicy/PlatformGopPolicy.inf
+  Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
 
 !endif
 
@@ -1287,13 +1073,15 @@ [Components.IA32]
   MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf
   MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf
   UefiCpuPkg/CpuDxe/CpuDxe.inf
+  UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
   UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
   UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
   MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf
   UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
-  $(PLATFORM_PACKAGE)/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/GraphicDxeInitSmm.inf
 
   #
   # ACPI
@@ -1306,14 +1094,14 @@ [Components.IA32]
     <LibraryClasses>
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
+  MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  $(PLATFORM_PACKAGE)/BootScriptSaveDxe/BootScriptSaveDxe.inf
   IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
-  $(PLATFORM_RC_PACKAGE)/AcpiTablesPCAT/AcpiTables.inf
+  Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
 
-  $(PLATFORM_PACKAGE)/AcpiPlatform/AcpiPlatform.inf
+  Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
 
   MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
@@ -1323,31 +1111,23 @@ [Components.IA32]
   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
 
 
-#
-# ISA
-#
-  $(PLATFORM_PACKAGE)/Wpce791/Wpce791.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf
-#
-# SDIO
-#
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcHost.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcMediaDevice.inf
+  #
+  # ISA
+  #
+  Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
+  MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf
+
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/FirmwarePerformanceDxe.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/FirmwarePerformanceSmm.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 !endif
 
@@ -1355,7 +1135,6 @@ [Components.IA32]
 # IDE/SCSI/AHCI
 #
   MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
-  IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/IdeBusDxe.inf
   MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
   MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
   MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
@@ -1379,7 +1158,7 @@ [Components.IA32]
       gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000
   }
 !if $(SATA_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
 !endif
   MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
 !if $(SCSI_ENABLE) == TRUE
@@ -1392,7 +1171,6 @@ [Components.IA32]
   MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
   MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
   MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
-  IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
   MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
   MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
@@ -1416,9 +1194,9 @@ [Components.IA32]
   # SMBIOS
   #
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
-  $(PLATFORM_PACKAGE)/SmBiosMiscDxe/SmBiosMiscDxe.inf
+  Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
@@ -1433,12 +1211,6 @@ [Components.IA32]
   #
 !include NetworkPkg/Network.dsc.inc
 
-!if $(NETWORK_ENABLE) == TRUE
-  !if $(CSM_ENABLE) == TRUE
-    IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Snp16Dxe.inf
-  !endif
-!endif
-
 !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE)
   MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf
   MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
@@ -1456,7 +1228,7 @@ [Components.IA32]
     <LibraryClasses>
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
 !endif
 
@@ -1468,11 +1240,7 @@ [BuildOptions]
 #
 # Define token for different Platform
 #
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  DEFINE MINNOW2_FSP_OPTION = /DMINNOW2_FSP_BUILD
-!else
   DEFINE MINNOW2_FSP_OPTION =
-!endif
 
 !if $(ENBDT_PF_BUILD) == TRUE
   DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=1
@@ -1511,11 +1279,6 @@ [BuildOptions]
   DEFINE X64_BUILD_ENABLE =
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  DEFINE DSC_FTPM_BUILD_OPTIONS = /DFTPM_ENABLE
-!else
-  DEFINE DSC_FTPM_BUILD_OPTIONS =
-!endif
 !if $(TPM_ENABLED) == TRUE
   DEFINE DSC_TPM_BUILD_OPTIONS = /DTPM_ENABLED
 !else
@@ -1523,7 +1286,7 @@ [BuildOptions]
 !endif
 
 
-  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
+  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
 !if $(PERFORMANCE_ENABLE) == TRUE
   DEFINE PDB_BUILD_OPTION = /Zi
 !endif
@@ -1556,76 +1319,6 @@ [BuildOptions.common.EDKII.DXE_SMM_DRIVER, BuildOptions.common.EDKII.SMM_CORE]
   MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096
   GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000
 
-[BuildOptions.Common.EDK]
-
-#
-# Define token for different Platform
-#
-!if $(ENBDT_PF_BUILD) == TRUE
-  DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=1
-!else
-  DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=0
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-  RELEASE_*_*_DLINK_FLAGS = /DEBUG
-!endif
-
-!if $(S3_ENABLE) == TRUE
-  DEFINE DSC_S3_BUILD_OPTIONS = /DEFI_S3_RESUME
-!else
-  DEFINE DSC_S3_BUILD_OPTIONS =
-!endif
-
-!if $(ENBDT_S3_SUPPORT) == TRUE
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS = /DNOCS_S3_SUPPORT
-!else
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS =
-!endif
-
-!if $(X64_CONFIG) == TRUE
-  DEFINE X64_BUILD_ENABLE = /DX64_BUILD_ENABLE=1
-!else
-  DEFINE X64_BUILD_ENABLE =
-!endif
-
-
-  DEFINE EDK_GLUE_LIB_DEBUG  =
-  DEFINE DEBUG_BUILD_OPTIONS = /D EFI_DEBUG /D DEBUG_MODE=1  /GL- $(EDK_GLUE_LIB_DEBUG) /DEDKII_GLUE_DebugPrintErrorLevel=(EFI_D_ERROR)
-  DEFINE EDK_DSC_FEATURE_BUILD_OPTIONS = $(DSC_S3_BUILD_OPTIONS) $(DSC_ACPI_BUILD_OPTIONS) $(DSC_SEC_BUILD_OPTIONS) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(SOFTSDV_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(QT_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS) /D$(PROJECT_SC_CHIPSET)
-
-  DEFINE EDK_DSC_OTHER_BUILD_OPTIONS = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS) $(SV_BUILD_OPTIONS) $(INTEL_FASTBOOT_BUILD_OPTION)
-  DEFINE EDK_DSC_GLOBAL_BUILD_OPTIONS = $(ENBDT_PF_ENABLE) $(EDK_DSC_FEATURE_BUILD_OPTIONS) $(EDK_DSC_OTHER_BUILD_OPTIONS) /D EFI_SPECIFICATION_VERSION=0x00020000  /D PI_SPECIFICATION_VERSION=0x00000009  /D TIANO_RELEASE_VERSION=0x00080006 /D SUPPORT_DEPRECATED_PCI_CFG_PPI /D CSM_SMMENTRY_PORT8DATA8 /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE) /D MAX_VARIABLE_SIZE=0x2000 /D EFI_FIRMWARE_VENDOR="L/"INTEL/"" /D EFI_BUILD_VERSION="L/"EDKII/"" /DEFI_PEI_REPORT_STATUS_CODE_ON $(ENBDT_S3_SUPPORT_OPTIONS)
-
-  *_*_IA32_ASM_FLAGS         = /DEFI32 /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
-  DEBUG_*_IA32_CC_FLAGS      = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_CC_FLAGS    = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_VFRPP_FLAGS   = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_VFRPP_FLAGS = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_APP_FLAGS     = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_APP_FLAGS   = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_PP_FLAGS      = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_PP_FLAGS    = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_IA32_ASLPP_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASLCC_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASM16_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
-
-  *_*_X64_ASM_FLAGS          = /DEFIX64 /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
-  DEBUG_*_X64_CC_FLAGS       = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_CC_FLAGS     = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_VFRPP_FLAGS    = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_VFRPP_FLAGS  = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_APP_FLAGS      = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_APP_FLAGS    = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_PP_FLAGS       = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_PP_FLAGS     = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_X64_ASLPP_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASLCC_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASM16_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
- # *_*_*_BUILD_FLAGS = -s
-  *_*_*_VFR_FLAGS   = -c
-  *_*_*_BUILD_FLAGS = -c
-
 [BuildOptions.Common.EDKII]
   *_*_IA32_ASM_FLAGS     = $(VP_BUILD_OPTIONS) /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
 
@@ -1640,25 +1333,3 @@ [BuildOptions.Common.EDKII]
   *_*_X64_APP_FLAGS      = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_PP_FLAGS       = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_ASLPP_FLAGS    = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
-
-
-[Components.IA32]
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cBus.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cHost.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cPortA0Pio.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cMmioDeviceDxe.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index 9ec48f9fee..c0fe0892ac 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -18,25 +18,11 @@ [Defines]
   PLATFORM_GUID                       = 465B0A0B-7AC1-443b-8F67-7B8DEC145F90
   PLATFORM_VERSION                    = 0.1
   DSC_SPECIFICATION                   = 0x00010005
-
-  #
-  # Set platform specific package/folder name, same as passed from PREBUILD script.
-  # PLATFORM_PACKAGE would be the same as PLATFORM_NAME as well as package build folder
-  # DEFINE only takes effect at R9 DSC and FDF.
-  #
-  DEFINE      PLATFORM_PACKAGE                = Vlv2TbltDevicePkg
-  DEFINE      PLATFORM_RC_PACKAGE             = Vlv2DeviceRefCodePkg
-  DEFINE      PLATFORM_BINARY_PACKAGE         = Vlv2SocBinPkg
-  OUTPUT_DIRECTORY                    = Build/$(PLATFORM_PACKAGE)
+  OUTPUT_DIRECTORY                    = Build/Vlv2TbltDevicePkg
   SUPPORTED_ARCHITECTURES             = IA32|X64
   BUILD_TARGETS                       = DEBUG|RELEASE
   SKUID_IDENTIFIER                    = DEFAULT
 
-  DEFINE CPU_ARCH                 =ValleyView2
-  DEFINE PROJECT_SC_FAMILY        =IntelPch
-  DEFINE PROJECT_SC_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/SouthCluster
-  DEFINE PROJECT_VLV_ROOT          =../$(PLATFORM_RC_PACKAGE)/ValleyView2Soc/NorthCluster
-
   DEFINE RC_BINARY_RELEASE        = TRUE
   #
   # Platform On/Off features are defined here
@@ -47,22 +33,18 @@ [Defines]
   #   3.BayleyBay
   #     ENBDT_PF_ENABLE  = TRUE
   #
-  !include $(PLATFORM_PACKAGE)/AutoPlatformCFG.txt
-  !include $(PLATFORM_PACKAGE)/PlatformPkgConfig.dsc
+  !include Vlv2TbltDevicePkg/AutoPlatformCFG.txt
+  !include Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
 
   DEFINE PLATFORMX64_ENABLE = TRUE
 
 !if $(X64_CONFIG) == TRUE
   DEFINE      DXE_ARCHITECTURE        = X64
-  DEFINE      EDK_DXE_ARCHITECTURE    = X64
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 64
 !else
   DEFINE      DXE_ARCHITECTURE        = IA32
-  DEFINE      EDK_DXE_ARCHITECTURE    = Ia32
-  DEFINE      UNDI_DXE_ARCHITECTURE   = 32
 !endif
 
-  FLASH_DEFINITION                    = $(PLATFORM_PACKAGE)/PlatformPkg.fdf
+  FLASH_DEFINITION                    = Vlv2TbltDevicePkg/PlatformPkg.fdf
 !if $(LFMA_ENABLE) == TRUE
   FIX_LOAD_TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
   DEFINE   TOP_MEMORY_ADDRESS         = 0xFFFFFFFFFFFFFFFF
@@ -73,10 +55,6 @@ [Defines]
 
   DEFINE   PLATFORM_PCIEXPRESS_BASE   = 0E0000000
 
-  DEFINE SEC_ENABLE = FALSE
-  DEFINE SEC_DEBUG_INFO_ENABLE = FALSE
-  DEFINE FTPM_ENABLE = FALSE
-
 ################################################################################
 #
 # SKU Identification section - list of all SKU IDs supported by this
@@ -100,7 +78,6 @@ [LibraryClasses.common]
   DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
   UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
   UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
-  DxeSmmDriverEntryPoint|IntelFrameworkPkg/Library/DxeSmmDriverEntryPoint/DxeSmmDriverEntryPoint.inf
 
   #
   # Basic
@@ -144,8 +121,7 @@ [LibraryClasses.common]
   GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
-  PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLib.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   #
   # Framework
@@ -167,9 +143,6 @@ [LibraryClasses.common]
 !if $(SCSI_ENABLE) == TRUE
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
 !endif
-!if $(S3_ENABLE) == TRUE
-  S3Lib|IntelFrameworkModulePkg/Library/PeiS3Lib/PeiS3Lib.inf
-!endif
 
   OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
 !if $(CAPSULE_ENABLE) == TRUE
@@ -198,27 +171,27 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|$(PLATFORM_PACKAGE)/Library/SmbusLib/SmbusLib.inf
-  SmmLib|$(PLATFORM_PACKAGE)/Library/PchSmmLib/PchSmmLib.inf
+  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
   # Platform
   #
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
-  ResetSystemLib|$(PLATFORM_PACKAGE)/Library/ResetSystemLib/ResetSystemLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  ResetSystemLib|Vlv2TbltDevicePkg/Library/ResetSystemLib/ResetSystemLib.inf
 
-  PlatformCmosLib|$(PLATFORM_PACKAGE)/Library/PlatformCmosLib/PlatformCmosLib.inf
+  PlatformCmosLib|Vlv2TbltDevicePkg/Library/PlatformCmosLib/PlatformCmosLib.inf
 
   #
   # Misc
   #
-  MonoStatusCodeLib|$(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf
+  MonoStatusCodeLib|Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf
 !if $(TARGET) == RELEASE
   DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
@@ -230,10 +203,11 @@ [LibraryClasses.common]
 
 !endif
 
+  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
+
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   PeCoffExtraActionLib|SourceLevelDebugPkg/Library/PeCoffExtraActionLibDebug/PeCoffExtraActionLibDebug.inf
   DebugCommunicationLib|SourceLevelDebugPkg/Library/DebugCommunicationLibSerialPort/DebugCommunicationLibSerialPort.inf
-  PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
   SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !else
   PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
@@ -248,10 +222,10 @@ [LibraryClasses.common]
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
 !endif
 
- BiosIdLib|$(PLATFORM_PACKAGE)/Library/BiosIdLib/BiosIdLib.inf
- CpuIA32Lib|$(PLATFORM_PACKAGE)/Library/CpuIA32Lib/CpuIA32Lib.inf
+ BiosIdLib|Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
+ CpuIA32Lib|Vlv2TbltDevicePkg/Library/CpuIA32Lib/CpuIA32Lib.inf
 
-  StallSmmLib|$(PLATFORM_PACKAGE)/Library/StallSmmLib/StallSmmLib.inf
+  StallSmmLib|Vlv2TbltDevicePkg/Library/StallSmmLib/StallSmmLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
@@ -265,15 +239,10 @@ [LibraryClasses.common]
   AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
 !endif
   VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
-!if $(RC_BINARY_RELEASE) == TRUE
-  I2cLib|Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
-!endif
   ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
-  ShellCommandLib|ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
-  HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
   FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
   SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
-!if $(FTPM_ENABLE) == TRUE || $(NETWORK_ISCSI_ENABLE) == TRUE
+!if $(NETWORK_ISCSI_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
   IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
@@ -284,13 +253,6 @@ [LibraryClasses.common]
 
 
   Tpm2CommandLib|SecurityPkg/Library/Tpm2CommandLib/Tpm2CommandLib.inf
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  FspApiLib|IntelFspWrapperPkg/Library/BaseFspApiLib/BaseFspApiLib.inf
-  FspPlatformInfoLib|IntelFspWrapperPkg/Library/BaseFspPlatformInfoLibSample/BaseFspPlatformInfoLibSample.inf
-  FspPlatformSecLib|Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
-  FspHobProcessLib|Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
-!endif
-
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
 
 [LibraryClasses.IA32.SEC]
@@ -310,14 +272,14 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
   ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
   ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf
-  MultiPlatformLib|$(PLATFORM_PACKAGE)/Library/MultiPlatformLib/MultiPlatformLib.inf
+  MultiPlatformLib|Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
   MpInitLib|UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
 
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(TARGET) == RELEASE
@@ -325,7 +287,7 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
 !else
   DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
-  SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+  SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxPeiLib.inf
@@ -334,13 +296,6 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.IA32.PEI_CORE, LibraryClasses.IA32.SEC
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgentLib.inf
 !endif
 
- !if $(MINNOW2_FSP_BUILD) == TRUE
- PlatformFspLib|Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
- !endif
-!if $(FTPM_ENABLE) == TRUE
-  Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCPei/Tpm2DeviceLibSeC.inf
-!endif
-
 [LibraryClasses.X64]
   #
   # DXE phase common
@@ -357,7 +312,7 @@ [LibraryClasses.X64]
 !endif
 
   LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.inf
-  EfiRegTableLib|$(PLATFORM_PACKAGE)/Library/EfiRegTableLib/EfiRegTableLib.inf
+  EfiRegTableLib|Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
@@ -372,14 +327,14 @@ [LibraryClasses.X64.DXE_DRIVER]
   CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgentLib.inf
 !endif
 
-  FlashDeviceLib|$(PLATFORM_PACKAGE)/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
+  FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLibDxe.inf
 
 [LibraryClasses.X64.DXE_CORE]
   HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
@@ -387,7 +342,7 @@ [LibraryClasses.X64.DXE_CORE]
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
 !if $(PERFORMANCE_ENABLE) == TRUE
   PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
@@ -412,7 +367,7 @@ [LibraryClasses.X64.DXE_SMM_DRIVER]
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgentLib.inf
-  TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+  TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
 !endif
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
 
@@ -486,12 +441,6 @@ [PcdsFeatureFlag.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|FALSE
-!endif
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmEnableBspElection|FALSE
-!if $(DATAHUB_STATUS_CODE_ENABLE) == TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|TRUE
-!else
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseDataHub|FALSE
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE
 !if $(TARGET) == RELEASE
@@ -517,59 +466,20 @@ [PcdsFeatureFlag.common]
 !endif
 
 
-  ## This PCD specifies whether PS2 keyboard does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2KbdExtendedVerification|FALSE
-
-  ## This PCD specifies whether PS2 mouse does a extended verification during start.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPs2MouseExtendedVerification|FALSE
-
 !if $(VARIABLE_INFO_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|TRUE
 !else
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|FALSE
 !endif
 
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
-
 !if $(SOURCE_DEBUG_ENABLE)
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmDebug|TRUE
 !endif
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|TRUE
+
 [PcdsFixedAtBuild.common]
-!if $(MINNOW2_FSP_BUILD) == TRUE
-# $(FLASH_REGION_VLVMICROCODE_BASE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress|0xFFC00000
-# $(FLASH_REGION_VLVMICROCODE_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize|0x00040000
-  gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset|0x60
-# $(FLASH_AREA_BASE_ADDRESS)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress|0xFF800000
-# $(FLASH_AREA_SIZE)
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize|0x00800000
-# $(FLASH_REGION_FSPBIN_BASE)
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase|0xFFCC0000
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  # in FSP, when this got used, the memory already is up
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-!else
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-!endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-
-!else
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0x00080000
-  !else
-    gEfiCpuTokenSpaceGuid.PcdTemporaryRamBase|0xFEF80000
-  !endif
-  gEfiCpuTokenSpaceGuid.PcdTemporaryRamSize|0x00010000
-  gEfiCpuTokenSpaceGuid.PcdPeiTemporaryRamStackSize|0x3C00
-!endif
-
-
 !if $(SECURE_BOOT_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x22000
 !else
@@ -577,11 +487,8 @@ [PcdsFixedAtBuild.common]
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize|0x00000800
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize|0x400
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDRamSize|0x400000
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdS3AcpiReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdSrIovSupport|FALSE
   gEfiMdeModulePkgTokenSpaceGuid.PcdAriSupport|FALSE
-  gEfiCpuTokenSpaceGuid.PcdCpuSmmApSyncTimeout|1000
 !if $(S4_ENABLE) == TRUE
   gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|TRUE
 !else
@@ -599,13 +506,9 @@ [PcdsFixedAtBuild.common]
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries|60
 !endif
 
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdEbdaReservedMemorySize|0x10000
   gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable|$(TOP_MEMORY_ADDRESS)
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserSubtitleTextColor|0x0
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldTextColor|0x01
-  gEfiCpuTokenSpaceGuid.PcdCpuIEDEnabled|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVbeEnable|TRUE
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVgaEnable|TRUE
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17
@@ -651,11 +554,6 @@ [PcdsFixedAtBuild.IA32]
 [PcdsPatchableInModule.common]
   gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0x$(PLATFORM_PCIEXPRESS_BASE)
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLegacyBiosCacheLegacyRegion|FALSE
-
-  ## This PCD specifies whether to use the optimized timing for best PS2 detection performance.
-  #  Note this PCD could be set to TRUE for best boot performance and set to FALSE for best device compatibility.
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFastPS2Detection|TRUE
 
   #######################################################################################################
   #
@@ -830,10 +728,6 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdFTPMStatus|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateSmmDataPtr|0
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0
-  gEfiCpuTokenSpaceGuid.PcdCpuS3DataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuHotPlugDataAddress|0
-  gEfiCpuTokenSpaceGuid.PcdCpuCallbackSignal|0
-  gEfiCpuTokenSpaceGuid.PcdCpuConfigContextBuffer|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
@@ -846,24 +740,7 @@ [PcdsDynamicExDefault.X64.DEFAULT]
 
 [Components.IA32]
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
-
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspWrapperSecCore/FspWrapperSecCore.inf {
-    !if $(TARGET) == DEBUG
-
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
-  IntelFspWrapperPkg/FspInitPei/FspInitPei.inf {
-    !if $(TARGET) == DEBUG
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-  !endif
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SecCore.inf
 
   MdeModulePkg/Core/Pei/PeiMain.inf {
 !if $(TARGET) == DEBUG
@@ -874,31 +751,23 @@ [Components.IA32]
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 
-  $(PLATFORM_PACKAGE)/MonoStatusCode/MonoStatusCode.inf {
+  Vlv2TbltDevicePkg/MonoStatusCode/MonoStatusCode.inf {
 !if $(TARGET) == DEBUG
     <PcdsFixedAtBuild>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2E
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MemoryInit.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <BuildOptions>
-      !if $(FTPM_ENABLE)==TRUE
-        *_*_IA32_CC_FLAGS = /D FTPM_ENABLE
-      !endif
   }
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-$(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/fTPMInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/SeCUma.inf
 !endif
 
 !if $(RC_BINARY_RELEASE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformPei/PlatformPei.inf {
+  Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf {
     <BuildOptions>
       *_*_IA32_CC_FLAGS      = /DRC_BINARY_RELEASE
   !if $(TARGET) == DEBUG
@@ -918,10 +787,6 @@ [Components.IA32]
     }
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/Tpm2DeviceSeCPei.inf
-!endif
-
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/PhysicalPresencePei/PhysicalPresencePei.inf
   SecurityPkg/Tcg/TcgPei/TcgPei.inf {
@@ -932,7 +797,7 @@ [Components.IA32]
 }
 !endif
 
- $(PLATFORM_PACKAGE)/PlatformInitPei/PlatformInitPei.inf {
+ Vlv2TbltDevicePkg/PlatformInitPei/PlatformInitPei.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x803805c6
     <LibraryClasses>
@@ -941,34 +806,33 @@ [Components.IA32]
 !endif
       PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/FvInfoPei/FvInfoPei.inf
+  Vlv2TbltDevicePkg/FvInfoPei/FvInfoPei.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/VlvInitPeim.inf
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchEarlyInitPeim.inf {
     <PcdsPatchableInModule>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
   }
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchInitPeim.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSmbusArpDisabled.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchSpiPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PeiSmmControl.inf
   MdeModulePkg/Universal/PCD/Pei/Pcd.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/CpuPeim.inf
   UefiCpuPkg/CpuIoPei/CpuIoPei.inf
   UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/MpS3.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PiSmmCommunicationPei.inf
+  UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
 
 !if $(RECOVERY_ENABLE)
   #
   # Recovery
   #
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/IA32/PchUsb.inf
   MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf
   MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf
   MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPei.inf
@@ -994,17 +858,6 @@ [Components.IA32]
  MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
  MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
 
-!if $(FTPM_ENABLE) == TRUE
-   SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      NULL|SecurityPkg/Library\HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
-  }
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1014,7 +867,7 @@ [Components.IA32]
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTablePei/FirmwarePerformancePei.inf{
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 
 !endif
@@ -1022,17 +875,6 @@ [Components.IA32]
   MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf
 !endif
 [Components.X64]
-  !if $(MINNOW2_FSP_BUILD) == TRUE
-  IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.inf {
-    !if $(TARGET) == DEBUG
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
-    <LibraryClasses>
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-  }
-
-  !endif
   #
   # EDK II Related Platform codes
   #
@@ -1050,24 +892,10 @@ [Components.X64]
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
 !endif
   }
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf {
-    <PcdsPatchableInModule>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-    <PcdsFixedAtBuild>
-        gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x27
-    <LibraryClasses>
-    !if $(TARGET) != RELEASE
-          DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-    !endif
-       <BuildOptions>
-        ICC:*_*_*_CC_FLAGS = /D MDEPKG_NDEBUG
-        GCC:*_*_*_CC_FLAGS = -D MDEPKG_NDEBUG
-  }
   MdeModulePkg/Universal/PCD/Dxe/Pcd.inf {
     <LibraryClasses>
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
   }
-  IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
   UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
 
   MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
@@ -1100,13 +928,9 @@ [Components.X64]
 
 !if $(TPM_ENABLED) == TRUE
       NULL|SecurityPkg/Library/DxeTpmMeasureBootLib/DxeTpmMeasureBootLib.inf
-!endif
-!if $(FTPM_ENABLE) == TRUE
-      NULL|SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf
 !endif
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MpCpu.inf
-  $(PLATFORM_PACKAGE)/Metronome/Metronome.inf
+  MdeModulePkg/Universal/Metronome/Metronome.inf
 
   IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
     <LibraryClasses>
@@ -1116,12 +940,8 @@ [Components.X64]
       PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
-    !if $(FTPM_ENABLE) == TRUE
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-    !else
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
-    !endif
   }
 
   $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
@@ -1133,11 +953,11 @@ [Components.X64]
   MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf {
     <LibraryClasses>
       NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbSmm.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbSmm.inf
   MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiSmm.inf
 !if $(SECURE_BOOT_ENABLE) == TRUE
   SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf {
     <LibraryClasses>
@@ -1159,9 +979,9 @@ [Components.X64]
   PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
   MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
 
-  $(PLATFORM_PACKAGE)/FvbRuntimeDxe/FvbRuntimeDxe.inf
+  Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbRuntimeDxe.inf
 
-  $(PLATFORM_PACKAGE)/PlatformSetupDxe/PlatformSetupDxe.inf
+  Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
 !if $(DATAHUB_ENABLE) == TRUE
   IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
@@ -1169,38 +989,30 @@ [Components.X64]
       gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
   }
 !endif
-  IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
-  !if $(USE_HPET_TIMER) == TRUE
-    PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
-  !else
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmartTimer.inf
-  !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
+  PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmControl.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/IntelPchLegacyInterrupt.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmbusDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchReset.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitDxe.inf{
     <PcdsPatchableInModule>
         gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
   }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchInitSmm.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSmiDispatcher.inf
 
 !if $(PCIESC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPcieSmm.inf
 !endif
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
-
-  IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchSpiRuntime.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchPolicyInitDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchBiosWriteProtect.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmmAccess.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PciHostBridge.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/VlvInitDxe.inf
 
   #
   # Performance Application; Set PERFORMANCE_ENABLE=TRUE for normal boot performance and smm performance data
@@ -1220,35 +1032,9 @@ [Components.X64]
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PnpDxe.inf
 
-!if $(SEC_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/HeciDrv.inf {
-!if $(SEC_DEBUG_INFO_ENABLE) == TRUE
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=1
-!else
-    <BuildOptions>
-      *_*_X64_CC_FLAGS      = /DSEC_DEBUG_INFO=0
-!endif
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SeCPolicyInitDxe.inf
-!endif
-
-!if $(FTPM_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Tpm2DeviceSeCDxe.inf
-  SecurityPkg/Tcg/MemoryOverwriteControl/TcgMor.inf
-  SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf{
-    <LibraryClasses>
-      NULL|SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.inf
-      NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
-      PcdLib|MdePkg/Library\DxePcdLib/DxePcdLib.inf
-      Tpm2DeviceLib|Vlv2TbltDevicePkg/Library/Tpm2DeviceLibSeCDxe/Tpm2DeviceLibSeC.inf
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/FtpmSmm.inf
-!endif
 !if $(TPM_ENABLED) == TRUE
   SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf {
     <LibraryClasses>
@@ -1275,24 +1061,23 @@ [Components.X64]
   #
   # EDK II Related Platform codes
   #
-  $(PLATFORM_PACKAGE)/PlatformSmm/PlatformSmm.inf{
+  Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf{
     <LibraryClasses>
     !if $(TARGET) != RELEASE
           DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
     !endif
           PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
-  $(PLATFORM_PACKAGE)/PlatformInfoDxe/PlatformInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
-  $(PLATFORM_PACKAGE)/PlatformDxe/PlatformDxe.inf
+  Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf
+  Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
 
-  $(PLATFORM_PACKAGE)/PciPlatform/PciPlatform.inf
-  $(PLATFORM_PACKAGE)/SaveMemoryConfig/SaveMemoryConfig.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
-  $(PLATFORM_PACKAGE)/PpmPolicy/PpmPolicy.inf
-  $(PLATFORM_PACKAGE)/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+  Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+  Vlv2TbltDevicePkg/SaveMemoryConfig/SaveMemoryConfig.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PlatformCpuPolicy.inf
+  Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
 !if $(GOP_DRIVER_ENABLE) == TRUE
-  $(PLATFORM_PACKAGE)/PlatformGopPolicy/PlatformGopPolicy.inf
+  Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
 
 !endif
 
@@ -1303,13 +1088,15 @@ [Components.X64]
   MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf
   MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf
   UefiCpuPkg/CpuDxe/CpuDxe.inf
+  UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
   UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
   UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
   MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf
   UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
-  $(PLATFORM_PACKAGE)/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PowerManagement2.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/DigitalThermalSensor.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/GraphicDxeInitSmm.inf
 
   #
   # ACPI
@@ -1322,14 +1109,14 @@ [Components.X64]
     <LibraryClasses>
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
+  MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  $(PLATFORM_PACKAGE)/BootScriptSaveDxe/BootScriptSaveDxe.inf
   IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
-  $(PLATFORM_RC_PACKAGE)/AcpiTablesPCAT/AcpiTables.inf
+  Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
 
-  $(PLATFORM_PACKAGE)/AcpiPlatform/AcpiPlatform.inf
+  Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
 
   MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
@@ -1339,31 +1126,23 @@ [Components.X64]
   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
 
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/ISPDxe.inf
 
 
-#
-# ISA
-#
-  $(PLATFORM_PACKAGE)/Wpce791/Wpce791.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf
-  IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf
-#
-# SDIO
-#
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcHost.inf
-#  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/MmcMediaDevice.inf
+  #
+  # ISA
+  #
+  Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
+  MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf
+
 !if $(ACPI50_ENABLE) == TRUE
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/FirmwarePerformanceDxe.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/FirmwarePerformanceSmm.inf {
     <LibraryClasses>
-      TimerLib|$(PLATFORM_PACKAGE)/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
+      TimerLib|Vlv2TbltDevicePkg/Library/IntelPchAcpiTimerLib/IntelPchAcpiTimerLib.inf
   }
 !endif
 
@@ -1371,7 +1150,6 @@ [Components.X64]
 # IDE/SCSI/AHCI
 #
   MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
-  IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/IdeBusDxe.inf
   MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
   MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
   MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
@@ -1395,7 +1173,7 @@ [Components.X64]
       gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000
   }
 !if $(SATA_ENABLE) == TRUE
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SataController.inf
 !endif
   MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
 !if $(SCSI_ENABLE) == TRUE
@@ -1408,7 +1186,6 @@ [Components.X64]
   MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
   MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
   MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
-  IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf
   MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
   MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
@@ -1432,9 +1209,9 @@ [Components.X64]
   # SMBIOS
   #
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
-  $(PLATFORM_PACKAGE)/SmBiosMiscDxe/SmBiosMiscDxe.inf
+  Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
+  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
@@ -1449,12 +1226,6 @@ [Components.X64]
   #
 !include NetworkPkg/Network.dsc.inc
 
-!if $(NETWORK_ENABLE) == TRUE
-  !if $(CSM_ENABLE) == TRUE
-    IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Snp16Dxe.inf
-  !endif
-!endif
-
 !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE)
   MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf
   MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
@@ -1472,7 +1243,7 @@ [Components.X64]
     <LibraryClasses>
       DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
       PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|$(PLATFORM_PACKAGE)/Library/SerialPortLib/SerialPortLib.inf
+      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   }
 !endif
 
@@ -1484,11 +1255,7 @@ [BuildOptions]
 #
 # Define token for different Platform
 #
-!if $(MINNOW2_FSP_BUILD) == TRUE
-  DEFINE MINNOW2_FSP_OPTION = /DMINNOW2_FSP_BUILD
-!else
   DEFINE MINNOW2_FSP_OPTION =
-!endif
 
 !if $(ENBDT_PF_BUILD) == TRUE
   DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=1
@@ -1527,11 +1294,6 @@ [BuildOptions]
   DEFINE X64_BUILD_ENABLE =
 !endif
 
-!if $(FTPM_ENABLE) == TRUE
-  DEFINE DSC_FTPM_BUILD_OPTIONS = /DFTPM_ENABLE
-!else
-  DEFINE DSC_FTPM_BUILD_OPTIONS =
-!endif
 !if $(TPM_ENABLED) == TRUE
   DEFINE DSC_TPM_BUILD_OPTIONS = /DTPM_ENABLED
 !else
@@ -1539,7 +1301,7 @@ [BuildOptions]
 !endif
 
 
-  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
+  DEFINE EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS = $(MINNOW2_FSP_OPTION) $(MINNOW2_BUILD_OPTION) $(ENBDT_PF_ENABLE) $(EXTERNAL_VGA_BUILD_OPTION) $(PCIE_ENUM_WA_BUILD_OPTION) $(X0_WA_ENABLE_BUILD_OPTION) $(A0_WA_ENABLE_BUILD_OPTION) $(MICROCODE_FREE_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(SYSCTL_ID_BUILD_OPTION) $(CLKGEN_CONFIG_EXTRA_BUILD_OPTION) $(SYSCTL_X0_CONVERT_BOARD_OPTION) $(ENBDT_S3_SUPPORT_OPTIONS) $(SATA_SUPPORT_BUILD_OPTION) $(PCIESC_SUPPORT_BUILD_OPTION) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS)
 !if $(PERFORMANCE_ENABLE) == TRUE
   DEFINE PDB_BUILD_OPTION = /Zi
 !endif
@@ -1572,76 +1334,6 @@ [BuildOptions.common.EDKII.DXE_SMM_DRIVER, BuildOptions.common.EDKII.SMM_CORE]
   MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096
   GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000
 
-[BuildOptions.Common.EDK]
-
-#
-# Define token for different Platform
-#
-!if $(ENBDT_PF_BUILD) == TRUE
-  DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=1
-!else
-  DEFINE ENBDT_PF_ENABLE = /DENBDT_PF_ENABLE=0
-!endif
-
-!if $(PERFORMANCE_ENABLE) == TRUE
-  RELEASE_*_*_DLINK_FLAGS = /DEBUG
-!endif
-
-!if $(S3_ENABLE) == TRUE
-  DEFINE DSC_S3_BUILD_OPTIONS = /DEFI_S3_RESUME
-!else
-  DEFINE DSC_S3_BUILD_OPTIONS =
-!endif
-
-!if $(ENBDT_S3_SUPPORT) == TRUE
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS = /DNOCS_S3_SUPPORT
-!else
-  DEFINE ENBDT_S3_SUPPORT_OPTIONS =
-!endif
-
-!if $(X64_CONFIG) == TRUE
-  DEFINE X64_BUILD_ENABLE = /DX64_BUILD_ENABLE=1
-!else
-  DEFINE X64_BUILD_ENABLE =
-!endif
-
-
-  DEFINE EDK_GLUE_LIB_DEBUG  =
-  DEFINE DEBUG_BUILD_OPTIONS = /D EFI_DEBUG /D DEBUG_MODE=1  /GL- $(EDK_GLUE_LIB_DEBUG) /DEDKII_GLUE_DebugPrintErrorLevel=(EFI_D_ERROR)
-  DEFINE EDK_DSC_FEATURE_BUILD_OPTIONS = $(DSC_S3_BUILD_OPTIONS) $(DSC_ACPI_BUILD_OPTIONS) $(DSC_SEC_BUILD_OPTIONS) $(DSC_FTPM_BUILD_OPTIONS) $(DSC_FTPM_ERROR_WR_BUILD_OPTIONS) $(DSC_TPM_BUILD_OPTIONS) $(SOFTSDV_BUILD_OPTIONS) $(SIMICS_BUILD_OPTIONS) $(HYBRID_BUILD_OPTIONS) $(COMPACT_BUILD_OPTIONS) $(VP_BUILD_OPTIONS) $(QT_BUILD_OPTIONS) $(DSC_BYTI_SECURE_BOOT_BUILD_OPTIONS) /D$(PROJECT_SC_CHIPSET)
-
-  DEFINE EDK_DSC_OTHER_BUILD_OPTIONS = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS) $(SV_BUILD_OPTIONS) $(INTEL_FASTBOOT_BUILD_OPTION)
-  DEFINE EDK_DSC_GLOBAL_BUILD_OPTIONS = $(ENBDT_PF_ENABLE) $(EDK_DSC_FEATURE_BUILD_OPTIONS) $(EDK_DSC_OTHER_BUILD_OPTIONS) /D EFI_SPECIFICATION_VERSION=0x00020000  /D PI_SPECIFICATION_VERSION=0x00000009  /D TIANO_RELEASE_VERSION=0x00080006 /D SUPPORT_DEPRECATED_PCI_CFG_PPI /D CSM_SMMENTRY_PORT8DATA8 /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE) /D MAX_VARIABLE_SIZE=0x2000 /D EFI_FIRMWARE_VENDOR="L/"INTEL/"" /D EFI_BUILD_VERSION="L/"EDKII/"" /DEFI_PEI_REPORT_STATUS_CODE_ON $(ENBDT_S3_SUPPORT_OPTIONS)
-
-  *_*_IA32_ASM_FLAGS         = /DEFI32 /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
-  DEBUG_*_IA32_CC_FLAGS      = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_CC_FLAGS    = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_VFRPP_FLAGS   = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_VFRPP_FLAGS = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_APP_FLAGS     = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_APP_FLAGS   = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_IA32_PP_FLAGS      = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_IA32_PP_FLAGS    = /D EFI32 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_IA32_ASLPP_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASLCC_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_IA32_ASM16_FLAGS       = /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
-
-  *_*_X64_ASM_FLAGS          = /DEFIX64 /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
-  DEBUG_*_X64_CC_FLAGS       = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_CC_FLAGS     = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_VFRPP_FLAGS    = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_VFRPP_FLAGS  = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_APP_FLAGS      = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_APP_FLAGS    = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  DEBUG_*_X64_PP_FLAGS       = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS) $(DEBUG_BUILD_OPTIONS)
-  RELEASE_*_X64_PP_FLAGS     = /D EFIX64 $(EDK_DSC_GLOBAL_BUILD_OPTIONS)
-  *_*_X64_ASLPP_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASLCC_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=0x$(PLATFORM_PCIEXPRESS_BASE)
-  *_*_X64_ASM16_FLAGS        = /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h
- # *_*_*_BUILD_FLAGS = -s
-  *_*_*_VFR_FLAGS   = -c
-  *_*_*_BUILD_FLAGS = -c
-
 [BuildOptions.Common.EDKII]
   *_*_IA32_ASM_FLAGS     = $(VP_BUILD_OPTIONS) /D EDKII_GLUE_PciExpressBaseAddress=$(PLATFORM_PCIEXPRESS_BASE)h /DNOCS_S3_SUPPORT
 
@@ -1656,25 +1348,3 @@ [BuildOptions.Common.EDKII]
   *_*_X64_APP_FLAGS      = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_PP_FLAGS       = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
   *_*_X64_ASLPP_FLAGS    = $(EDK_EDKII_DSC_FEATURE_BUILD_OPTIONS)
-
-
-[Components.X64]
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cBus.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cHost.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xF0000043
-  }
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cPortA0Pio.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
-  $(PLATFORM_BINARY_PACKAGE)/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/I2cMmioDeviceDxe.inf {
-    <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x00000043
-  }
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
index 53372bb922..1ba75175e1 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
@@ -1,18 +1,15 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 **/
 
 #ifndef _PLAT_OVER_MNGR_H_
 #define _PLAT_OVER_MNGR_H_
 
-#include <FrameworkDxe.h>
+#include <PiDxe.h>
 
 #include <Protocol/HiiConfigAccess.h>
 #include <Protocol/HiiConfigRouting.h>
@@ -57,24 +54,11 @@
 #include <CpuType.h>
 #include <Guid/PlatformCpuInfo.h>
 #include <Protocol/SimpleTextIn.h>
-#include <Protocol/FrameworkFormBrowser.h>
+
+typedef UINT16  STRING_REF;
+
 extern EFI_HII_HANDLE   mHiiHandle;
 
-UINT32
-ConvertBase10ToRaw (
-  IN  EFI_EXP_BASE10_DATA             *Data);
-
-UINT32
-ConvertBase2ToRaw (
-  IN  EFI_EXP_BASE2_DATA             *Data);
-
-EFI_STATUS
-GetStringFromToken (
-  IN      EFI_GUID                  *ProducerGuid,
-  IN      STRING_REF                Token,
-  OUT     CHAR16                    **String
-  );
-
 VOID
 SwapEntries (
   IN  CHAR8 *Data
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
index 6d7e7c3f6c..ae100df26d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
@@ -1,11 +1,8 @@
 #
 #
-# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

+# Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
 #
 #  This driver produces UEFI PLATFORM_DRIVER_OVERRIDE_PROTOCOL if this protocol doesn't exist.
 #  It doesn't install again if this protocol exists.
@@ -63,7 +60,6 @@ [Sources]
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec    #for PchAccess.h
   SecurityPkg/SecurityPkg.dec
@@ -94,10 +90,6 @@ [Guids]
   #
   # gEfiCallerIdGuid                            ## Private  ## Variable:L"PlatDriOver"
   gEfiIfrTianoGuid                              ## CONSUMES ## Guid
-  gEfiProcessorSubClassGuid
-  gEfiMiscSubClassGuid
-  gEfiCacheSubClassGuid
-  gEfiMemorySubClassGuid
   gEfiPlatformInfoGuid
   gEfiNormalSetupGuid
   gEfiSecureBootEnableDisableGuid
@@ -123,8 +115,6 @@ [Protocols]
   gEfiDevicePathToTextProtocolGuid              ## CONSUMED
   gEdkiiFormBrowserEx2ProtocolGuid
 
-  gEfiDataHubProtocolGuid
-  gEfiLegacyBiosProtocolGuid
   gEfiSimpleNetworkProtocolGuid
 
   gEfiDiskInfoProtocolGuid                      ## CONSUMED
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
index c404ada588..fb82cdb984 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
     SetupInfoRecords.c
@@ -19,7 +16,6 @@ Revision History:
 --*/
 
 #include "PlatformSetupDxe.h"
-#include <Protocol/LegacyBios.h>
 #include <Protocol/PciRootBridgeIo.h>
 #include <Protocol/SimpleNetwork.h>
 #include <Protocol/DevicePath.h>
@@ -31,7 +27,6 @@ Revision History:
 #include <Protocol/Smbios.h>
 #include <IndustryStandard/SmBios.h>
 #include <Library/IoLib.h>
-#include <Library/I2CLib.h>
 #include <Guid/GlobalVariable.h>
 
 #include "Valleyview.h"
@@ -1172,11 +1167,6 @@ UpdatePlatformInformation (
 {
   UINT32                   MicroCodeVersion;
   CHAR16                   Buffer[40];
-  UINT8                    IgdVBIOSRevH;
-  UINT8                    IgdVBIOSRevL;
-  UINT16                   EDX;
-  EFI_IA32_REGISTER_SET    RegSet;
-  EFI_LEGACY_BIOS_PROTOCOL *LegacyBios = NULL;
   EFI_STATUS               Status;
   UINT8                    CpuFlavor=0;
   EFI_PEI_HOB_POINTERS     GuidHob;
@@ -1202,35 +1192,6 @@ UpdatePlatformInformation (
     }
   }
 
-  //
-  //VBIOS version
-  //
-  Status = gBS->LocateProtocol(
-                  &gEfiLegacyBiosProtocolGuid,
-                  NULL,
-                  (void **)&LegacyBios
-                  );
-  if (!EFI_ERROR (Status)) {
-  RegSet.X.AX = 0x5f01;
-  Status = LegacyBios->Int86 (LegacyBios, 0x10, &RegSet);
-  ASSERT_EFI_ERROR(Status);
-
-  //
-  // simulate AMI int15 (ax=5f01) handler
-  // check NbInt15.asm in AMI code for asm edition
-  //
-  EDX = (UINT16)((RegSet.E.EBX >> 16) & 0xffff);
-  IgdVBIOSRevH = (UINT8)(((EDX & 0x0F00) >> 4) | (EDX & 0x000F));
-  IgdVBIOSRevL = (UINT8)(((RegSet.X.BX & 0x0F00) >> 4) | (RegSet.X.BX & 0x000F));
-
-  if (IgdVBIOSRevH==0 && IgdVBIOSRevL==0){
-    HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), L"N/A", NULL);
-  } else {
-    UnicodeSPrint (Buffer, sizeof (Buffer), L"%02X%02X", IgdVBIOSRevH,IgdVBIOSRevL);
-    HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), Buffer, NULL);
-    }
-  }
-
   Status = GetGOPDriverName(Name);
 
   if (!EFI_ERROR(Status))
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
index 8b46fbdfd1..14b9250e99 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
     Platform.c
@@ -70,26 +68,9 @@ UINT8 mTco1Sources[] = {
   IchnNmi
 };
 
-UINTN
-DevicePathSize (
-  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
-  );
-
 VOID
 S4S5ProgClock();
 
-EFI_STATUS
-InitRuntimeScriptTable (
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  );
-
-VOID
-S5SleepWakeOnRtcCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
-  );
-
-
 VOID
 EnableS5WakeOnRtc();
 
@@ -98,12 +79,6 @@ HexToBcd(
   UINT8 HexValue
   );
 
-UINT8
-BcdToHex(
-  IN UINT8 BcdValue
-  );
-
-
 VOID
 CpuSmmSxWorkAround(
   );
@@ -779,46 +754,6 @@ DummyTco1Callback (
 {
 }
 
-UINTN
-DevicePathSize (
-  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL     *Start;
-
-  if (DevicePath == NULL) {
-    return 0;
-  }
-
-  //
-  // Search for the end of the device path structure
-  //
-  Start = DevicePath;
-  while (!IsDevicePathEnd (DevicePath)) {
-    DevicePath = NextDevicePathNode (DevicePath);
-  }
-
-  //
-  // Compute the size and add back in the size of the end device path structure
-  //
-  return ((UINTN)DevicePath - (UINTN)Start) + sizeof(EFI_DEVICE_PATH_PROTOCOL);
-}
-
-/**
-
-  @param DispatchHandle   The handle of this callback, obtained when registering
-  @param DispatchContext  The predefined context which contained sleep type and phase
-
-**/
-VOID
-S5SleepWakeOnRtcCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
-  )
-{
-  EnableS5WakeOnRtc();
-}
-
 /**
 
  @retval 1. Check Alarm interrupt is not set.
@@ -981,17 +916,3 @@ HexToBcd(
   return ((UINT8)(LowByte + (HighByte << 4)));
 }
 
-UINT8
-BcdToHex(
-  IN UINT8 BcdValue
-  )
-{
-  UINTN   HighByte;
-  UINTN   LowByte;
-
-  HighByte    = (UINTN)((BcdValue >> 4) * 10);
-  LowByte     = (UINTN)(BcdValue & 0x0F);
-
-  return ((UINT8)(LowByte + HighByte));
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
index 1b7b05d9b3..3c4f55cf54 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
@@ -1,11 +1,8 @@
 #
 #
-# Copyright (c)  1999  - 2018, Intel Corporation. All rights reserved
-#                                                                                  

+# Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
 #
 #  Module Name:
 #
@@ -51,16 +48,8 @@ [LibraryClasses]
 
 [Guids]
   gEfiSetupVariableGuid
-  gDmiDataGuid
-  gEfiAcpiVariableCompatiblityGuid
-  gEfiPciLanInfoGuid
-  gEfiPciLanInfoGuid
-
-[FeaturePcd]
-  gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode
 
 [Protocols]
-  gEfiSmmBase2ProtocolGuid
   gEfiSmmIchnDispatchProtocolGuid
   gEfiGlobalNvsAreaProtocolGuid
   gEfiSmmSwDispatchProtocolGuid
@@ -75,13 +64,11 @@ [Packages]
   IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
 
 [Pcd.common]
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
 
 [Depex]
-  gEfiSmmBase2ProtocolGuid                 AND
   gEfiSmmAccess2ProtocolGuid               AND
   gEfiSmmPowerButtonDispatchProtocolGuid  AND
   gEfiSmmSxDispatchProtocolGuid           AND
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/S3Save.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/S3Save.c
index 19089233b2..7bd0270655 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/S3Save.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/S3Save.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
     IchS3Save.c
@@ -23,52 +20,6 @@ Revision History
 extern  UINT16                          mAcpiBaseAddr;
 EFI_PHYSICAL_ADDRESS                    mRuntimeScriptTableBase;
 
-EFI_STATUS
-InitRuntimeScriptTable (
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  EFI_STATUS        Status;
-  UINT32            VarAttrib;
-  UINTN             VarSize;
-  ACPI_VARIABLE_SET_COMPATIBILITY *AcpiVariableBase;
-
-  //
-  // Allocate runtime ACPI script table space. We need it to save some
-  // settings done by CSM, which runs after normal script table closed
-  //
-  Status = gBS->AllocatePages (
-                  AllocateAnyPages,
-                  EfiACPIReclaimMemory,
-                  1,
-                  &mRuntimeScriptTableBase
-                  );
-  if (EFI_ERROR(Status)) {
-    return EFI_OUT_OF_RESOURCES ;
-  }
-
-  //
-  // Save runtime script table base into global ACPI variable
-  //
-  VarAttrib = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS
-              | EFI_VARIABLE_NON_VOLATILE;
-  VarSize   = sizeof (UINTN);
-  Status = SystemTable->RuntimeServices->GetVariable (
-                          ACPI_GLOBAL_VARIABLE,
-                          &gEfiAcpiVariableCompatiblityGuid,
-                          &VarAttrib,
-                          &VarSize,
-                          &AcpiVariableBase
-                          );
-  if (EFI_ERROR(Status)) {
-    return Status;
-  }
-
-  AcpiVariableBase->RuntimeScriptTableBase = mRuntimeScriptTableBase;
-
-  return EFI_SUCCESS;
-}
-
 EFI_STATUS
 SaveRuntimeScriptTable (
   VOID
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
index 8bf2ebafc1..bcb1d8ae92 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   SmmPlatform.h
@@ -35,7 +33,6 @@ Abstract:
 #include <Protocol/PciRootBridgeIo.h>
 #include <Protocol/LoadedImage.h>
 #include "Protocol/GlobalNvsArea.h"
-#include <Guid/AcpiVariableCompatibility.h>
 #include <Guid/SetupVariable.h>
 #include <Guid/EfiVpdData.h>
 #include <Guid/PciLanInfo.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf b/Platform/Intel/Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
index 331076a2d4..2c0a13f6af 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf
@@ -1,9 +1,8 @@
 #/*++
 #
-#  Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  
+#  Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                     
 #
 #  Module Name:
 #
@@ -29,7 +28,6 @@ [Sources]
 [Packages]
   MdePkg/MdePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2SocBinPkg/Vlv2SocBinPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
 
 [LibraryClasses]
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c
index aa8c213d83..4e02486853 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c
@@ -1,10 +1,8 @@
 /*++
 
-Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   
+Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                                   
-
 
 Module Name:
 
@@ -138,7 +136,7 @@ MISC_SMBIOS_TABLE_FUNCTION(MiscBaseBoardManufacturer)
              &MacStr
              );
   if (EFI_ERROR (Status)) {	
-    return Status;
+    MacStr = L"000000000000";
   }
   SerialNumber = MacStr;    
   SerialNumStrLen = StrLen(SerialNumber);
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
index 15c180129c..81b66ce9af 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
@@ -1,13 +1,9 @@
 /*++
 
-Copyright (c) 1999  - 2014, Intel Corporation.  All rights reserved.
-                                                                                   

+Copyright (c) 1999  - 2019, Intel Corporation.  All rights reserved.
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
-
 Module Name:
 
   MiscOemType0x94Function.c
@@ -36,7 +32,6 @@ Abstract:
 #include <Protocol/I2cBus.h>
 
 #include <Library/IoLib.h>
-#include <Library/I2CLib.h>
 #include <Library/CpuIA32.h>
 #include <Library/UefiRuntimeServicesTableLib.h>
 #include <Guid/PlatformInfo.h>
@@ -527,11 +522,6 @@ UpdatePlatformInformation (
 {
   UINT32                   MicroCodeVersion;
   CHAR16                   Buffer[40];
-  UINT8                    IgdVBIOSRevH;
-  UINT8                    IgdVBIOSRevL;
-  UINT16                   EDX;
-  EFI_IA32_REGISTER_SET    RegSet;
-  EFI_LEGACY_BIOS_PROTOCOL *LegacyBios = NULL;
   EFI_STATUS               Status;
   UINT8                    CpuFlavor=0;
   EFI_PEI_HOB_POINTERS     GuidHob;
@@ -561,34 +551,6 @@ UpdatePlatformInformation (
     }
   }
 
-  //
-  //VBIOS version
-  //
-  Status = gBS->LocateProtocol(
-                  &gEfiLegacyBiosProtocolGuid,
-                  NULL,
-                  (VOID **)&LegacyBios
-                  );
-
-  RegSet.X.AX = 0x5f01;
-  Status = LegacyBios->Int86 (LegacyBios, 0x10, &RegSet);
-  ASSERT_EFI_ERROR(Status);
-
-  //
-  // simulate AMI int15 (ax=5f01) handler
-  // check NbInt15.asm in AMI code for asm edition
-  //
-  EDX = (UINT16)((RegSet.E.EBX >> 16) & 0xffff);
-  IgdVBIOSRevH = (UINT8)(((EDX & 0x0F00) >> 4) | (EDX & 0x000F));
-  IgdVBIOSRevL = (UINT8)(((RegSet.X.BX & 0x0F00) >> 4) | (RegSet.X.BX & 0x000F));
-
-  if (IgdVBIOSRevH==0 && IgdVBIOSRevL==0) {
-    HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), L"N/A", NULL);
-  } else {
-    UnicodeSPrint (Buffer, sizeof (Buffer), L"%02X%02X", IgdVBIOSRevH,IgdVBIOSRevL);
-    HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), Buffer, NULL);
-  }
-
   Status = TGetGOPDriverName(Name);
 
   if(!EFI_ERROR(Status))
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSystemManufacturerFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSystemManufacturerFunction.c
index 63c4f50ed5..f537e0db76 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSystemManufacturerFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSystemManufacturerFunction.c
@@ -1,10 +1,8 @@
 /*++
 
-Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   
+Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                                   
-
 
 Module Name:
 
@@ -219,8 +217,8 @@ AddSmbiosManuCallback (
              NULL,
              &MacStr
              );
-  if (EFI_ERROR (Status)) {	
-    return Status;
+  if (EFI_ERROR (Status)) {
+    MacStr = L"000000000000";
   }
   SerialNumber = MacStr; 
   SerialNumStrLen = StrLen(SerialNumber);
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
index 9d2f5410a0..99b1a18185 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
@@ -2,12 +2,9 @@
 # Component name for module MiscSubclass
 #
 # FIX ME!
-# Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
-#                                                                                  
+# Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-#                                                                                  
-#
-#
 #
 ##
 
@@ -87,9 +84,8 @@ [Packages]
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
   MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  NetworkPkg/NetworkPkg.dec
+  NetworkPkg/NetworkPkg.dec
 
 [LibraryClasses]
   HiiLib
@@ -107,13 +103,10 @@ [LibraryClasses]
   PrintLib
   CpuIA32Lib
   PchPlatformLib
-  I2cLib
   NetLib
   HobLib
   
 [Guids]
-  gEfiProcessorSubClassGuid
-  gEfiCacheSubClassGuid
   gEfiNormalSetupGuid
   gEfiPlatformInfoGuid
   gEfiVlv2VariableGuid
@@ -137,4 +130,4 @@ [Pcd]
   gEfiVLVTokenSpaceGuid.PcdProductSerialNumber
 
 [Depex]
- gEfiSmbiosProtocolGuid AND gMemInfoProtocolGuid AND gEfiMpServiceProtocolGuid AND gEfiSimpleNetworkProtocolGuid
+  gEfiSmbiosProtocolGuid AND gMemInfoProtocolGuid AND gEfiMpServiceProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
index ba81bd9def..8fe1482106 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
@@ -1,13 +1,10 @@
 
 /*++
 
-Copyright (c)  2011  - 2018, Intel Corporation. All rights reserved
-                                                                                   

+Copyright (c)  2011  - 2019, Intel Corporation. All rights reserved
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   IgdOpRegion.c
@@ -35,14 +32,12 @@ Abstract:
 
 #include "IgdOpRegion.h"
 #include "VlvPlatformInit.h"
-#include <FrameworkDxe.h>
-#include <Uefi.h>
+#include <PiDxe.h>
 #include <PchRegs.h>
 
 #include <Guid/DataHubRecords.h>
 
 #include <Protocol/IgdOpRegion.h>
-#include <Protocol/FrameworkHii.h>
 #include <Protocol/FirmwareVolume2.h>
 #include <Protocol/PlatformGopPolicy.h>
 #include <Protocol/PciIo.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.h b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.h
index cd1d208d61..597bdaf46a 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.h
@@ -1,13 +1,10 @@
 
 /*++
 
-Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-                                                                                   

+Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   IgdOpRegion.h
@@ -36,7 +33,7 @@ Abstract:
 #include "VlvPlatformInit.h"
 #include "VlvCommonDefinitions.h"
 #include <Uefi/UefiInternalFormRepresentation.h>
-#include <FrameworkDxe.h>
+#include <PiDxe.h>
 
 //
 //
@@ -177,24 +174,6 @@ GetSVER (
   OUT UINT8 *SVER
   );
 
-/**
-  Acquire the string associated with the ProducerGuid and return it.
-
-  @param ProducerGuid  The Guid to search the HII database for
-  @param Token         The token value of the string to extract
-  @param String        The string that is extracted
-
-  @retval EFI_SUCCESS       The function completed successfully
-  @retval EFI_NOT_FOUND     The requested string was not found
-
-**/
-EFI_STATUS
-GetStringFromToken (
-  IN      EFI_GUID                  *ProducerGuid,
-  IN      STRING_REF                Token,
-  OUT     CHAR16                    **String
-  );
-
 /**
 
   Graphics OpRegion / Software SCI driver installation function.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
index 9d277dd7cf..1e86adadb3 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
@@ -2,11 +2,10 @@
 #
 #/*++
 #
-#  Copyright (c)  1999  - 2018, Intel Corporation. All rights reserved
-#                                                                                  

+#  Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+#                                                                                  
+
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

 #
 #  Module Name:
 #
@@ -34,7 +33,6 @@ [Sources]
 
 [Packages]
   MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
index d8594053b0..8cf8938a4e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
+++ b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
@@ -212,8 +212,12 @@ if defined VS140COMNTOOLS (
   goto :BldFail
 )
 
-echo Ensuring correct build directory is present for GenBiosId...
-set BUILD_PATH=%WORKSPACE%\Build\%PLATFORM_NAME%\%TARGET%_%TOOL_CHAIN_TAG%
+echo Ensuring correct build directory is present
+if "%Arch%"=="IA32" (
+  set BUILD_PATH=%WORKSPACE%\Build\%PLATFORM_NAME%IA32\%TARGET%_%TOOL_CHAIN_TAG%
+) else (
+  set BUILD_PATH=%WORKSPACE%\Build\%PLATFORM_NAME%\%TARGET%_%TOOL_CHAIN_TAG%
+)
 
 echo Modifing Conf files for this build...
 :: Remove lines with these tags from target.txt
@@ -240,16 +244,6 @@ move /Y %WORKSPACE%\Conf\target.txt.tmp %WORKSPACE%\Conf\target.txt >nul
 :: Build BIOS
 ::**********************************************************************
 
-echo Creating BiosId...
-if not exist %BUILD_PATH%\IA32  mkdir %BUILD_PATH%\IA32
-%PLATFORM_PACKAGE%\GenBiosId.exe -i %WORKSPACE%\Conf\BiosId.env -o %BUILD_PATH%\IA32\BiosId.bin -ob %WORKSPACE%\Conf\BiosId.bat
-if "%Arch%"=="X64" (
-   if not exist %BUILD_PATH%\X64  mkdir %BUILD_PATH%\X64
-   %PLATFORM_PACKAGE%\GenBiosId.exe -i %WORKSPACE%\Conf\BiosId.env -o %BUILD_PATH%\X64\BiosId.bin -ob %WORKSPACE%\Conf\BiosId.bat
-)
-
-if %ERRORLEVEL% NEQ 0 goto BldFail
-
 echo.
 echo Invoking EDK2 build...
 call build %Build_Flags%
@@ -267,31 +261,14 @@ pushd %PLATFORM_PACKAGE%
 %PLATFORM_PACKAGE%\fce read -i %BUILD_PATH%\FV\Vlv.fd > %BUILD_PATH%\FV\HiiDefaultData.txt
 
 :: save changes to VlvXXX.fd
-%PLATFORM_PACKAGE%\fce update -i %BUILD_PATH%\FV\Vlv.fd -s %BUILD_PATH%\FV\HiiDefaultData.txt -o %BUILD_PATH%\FV\Vlv%Arch%.fd
+%PLATFORM_PACKAGE%\fce update -i %BUILD_PATH%\FV\Vlv.fd -s %BUILD_PATH%\FV\HiiDefaultData.txt -o %BUILD_PATH%\FV\Vlv.ROM
 popd
 
 if %ERRORLEVEL% NEQ 0 goto BldFail
 ::echo FD successfully updated with default Hii values.
 
-:: Set the Board_Id, Build_Type, Version_Major, and Version_Minor environment variables
-find /v "#" %WORKSPACE%\Conf\BiosId.env > ver_strings
-for /f "tokens=1,3" %%i in (ver_strings) do set %%i=%%j
-del /f/q ver_strings >nul
-
-set BIOS_Name=%BOARD_ID%_%Arch%_%BUILD_TYPE%_%VERSION_MAJOR%_%VERSION_MINOR%.ROM
-copy /y/b %BUILD_PATH%\FV\Vlv%Arch%.fd  %PLATFORM_PACKAGE%\Stitch\%BIOS_Name% >nul
-copy /y/b %BUILD_PATH%\FV\Vlv%Arch%.fd  %BUILD_PATH%\FV\Vlv.ROM >nul
-
-echo.
-echo Build location:     %BUILD_PATH%
-echo BIOS ROM Created:   %BIOS_Name%
-echo.
-echo -------------------- The EDKII BIOS build has successfully completed. --------------------
-echo.
-
 @REM build capsule here
-echo > %BUILD_PATH%\FV\SYSTEMFIRMWAREUPDATECARGO.Fv
-build -p %PLATFORM_PACKAGE%\PlatformCapsule.dsc
+call build -p %PLATFORM_PACKAGE%\PlatformCapsule.dsc
 
 goto Exit
 
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-platforms Patch 03/14] Vlv2TbltDevicePkg: Remove unused modules/libraries
  2019-07-01  2:55 ` [edk2-platforms Patch 03/14] Vlv2TbltDevicePkg: Remove unused modules/libraries Michael D Kinney
@ 2019-07-01  4:07   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:07 UTC (permalink / raw)
  To: Kinney, Michael D, devel@edk2.groups.io; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: Kinney, Michael D 
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-platforms Patch 03/14] Vlv2TbltDevicePkg: Remove unused modules/libraries

* Delete platform specific SerialPortLib
* Delete platform specific Metronome module
* Delete platform specific BootScriptSaveDxe module
* Delete SmmSwDispatch2OnSmmSwDispatchThunk module
* Delete SmramSaveInfoHandlerSmm module
* Delete unused FSP content
* Delete unused I2C content
* Delete unused Stitch content
* Delete unused portions of PlatformSmm module

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../BootScriptSaveDxe/BootScriptSaveDxe.inf   |  60 --
 .../InternalBootScriptSave.h                  | 102 ---
 .../BootScriptSaveDxe/ScriptSave.c            | 626 ---------------
 .../FspAzaliaConfigData/AzaliaConfig.bin      | Bin 3708 -> 0 bytes
 .../FspSupport/BootModePei/BootModePei.c      |  42 -
 .../FspSupport/BootModePei/BootModePei.inf    |  40 -
 .../FspHobProcessLibVlv2.c                    | 421 ----------
 .../FspHobProcessLibVlv2.inf                  |  74 --
 .../FspPlatformSecLibVlv2.c                   | 144 ----
 .../FspPlatformSecLibVlv2.inf                 |  82 --
 .../Ia32/AsmSaveSecContext.asm                |  45 --
 .../SecFspPlatformSecLibVlv2/Ia32/Fsp.inc     |  45 --
 .../Ia32/PeiCoreEntry.asm                     | 135 ----
 .../Ia32/SecEntry.asm                         | 338 --------
 .../SecFspPlatformSecLibVlv2/Ia32/Stack.S     |  71 --
 .../SecFspPlatformSecLibVlv2/Ia32/Stack.asm   |  76 --
 .../SecFspPlatformSecLibVlv2/PlatformInit.c   |  36 -
 .../SecFspPlatformSecLibVlv2/SaveSecContext.c | 108 ---
 .../SecGetPerformance.c                       |  83 --
 .../SecPlatformInformation.c                  |  77 --
 .../SecFspPlatformSecLibVlv2/SecRamInitData.c |  16 -
 .../SecTempRamSupport.c                       | 149 ----
 .../SecFspPlatformSecLibVlv2/UartInit.c       | 192 -----
 .../Include/Protocol/TpmMp.h                  | 136 ----
 .../Include/Protocol/UsbPolicy.h              | 126 ---
 .../Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c |  46 --
 .../Library/I2CLib/I2CLibNull.inf             |  39 -
 .../Library/I2CLibDxe/I2CLib.c                | 735 ------------------
 .../Library/I2CLibDxe/I2CLibDxe.inf           |  39 -
 .../Library/I2CLibDxe/I2CRegs.h               | 126 ---
 .../Library/I2CLibPei/I2CAccess.h             |  44 --
 .../Library/I2CLibPei/I2CDelayPei.c           |  46 --
 .../Library/I2CLibPei/I2CDelayPei.h           |  30 -
 .../Library/I2CLibPei/I2CIoLibPei.c           | 178 -----
 .../Library/I2CLibPei/I2CIoLibPei.h           | 153 ----
 .../Library/I2CLibPei/I2CLibPei.c             | 638 ---------------
 .../Library/I2CLibPei/I2CLibPei.h             | 280 -------
 .../Library/I2CLibPei/I2CLibPei.inf           |  40 -
 .../Library/PlatformFspLib/PlatformFspLib.c   |  44 --
 .../Library/PlatformFspLib/PlatformFspLib.inf |  49 --
 .../SerialPortLib/PlatformSerialPortLib.h     |  53 --
 .../Library/SerialPortLib/SerialPortLib.c     | 246 ------
 .../Library/SerialPortLib/SerialPortLib.inf   |  52 --
 .../Library/SerialPortLib/SioInit.c           | 127 ---
 .../Library/SerialPortLib/SioInit.h           |  62 --
 .../Metronome/LegacyMetronome.c               | 185 -----
 .../Metronome/LegacyMetronome.h               |  64 --
 .../Vlv2TbltDevicePkg/Metronome/Metronome.inf |  49 --
 .../PlatformSmm/SmmScriptSave.c               | 252 ------
 .../PlatformSmm/SmmScriptSave.h               |  50 --
 .../SmmSwDispatch2OnSmmSwDispatchThunk.c      | 459 -----------
 .../SmmSwDispatch2OnSmmSwDispatchThunk.inf    |  54 --
 .../SmramSaveInfoHandlerSmm.c                 | 164 ----
 .../SmramSaveInfoHandlerSmm.inf               |  60 --
 .../Stitch/IFWIHeader/Vacant.bin              | Bin 3928064 -> 0 bytes
 .../Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat   | 270 -------
 .../Stitch/MNW2_Stitch_Config.txt             |  10 -
 57 files changed, 7868 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootScriptSaveDxe.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/InternalBootScriptSave.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/ScriptSave.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/AsmSaveSecContext.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Fsp.inc
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/PeiCoreEntry.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.asm
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/PlatformInit.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SaveSecContext.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecGetPerformance.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecPlatformInformation.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecRamInitData.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecTempRamSupport.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/UartInit.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPolicy.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLibDxe.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRegs.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAccess.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/PlatformSerialPortLib.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIHeader/Vacant.bin
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Config.txt

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootScriptSaveDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootScriptSaveDxe.inf
deleted file mode 100644
index d2fa621096..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootScriptSaveDxe.inf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-## @file
-# Component description file for ScriptSave Lite module.
-#
-# This is an implementation of the Boot Script Save protocol.
-# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = BootScriptSaveDxe
-  FILE_GUID                      = 42BB673D-09F3-4e2e-9FEE-D081131DED5B
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-
-  ENTRY_POINT                    = InitializeScriptSave
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  ScriptSave.c
-  InternalBootScriptSave.h
-
-
-[Packages]
-  MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-
-
-[LibraryClasses]
-  PcdLib
-  UefiRuntimeServicesTableLib
-  UefiBootServicesTableLib
-  MemoryAllocationLib
-  UefiDriverEntryPoint
-  BaseMemoryLib
-  DebugLib
-  BaseLib
-  S3BootScriptLib
-
-[Protocols]
-  gEfiBootScriptSaveProtocolGuid                # PROTOCOL ALWAYS_PRODUCED
-
-
-[Depex]
-  TRUE
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/InternalBootScriptSave.h b/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/InternalBootScriptSave.h
deleted file mode 100644
index f232281e2b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/InternalBootScriptSave.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/** @file
-//
-//
-  Internal header file for S3 Boot Script Saver driver.
-
-  Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-
-#ifndef _INTERNAL_BOOT_SCRIPT_SAVE_H_
-#define _INTERNAL_BOOT_SCRIPT_SAVE_H_
-#include <FrameworkDxe.h>
-
-#include <Protocol/BootScriptSave.h>
-#include <Protocol/FirmwareVolume.h>
-
-#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/S3BootScriptLib.h>
-#include <Library/PcdLib.h>
-#include <Library/SmbusLib.h>
-#include <IndustryStandard/SmBus.h>
-
-/**
-  Adds a record into a specified Framework boot script table.
-
-  This function is used to store a boot script record into a given boot
-  script table. If the table specified by TableName is nonexistent in the
-  system, a new table will automatically be created and then the script record
-  will be added into the new table. A boot script table can add new script records
-  until EFI_BOOT_SCRIPT_SAVE_PROTOCOL.CloseTable() is called. Currently, the only
-  meaningful table name is EFI_ACPI_S3_RESUME_SCRIPT_TABLE. This function is
-  responsible for allocating necessary memory for the script.
-
-  This function has a variable parameter list. The exact parameter list depends on
-  the OpCode that is passed into the function. If an unsupported OpCode or illegal
-  parameter list is passed in, this function returns EFI_INVALID_PARAMETER.
-  If there are not enough resources available for storing more scripts, this function returns
-  EFI_OUT_OF_RESOURCES.
-
-  @param[in]  This                 A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
-  @param[in]  TableName            Name of the script table. Currently, the only meaningful value is
-                                   EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-  @param[in]  OpCode               The operation code (opcode) number.
-  @param[in]  ...                  Argument list that is specific to each opcode.
-
-  @retval EFI_SUCCESS              The operation succeeded. A record was added into the
-                                   specified script table.
-  @retval EFI_INVALID_PARAMETER    The parameter is illegal or the given boot script is not supported.
-                                   If the opcode is unknow or not supported because of the PCD
-                                   Feature Flags.
-  @retval EFI_OUT_OF_RESOURCES     There is insufficient memory to store the boot script.
-
-**/
-EFI_STATUS
-EFIAPI
-BootScriptWrite (
-  IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL    *This,
-  IN UINT16                           TableName,
-  IN UINT16                           OpCode,
-  ...
-  );
-
-/**
-  Closes the specified script table.
-
-  This function closes the specified boot script table and returns the base address
-  of the table. It allocates a new pool to duplicate all the boot scripts in the specified
-  table. Once this function is called, the specified table will be destroyed after it is
-  copied into the allocated pool. As a result, any attempts to add a script record into a
-  closed table will cause a new table to be created. The base address of the allocated pool
-  will be returned in Address. After using the boot script table, the caller is responsible
-  for freeing the pool that is allocated by this function. If the boot script table,
-  such as EFI_ACPI_S3_RESUME_SCRIPT_TABLE, is required to be stored in a nonperturbed
-  memory region, the caller should copy the table into the nonperturbed memory region by itself.
-
-  @param[in]  This              A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
-  @param[in]  TableName         Name of the script table. Currently, the only meaningful value is
-                                EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-  @param[in]  Address           A pointer to the physical address where the table begins.
-
-  @retval EFI_SUCCESS           The table was successfully returned.
-  @retval EFI_NOT_FOUND         The specified table was not created previously.
-  @retval EFI_OUT_OF_RESOURCE   Memory is insufficient to hold the reorganized boot script table.
-  @retval EFI_UNSUPPORTED       The table type is not EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-
-**/
-EFI_STATUS
-EFIAPI
-BootScriptCloseTable (
-  IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL    *This,
-  IN UINT16                           TableName,
-  OUT EFI_PHYSICAL_ADDRESS            *Address
-  );
-#endif //_INTERNAL_BOOT_SCRIPT_SAVE_H_
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/ScriptSave.c b/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/ScriptSave.c
deleted file mode 100644
index 837a8c95cd..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/ScriptSave.c
+++ /dev/null
@@ -1,626 +0,0 @@
-/** @file
-  Implementation for S3 Boot Script Saver driver.
-
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-
-#include "InternalBootScriptSave.h"
-
-EFI_HANDLE                    mHandle = NULL;
-EFI_BOOT_SCRIPT_SAVE_PROTOCOL mS3ScriptSave = {
-  BootScriptWrite,
-  BootScriptCloseTable
-  };
-
-/**
-  Internal function to add IO write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptIoWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINTN                 Count;
-  UINT8                 *Buffer;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Count       = VA_ARG (Marker, UINTN);
-  Buffer      = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSaveIoWrite (Width, Address, Count, Buffer);
-}
-
-/**
-  Internal function to add IO read/write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptIoReadWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINT8                 *Data;
-  UINT8                 *DataMask;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Data        = VA_ARG (Marker, UINT8 *);
-  DataMask    = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSaveIoReadWrite (Width, Address, Data, DataMask);
-}
-
-/**
-  Internal function to add memory write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptMemWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINTN                 Count;
-  UINT8                 *Buffer;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Count       = VA_ARG (Marker, UINTN);
-  Buffer      = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSaveMemWrite (Width, Address, Count, Buffer);
-}
-
-/**
-  Internal function to add memory read/write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptMemReadWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINT8                 *Data;
-  UINT8                 *DataMask;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Data        = VA_ARG (Marker, UINT8 *);
-  DataMask    = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSaveMemReadWrite (Width, Address, Data, DataMask);
-}
-
-/**
-  Internal function to add PciCfg write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptPciCfgWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINTN                 Count;
-  UINT8                 *Buffer;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Count       = VA_ARG (Marker, UINTN);
-  Buffer      = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSavePciCfgWrite (Width, Address, Count, Buffer);
-}
-
-/**
-  Internal function to PciCfg read/write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptPciCfgReadWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINT8                 *Data;
-  UINT8                 *DataMask;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Data        = VA_ARG (Marker, UINT8 *);
-  DataMask    = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSavePciCfgReadWrite (Width, Address, Data, DataMask);
-}
-
-/**
-  Internal function to add PciCfg2 write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptPciCfg2Write (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINTN                 Count;
-  UINT8                 *Buffer;
-  UINT16                Segment;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Count       = VA_ARG (Marker, UINTN);
-  Buffer      = VA_ARG (Marker, UINT8 *);
-  Segment     = VA_ARG (Marker, UINT16);
-
-  return S3BootScriptSavePciCfg2Write (Width, Segment, Address, Count, Buffer);
-}
-
-/**
-  Internal function to PciCfg2 read/write opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptPciCfg2ReadWrite (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT16                Segment;
-  UINT64                Address;
-  UINT8                 *Data;
-  UINT8                 *DataMask;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  Segment     = VA_ARG (Marker, UINT16);
-  Data        = VA_ARG (Marker, UINT8 *);
-  DataMask    = VA_ARG (Marker, UINT8 *);
-
-  return S3BootScriptSavePciCfg2ReadWrite (Width, Segment, Address, Data, DataMask);
-}
-
-/**
-  Internal function to add smbus execute opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptSmbusExecute (
-  IN VA_LIST                       Marker
-  )
-{
-  EFI_SMBUS_DEVICE_ADDRESS  SlaveAddress;
-  EFI_SMBUS_DEVICE_COMMAND  Command;
-  EFI_SMBUS_OPERATION       Operation;
-  BOOLEAN                   PecCheck;
-  VOID                     *Buffer;
-  UINTN                    *DataSize;
-  UINTN                     SmBusAddress;
-
-  SlaveAddress.SmbusDeviceAddress = VA_ARG (Marker, UINTN);
-  Command                         = VA_ARG (Marker, EFI_SMBUS_DEVICE_COMMAND);
-  Operation                       = VA_ARG (Marker, EFI_SMBUS_OPERATION);
-  PecCheck                        = VA_ARG (Marker, BOOLEAN);
-  SmBusAddress                    = SMBUS_LIB_ADDRESS (SlaveAddress.SmbusDeviceAddress,Command,0,PecCheck);
-  DataSize                        = VA_ARG (Marker, UINTN *);
-  Buffer                          = VA_ARG (Marker, VOID *);
-
-  return S3BootScriptSaveSmbusExecute (SmBusAddress, Operation, DataSize, Buffer);
-}
-
-/**
-  Internal function to add stall opcode to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptStall (
-  IN VA_LIST                       Marker
-  )
-{
-  UINT32                Duration;
-
-  Duration    = VA_ARG (Marker, UINT32);
-
-  return S3BootScriptSaveStall (Duration);
-}
-
-/**
-  Internal function to add Save jmp address according to DISPATCH_OPCODE.
-  We ignore "Context" parameter.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptDispatch (
-  IN VA_LIST                       Marker
-  )
-{
-  VOID        *EntryPoint;
-
-  EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
-  return S3BootScriptSaveDispatch (EntryPoint);
-}
-
-/**
-  Internal function to add memory pool operation to the table.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptMemPoll (
-  IN VA_LIST                       Marker
-  )
-{
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;
-  UINT64                Address;
-  UINT8                 *BitMask;
-  UINT8                 *BitValue;
-  UINTN                Duration;
-  UINT64               LoopTimes;
-
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
-  Address     = VA_ARG (Marker, UINT64);
-  BitMask     = VA_ARG (Marker, UINT8 *);
-  BitValue    = VA_ARG (Marker, UINT8 *);
-  Duration    = (UINTN)VA_ARG (Marker, UINT64);
-  LoopTimes   = VA_ARG (Marker, UINT64);
-
-  return S3BootScriptSaveMemPoll (Width, Address, BitMask, BitValue, Duration, LoopTimes);
-}
-
-/**
-  Internal function to add Save jmp address according to DISPATCH_OPCODE2.
-  The "Context" parameter is not ignored.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
-  @retval EFI_SUCCESS           Opcode is added.
-
-**/
-EFI_STATUS
-BootScriptDispatch2 (
-  IN VA_LIST                       Marker
-  )
-{
-  VOID                  *EntryPoint;
-  VOID                  *Context;
-
-  EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
-  Context    = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
-
-  return S3BootScriptSaveDispatch2 (EntryPoint, Context);
-}
-
-/**
-  Internal function to add the opcode link node to the link list.
-
-  @param  Marker                The variable argument list to get the opcode
-                                and associated attributes.
-
-  @retval EFI_OUT_OF_RESOURCES  Not enought resource to complete the operations.
-  @retval EFI_SUCCESS           The opcode entry is added to the link list
-                                successfully.
-**/
-EFI_STATUS
-BootScriptInformation (
-  IN VA_LIST                       Marker
-  )
-{
-  UINT32                InformationLength;
-  EFI_PHYSICAL_ADDRESS  Information;
-
-  InformationLength = VA_ARG (Marker, UINT32);
-  Information = VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
-  return S3BootScriptSaveInformation (InformationLength, (VOID*)(UINTN)Information);
-}
-
-/**
-  Adds a record into a specified Framework boot script table.
-
-  This function is used to store a boot script record into a given boot
-  script table. If the table specified by TableName is nonexistent in the
-  system, a new table will automatically be created and then the script record
-  will be added into the new table. A boot script table can add new script records
-  until EFI_BOOT_SCRIPT_SAVE_PROTOCOL.CloseTable() is called. Currently, the only
-  meaningful table name is EFI_ACPI_S3_RESUME_SCRIPT_TABLE. This function is
-  responsible for allocating necessary memory for the script.
-
-  This function has a variable parameter list. The exact parameter list depends on
-  the OpCode that is passed into the function. If an unsupported OpCode or illegal
-  parameter list is passed in, this function returns EFI_INVALID_PARAMETER.
-  If there are not enough resources available for storing more scripts, this function returns
-  EFI_OUT_OF_RESOURCES.
-
-  @param  This                  A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
-  @param  TableName             Name of the script table. Currently, the only meaningful value is
-                                EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-  @param  OpCode                The operation code (opcode) number.
-  @param  ...                   Argument list that is specific to each opcode.
-
-  @retval EFI_SUCCESS           The operation succeeded. A record was added into the
-                                specified script table.
-  @retval EFI_INVALID_PARAMETER The parameter is illegal or the given boot script is not supported.
-                                If the opcode is unknow or not supported because of the PCD
-                                Feature Flags.
-  @retval EFI_OUT_OF_RESOURCES  There is insufficient memory to store the boot script.
-
-**/
-EFI_STATUS
-EFIAPI
-BootScriptWrite (
-  IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL    *This,
-  IN UINT16                           TableName,
-  IN UINT16                           OpCode,
-  ...
-  )
-{
-  EFI_STATUS                Status;
-  VA_LIST                   Marker;
-
-  if (TableName != FRAMEWORK_EFI_ACPI_S3_RESUME_SCRIPT_TABLE) {
-    //
-    // Only S3 boot script is supported for now.
-    //
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  //
-  // Build script according to opcode.
-  //
-  switch (OpCode) {
-
-  case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptIoWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptIoReadWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptMemWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptMemReadWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptPciCfgWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptPciCfgReadWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptSmbusExecute (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_STALL_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptStall (Marker);
-    VA_END (Marker);
-
-    break;
-
-  case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptDispatch (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptDispatch2 (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptInformation (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptMemPoll (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptPciCfg2Write (Marker);
-    VA_END (Marker);
-    break;
-
-  case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:
-    VA_START (Marker, OpCode);
-    Status = BootScriptPciCfg2ReadWrite (Marker);
-    VA_END (Marker);
-    break;
-
-  default:
-    Status = EFI_INVALID_PARAMETER;
-    break;
-  }
-
-  return Status;
-}
-
-/**
-  Closes the specified script table.
-
-  This function closes the specified boot script table and returns the base address
-  of the table. It allocates a new pool to duplicate all the boot scripts in the specified
-  table. Once this function is called, the specified table will be destroyed after it is
-  copied into the allocated pool. As a result, any attempts to add a script record into a
-  closed table will cause a new table to be created. The base address of the allocated pool
-  will be returned in Address. After using the boot script table, the caller is responsible
-  for freeing the pool that is allocated by this function. If the boot script table,
-  such as EFI_ACPI_S3_RESUME_SCRIPT_TABLE, is required to be stored in a nonperturbed
-  memory region, the caller should copy the table into the nonperturbed memory region by itself.
-
-  @param  This                  A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
-  @param  TableName             Name of the script table. Currently, the only meaningful value is
-                                 EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-  @param  Address               A pointer to the physical address where the table begins.
-
-  @retval EFI_SUCCESS           The table was successfully returned.
-  @retval EFI_NOT_FOUND         The specified table was not created previously.
-  @retval EFI_OUT_OF_RESOURCE   Memory is insufficient to hold the reorganized boot script table.
-  @retval EFI_UNSUPPORTED       The table type is not EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
-
-**/
-EFI_STATUS
-EFIAPI
-BootScriptCloseTable (
-  IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL    *This,
-  IN UINT16                           TableName,
-  OUT EFI_PHYSICAL_ADDRESS            *Address
-  )
-{
-  if (TableName != FRAMEWORK_EFI_ACPI_S3_RESUME_SCRIPT_TABLE) {
-    //
-    // Only S3 boot script is supported for now.
-    //
-    return EFI_NOT_FOUND;
-  }
-  *Address = (EFI_PHYSICAL_ADDRESS)(UINTN)S3BootScriptCloseTable ();
-
-  if (*Address == 0) {
-    return  EFI_NOT_FOUND;
-  }
-  return EFI_SUCCESS;
-}
-
-/**
-  This routine is entry point of ScriptSave driver.
-
-  @param  ImageHandle           Handle for this drivers loaded image protocol.
-  @param  SystemTable           EFI system table.
-
-  @retval EFI_OUT_OF_RESOURCES  No enough resource.
-  @retval EFI_SUCCESS           Succesfully installed the ScriptSave driver.
-  @retval other                 Errors occured.
-
-**/
-EFI_STATUS
-EFIAPI
-InitializeScriptSave (
-  IN EFI_HANDLE           ImageHandle,
-  IN EFI_SYSTEM_TABLE     *SystemTable
-  )
-{
-  return  gBS->InstallProtocolInterface (
-                  &mHandle,
-                  &gEfiBootScriptSaveProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &mS3ScriptSave
-                  );
-
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin b/Platform/Intel/Vlv2TbltDevicePkg/FspAzaliaConfigData/AzaliaConfig.bin
deleted file mode 100644
index da24c02b5d25ce888c630c664095902b4bb035e7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3708
zcmd^>Pl#JZ9LMK3`)XRdt$F?9>(+TQNqa~UwYzRL6+{xdH3}71P@h!~iwKK?QYsja
zyX|(<qQVxzbj5>fq4Da)Ts;(X@!&zpF$WI;5lLww$LD8u(;7lcLET;q4D-G_leaV9
z`ONQ|ZR6t$o%9hYzfnH1u=S6uQmNdpwECI9F1+yKF{PAjL*H2Jq)QXOgh~bLdf(Yj
zx{Q{={HK>X>1pl1uVg3l=gxJ~cL&<PZ)v%co*%q_JNnyNCp|Z$e>&eufBh)t{i$qa
zymz6Ko;kF<fYxKYbk8T9^zHTcrQ*MT^i#$MdK~@MXPtDW{K}NLuFTl3<m0X=(-m=j
zxoZ39zGO`wT@kSrDa94Z8J=B&PSA<u4bN^KJufTqyc{q*yDGXWlW|oJ8lGK47HtDf
zGYxc2)@+UWHJLIsS#>R$wk^39x8#&*q1$rZw$W`_Fm2JUDS6xE|21XSG|_dwU+4RE
znKN}^tDE}4qiNQxW^7I6<C;>Yro`3NRa-~bRo2weO(nLeSfk1ro?RE+MR!%+@QkN|
zrz?1RVBOP<7MszNaYi3BJiC@!v@JCm(@cx`ZMA0GY9(%~l4+||7vWKaClMY+c+gjQ
z+voj#HEa4xy9}OWcz*^@GMnznsNr~Yq{O;PtS`?xHS5iqf=FDD$QES96{Kg1=%Vbl
zMS0m3VWGl$E3CW1e9u<Gcp?p(Fh7yUJWDV&4O^=))-zRfRj$~oyy~jx8oGwAp=;=d
zgfMm;)-J+a4^~2$ISxBz80x{6z}V-ob`s`B_psR-kDkb~#xiTnvqsGtCt0KC8g{rB
zP3}XBd%`+dBTUHSrj18!G|jbT+HgnXu7tKL6RwMAeYprzYp?|qQi3JV)FNz&%jj7X
zX^A6!(MI~Di}ai+pbL7+7W9NGXwC#()Zf`6<3)4@UD4NUh4BhH(b+iB$8Ey<5`7Om
zdQz(``s;53YS<Qi?D>E-M4TfHuF7zggR5<Dbs4T!2V8}46~a{+uCj2&9^kCPc!hIM
z_&yD;%5c?#s}Qb2xGE303gIe*t1?_onwngSH)>SiJXdw*(`=pbI(mb%kTWcEhBrA2
zIYZCcqnz27oLR(~l{m8=XBH05tjw7?&V+lSxhFc{O#D8_N*nw2{oOo<qvGU<2cvs-
z?0LODv*+M8doKOUJ#Jx-XV~NJ!5(viJsyY4fIW_$SqhgaTq?L!aQOgxCKq*<{&yGX
zkp9CRfsW}z{=PoG_IH0bPe#Y_=;&{`NR8(s_2z*{We?Ke!e^Mkh0nBIcm&&M8Xkpk
zF$Whu%LFd=n5yL9Lf}H+A~)n2c_4@3;w!jVgA4M2EaX1N8(HTwj~tK_ag)35GwbjA
z<7<!4yD>cc9uFV911CMxhZ~yh!&U!3uUB~VR348M9xdb1!oZ`MA&-1bp24F$9_ib7
z<ZJTq-I*QoNaN8iJj&vc3_L2~(UBpKUc#eGc(jH`zW(_d9mX{LDbsp*BzSZdk50Na
zcXQ(|dCtUn&NkhnXLF`O4mZf-207bMj(qny&$*(TN|D!!-0qRzC2~AVUbAKu`urxx
z`Ax-mm+>y+Jd@Xo-0u1OCdZW_uj7pLY=(Nlvx(3VIzscz9+{7(zIzV1OU&2I*UZ;H
zWLQt8t)~8r)UF%R=vCNs4M)egTR9b1a<AD+Zl9~<;0B$b6LgZBH1p_r^nC7h$MgT}
zgGV!?HL*tx4`Z4waK8)dxiws$?v`7l^(fC>yTo1d^~nE5K0H#7;CB7D2Hf7NN4M@8
zHA%Q@KgMm@!(F>wZry{scKj6e==4xMQYkzSwVSzj1<zInp82egsOc-z^wE0cJ=zy<
zWce8N=$~Zy5}xe6gC{=Avx6)jBg^0SxppDYAJgysBGC8IOFqyO^vV7}@Au<me3Aa)
og+TA{`cR;E`u>AJKSaMh8|ZiFi`_ua(_elr(C^Vdb2!j{0U29Y3;+NC

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.c
deleted file mode 100644
index bf6c7efba5..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/** @file
-  This PEIM will parse the hoblist from fsp and report them into pei core.
-  This file contains the main entrypoint of the PEIM.
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-
-#include <PiPei.h>
-#include <Ppi/MasterBootMode.h>
-
-static EFI_PEI_PPI_DESCRIPTOR       mPpiList[] = {
-  {
-    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
-    &gEfiPeiMasterBootModePpiGuid,
-    NULL
-  },
-};
-
-/**
-  This is the entrypoint of PEIM
-
-  @param  FileHandle  Handle of the file being invoked.
-  @param  PeiServices Describes the list of possible PEI Services.
-
-  @retval EFI_SUCCESS if it completed successfully.
-**/
-EFI_STATUS
-EFIAPI
-BootModePeiEntryPoint (
-  IN       EFI_PEI_FILE_HANDLE  FileHandle,
-  IN CONST EFI_PEI_SERVICES     **PeiServices
-  )
-{
-  (*PeiServices)->SetBootMode(PeiServices, BOOT_WITH_FULL_CONFIGURATION);
-
-  (*PeiServices)->InstallPpi (PeiServices, &mPpiList[0]);
-
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
deleted file mode 100644
index 27200bca15..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/BootModePei.inf
+++ /dev/null
@@ -1,40 +0,0 @@
-## @file
-# FSP PEI Module
-#
-# Parses the hoblist from fsp and report them into pei core. It will install
-# the memory as required.
-#
-#  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = BootModePeim
-  FILE_GUID                      = 2B1D0832-2184-4C8F-A90D-8E4AF9DE5BCD
-  MODULE_TYPE                    = PEIM
-  VERSION_STRING                 = 1.0
-  ENTRY_POINT                    = BootModePeiEntryPoint
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32
-#
-
-[Sources]
-  BootModePei.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-
-[LibraryClasses]
-  PeimEntryPoint
-
-[Ppis]
-  gEfiPeiMasterBootModePpiGuid
-
-[Depex]
-  TRUE
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c
deleted file mode 100644
index 8a97e25bd4..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c
+++ /dev/null
@@ -1,421 +0,0 @@
-/** @file
-  Null instance of Platform Sec Lib.
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-
-#include <Library/PeiServicesLib.h>
-#include <Library/PeiServicesTablePointerLib.h>
-#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/HobLib.h>
-#include <Library/PcdLib.h>
-#include <Library/FspPlatformInfoLib.h>
-
-#include <Guid/GuidHobFsp.h>
-#include <Guid/MemoryTypeInformation.h>
-#include <Ppi/Capsule.h>
-
-#include <PlatformFspLib.h>
-#include <Guid/SmramMemoryReserve.h>
-EFI_GUID gFspReservedMemoryResourceHobTsegGuid = {0xd038747c, 0xd00c, 0x4980, {0xb3, 0x19, 0x49, 0x01, 0x99, 0xa4, 0x7d, 0x55}};
-
-//
-// Additional pages are used by DXE memory manager.
-// It should be consistent between RetrieveRequiredMemorySize() and GetPeiMemSize()
-//
-#define PEI_ADDITIONAL_MEMORY_SIZE    (16 * EFI_PAGE_SIZE)
-
-/**
-  Get the mem size in memory type infromation table.
-
-  @param PeiServices  PEI Services table.
-
-  @return the mem size in memory type infromation table.
-**/
-UINT64
-GetMemorySizeInMemoryTypeInformation (
-  IN EFI_PEI_SERVICES **PeiServices
-  )
-{
-  EFI_PEI_HOB_POINTERS        Hob;
-  EFI_MEMORY_TYPE_INFORMATION *MemoryData;
-  UINT8                       Index;
-  UINTN                       TempPageNum;
-
-  MemoryData = NULL;
-  (*PeiServices)->GetHobList ((CONST EFI_PEI_SERVICES **)PeiServices, (VOID **) &Hob.Raw);
-  while (!END_OF_HOB_LIST (Hob)) {
-    if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION &&
-      CompareGuid (&Hob.Guid->Name, &gEfiMemoryTypeInformationGuid)) {
-      MemoryData = (EFI_MEMORY_TYPE_INFORMATION *) (Hob.Raw + sizeof (EFI_HOB_GENERIC_HEADER) + sizeof (EFI_GUID));
-      break;
-    }
-
-    Hob.Raw = GET_NEXT_HOB (Hob);
-  }
-
-  if (MemoryData == NULL) {
-    return 0;
-  }
-
-  TempPageNum = 0;
-  for (Index = 0; MemoryData[Index].Type != EfiMaxMemoryType; Index++) {
-    //
-    // Accumulate default memory size requirements
-    //
-    TempPageNum += MemoryData[Index].NumberOfPages;
-  }
-
-  return TempPageNum * EFI_PAGE_SIZE;
-}
-
-/**
-  Get the mem size need to be reserved in PEI phase.
-
-  @param PeiServices  PEI Services table.
-
-  @return the mem size need to be reserved in PEI phase.
-**/
-UINT64
-RetrieveRequiredMemorySize (
-  IN EFI_PEI_SERVICES **PeiServices
-  )
-{
-  UINT64                      Size;
-
-  Size = GetMemorySizeInMemoryTypeInformation (PeiServices);
-  return Size + PEI_ADDITIONAL_MEMORY_SIZE;
-}
-
-/**
-  Get the mem size need to be consumed and reserved in PEI phase.
-
-  @param PeiServices  PEI Services table.
-  @param BootMode     Current boot mode.
-
-  @return the mem size need to be consumed and reserved in PEI phase.
-**/
-UINT64
-GetPeiMemSize (
-  IN EFI_PEI_SERVICES **PeiServices,
-  IN UINT32           BootMode
-  )
-{
-  UINT64                      Size;
-  UINT64                      MinSize;
-
-  if (BootMode == BOOT_IN_RECOVERY_MODE) {
-    return PcdGet32 (PcdPeiRecoveryMinMemSize);
-  }
-
-  Size = GetMemorySizeInMemoryTypeInformation (PeiServices);
-
-  if (BootMode == BOOT_ON_FLASH_UPDATE) {
-    //
-    // Maybe more size when in CapsuleUpdate phase ?
-    //
-    MinSize = PcdGet32 (PcdPeiMinMemSize);
-  } else {
-    MinSize = PcdGet32 (PcdPeiMinMemSize);
-  }
-
-  return MinSize + Size + PEI_ADDITIONAL_MEMORY_SIZE;
-}
-
-/**
-  BIOS process FspBobList.
-
-  @param FspHobList  Pointer to the HOB data structure produced by FSP.
-
-  @return If platform process the FSP hob list successfully.
-**/
-EFI_STATUS
-EFIAPI
-FspHobProcessForMemoryResource (
-  IN VOID                 *FspHobList
-  )
-{
-  EFI_PEI_HOB_POINTERS Hob;
-  UINT64               LowMemorySize;
-  UINT64               FspMemorySize;
-  EFI_PHYSICAL_ADDRESS FspMemoryBase;
-  UINT64               PeiMemSize;
-  EFI_PHYSICAL_ADDRESS PeiMemBase;
-  UINT64               S3PeiMemSize;
-  EFI_PHYSICAL_ADDRESS S3PeiMemBase;
-  BOOLEAN              FoundFspMemHob;
-  EFI_STATUS           Status;
-  EFI_BOOT_MODE        BootMode;
-  PEI_CAPSULE_PPI      *Capsule;
-  VOID                 *CapsuleBuffer;
-  UINTN                CapsuleBufferLength;
-  UINT64               RequiredMemSize;
-  EFI_PEI_SERVICES     **PeiServices;
-  UINT64               TsegSize;
-  EFI_PHYSICAL_ADDRESS TsegBase;
-  BOOLEAN              FoundTsegHob;
-
-  PeiServices = (EFI_PEI_SERVICES **)GetPeiServicesTablePointer ();
-
-  PeiServicesGetBootMode (&BootMode);
-
-  PeiMemBase = 0;
-  LowMemorySize = 0;
-  FspMemorySize = 0;
-  FspMemoryBase = 0;
-  FoundFspMemHob = FALSE;
-  TsegSize      = 0;
-  TsegBase      = 0;
-  FoundTsegHob   = FALSE;
-
-  //
-  // Parse the hob list from fsp
-  // Report all the resource hob except the memory between 1M and 4G
-  //
-  Hob.Raw = (UINT8 *)(UINTN)FspHobList;
-  DEBUG((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));
-
-  while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw)) != NULL) {
-    DEBUG((DEBUG_INFO, "\nResourceType: 0x%x\n", Hob.ResourceDescriptor->ResourceType));
-    if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) ||
-        (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED)) {
-      DEBUG((DEBUG_INFO, "ResourceAttribute: 0x%x\n", Hob.ResourceDescriptor->ResourceAttribute));
-      DEBUG((DEBUG_INFO, "PhysicalStart: 0x%x\n", Hob.ResourceDescriptor->PhysicalStart));
-      DEBUG((DEBUG_INFO, "ResourceLength: 0x%x\n", Hob.ResourceDescriptor->ResourceLength));
-      DEBUG((DEBUG_INFO, "Owner: %g\n\n", &Hob.ResourceDescriptor->Owner));
-    }
-
-    if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY)  // Found the low memory length below 4G
-        && (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB)
-        && (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= BASE_4GB)) {
-        LowMemorySize += Hob.ResourceDescriptor->ResourceLength;
-      Hob.Raw = GET_NEXT_HOB (Hob);
-      continue;
-    }
-
-    if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED)  // Found the low memory length below 4G
-        && (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB)
-        && (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= BASE_4GB)
-        && (CompareGuid (&Hob.ResourceDescriptor->Owner, &gFspReservedMemoryResourceHobGuid))) {
-      FoundFspMemHob = TRUE;
-      FspMemoryBase = Hob.ResourceDescriptor->PhysicalStart;
-      FspMemorySize = Hob.ResourceDescriptor->ResourceLength;
-      DEBUG((DEBUG_INFO, "Find fsp mem hob, base 0x%x, len 0x%x\n", FspMemoryBase, FspMemorySize));
-    }
-
-    if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED)  // Found the low memory length below 4G
-      && (Hob.ResourceDescriptor->PhysicalStart >= 0x100000)
-      && (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= 0x100000000)
-      && (CompareGuid (&Hob.ResourceDescriptor->Owner, &gFspReservedMemoryResourceHobTsegGuid))) {
-        FoundTsegHob = TRUE;
-        TsegBase = Hob.ResourceDescriptor->PhysicalStart;
-
-
-        if ((Hob.ResourceDescriptor->ResourceLength == 0  ) || (Hob.ResourceDescriptor->ResourceLength > 0x800000)){
-          Hob.ResourceDescriptor->ResourceLength = 0x800000;
-        }
-
-
-        TsegSize = Hob.ResourceDescriptor->ResourceLength;
-        DEBUG((EFI_D_ERROR, "Find Tseg mem hob, base 0x%lx, len 0x%lx\n", TsegBase, TsegSize));
-      }
-
-    //
-    // Report the resource hob
-    //
-    BuildResourceDescriptorHob (
-      Hob.ResourceDescriptor->ResourceType,
-      Hob.ResourceDescriptor->ResourceAttribute,
-      Hob.ResourceDescriptor->PhysicalStart,
-      Hob.ResourceDescriptor->ResourceLength
-      );
-
-    Hob.Raw = GET_NEXT_HOB (Hob);
-  }
-
-  if (!FoundFspMemHob) {
-    DEBUG((DEBUG_INFO, "Didn't find the fsp used memory information.\n"));
-    //ASSERT(FALSE);
-  }
-
-  DEBUG((DEBUG_INFO, "LowMemorySize: 0x%x.\n", LowMemorySize));
-  DEBUG((DEBUG_INFO, "FspMemoryBase: 0x%x.\n", FspMemoryBase));
-  DEBUG((DEBUG_INFO, "FspMemorySize: 0x%x.\n", FspMemorySize));
-
-  if (BootMode == BOOT_ON_S3_RESUME) {
-    BuildResourceDescriptorHob (
-      EFI_RESOURCE_SYSTEM_MEMORY,
-      (
-         EFI_RESOURCE_ATTRIBUTE_PRESENT |
-         EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
-         // EFI_RESOURCE_ATTRIBUTE_TESTED |
-         EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
-      ),
-      BASE_1MB,
-      LowMemorySize
-      );
-
-    Status = GetS3MemoryInfo (&S3PeiMemBase, &S3PeiMemSize);
-    ASSERT_EFI_ERROR (Status);
-    DEBUG((DEBUG_INFO, "S3 memory %Xh - %Xh bytes\n", S3PeiMemBase, S3PeiMemSize));
-
-    //
-    // Make sure Stack and PeiMemory are not overlap - JYAO1
-    //
-
-    Status = PeiServicesInstallPeiMemory (
-               S3PeiMemBase,
-               S3PeiMemSize
-               );
-    ASSERT_EFI_ERROR (Status);
-  } else {
-    PeiMemSize = GetPeiMemSize (PeiServices, BootMode);
-    DEBUG((DEBUG_INFO, "PEI memory size = %Xh bytes\n", PeiMemSize));
-
-    //
-    // Capsule mode
-    //
-    Capsule = NULL;
-    CapsuleBuffer = NULL;
-    CapsuleBufferLength = 0;
-    if (BootMode == BOOT_ON_FLASH_UPDATE) {
-      Status = PeiServicesLocatePpi (
-                 &gPeiCapsulePpiGuid,
-                 0,
-                 NULL,
-                 (VOID **) &Capsule
-                 );
-      ASSERT_EFI_ERROR (Status);
-
-      if (Status == EFI_SUCCESS) {
-        //
-        // Make sure Stack and CapsuleBuffer are not overlap - JYAO1
-        //
-        CapsuleBuffer = (VOID *)(UINTN)BASE_1MB;
-        CapsuleBufferLength = (UINTN)(LowMemorySize - PeiMemSize);
-        //
-        // Call the Capsule PPI Coalesce function to coalesce the capsule data.
-        //
-        Status = Capsule->Coalesce (PeiServices, &CapsuleBuffer, &CapsuleBufferLength);
-      }
-    }
-
-    RequiredMemSize = RetrieveRequiredMemorySize (PeiServices);
-    DEBUG((DEBUG_INFO, "Required memory size = %Xh bytes\n", RequiredMemSize));
-
-    //
-    // Report the main memory
-    //
-    BuildResourceDescriptorHob (
-      EFI_RESOURCE_SYSTEM_MEMORY,
-      (
-         EFI_RESOURCE_ATTRIBUTE_PRESENT |
-         EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
-         EFI_RESOURCE_ATTRIBUTE_TESTED |
-         EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
-         EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
-      ),
-      BASE_1MB,
-      LowMemorySize
-      );
-
-    //
-    // Make sure Stack and CapsuleBuffer are not overlap - JYAO1
-    //
-
-    //
-    // Install efi memory
-    //
-    PeiMemBase = BASE_1MB + LowMemorySize - PeiMemSize;
-    Status = PeiServicesInstallPeiMemory (
-               PeiMemBase,
-               PeiMemSize - RequiredMemSize
-               );
-    ASSERT_EFI_ERROR (Status);
-
-    if (Capsule != NULL) {
-      Status = Capsule->CreateState (PeiServices, CapsuleBuffer, CapsuleBufferLength);
-    }
-  }
-
-  //
-  // Report GUIDed HOB for reserving SMRAM regions
-  //
-  if (FoundTsegHob) {
-    EFI_SMRAM_HOB_DESCRIPTOR_BLOCK  *SmramHobDescriptorBlock;
-
-    SmramHobDescriptorBlock = BuildGuidHob (
-             &gEfiSmmPeiSmramMemoryReserveGuid,
-             sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK)
-             );
-    ASSERT (SmramHobDescriptorBlock != NULL);
-
-    SmramHobDescriptorBlock->NumberOfSmmReservedRegions = 1;
-
-    SmramHobDescriptorBlock->Descriptor[0].PhysicalStart = TsegBase;
-    SmramHobDescriptorBlock->Descriptor[0].CpuStart      = TsegBase;
-    SmramHobDescriptorBlock->Descriptor[0].PhysicalSize  = TsegSize;
-    SmramHobDescriptorBlock->Descriptor[0].RegionState   = EFI_SMRAM_CLOSED;
-  }
-  return EFI_SUCCESS;
-}
-
-/**
-  BIOS process FspBobList for other data (not Memory Resource Descriptor).
-
-  @param[in] FspHobList  Pointer to the HOB data structure produced by FSP.
-
-  @return If platform process the FSP hob list successfully.
-**/
-EFI_STATUS
-EFIAPI
-FspHobProcessForOtherData (
-  IN VOID                 *FspHobList
-  )
-{
-  EFI_PEI_SERVICES     **PeiServices;
-
-  PeiServices = (EFI_PEI_SERVICES **)GetPeiServicesTablePointer ();
-
-  //
-  // Other hob for platform
-  //
-  PlatformHobCreateFromFsp ((CONST EFI_PEI_SERVICES **) PeiServices,  FspHobList);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  BIOS process FspBobList.
-
-  @param[in] FspHobList  Pointer to the HOB data structure produced by FSP.
-
-  @return If platform process the FSP hob list successfully.
-**/
-EFI_STATUS
-EFIAPI
-FspHobProcess (
-  IN VOID                 *FspHobList
-  )
-{
-  EFI_STATUS  Status;
-
-  Status = FspHobProcessForMemoryResource (FspHobList);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  Status = FspHobProcessForOtherData (FspHobList);
-
-  return Status;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
deleted file mode 100644
index b789b27f4c..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.inf
+++ /dev/null
@@ -1,74 +0,0 @@
-## @file
-#
-#  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-################################################################################
-#
-# Defines Section - statements that will be processed to create a Makefile.
-#
-################################################################################
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = PeiFspHobProcessLibVlv2
-  FILE_GUID                      = C7B7070B-E5A8-4b86-9110-BDCA1095F496
-  MODULE_TYPE                    = SEC
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = FspHobProcessLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64
-#
-
-################################################################################
-#
-# Sources Section - list of files that are required for the build to succeed.
-#
-################################################################################
-
-[Sources]
-  FspHobProcessLibVlv2.c
-
-
-################################################################################
-#
-# Package Dependency Section - list of Package files that are required for
-#                              this module.
-#
-################################################################################
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
-  IntelFspPkg/IntelFspPkg.dec
-  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-
-[LibraryClasses]
-  BaseLib
-  BaseMemoryLib
-  HobLib
-  DebugLib
-  FspPlatformInfoLib
-  PeiServicesLib
-  PeiServicesTablePointerLib
-  PlatformFspLib
-
-[Pcd]
-  gFspWrapperTokenSpaceGuid.PcdPeiMinMemSize
-  gFspWrapperTokenSpaceGuid.PcdPeiRecoveryMinMemSize
-
-[Guids]
-  gFspReservedMemoryResourceHobGuid
-  gEfiMemoryTypeInformationGuid
-  gEfiSmmPeiSmramMemoryReserveGuid
-
-[Ppis]
-  gPeiCapsulePpiGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.c
deleted file mode 100644
index 2b03cfaec9..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/** @file
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-
-#include <Ppi/SecPlatformInformation.h>
-#include <Ppi/SecPerformance.h>
-#include <Ppi/TemporaryRamSupport.h>
-
-#include <Library/LocalApicLib.h>
-
-/**
-  This interface conveys state information out of the Security (SEC) phase into PEI.
-
-  @param  PeiServices               Pointer to the PEI Services Table.
-  @param  StructureSize             Pointer to the variable describing size of the input buffer.
-  @param  PlatformInformationRecord Pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD.
-
-  @retval EFI_SUCCESS               The data was successfully returned.
-  @retval EFI_BUFFER_TOO_SMALL      The buffer was too small.
-
-**/
-EFI_STATUS
-EFIAPI
-SecPlatformInformation (
-  IN CONST EFI_PEI_SERVICES                     **PeiServices,
-  IN OUT   UINT64                               *StructureSize,
-     OUT   EFI_SEC_PLATFORM_INFORMATION_RECORD  *PlatformInformationRecord
-  );
-
-/**
-  This interface conveys performance information out of the Security (SEC) phase into PEI.
-
-  This service is published by the SEC phase. The SEC phase handoff has an optional
-  EFI_PEI_PPI_DESCRIPTOR list as its final argument when control is passed from SEC into the
-  PEI Foundation. As such, if the platform supports collecting performance data in SEC,
-  this information is encapsulated into the data structure abstracted by this service.
-  This information is collected for the boot-strap processor (BSP) on IA-32.
-
-  @param[in]  PeiServices  The pointer to the PEI Services Table.
-  @param[in]  This         The pointer to this instance of the PEI_SEC_PERFORMANCE_PPI.
-  @param[out] Performance  The pointer to performance data collected in SEC phase.
-
-  @retval EFI_SUCCESS      The data was successfully returned.
-
-**/
-EFI_STATUS
-EFIAPI
-SecGetPerformance (
-  IN CONST EFI_PEI_SERVICES          **PeiServices,
-  IN       PEI_SEC_PERFORMANCE_PPI   *This,
-  OUT      FIRMWARE_SEC_PERFORMANCE  *Performance
-  );
-
-/**
-  This service of the TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into
-  permanent memory.
-
-  @param PeiServices            Pointer to the PEI Services Table.
-  @param TemporaryMemoryBase    Source Address in temporary memory from which the SEC or PEIM will copy the
-                                Temporary RAM contents.
-  @param PermanentMemoryBase    Destination Address in permanent memory into which the SEC or PEIM will copy the
-                                Temporary RAM contents.
-  @param CopySize               Amount of memory to migrate from temporary to permanent memory.
-
-  @retval EFI_SUCCESS           The data was successfully returned.
-  @retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when
-                                TemporaryMemoryBase > PermanentMemoryBase.
-
-**/
-EFI_STATUS
-EFIAPI
-SecTemporaryRamSupport (
-  IN CONST EFI_PEI_SERVICES   **PeiServices,
-  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,
-  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,
-  IN UINTN                    CopySize
-  );
-
-EFI_SEC_PLATFORM_INFORMATION_PPI  mSecPlatformInformationPpi = {
-  SecPlatformInformation
-};
-
-PEI_SEC_PERFORMANCE_PPI  mSecPerformancePpi = {
-  SecGetPerformance
-};
-
-EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI gSecTemporaryRamSupportPpi = {
-  SecTemporaryRamSupport
-};
-
-EFI_PEI_PPI_DESCRIPTOR  mPeiSecPlatformPpi[] = {
-  {
-    EFI_PEI_PPI_DESCRIPTOR_PPI,
-    &gEfiSecPlatformInformationPpiGuid,
-    &mSecPlatformInformationPpi
-  },
-  {
-    EFI_PEI_PPI_DESCRIPTOR_PPI,
-    &gPeiSecPerformancePpiGuid,
-    &mSecPerformancePpi
-  },
-  {
-    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
-    &gEfiTemporaryRamSupportPpiGuid,
-    &gSecTemporaryRamSupportPpi
-  },
-};
-
-/**
-  A developer supplied function to perform platform specific operations.
-
-  It's a developer supplied function to perform any operations appropriate to a
-  given platform. It's invoked just before passing control to PEI core by SEC
-  core. Platform developer may modify the SecCoreData passed to PEI Core.
-  It returns a platform specific PPI list that platform wishes to pass to PEI core.
-  The Generic SEC core module will merge this list to join the final list passed to
-  PEI core.
-
-  @param  SecCoreData           The same parameter as passing to PEI core. It
-                                could be overridden by this function.
-
-  @return The platform specific PPI list to be passed to PEI core or
-          NULL if there is no need of such platform specific PPI list.
-
-**/
-EFI_PEI_PPI_DESCRIPTOR *
-EFIAPI
-SecPlatformMain (
-  IN OUT   EFI_SEC_PEI_HAND_OFF        *SecCoreData
-  )
-{
-  EFI_PEI_PPI_DESCRIPTOR      *PpiList;
-
-  InitializeApicTimer (0, (UINT32) -1, TRUE, 5);
-
-  PpiList = &mPeiSecPlatformPpi[0];
-
-  return PpiList;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
deleted file mode 100644
index 578066d98f..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/FspPlatformSecLibVlv2.inf
+++ /dev/null
@@ -1,82 +0,0 @@
-## @file
-#
-#  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-################################################################################
-#
-# Defines Section - statements that will be processed to create a Makefile.
-#
-################################################################################
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SecPeiFspPlatformSecLibVlv2
-  FILE_GUID                      = 6653876C-F6A1-45BB-A027-20455093BC6D
-  MODULE_TYPE                    = SEC
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = FspPlatformSecLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64
-#
-
-################################################################################
-#
-# Sources Section - list of files that are required for the build to succeed.
-#
-################################################################################
-
-[Sources]
-  FspPlatformSecLibVlv2.c
-  SecRamInitData.c
-  SaveSecContext.c
-  SecPlatformInformation.c
-  SecGetPerformance.c
-  SecTempRamSupport.c
-  PlatformInit.c
-  UartInit.c
-
-[Sources.IA32]
-  Ia32/SecEntry.asm
-  Ia32/PeiCoreEntry.asm
-  Ia32/AsmSaveSecContext.asm
-  Ia32/Stack.asm
-
-################################################################################
-#
-# Package Dependency Section - list of Package files that are required for
-#                              this module.
-#
-################################################################################
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  UefiCpuPkg/UefiCpuPkg.dec
-  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
-
-[LibraryClasses]
-  LocalApicLib
-  SerialPortLib
-
-[Ppis]
-  gEfiSecPlatformInformationPpiGuid
-  gPeiSecPerformancePpiGuid
-  gEfiTemporaryRamSupportPpiGuid
-
-[Pcd]
-  gFspWrapperTokenSpaceGuid.PcdPeiTemporaryRamStackSize
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase
-  gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize
-
-[FixedPcd]
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchAddress
-  gFspWrapperTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize
-  gFspWrapperTokenSpaceGuid.PcdFlashMicroCodeOffset
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheAddress
-  gFspWrapperTokenSpaceGuid.PcdFlashCodeCacheSize
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/AsmSaveSecContext.asm b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/AsmSaveSecContext.asm
deleted file mode 100644
index 2546a09a1a..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/AsmSaveSecContext.asm
+++ /dev/null
@@ -1,45 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-; SPDX-License-Identifier: BSD-2-Clause-Patent
-;
-; Module Name:
-;
-;  SecEntry.asm
-;
-; Abstract:
-;
-;  This is the code that goes from real-mode to protected mode.
-;  It consumes the reset vector, calls two basic APIs from FSP binary.
-;
-;------------------------------------------------------------------------------
-
-.686p
-.xmm
-.model flat,c
-.code
-
-;----------------------------------------------------------------------------
-;  MMX Usage:
-;              MM0 = BIST State
-;              MM5 = Save time-stamp counter value high32bit
-;              MM6 = Save time-stamp counter value low32bit.
-;
-;  It should be same as SecEntry.asm and PeiCoreEntry.asm.
-;----------------------------------------------------------------------------
-
-AsmSaveBistValue   PROC PUBLIC
-  mov     eax, [esp+4]
-  movd    mm0, eax
-  ret
-AsmSaveBistValue   ENDP
-
-AsmSaveTickerValue   PROC PUBLIC
-  mov     eax, [esp+4]
-  movd    mm6, eax
-  mov     eax, [esp+8]
-  movd    mm5, eax
-  ret
-AsmSaveTickerValue   ENDP
-
-END
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Fsp.inc b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Fsp.inc
deleted file mode 100644
index 23295587b4..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Fsp.inc
+++ /dev/null
@@ -1,45 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-; SPDX-License-Identifier: BSD-2-Clause-Patent
-;
-; Module Name:
-;
-;   Fsp.inc
-;
-; Abstract:
-;
-;   Fsp related definitions
-;
-;------------------------------------------------------------------------------
-
-
-;
-; Fv Header
-;
-FVH_SIGINATURE_OFFSET       EQU  028h
-FVH_SIGINATURE_VALID_VALUE  EQU  04856465Fh    ; valid signature:_FVH
-FVH_HEADER_LENGTH_OFFSET    EQU  030h
-FVH_EXTHEADER_OFFSET_OFFSET EQU  034h
-FVH_EXTHEADER_SIZE_OFFSET   EQU  010h
-
-;
-; Ffs Header
-;
-FSP_HEADER_GUID_DWORD1      EQU  0912740BEh
-FSP_HEADER_GUID_DWORD2      EQU  047342284h
-FSP_HEADER_GUID_DWORD3      EQU  0B08471B9h
-FSP_HEADER_GUID_DWORD4      EQU  00C3F3527h
-FFS_HEADER_SIZE_VALUE       EQU  018h
-
-;
-; Section Header
-;
-SECTION_HEADER_TYPE_OFFSET  EQU  03h
-RAW_SECTION_HEADER_SIZE_VALUE  EQU  04h
-
-;
-; Fsp Header
-;
-FSP_HEADER_IMAGEBASE_OFFSET   EQU  01Ch
-FSP_HEADER_TEMPRAMINIT_OFFSET EQU  030h
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/PeiCoreEntry.asm b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/PeiCoreEntry.asm
deleted file mode 100644
index 3d34c62ea4..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/PeiCoreEntry.asm
+++ /dev/null
@@ -1,135 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-; SPDX-License-Identifier: BSD-2-Clause-Patent
-;
-; Module Name:
-;
-;  SecEntry.asm
-;
-; Abstract:
-;
-;  This is the code that goes from real-mode to protected mode.
-;  It consumes the reset vector, calls two basic APIs from FSP binary.
-;
-;------------------------------------------------------------------------------
-
-.686p
-.xmm
-.model flat, c
-.code
-
-EXTRN   SecStartup:NEAR
-EXTRN   PlatformInit:NEAR
-
-CallPeiCoreEntryPoint   PROC PUBLIC
-  ;
-  ; Obtain the hob list pointer
-  ;
-  mov     eax, [esp+4]
-  ;
-  ; Obtain the stack information
-  ;   ECX: start of range
-  ;   EDX: end of range
-  ;
-  mov     ecx, [esp+8]
-  mov     edx, [esp+0Ch]
-
-  ;
-  ; Platform init
-  ;
-  pushad
-  push edx
-  push ecx
-  push eax
-  call PlatformInit
-  pop  eax
-  pop  eax
-  pop  eax
-  popad
-
-  ;
-  ; Set stack top pointer
-  ;
-  mov     esp, edx
-
-  ;
-  ; Push the hob list pointer
-  ;
-  push    eax
-
-  ;
-  ; Save the value
-  ;   ECX: start of range
-  ;   EDX: end of range
-  ;
-  mov     ebp, esp
-  push    ecx
-  push    edx
-
-  ;
-  ; Push processor count to stack first, then BIST status (AP then BSP)
-  ;
-  mov     eax, 1
-  cpuid
-  shr     ebx, 16
-  and     ebx, 0000000FFh
-  cmp     bl, 1
-  jae     PushProcessorCount
-
-  ;
-  ; Some processors report 0 logical processors.  Effectively 0 = 1.
-  ; So we fix up the processor count
-  ;
-  inc     ebx
-
-PushProcessorCount:
-  push    ebx
-
-  ;
-  ; We need to implement a long-term solution for BIST capture.  For now, we just copy BSP BIST
-  ; for all processor threads
-  ;
-  xor     ecx, ecx
-  mov     cl, bl
-PushBist:
-  movd    eax, mm0
-  push    eax
-  loop    PushBist
-
-  ; Save Time-Stamp Counter
-  movd eax, mm5
-  push eax
-
-  movd eax, mm6
-  push eax
-
-  ;
-  ; Pass entry point of the PEI core
-  ;
-  mov     edi, 0FFFFFFE0h
-  push    DWORD PTR ds:[edi]
-
-  ;
-  ; Pass BFV into the PEI Core
-  ;
-  mov     edi, 0FFFFFFFCh
-  push    DWORD PTR ds:[edi]
-
-  ;
-  ; Pass stack size into the PEI Core
-  ;
-  mov     ecx, [ebp - 4]
-  mov     edx, [ebp - 8]
-  push    ecx       ; RamBase
-
-  sub     edx, ecx
-  push    edx       ; RamSize
-
-  ;
-  ; Pass Control into the PEI Core
-  ;
-  call SecStartup
-CallPeiCoreEntryPoint   ENDP
-
-END
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm
deleted file mode 100644
index b7026c433f..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm
+++ /dev/null
@@ -1,338 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-; SPDX-License-Identifier: BSD-2-Clause-Patent
-;
-; Module Name:
-;
-;  SecEntry.asm
-;
-; Abstract:
-;
-;  This is the code that goes from real-mode to protected mode.
-;  It consumes the reset vector, calls two basic APIs from FSP binary.
-;
-;------------------------------------------------------------------------------
-  INCLUDE Fsp.inc
-
-.686p
-.xmm
-.model small, c
-
-EXTRN   CallPeiCoreEntryPoint:NEAR
-EXTRN   TempRamInitParams:FAR
-
-; Pcds
-EXTRN   PcdGet32 (PcdFlashFvFspBase):DWORD
-EXTRN   PcdGet32 (PcdFlashFvFspSize):DWORD
-
-_TEXT_REALMODE      SEGMENT PARA PUBLIC USE16 'CODE'
-                    ASSUME  CS:_TEXT_REALMODE, DS:_TEXT_REALMODE
-
-;----------------------------------------------------------------------------
-;
-; Procedure:    _ModuleEntryPoint
-;
-; Input:        None
-;
-; Output:       None
-;
-; Destroys:     Assume all registers
-;
-; Description:
-;
-;   Transition to non-paged flat-model protected mode from a
-;   hard-coded GDT that provides exactly two descriptors.
-;   This is a bare bones transition to protected mode only
-;   used for a while in PEI and possibly DXE.
-;
-;   After enabling protected mode, a far jump is executed to
-;   transfer to PEI using the newly loaded GDT.
-;
-; Return:       None
-;
-;  MMX Usage:
-;              MM0 = BIST State
-;              MM5 = Save time-stamp counter value high32bit
-;              MM6 = Save time-stamp counter value low32bit.
-;
-;----------------------------------------------------------------------------
-
-align 4
-_ModuleEntryPoint PROC NEAR C PUBLIC
-  fninit                                ; clear any pending Floating point exceptions
-  ;
-  ; Store the BIST value in mm0
-  ;
-  movd    mm0, eax
-
-  ;
-  ; Save time-stamp counter value
-  ; rdtsc load 64bit time-stamp counter to EDX:EAX
-  ;
-  rdtsc
-  movd    mm5, edx
-  movd    mm6, eax
-
-  ;
-  ; Load the GDT table in GdtDesc
-  ;
-  mov     esi,  OFFSET GdtDesc
-  DB      66h
-  lgdt    fword ptr cs:[si]
-
-  ;
-  ; Transition to 16 bit protected mode
-  ;
-  mov     eax, cr0                   ; Get control register 0
-  or      eax, 00000003h             ; Set PE bit (bit #0) & MP bit (bit #1)
-  mov     cr0, eax                   ; Activate protected mode
-
-  mov     eax, cr4                   ; Get control register 4
-  or      eax, 00000600h             ; Set OSFXSR bit (bit #9) & OSXMMEXCPT bit (bit #10)
-  mov     cr4, eax
-
-  ;
-  ; Now we're in 16 bit protected mode
-  ; Set up the selectors for 32 bit protected mode entry
-  ;
-  mov     ax, SYS_DATA_SEL
-  mov     ds, ax
-  mov     es, ax
-  mov     fs, ax
-  mov     gs, ax
-  mov     ss, ax
-
-  ;
-  ; Transition to Flat 32 bit protected mode
-  ; The jump to a far pointer causes the transition to 32 bit mode
-  ;
-  mov esi, offset ProtectedModeEntryLinearAddress
-  jmp     fword ptr cs:[si]
-
-_ModuleEntryPoint   ENDP
-_TEXT_REALMODE      ENDS
-
-_TEXT_PROTECTED_MODE      SEGMENT PARA PUBLIC USE32 'CODE'
-                          ASSUME  CS:_TEXT_PROTECTED_MODE, DS:_TEXT_PROTECTED_MODE
-
-;----------------------------------------------------------------------------
-;
-; Procedure:    ProtectedModeEntryPoint
-;
-; Input:        None
-;
-; Output:       None
-;
-; Destroys:     Assume all registers
-;
-; Description:
-;
-; This function handles:
-;   Call two basic APIs from FSP binary
-;   Initializes stack with some early data (BIST, PEI entry, etc)
-;
-; Return:       None
-;
-;----------------------------------------------------------------------------
-
-align 4
-ProtectedModeEntryPoint PROC NEAR PUBLIC
-
-  ; Find the fsp info header
-  mov  edi, PcdGet32 (PcdFlashFvFspBase)
-  mov  ecx, PcdGet32 (PcdFlashFvFspSize)
-
-  mov  eax, dword ptr [edi + FVH_SIGINATURE_OFFSET]
-  cmp  eax, FVH_SIGINATURE_VALID_VALUE
-  jnz  FspHeaderNotFound
-
-  xor  eax, eax
-  mov  ax, word ptr [edi + FVH_EXTHEADER_OFFSET_OFFSET]
-  cmp  ax, 0
-  jnz  FspFvExtHeaderExist
-
-  xor  eax, eax
-  mov  ax, word ptr [edi + FVH_HEADER_LENGTH_OFFSET]   ; Bypass Fv Header
-  add  edi, eax
-  jmp  FspCheckFfsHeader
-
-FspFvExtHeaderExist:
-  add  edi, eax
-  mov  eax, dword ptr [edi + FVH_EXTHEADER_SIZE_OFFSET]  ; Bypass Ext Fv Header
-  add  edi, eax
-
-  ; Round up to 8 byte alignment
-  mov  eax, edi
-  and  al,  07h
-  jz FspCheckFfsHeader
-
-  and  edi, 0FFFFFFF8h
-  add  edi, 08h
-
-FspCheckFfsHeader:
-  ; Check the ffs guid
-  mov  eax, dword ptr [edi]
-  cmp  eax, FSP_HEADER_GUID_DWORD1
-  jnz FspHeaderNotFound
-
-  mov  eax, dword ptr [edi + 4]
-  cmp  eax, FSP_HEADER_GUID_DWORD2
-  jnz FspHeaderNotFound
-
-  mov  eax, dword ptr [edi + 8]
-  cmp  eax, FSP_HEADER_GUID_DWORD3
-  jnz FspHeaderNotFound
-
-  mov  eax, dword ptr [edi + 0Ch]
-  cmp  eax, FSP_HEADER_GUID_DWORD4
-  jnz FspHeaderNotFound
-
-  add  edi, FFS_HEADER_SIZE_VALUE       ; Bypass the ffs header
-
-  ; Check the section type as raw section
-  mov  al, byte ptr [edi + SECTION_HEADER_TYPE_OFFSET]
-  cmp  al, 019h
-  jnz FspHeaderNotFound
-
-  add  edi, RAW_SECTION_HEADER_SIZE_VALUE ; Bypass the section header
-  jmp FspHeaderFound
-
-FspHeaderNotFound:
-  jmp  $
-
-FspHeaderFound:
-  ; Get the fsp TempRamInit Api address
-  mov eax, dword ptr [edi + FSP_HEADER_IMAGEBASE_OFFSET]
-  add eax, dword ptr [edi + FSP_HEADER_TEMPRAMINIT_OFFSET]
-
-  ; Setup the hardcode stack
-  mov esp, OFFSET TempRamInitStack
-
-  ; Call the fsp TempRamInit Api
-  jmp eax
-
-TempRamInitDone:
-  cmp eax, 0
-  jnz FspApiFailed
-
-  ;   ECX: start of range
-  ;   EDX: end of range
-  mov     esp, edx
-  push    edx
-  push    ecx
-  push    eax ; zero - no hob list yet
-  call CallPeiCoreEntryPoint
-
-FspApiFailed:
-  jmp $
-
-align 10h
-TempRamInitStack:
-    DD  OFFSET TempRamInitDone
-    DD  OFFSET TempRamInitParams
-
-ProtectedModeEntryPoint ENDP
-
-;
-; ROM-based Global-Descriptor Table for the Tiano PEI Phase
-;
-align 16
-PUBLIC  BootGdtTable
-
-;
-; GDT[0]: 0x00: Null entry, never used.
-;
-NULL_SEL            EQU $ - GDT_BASE    ; Selector [0]
-GDT_BASE:
-BootGdtTable        DD  0
-                    DD  0
-;
-; Linear data segment descriptor
-;
-LINEAR_SEL          EQU $ - GDT_BASE    ; Selector [0x8]
-    DW  0FFFFh                          ; limit 0xFFFFF
-    DW  0                               ; base 0
-    DB  0
-    DB  092h                            ; present, ring 0, data, expand-up, writable
-    DB  0CFh                            ; page-granular, 32-bit
-    DB  0
-;
-; Linear code segment descriptor
-;
-LINEAR_CODE_SEL     EQU $ - GDT_BASE    ; Selector [0x10]
-    DW  0FFFFh                          ; limit 0xFFFFF
-    DW  0                               ; base 0
-    DB  0
-    DB  09Bh                            ; present, ring 0, data, expand-up, not-writable
-    DB  0CFh                            ; page-granular, 32-bit
-    DB  0
-;
-; System data segment descriptor
-;
-SYS_DATA_SEL        EQU $ - GDT_BASE    ; Selector [0x18]
-    DW  0FFFFh                          ; limit 0xFFFFF
-    DW  0                               ; base 0
-    DB  0
-    DB  093h                            ; present, ring 0, data, expand-up, not-writable
-    DB  0CFh                            ; page-granular, 32-bit
-    DB  0
-
-;
-; System code segment descriptor
-;
-SYS_CODE_SEL        EQU $ - GDT_BASE    ; Selector [0x20]
-    DW  0FFFFh                          ; limit 0xFFFFF
-    DW  0                               ; base 0
-    DB  0
-    DB  09Ah                            ; present, ring 0, data, expand-up, writable
-    DB  0CFh                            ; page-granular, 32-bit
-    DB  0
-;
-; Spare segment descriptor
-;
-SYS16_CODE_SEL      EQU $ - GDT_BASE    ; Selector [0x28]
-    DW  0FFFFh                          ; limit 0xFFFFF
-    DW  0                               ; base 0
-    DB  0Eh                             ; Changed from F000 to E000.
-    DB  09Bh                            ; present, ring 0, code, expand-up, writable
-    DB  00h                             ; byte-granular, 16-bit
-    DB  0
-;
-; Spare segment descriptor
-;
-SYS16_DATA_SEL      EQU $ - GDT_BASE    ; Selector [0x30]
-    DW  0FFFFh                          ; limit 0xFFFF
-    DW  0                               ; base 0
-    DB  0
-    DB  093h                            ; present, ring 0, data, expand-up, not-writable
-    DB  00h                             ; byte-granular, 16-bit
-    DB  0
-
-;
-; Spare segment descriptor
-;
-SPARE5_SEL          EQU $ - GDT_BASE    ; Selector [0x38]
-    DW  0                               ; limit 0
-    DW  0                               ; base 0
-    DB  0
-    DB  0                               ; present, ring 0, data, expand-up, writable
-    DB  0                               ; page-granular, 32-bit
-    DB  0
-GDT_SIZE            EQU $ - BootGdtTable    ; Size, in bytes
-
-;
-; GDT Descriptor
-;
-GdtDesc:                                ; GDT descriptor
-    DW  GDT_SIZE - 1                    ; GDT limit
-    DD  OFFSET BootGdtTable             ; GDT base address
-
-
-ProtectedModeEntryLinearAddress   LABEL   FWORD
-ProtectedModeEntryLinearOffset    LABEL   DWORD
-  DD      OFFSET ProtectedModeEntryPoint  ; Offset of our 32 bit code
-  DW      LINEAR_CODE_SEL
-
-_TEXT_PROTECTED_MODE    ENDS
-END
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S
deleted file mode 100644
index 9bd29ce0f4..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S
+++ /dev/null
@@ -1,71 +0,0 @@
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-# Abstract:
-#
-#   Switch the stack from temporary memory to permenent memory.
-#
-#------------------------------------------------------------------------------
-
-
-#------------------------------------------------------------------------------
-# VOID
-# EFIAPI
-# SecSwitchStack (
-#   UINT32   TemporaryMemoryBase,
-#   UINT32   PermenentMemoryBase
-#   )#
-#------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX (SecSwitchStack)
-ASM_PFX(SecSwitchStack):
-    #
-    # Save standard registers so they can be used to change stack
-    #
-    pushl %eax
-    pushl %ebx
-    pushl %ecx
-    pushl %edx
-
-    #
-    # !!CAUTION!! this function address's is pushed into stack after
-    # migration of whole temporary memory, so need save it to permenent
-    # memory at first!
-    #
-    movl  20(%esp), %ebx         # Save the first parameter
-    movl  24(%esp), %ecx         # Save the second parameter
-
-    #
-    # Save this function's return address into permenent memory at first.
-    # Then, Fixup the esp point to permenent memory
-    #
-    movl  %esp, %eax
-    subl  %ebx, %eax
-    addl  %ecx, %eax
-    movl  0(%esp), %edx          # copy pushed register's value to permenent memory
-    movl  %edx, 0(%eax)
-    movl  4(%esp), %edx
-    movl  %edx, 4(%eax)
-    movl  8(%esp), %edx
-    movl  %edx, 8(%eax)
-    movl  12(%esp), %edx
-    movl  %edx, 12(%eax)
-    movl  16(%esp), %edx        # Update this function's return address into permenent memory
-    movl  %edx, 16(%eax)
-    movl  %eax, %esp            # From now, esp is pointed to permenent memory
-
-    #
-    # Fixup the ebp point to permenent memory
-    #
-    movl  %ebp, %eax
-    subl  %ebx, %eax
-    addl  %ecx, %eax
-    movl  %eax, %ebp            # From now, ebp is pointed to permenent memory
-
-    popl  %edx
-    popl  %ecx
-    popl  %ebx
-    popl  %eax
-    ret
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.asm b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.asm
deleted file mode 100644
index 95e56cec9b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.asm
+++ /dev/null
@@ -1,76 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-; SPDX-License-Identifier: BSD-2-Clause-Patent
-;
-; Abstract:
-;
-;   Switch the stack from temporary memory to permenent memory.
-;
-;------------------------------------------------------------------------------
-
-    .586p
-    .model  flat,C
-    .code
-
-;------------------------------------------------------------------------------
-; VOID
-; EFIAPI
-; SecSwitchStack (
-;   UINT32   TemporaryMemoryBase,
-;   UINT32   PermenentMemoryBase
-;   );
-;------------------------------------------------------------------------------
-SecSwitchStack   PROC
-    ;
-    ; Save three register: eax, ebx, ecx
-    ;
-    push  eax
-    push  ebx
-    push  ecx
-    push  edx
-
-    ;
-    ; !!CAUTION!! this function address's is pushed into stack after
-    ; migration of whole temporary memory, so need save it to permenent
-    ; memory at first!
-    ;
-
-    mov   ebx, [esp + 20]          ; Save the first parameter
-    mov   ecx, [esp + 24]          ; Save the second parameter
-
-    ;
-    ; Save this function's return address into permenent memory at first.
-    ; Then, Fixup the esp point to permenent memory
-    ;
-    mov   eax, esp
-    sub   eax, ebx
-    add   eax, ecx
-    mov   edx, dword ptr [esp]         ; copy pushed register's value to permenent memory
-    mov   dword ptr [eax], edx
-    mov   edx, dword ptr [esp + 4]
-    mov   dword ptr [eax + 4], edx
-    mov   edx, dword ptr [esp + 8]
-    mov   dword ptr [eax + 8], edx
-    mov   edx, dword ptr [esp + 12]
-    mov   dword ptr [eax + 12], edx
-    mov   edx, dword ptr [esp + 16]    ; Update this function's return address into permenent memory
-    mov   dword ptr [eax + 16], edx
-    mov   esp, eax                     ; From now, esp is pointed to permenent memory
-
-    ;
-    ; Fixup the ebp point to permenent memory
-    ;
-    mov   eax, ebp
-    sub   eax, ebx
-    add   eax, ecx
-    mov   ebp, eax                ; From now, ebp is pointed to permenent memory
-
-    pop   edx
-    pop   ecx
-    pop   ebx
-    pop   eax
-    ret
-SecSwitchStack   ENDP
-
-    END
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/PlatformInit.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/PlatformInit.c
deleted file mode 100644
index d4e1c2a425..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/PlatformInit.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/** @file
-  This PEIM will parse the hoblist from fsp and report them into pei core.
-  This file contains the main entrypoint of the PEIM.
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-
-#include <PiPei.h>
-#include <Library/DebugLib.h>
-#include <Library/SerialPortLib.h>
-
-VOID EnableInternalUart ();
-
-VOID
-EFIAPI
-PlatformInit (
-  IN VOID                 *FspHobList,
-  IN VOID                 *StartOfRange,
-  IN VOID                 *EndOfRange
-  )
-{
-  //
-  // Platform initialization
-  // Enable Serial port here
-  //
-  EnableInternalUart ();
-  SerialPortInitialize ();
-
-  DEBUG ((DEBUG_INFO, "PlatformInit\n"));
-  DEBUG ((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));
-  DEBUG ((DEBUG_INFO, "StartOfRange - 0x%x\n", StartOfRange));
-  DEBUG ((DEBUG_INFO, "EndOfRange - 0x%x\n", EndOfRange));
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SaveSecContext.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SaveSecContext.c
deleted file mode 100644
index 382e617b27..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SaveSecContext.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/** @file
-  This PEIM will parse the hoblist from fsp and report them into pei core.
-  This file contains the main entrypoint of the PEIM.
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-
-#include <PiPei.h>
-#include <Library/DebugLib.h>
-
-#include <Ppi/TopOfTemporaryRam.h>
-#include <Ppi/SecPlatformInformation.h>
-
-/**
-  Save BIST value before call FspInit.
-
-  @param Bist   BIST value.
-**/
-VOID
-AsmSaveBistValue (
-  IN UINT32  Bist
-  );
-
-/**
-  Save Ticker value before call FspInit.
-
-  @param Ticker   Ticker value.
-**/
-VOID
-AsmSaveTickerValue (
-  IN UINT64  Ticker
-  );
-
-/**
-  Save SEC context before call FspInit.
-
-  @param PeiServices  Pointer to PEI Services Table.
-**/
-VOID
-EFIAPI
-SaveSecContext (
-  IN CONST EFI_PEI_SERVICES                     **PeiServices
-  )
-{
-  UINT32      *Bist;
-  UINT64      *Ticker;
-  UINT32      Size;
-  UINT32      Count;
-  UINT32      TopOfTemporaryRam;
-  VOID        *TopOfTemporaryRamPpi;
-  EFI_STATUS  Status;
-
-  DEBUG ((DEBUG_INFO, "SaveSecContext - 0x%x\n", PeiServices));
-
-  Status = (*PeiServices)->LocatePpi (
-                             PeiServices,
-                             &gTopOfTemporaryRamPpiGuid,
-                             0,
-                             NULL,
-                             (VOID **) &TopOfTemporaryRamPpi
-                             );
-  if (EFI_ERROR (Status)) {
-    return ;
-  }
-
-  DEBUG ((DEBUG_INFO, "TopOfTemporaryRamPpi - 0x%x\n", TopOfTemporaryRamPpi));
-
-  //
-  // The entries of BIST information, together with the number of them,
-  // reside in the bottom of stack, left untouched by normal stack operation.
-  // This routine copies the BIST information to the buffer pointed by
-  // PlatformInformationRecord for output.
-  //
-  // |--------------| <- TopOfTemporaryRam
-  // |Number of BSPs|
-  // |--------------|
-  // |     BIST     |
-  // |--------------|
-  // |     ....     |
-  // |--------------|
-  // |  TSC[63:32]  |
-  // |--------------|
-  // |  TSC[31:00]  |
-  // |--------------|
-  //
-
-  TopOfTemporaryRam = (UINT32)(UINTN)TopOfTemporaryRamPpi - sizeof(UINT32);
-  TopOfTemporaryRam -= sizeof(UINT32) * 2;
-  DEBUG ((DEBUG_INFO, "TopOfTemporaryRam - 0x%x\n", TopOfTemporaryRam));
-  Count             = *(UINT32 *)(UINTN)(TopOfTemporaryRam - sizeof(UINT32));
-  DEBUG ((DEBUG_INFO, "Count - 0x%x\n", Count));
-  Size              = Count * sizeof (IA32_HANDOFF_STATUS);
-  DEBUG ((DEBUG_INFO, "Size - 0x%x\n", Size));
-
-  Bist   = (UINT32 *)(UINTN)(TopOfTemporaryRam - sizeof(UINT32) - Size);
-  DEBUG ((DEBUG_INFO, "Bist - 0x%x\n", *Bist));
-  Ticker = (UINT64 *)(UINTN)(TopOfTemporaryRam - sizeof(UINT32) - Size - sizeof(UINT64));
-  DEBUG ((DEBUG_INFO, "Ticker - 0x%lx\n", *Ticker));
-
-  //
-  // Just need record BSP
-  //
-  AsmSaveBistValue (*Bist);
-  AsmSaveTickerValue (*Ticker);
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecGetPerformance.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecGetPerformance.c
deleted file mode 100644
index c5c22a29c2..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecGetPerformance.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/** @file
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-
-#include <Ppi/SecPerformance.h>
-#include <Ppi/TopOfTemporaryRam.h>
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/TimerLib.h>
-#include <Library/DebugLib.h>
-
-/**
-  This interface conveys performance information out of the Security (SEC) phase into PEI.
-
-  This service is published by the SEC phase. The SEC phase handoff has an optional
-  EFI_PEI_PPI_DESCRIPTOR list as its final argument when control is passed from SEC into the
-  PEI Foundation. As such, if the platform supports collecting performance data in SEC,
-  this information is encapsulated into the data structure abstracted by this service.
-  This information is collected for the boot-strap processor (BSP) on IA-32.
-
-  @param[in]  PeiServices  The pointer to the PEI Services Table.
-  @param[in]  This         The pointer to this instance of the PEI_SEC_PERFORMANCE_PPI.
-  @param[out] Performance  The pointer to performance data collected in SEC phase.
-
-  @retval EFI_SUCCESS  The data was successfully returned.
-
-**/
-EFI_STATUS
-EFIAPI
-SecGetPerformance (
-  IN CONST EFI_PEI_SERVICES          **PeiServices,
-  IN       PEI_SEC_PERFORMANCE_PPI   *This,
-  OUT      FIRMWARE_SEC_PERFORMANCE  *Performance
-  )
-{
-  UINT32      Size;
-  UINT32      Count;
-  UINT32      TopOfTemporaryRam;
-  UINT64      Ticker;
-  VOID        *TopOfTemporaryRamPpi;
-  EFI_STATUS  Status;
-
-  DEBUG ((DEBUG_INFO, "SecGetPerformance\n"));
-
-  Status = (*PeiServices)->LocatePpi (
-                             PeiServices,
-                             &gTopOfTemporaryRamPpiGuid,
-                             0,
-                             NULL,
-                             (VOID **) &TopOfTemporaryRamPpi
-                             );
-  if (EFI_ERROR (Status)) {
-    return EFI_NOT_FOUND;
-  }
-
-  //
-  // |--------------| <- TopOfTemporaryRam
-  // |Number of BSPs|
-  // |--------------|
-  // |     BIST     |
-  // |--------------|
-  // |     ....     |
-  // |--------------|
-  // |  TSC[63:32]  |
-  // |--------------|
-  // |  TSC[31:00]  |
-  // |--------------|
-  //
-  TopOfTemporaryRam = (UINT32)(UINTN)TopOfTemporaryRamPpi - sizeof(UINT32);
-  TopOfTemporaryRam -= sizeof(UINT32) * 2;
-  Count             = *(UINT32 *) (UINTN) (TopOfTemporaryRam - sizeof (UINT32));
-  Size              = Count * sizeof (UINT64);
-
-  Ticker = *(UINT64 *) (UINTN) (TopOfTemporaryRam - sizeof (UINT32) - Size - sizeof (UINT32) * 2);
-  Performance->ResetEnd = GetTimeInNanoSecond (Ticker);
-
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecPlatformInformation.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecPlatformInformation.c
deleted file mode 100644
index a1ba35d47d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecPlatformInformation.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/** @file
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-
-#include <Ppi/SecPlatformInformation.h>
-#include <Ppi/TopOfTemporaryRam.h>
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-
-/**
-  This interface conveys state information out of the Security (SEC) phase into PEI.
-
-  @param  PeiServices               Pointer to the PEI Services Table.
-  @param  StructureSize             Pointer to the variable describing size of the input buffer.
-  @param  PlatformInformationRecord Pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD.
-
-  @retval EFI_SUCCESS           The data was successfully returned.
-  @retval EFI_BUFFER_TOO_SMALL  The buffer was too small.
-
-**/
-EFI_STATUS
-EFIAPI
-SecPlatformInformation (
-  IN CONST EFI_PEI_SERVICES                     **PeiServices,
-  IN OUT   UINT64                               *StructureSize,
-     OUT   EFI_SEC_PLATFORM_INFORMATION_RECORD  *PlatformInformationRecord
-  )
-{
-  UINT32      *Bist;
-  UINT32      Size;
-  UINT32      Count;
-  UINT32      TopOfTemporaryRam;
-  VOID        *TopOfTemporaryRamPpi;
-  EFI_STATUS  Status;
-
-  DEBUG ((DEBUG_INFO, "SecPlatformInformation\n"));
-
-  Status = (*PeiServices)->LocatePpi (
-                             PeiServices,
-                             &gTopOfTemporaryRamPpiGuid,
-                             0,
-                             NULL,
-                             (VOID **) &TopOfTemporaryRamPpi
-                             );
-  if (EFI_ERROR (Status)) {
-    return EFI_NOT_FOUND;
-  }
-
-  //
-  // The entries of BIST information, together with the number of them,
-  // reside in the bottom of stack, left untouched by normal stack operation.
-  // This routine copies the BIST information to the buffer pointed by
-  // PlatformInformationRecord for output.
-  //
-  TopOfTemporaryRam = (UINT32)(UINTN)TopOfTemporaryRamPpi - sizeof (UINT32);
-  TopOfTemporaryRam -= sizeof(UINT32) * 2;
-  Count             = *((UINT32 *)(UINTN) (TopOfTemporaryRam - sizeof (UINT32)));
-  Size              = Count * sizeof (IA32_HANDOFF_STATUS);
-
-  if ((*StructureSize) < (UINT64) Size) {
-    *StructureSize = Size;
-    return EFI_BUFFER_TOO_SMALL;
-  }
-
-  *StructureSize  = Size;
-  Bist            = (UINT32 *) (TopOfTemporaryRam - sizeof (UINT32) - Size);
-
-  CopyMem (PlatformInformationRecord, Bist, Size);
-
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecRamInitData.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecRamInitData.c
deleted file mode 100644
index 33734e3111..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecRamInitData.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/** @file
-  Calling Fsp Apis in SEC
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <Library/PcdLib.h>
-
-GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT32 TempRamInitParams[4] = {
-  ((UINT32)FixedPcdGet64 (PcdCpuMicrocodePatchAddress) + FixedPcdGet32 (PcdFlashMicroCodeOffset)),
-  ((UINT32)FixedPcdGet64 (PcdCpuMicrocodePatchRegionSize) - FixedPcdGet32 (PcdFlashMicroCodeOffset)),
-  FixedPcdGet32 (PcdFlashCodeCacheAddress),
-  FixedPcdGet32 (PcdFlashCodeCacheSize)
-};
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecTempRamSupport.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecTempRamSupport.c
deleted file mode 100644
index 8dd1367980..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/SecTempRamSupport.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/** @file
-  C functions in SEC
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-
-#include <Ppi/TemporaryRamSupport.h>
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/PcdLib.h>
-#include <Library/DebugAgentLib.h>
-
-/**
-  Switch the stack in the temporary memory to the one in the permanent memory.
-
-  This function must be invoked after the memory migration immediately. The relative
-  position of the stack in the temporary and permanent memory is same.
-
-  @param TemporaryMemoryBase  Base address of the temporary memory.
-  @param PermenentMemoryBase  Base address of the permanent memory.
-**/
-VOID
-EFIAPI
-SecSwitchStack (
-  UINT32   TemporaryMemoryBase,
-  UINT32   PermenentMemoryBase
-  );
-
-/**
-  This service of the TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into
-  permanent memory.
-
-  @param PeiServices            Pointer to the PEI Services Table.
-  @param TemporaryMemoryBase    Source Address in temporary memory from which the SEC or PEIM will copy the
-                                Temporary RAM contents.
-  @param PermanentMemoryBase    Destination Address in permanent memory into which the SEC or PEIM will copy the
-                                Temporary RAM contents.
-  @param CopySize               Amount of memory to migrate from temporary to permanent memory.
-
-  @retval EFI_SUCCESS           The data was successfully returned.
-  @retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when
-                                TemporaryMemoryBase > PermanentMemoryBase.
-
-**/
-EFI_STATUS
-EFIAPI
-SecTemporaryRamSupport (
-  IN CONST EFI_PEI_SERVICES   **PeiServices,
-  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,
-  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,
-  IN UINTN                    CopySize
-  )
-{
-  IA32_DESCRIPTOR   IdtDescriptor;
-  VOID*             OldHeap;
-  VOID*             NewHeap;
-  VOID*             OldStack;
-  VOID*             NewStack;
-  DEBUG_AGENT_CONTEXT_POSTMEM_SEC  DebugAgentContext;
-  BOOLEAN           OldStatus;
-  UINTN             PeiStackSize;
-
-  PeiStackSize = (UINTN)PcdGet32 (PcdPeiTemporaryRamStackSize);
-  if (PeiStackSize == 0) {
-    PeiStackSize = (CopySize >> 1);
-  }
-
-  ASSERT (PeiStackSize < CopySize);
-
-  //
-  // |-------------------|---->
-  // |      Stack        |    PeiStackSize
-  // |-------------------|---->
-  // |      Heap         |    PeiTemporayRamSize
-  // |-------------------|---->  TempRamBase
-  //
-  // |-------------------|---->
-  // |      Heap         |    PeiTemporayRamSize
-  // |-------------------|---->
-  // |      Stack        |    PeiStackSize
-  // |-------------------|---->  PermanentMemoryBase
-  //
-
-  OldHeap = (VOID*)(UINTN)TemporaryMemoryBase;
-  NewHeap = (VOID*)((UINTN)PermanentMemoryBase + PeiStackSize);
-
-  OldStack = (VOID*)((UINTN)TemporaryMemoryBase + CopySize - PeiStackSize);
-  NewStack = (VOID*)(UINTN)PermanentMemoryBase;
-
-  DebugAgentContext.HeapMigrateOffset = (UINTN)NewHeap - (UINTN)OldHeap;
-  DebugAgentContext.StackMigrateOffset = (UINTN)NewStack - (UINTN)OldStack;
-
-  OldStatus = SaveAndSetDebugTimerInterrupt (FALSE);
-
-  //
-  // Initialize Debug Agent to support source level debug in PEI phase after memory ready.
-  // It will build HOB and fix up the pointer in IDT table.
-  //
-  InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, (VOID *) &DebugAgentContext, NULL);
-
-  //
-  // Migrate Heap
-  //
-  CopyMem (NewHeap, OldHeap, CopySize - PeiStackSize);
-
-  //
-  // Migrate Stack
-  //
-  CopyMem (NewStack, OldStack, PeiStackSize);
-
-
-  //
-  // We need *not* fix the return address because currently,
-  // The PeiCore is executed in flash.
-  //
-
-  //
-  // Rebase IDT table in permanent memory
-  //
-  AsmReadIdtr (&IdtDescriptor);
-  IdtDescriptor.Base = IdtDescriptor.Base - (UINTN)OldStack + (UINTN)NewStack;
-
-  AsmWriteIdtr (&IdtDescriptor);
-
-
-  //
-  // Program MTRR
-  //
-
-  //
-  // SecSwitchStack function must be invoked after the memory migration
-  // immediately, also we need fixup the stack change caused by new call into
-  // permanent memory.
-  //
-  SecSwitchStack (
-    (UINT32) (UINTN) OldStack,
-    (UINT32) (UINTN) NewStack
-    );
-
-  SaveAndSetDebugTimerInterrupt (OldStatus);
-
-  return EFI_SUCCESS;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/UartInit.c b/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/UartInit.c
deleted file mode 100644
index 2a9ab17120..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/UartInit.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/** @file
-  This PEIM will parse the hoblist from fsp and report them into pei core.
-  This file contains the main entrypoint of the PEIM.
-
-  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-
-#include <PiPei.h>
-#include <Library/IoLib.h>
-#include <Library/SerialPortLib.h>
-
-#define PCI_IDX        0xCF8
-#define PCI_DAT        0xCFC
-
-#define PCI_LPC_BASE    (0x8000F800)
-#define PCI_LPC_REG(x)  (PCI_LPC_BASE + (x))
-
-#define PMC_BASE_ADDRESS                  0xFED03000    // PMC Memory Base Address
-#define R_PCH_LPC_PMC_BASE                        0x44  // PBASE, 32bit, 512 Bytes
-#define B_PCH_LPC_PMC_BASE_EN                     BIT1  // Enable Bit
-#define R_PCH_PMC_GEN_PMCON_1                     0x20  // General PM Configuration 1
-#define B_PCH_PMC_GEN_PMCON_SUS_PWR_FLR           BIT14 // SUS Well Power Failure
-#define B_PCH_PMC_GEN_PMCON_PWROK_FLR             BIT16 // PWROK Failure
-
-#define R_PCH_LPC_UART_CTRL                       0x80  // UART Control
-#define B_PCH_LPC_UART_CTRL_COM1_EN               BIT0  // COM1 Enable
-
-#define ILB_BASE_ADDRESS                  0xFED08000    // ILB Memory Base Address
-#define R_PCH_ILB_IRQE                            0x88  // IRQ Enable Control
-
-#define IO_BASE_ADDRESS                   0xFED0C000    // IO Memory Base Address
-
-#define V_PCH_ILB_IRQE_UARTIRQEN_IRQ3             BIT3  // UART IRQ3 Enable
-#define V_PCH_ILB_IRQE_UARTIRQEN_IRQ4             BIT4  // UART IRQ4 Enable
-#define PCIEX_BASE_ADDRESS                        0xE0000000
-#define PCI_EXPRESS_BASE_ADDRESS                  PCIEX_BASE_ADDRESS
-#define PciD31F0RegBase                           PCIEX_BASE_ADDRESS + (UINT32) (31 << 15)
-#define SB_RCBA                                   0xfed1c000
-
-typedef enum {
-  PchA0         = 0,
-  PchA1         = 1,
-  PchB0         = 2,
-  PchB1         = 3,
-  PchB2         = 4,
-  PchB3         = 5,
-  PchC0         = 6,
-  PchSteppingMax
-} PCH_STEPPING;
-
-#define MmPciAddress( Segment, Bus, Device, Function, Register ) \
-  ( (UINTN)PCI_EXPRESS_BASE_ADDRESS + \
-    (UINTN)(Bus << 20) + \
-    (UINTN)(Device << 15) + \
-    (UINTN)(Function << 12) + \
-    (UINTN)(Register) \
-  )
-
-#define DEFAULT_PCI_BUS_NUMBER_PCH  0
-#define PCI_DEVICE_NUMBER_PCH_LPC                 31
-#define PCI_FUNCTION_NUMBER_PCH_LPC               0
-
-#define R_PCH_LPC_RID_CC                          0x08  // Revision ID & Class Code
-
-#define V_PCH_LPC_RID_0                           0x01  // A0 Stepping (17 x 17)
-#define V_PCH_LPC_RID_1                           0x02  // A0 Stepping (25 x 27)
-#define V_PCH_LPC_RID_2                           0x03  // A1 Stepping (17 x 17)
-#define V_PCH_LPC_RID_3                           0x04  // A1 Stepping (25 x 27)
-#define V_PCH_LPC_RID_4                           0x05  // B0 Stepping (17 x 17)
-#define V_PCH_LPC_RID_5                           0x06  // B0 Stepping (25 x 27)
-#define V_PCH_LPC_RID_6                           0x07  // B1 Stepping (17 x 17)
-#define V_PCH_LPC_RID_7                           0x08  // B1 Stepping (25 x 27)
-#define V_PCH_LPC_RID_8                           0x09  // B2 Stepping (17 x 17)
-#define V_PCH_LPC_RID_9                           0x0A  // B2 Stepping (25 x 27)
-#define V_PCH_LPC_RID_A                           0x0B  // B3 Stepping (17 x 17)
-#define V_PCH_LPC_RID_B                           0x0C  // B3 Stepping (25 x 27)
-#define V_PCH_LPC_RID_C                           0x0D  // C0 Stepping (17 x 17)
-#define V_PCH_LPC_RID_D                           0x0E  // C0 Stepping (25 x 27)
-
-/**
-  Return Pch stepping type
-
-  @param[in] None
-
-  @retval PCH_STEPPING            Pch stepping type
-
-**/
-PCH_STEPPING
-EFIAPI
-PchStepping (
-  VOID
-  )
-{
-  UINT8 RevId;
-
-  RevId = MmioRead8 (
-          MmPciAddress (0,
-            DEFAULT_PCI_BUS_NUMBER_PCH,
-            PCI_DEVICE_NUMBER_PCH_LPC,
-            PCI_FUNCTION_NUMBER_PCH_LPC,
-            R_PCH_LPC_RID_CC)
-          );
-
-  switch (RevId) {
-    case V_PCH_LPC_RID_0:
-    case V_PCH_LPC_RID_1:
-      return PchA0;
-      break;
-
-    case V_PCH_LPC_RID_2:
-    case V_PCH_LPC_RID_3:
-      return PchA1;
-      break;
-
-    case V_PCH_LPC_RID_4:
-    case V_PCH_LPC_RID_5:
-      return PchB0;
-      break;
-
-    case V_PCH_LPC_RID_6:
-    case V_PCH_LPC_RID_7:
-      return PchB1;
-      break;
-
-    case V_PCH_LPC_RID_8:
-    case V_PCH_LPC_RID_9:
-      return PchB2;
-      break;
-
-    case V_PCH_LPC_RID_A:
-    case V_PCH_LPC_RID_B:
-      return PchB3;
-      break;
-
-    case V_PCH_LPC_RID_C:
-    case V_PCH_LPC_RID_D:
-      return PchC0;
-      break;
-
-    default:
-      return PchSteppingMax;
-      break;
-
-  }
-}
-
-/**
-  Enable legacy decoding on ICH6
-
- @param[in] none
-
- @retval EFI_SUCCESS     Always returns success.
-
-**/
-VOID
-EnableInternalUart(
-  VOID
-  )
-{
-
-  //
-  // Program and enable PMC Base.
-  //
-  IoWrite32 (PCI_IDX,  PCI_LPC_REG(R_PCH_LPC_PMC_BASE));
-  IoWrite32 (PCI_DAT,  (PMC_BASE_ADDRESS | B_PCH_LPC_PMC_BASE_EN));
-
-  //
-  // Enable COM1 for debug message output.
-  //
-  MmioAndThenOr32 (PMC_BASE_ADDRESS + R_PCH_PMC_GEN_PMCON_1, (UINT32) (~(B_PCH_PMC_GEN_PMCON_SUS_PWR_FLR + B_PCH_PMC_GEN_PMCON_PWROK_FLR)), BIT24);
-
-  //
-  // Silicon Steppings
-  //
-  if (PchStepping()>= PchB0)
-    MmioOr8 (ILB_BASE_ADDRESS + R_PCH_ILB_IRQE, (UINT8) V_PCH_ILB_IRQE_UARTIRQEN_IRQ4);
-  else
-    MmioOr8 (ILB_BASE_ADDRESS + R_PCH_ILB_IRQE, (UINT8) V_PCH_ILB_IRQE_UARTIRQEN_IRQ3);
-  MmioAnd32(IO_BASE_ADDRESS + 0x0520, (UINT32)~(0x00000187));
-  MmioOr32 (IO_BASE_ADDRESS + 0x0520, (UINT32)0x81); // UART3_RXD-L
-  MmioAnd32(IO_BASE_ADDRESS + 0x0530, (UINT32)~(0x00000007));
-  MmioOr32 (IO_BASE_ADDRESS + 0x0530, (UINT32)0x1); // UART3_RXD-L
-  MmioOr8 (PciD31F0RegBase + R_PCH_LPC_UART_CTRL, (UINT8) B_PCH_LPC_UART_CTRL_COM1_EN);
-
-  SerialPortInitialize ();
-  SerialPortWrite ((UINT8 *)"EnableInternalUart!\r\n", sizeof("EnableInternalUart!\r\n") - 1);
-
-  return  ;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.h
deleted file mode 100644
index 415e53daf2..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  Tpm.h
-
-Abstract:
-
-
---*/
-
-#ifndef __EFI_TPM_MP_DRIVER_PROTOCOL_H__
-#define __EFI_TPM_MP_DRIVER_PROTOCOL_H__
-
-
-#define EFI_TPM_MP_DRIVER_PROTOCOL_GUID \
-  { 0xde161cfe, 0x1e60, 0x42a1, 0x8c, 0xc3, 0xee, 0x7e, 0xf0, 0x73, 0x52, 0x12 }
-
-
-EFI_FORWARD_DECLARATION (EFI_TPM_MP_DRIVER_PROTOCOL);
-
-#define TPM_DRIVER_STATUS         0
-#define TPM_DEVICE_STATUS         1
-
-#define TPM_DRIVER_OK             0
-#define TPM_DRIVER_FAILED         1
-#define TPM_DRIVER_NOT_OPENED     2
-#define TPM_DEVICE_OK             0
-#define TPM_DEVICE_UNRECOVERABLE  1
-#define TPM_DEVICE_RECOVERABLE    2
-#define TPM_DEVICE_NOT_FOUND      3
-
-//
-// Prototypes for the TPM MP Driver Protocol
-//
-
-/**
-  This service Open the TPM interface
-
-  @param[in] This             A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.
-
-  @retval  EFI_SUCCESS        Operation completed successfully
-  @retval  EFI_DEVICE_ERROR   The command was unsuccessful
-  @retval  EFI_NOT_FOUND      The component was not running
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_TPM_MP_INIT) (
-  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This
-  );
-
-/**
-  This service close the TPM interface and deactivate TPM
-
-  @param[in] This            A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.
-
-  @retval EFI_SUCCESS        Operation completed successfully
-  @retval EFI_DEVICE_ERROR   The command was unsuccessful
-  @retval EFI_NOT_FOUND      The component was not running
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_TPM_MP_CLOSE) (
-  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This
-  );
-
-/**
-  This service get the current status infomation of TPM
-
-  @param[in]  This                  A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.
-  @param[in]  ReqStatusType	        Requested type of status information, driver or device.
-  @param[in]  Status	              Pointer to the returned status.
-
-  @retval  EFI_SUCCESS              Operation completed successfully
-  @retval  EFI_DEVICE_ERROR         The command was unsuccessful
-  @retval  EFI_INVALID_PARAMETER    One or more of the parameters are incorrect
-  @retval  EFI_BUFFER_TOO_SMALL     The receive buffer is too small
-  @retval  EFI_NOT_FOUND            The component was not running
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_TPM_MP_GET_STATUS_INFO) (
-  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This,
-  IN UINT32				                ReqStatusType,
-  OUT UINT32				              *Status
-  );
-
-/**
-  This service transmit data to the TPM and get response from TPM
-
-  @param[in] This                  A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.
-  @param[in] TransmitBuf	         Pointer to a buffer containing TPM transmit data.
-  @param[in] TransmitBufLen	       Sizeof TPM input buffer in bytes.
-  @param[in] ReceiveBuf	           Pointer to a buffer containing TPM receive data.
-  @param[in]  ReceiveBufLen	       On input, size of TPM receive buffer in bytes.
-                                   On output, number of bytes written.
-
-  @retval  EFI_SUCCESS             Operation completed successfully
-  @retval  EFI_DEVICE_ERROR        The command was unsuccessful
-  @retval  EFI_INVALID_PARAMETER   One or more of the parameters are incorrect
-  @retval  EFI_BUFFER_TOO_SMALL    The receive buffer is too small
-  @retval  EFI_NOT_FOUND           The component was not running
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_TPM_MP_TRANSMIT) (
-  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This,
-  IN UINT8				  	            *TransmitBuffer,
-  IN UINT32			  	              TransmitBufferLen,
-  OUT UINT8				  	            *ReceiveBuf,
-  IN OUT UINT32			  	          *ReceiveBufLen
-  );
-
-
-
-typedef struct _EFI_TPM_MP_DRIVER_PROTOCOL {
-  EFI_TPM_MP_INIT			              Init;
-  EFI_TPM_MP_CLOSE			            Close;
-  EFI_TPM_MP_GET_STATUS_INFO 		    GetStatusInfo;
-  EFI_TPM_MP_TRANSMIT		            Transmit;
-} EFI_TPM_MP_DRIVER_PROTOCOL;
-
-extern EFI_GUID gEfiTpmMpDriverProtocolGuid;
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPolicy.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPolicy.h
deleted file mode 100644
index 16e9f9c6bc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPolicy.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-  UsbPolicy.h
-
-Abstract:
-
---*/
-
-#ifndef _USB_POLICY_H_
-#define _USB_POLICY_H_
-
-EFI_FORWARD_DECLARATION (EFI_USB_POLICY_PROTOCOL);
-
-#define USB_POLICY_GUID \
-  {\
-    0xf617b358, 0x12cf, 0x414a, 0xa0, 0x69, 0x60, 0x67, 0x7b, 0xda, 0x13, 0xb4\
-  }
-
-#define TIANO_CODE_BASE           0x00
-#define ICBD_CODE_BASE            0x01
-
-#define ATUO_TYPE                 0x00
-#define USB_FDD_TYPE              0x01
-#define HDD_TYPE                  0x02
-#define ZIP_TYPE                  0x03
-#define CDROM_TYPE                0x04
-#define SIZE_TYPE                 0x05
-
-#define ZIP_FDD                 0x80
-
-#define FDD_EMULATION             0x00
-#define HDD_EMULATION             0x01
-
-#define HIGH_SPEED                0x00
-#define FULL_SPEED                0x01
-#define SUPER_SPEED               0x02
-
-#define LEGACY_KB_EN              0x01
-#define LEGACY_KB_DIS             0x00
-#define LEGACY_MS_EN              0x01
-#define LEGACY_MS_DIS             0x00
-#define LEGACY_USB_EN             0x00
-#define LEGACY_USB_DIS            0x01
-#define LEGACY_FREE_SUPP          0x01
-#define LEGACY_FREE_UN_SUPP       0x00
-#define LEGACY_PERIOD_SUPP        0x01
-#define LEGACY_PERIOD_UN_SUPP     0x00
-
-#define LEGACY_USB_TIME_TUE_ENABLE       0x01
-#define LEGACY_USB_TIME_TUE_DISABLE      0x00
-#define USB_HAVE_HUB_INTERNEL            0x01
-#define USB_NOT_HAVE_HUB_INTERNEL        0x00
-
-#define USB_POLICY_PROTOCOL_REVISION_1 1
-#define USB_POLICY_PROTOCOL_REVISION_2 2
-
-#ifndef __GNUC__
-#pragma warning ( disable : 4306 )
-#pragma warning ( disable : 4054 )
-#endif
-
-#define GET_USB_CFG (UsbCfg);\
- do{\
-  UINT16                *pSegOfEbda;\
-  UINT32                mToEbda;\
-  pSegOfEbda = (UINT16 *)(UINTN)0x40E;\
-  mToEbda    = (UINT32)(((UINTN)(*pSegOfEbda) << 4) + 0x80);\
-  UsbCfg     = (USB_CFG *)(UINTN)mToEbda;\
- }while(0);
-
-#pragma    pack(1)
-typedef struct {
-    UINT8   HasUSBKeyboard:1;
-    UINT8   HasUSBMouse:1;
-    UINT8   LegacyFreeSupport:1;
-    UINT8   UsbOperationMode:1;
-    UINT8   LegacyKBEnable:1;
-    UINT8   LegacyMSEnable:1;
-    UINT8   USBPeriodSupport:1;
-    UINT8   Reserved:1;
-} USB_DEVICE_INFOR;
-
-typedef struct {
-    UINT8               Codebase;
-    UINT8               USBHDDForceType;
-    UINT8               Configurated;
-    UINT8               LpcAcpiBase;
-    UINT8               AcpiTimerReg;
-    UINT8               Reserved1[0x01];
-    UINT8               LegacyUsbEnable;
-    USB_DEVICE_INFOR    UsbDeviceInfor;
-    UINT16              UsbEmulationSize;
-    UINT8               Reserved2[0x06];
-} USB_CFG;
-#pragma pack()
-
-typedef struct _EFI_USB_POLICY_PROTOCOL{
-  UINT8   Version;
-  UINT8   UsbMassStorageEmulationType;  // 1: FDD_Type; 2: HDD_Type; other:Auto_Type*
-  UINT8   UsbOperationMode;             // 0: High_Speed; 1: Full_Speed;
-  UINT8   LegacyKBEnable;               // 0: Disabled;   1: Enabled*
-  UINT8   LegacyMSEnable;               // 0: Disabled;   1: Enabled*
-  UINT8   USBPeriodSupport;             // 0; Unsupport;  1: Support
-  UINT8   LegacyUsbEnable;              // 1: Disabled;   0: Enabled*
-  UINT8   LegacyFreeSupport;            // 0: Unsupport;  1: Support
-  UINT8   CodeBase;
-  UINT8   LpcAcpiBase;                  // 40h(default)
-  UINT8   AcpiTimerReg;
-  UINT8   UsbTimeTue;
-  UINT8   InternelHubExist;             // 1: Host have internel hub on board; 0: No internel hub on board
-  UINT8   EnumWaitPortStableStall;      // Value for wait port stable when enum a new dev.
-  UINT16  UsbEmulationSize;             // Mbytes.
-  UINT8   UsbZipEmulationType;
-  UINT8   Reserved[3];                  // Reserved fields for future expansion w/o protocol change
-} EFI_USB_POLICY_PROTOCOL;
-
-extern EFI_GUID gUsbPolicyGuid;
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c
deleted file mode 100644
index 85f066a9e3..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*++
-
-Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  I2CLib.c
-
-
-
---*/
-#ifdef ECP_FLAG
-#include "EdkIIGlueDxe.h"
-#else
-#include <Library/DebugLib.h>
-#include <Library/TimerLib.h>
-#endif
-#include <PchRegs/PchRegsPcu.h>
-#include <PchRegs.h>
-#include <PlatformBaseAddresses.h>
-#include <PchRegs/PchRegsLpss.h>
-#ifdef ECP_FLAG
-#include "I2CLib.h"
-#else
-#include <Library/I2CLib.h>
-#endif
-#include <Protocol/GlobalNvsArea.h>
-#ifndef ECP_FLAG
-#include <Library/UefiBootServicesTableLib.h>
-#endif
-
-EFI_STATUS ByteReadI2C(
-  IN  UINT8 BusNo,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer
-  )
-{
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
deleted file mode 100644
index d669a4eaf8..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNull.inf
+++ /dev/null
@@ -1,39 +0,0 @@
-## @file
-# Null instance of Debug Agent Library with empty functions.
-#
-#  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-#
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = I2CLib
-  FILE_GUID                      = 7f62bf44-2ba7-4c2d-9d4a-91c8906ff053
-  MODULE_TYPE                    = BASE
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = I2CLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources.common]
-  I2CLib.c
-
-[LibraryClasses]
-  BaseLib
-  IoLib
-  TimerLib
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-
-[Protocols]
-  gEfiGlobalNvsAreaProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLib.c
deleted file mode 100644
index 104c2ded43..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLib.c
+++ /dev/null
@@ -1,735 +0,0 @@
-/** @file
-  Functions for accessing I2C registers.
-  
-  Copyright (c) 2004  - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                               
---*/
-
-#include <Library/DebugLib.h>
-#include <Library/TimerLib.h>
-#include <PchRegs/PchRegsPcu.h> 
-#include <PchRegs.h>
-#include <PlatformBaseAddresses.h>
-#include <PchRegs/PchRegsLpss.h> 
-#include <Library/I2CLib.h>
-#include <Protocol/GlobalNvsArea.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <I2CRegs.h>
-
-#define GLOBAL_NVS_OFFSET(Field)    (UINTN)((CHAR8*)&((EFI_GLOBAL_NVS_AREA*)0)->Field - (CHAR8*)0)
-
-#define PCIEX_BASE_ADDRESS  0xE0000000
-#define PCI_EXPRESS_BASE_ADDRESS ((VOID *) (UINTN) PCIEX_BASE_ADDRESS)
-#define MmPciAddress( Segment, Bus, Device, Function, Register ) \
-         ((UINTN)PCI_EXPRESS_BASE_ADDRESS + \
-         (UINTN)(Bus << 20) + \
-         (UINTN)(Device << 15) + \
-         (UINTN)(Function << 12) + \
-         (UINTN)(Register) \
-        )
-#define PCI_D31F0_REG_BASE             PCIEX_BASE_ADDRESS + (UINT32) (31 << 15)
-
-typedef struct _LPSS_PCI_DEVICE_INFO {
-  UINTN        Segment;
-  UINTN        BusNum;
-  UINTN        DeviceNum;
-  UINTN        FunctionNum;
-  UINTN        Bar0;
-  UINTN        Bar1;
-} LPSS_PCI_DEVICE_INFO;
-
-LPSS_PCI_DEVICE_INFO  mLpssPciDeviceList[] = {
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_DMAC1, PCI_FUNCTION_NUMBER_PCH_LPSS_DMAC, 0xFE900000, 0xFE908000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C0, 0xFE910000, 0xFE918000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C1, 0xFE920000, 0xFE928000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C2, 0xFE930000, 0xFE938000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C3, 0xFE940000, 0xFE948000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C4, 0xFE950000, 0xFE958000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C5, 0xFE960000, 0xFE968000},
-  {0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C,   PCI_FUNCTION_NUMBER_PCH_LPSS_I2C6, 0xFE970000, 0xFE978000}
-};
-
-#define LPSS_PCI_DEVICE_NUMBER  sizeof(mLpssPciDeviceList)/sizeof(LPSS_PCI_DEVICE_INFO)
-
-STATIC UINTN mI2CBaseAddress = 0;
-STATIC UINT16 mI2CSlaveAddress = 0;
-
-UINT16 mI2cMode=B_IC_RESTART_EN | B_IC_SLAVE_DISABLE | B_MASTER_MODE ;
-
-UINTN mI2cNvsBaseAddress[] = {
-        GLOBAL_NVS_OFFSET(LDMA2Addr),
-        GLOBAL_NVS_OFFSET(I2C1Addr),
-        GLOBAL_NVS_OFFSET(I2C2Addr),
-        GLOBAL_NVS_OFFSET(I2C3Addr),
-        GLOBAL_NVS_OFFSET(I2C4Addr),
-        GLOBAL_NVS_OFFSET(I2C5Addr),
-        GLOBAL_NVS_OFFSET(I2C6Addr),
-        GLOBAL_NVS_OFFSET(I2C7Addr)
-      };
-
-/**
-  This function get I2Cx controller base address (BAR0).
-
-  @param I2cControllerIndex  Bus Number of I2C controller.
-
-  @return I2C BAR. 
-**/
-UINTN
-GetI2cBarAddr(
-  IN    UINT8 I2cControllerIndex
-  )
-{
-  EFI_STATUS           Status;
-  EFI_GLOBAL_NVS_AREA_PROTOCOL  *GlobalNvsArea;
-  UINTN  AcpiBaseAddr;
-  UINTN  PciMmBase=0;
-
-  ASSERT(gBS!=NULL);
-
-  Status = gBS->LocateProtocol (
-                  &gEfiGlobalNvsAreaProtocolGuid,
-                  NULL,
-                  &GlobalNvsArea
-                  );
-                  
-  //
-  // PCI mode from PEI ( Global NVS is not ready).
-  //
-  if (EFI_ERROR(Status)) {
-    DEBUG ((EFI_D_INFO, "GetI2cBarAddr() gEfiGlobalNvsAreaProtocolGuid:%r\n", Status));
-    //
-    // Global NVS is not ready.
-    //
-    return 0;
-  }
-
-  AcpiBaseAddr =  *(UINTN*)((CHAR8*)GlobalNvsArea->Area + mI2cNvsBaseAddress[I2cControllerIndex + 1]);
-  
-  //
-  //PCI mode from DXE (global NVS protocal) to LPSS OnReadytoBoot(swith to ACPI).
-  //
-  if(AcpiBaseAddr==0) {
-    PciMmBase = MmPciAddress (
-                  mLpssPciDeviceList[I2cControllerIndex + 1].Segment,
-                  mLpssPciDeviceList[I2cControllerIndex + 1].BusNum,
-                  mLpssPciDeviceList[I2cControllerIndex + 1].DeviceNum,
-                  mLpssPciDeviceList[I2cControllerIndex + 1].FunctionNum,
-                  0
-                  );
-    DEBUG((EFI_D_ERROR, "\nGetI2cBarAddr() I2C Device %x %x %x PciMmBase:%x\n", \
-           mLpssPciDeviceList[I2cControllerIndex + 1].BusNum, \
-           mLpssPciDeviceList[I2cControllerIndex + 1].DeviceNum, \
-           mLpssPciDeviceList[I2cControllerIndex + 1].FunctionNum, PciMmBase));
-
-    if (MmioRead32 (PciMmBase) != 0xFFFFFFFF)    {
-      if((MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_STSCMD)& B_PCH_LPSS_I2C_STSCMD_MSE)) {
-        //
-        // Get the address allocted.
-        //
-        mLpssPciDeviceList[I2cControllerIndex + 1].Bar0=MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR);     
-        mLpssPciDeviceList[I2cControllerIndex + 1].Bar1=MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR1);
-      }
-    }
-    AcpiBaseAddr =mLpssPciDeviceList[I2cControllerIndex+1].Bar0;
-  }
-  
-  //
-  // ACPI mode from BDS: LPSS OnReadytoBoot
-  //
-  else {
-    DEBUG ((EFI_D_INFO, "GetI2cBarAddr() NVS Varialable is updated by this LIB or LPSS  \n"));
-  }
-  
-  DEBUG ((EFI_D_INFO, "GetI2cBarAddr() I2cControllerIndex+1 0x%x AcpiBaseAddr:0x%x \n", (I2cControllerIndex + 1), AcpiBaseAddr));
-  return AcpiBaseAddr;
-}
-
-
-/**
-  This function enables I2C controllers.
-
-  @param I2cControllerIndex  Bus Number of I2C controllers.
-
-  @return Result of the I2C initialization.
-**/
-EFI_STATUS
-ProgramPciLpssI2C (
-  IN  UINT8 I2cControllerIndex
-  )
-{
-  UINT32                        PmcBase;
-  UINTN                         PciMmBase=0;
-  EFI_STATUS                    Status;
-  EFI_GLOBAL_NVS_AREA_PROTOCOL  *GlobalNvsArea;
-
-  UINT32 PmcFunctionDsiable[]= {
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC1,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC2,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC3,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC4,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC5,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC6,
-    B_PCH_PMC_FUNC_DIS_LPSS2_FUNC7
-  };
-
-  DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() Start\n"));
-
-  //
-  // Set the VLV Function Disable Register to ZERO
-  //
-  PmcBase = MmioRead32 (PCI_D31F0_REG_BASE + R_PCH_LPC_PMC_BASE) & B_PCH_LPC_PMC_BASE_BAR;
-  if(MmioRead32(PmcBase+R_PCH_PMC_FUNC_DIS)&PmcFunctionDsiable[I2cControllerIndex]) {
-    DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() End:I2C[%x] is disabled\n",I2cControllerIndex));
-    return EFI_NOT_READY;
-  }
-  
-  DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C()------------I2cControllerIndex=%x,PMC=%x\n",I2cControllerIndex,MmioRead32(PmcBase+R_PCH_PMC_FUNC_DIS)));
-
-  {
-    PciMmBase = MmPciAddress (
-                  mLpssPciDeviceList[I2cControllerIndex+1].Segment,
-                  mLpssPciDeviceList[I2cControllerIndex+1].BusNum,
-                  mLpssPciDeviceList[I2cControllerIndex+1].DeviceNum,
-                  mLpssPciDeviceList[I2cControllerIndex+1].FunctionNum,
-                  0
-                  );
-                  
-    DEBUG((EFI_D_ERROR, "Program Pci Lpss I2C Device  %x %x %x PciMmBase:%x\n", \
-           mLpssPciDeviceList[I2cControllerIndex+1].BusNum, \
-           mLpssPciDeviceList[I2cControllerIndex+1].DeviceNum, \
-           mLpssPciDeviceList[I2cControllerIndex+1].FunctionNum, PciMmBase));
-
-    if (MmioRead32 (PciMmBase) != 0xFFFFFFFF)     {
-      if((MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_STSCMD)& B_PCH_LPSS_I2C_STSCMD_MSE)) {
-        //
-        // Get the address allocted.
-        //
-        mLpssPciDeviceList[I2cControllerIndex+1].Bar0=MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR);     
-        mLpssPciDeviceList[I2cControllerIndex+1].Bar1=MmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR1);
-        DEBUG((EFI_D_ERROR, "ProgramPciLpssI2C() bar0:0x%x bar1:0x%x\n",mLpssPciDeviceList[I2cControllerIndex+1].Bar0, mLpssPciDeviceList[I2cControllerIndex+1].Bar1));
-      } else {
-        
-        //
-        // Program BAR 0
-        //
-        ASSERT (((mLpssPciDeviceList[I2cControllerIndex+1].Bar0 & B_PCH_LPSS_I2C_BAR_BA) == mLpssPciDeviceList[I2cControllerIndex+1].Bar0) && (mLpssPciDeviceList[I2cControllerIndex+1].Bar0 != 0));
-        MmioWrite32 ((UINTN) (PciMmBase + R_PCH_LPSS_I2C_BAR), (UINT32) (mLpssPciDeviceList[I2cControllerIndex+1].Bar0 & B_PCH_LPSS_I2C_BAR_BA));
-       
-        //
-        // Program BAR 1
-        //
-        ASSERT (((mLpssPciDeviceList[I2cControllerIndex+1].Bar1 & B_PCH_LPSS_I2C_BAR1_BA) == mLpssPciDeviceList[I2cControllerIndex+1].Bar1) && (mLpssPciDeviceList[I2cControllerIndex+1].Bar1 != 0));
-        MmioWrite32 ((UINTN) (PciMmBase + R_PCH_LPSS_I2C_BAR1), (UINT32) (mLpssPciDeviceList[I2cControllerIndex+1].Bar1 & B_PCH_LPSS_I2C_BAR1_BA));
-        
-        //
-        // Bus Master Enable & Memory Space Enable
-        //
-        MmioOr32 ((UINTN) (PciMmBase + R_PCH_LPSS_I2C_STSCMD), (UINT32) (B_PCH_LPSS_I2C_STSCMD_BME | B_PCH_LPSS_I2C_STSCMD_MSE));
-        ASSERT (MmioRead32 (mLpssPciDeviceList[I2cControllerIndex+1].Bar0) != 0xFFFFFFFF);
-      }
-      
-      //
-      // Release Resets
-      //
-      MmioWrite32 (mLpssPciDeviceList[I2cControllerIndex+1].Bar0 + R_PCH_LPIO_I2C_MEM_RESETS,(B_PCH_LPIO_I2C_MEM_RESETS_FUNC | B_PCH_LPIO_I2C_MEM_RESETS_APB));
-      
-      //
-      // Activate Clocks
-      //
-      MmioWrite32 (mLpssPciDeviceList[I2cControllerIndex+1].Bar0 + R_PCH_LPSS_I2C_MEM_PCP,0x80020003);//No use for A0
-
-      DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() Programmed()\n"));
-    }
-    
-    //
-    // BDS: already switched to ACPI mode
-    //
-    else {
-      ASSERT(gBS!=NULL);
-      Status = gBS->LocateProtocol (
-                      &gEfiGlobalNvsAreaProtocolGuid,
-                      NULL,
-                      &GlobalNvsArea
-                      );
-      if (EFI_ERROR(Status)) {
-        DEBUG ((EFI_D_INFO, "GetI2cBarAddr() gEfiGlobalNvsAreaProtocolGuid:%r\n", Status));
-        //
-        // gEfiGlobalNvsAreaProtocolGuid is not ready.
-        //
-        return 0;
-      }
-      mLpssPciDeviceList[I2cControllerIndex + 1].Bar0 = *(UINTN*)((CHAR8*)GlobalNvsArea->Area + mI2cNvsBaseAddress[I2cControllerIndex + 1]);
-      DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C(): is switched to ACPI 0x:%x \n",mLpssPciDeviceList[I2cControllerIndex + 1].Bar0));
-    }
-  }
-  
-  DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() End\n"));
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Disable I2C Bus.
-
-  @param VOID.
-
-  @return Result of the I2C disabling.
-**/
-RETURN_STATUS
-I2cDisable (
-  VOID
-  )
-{ 
-  //
-  // 0.1 seconds
-  //
-  UINT32 NumTries = 10000;
-  
-  MmioWrite32 ( mI2CBaseAddress + R_IC_ENABLE, 0 );
-  while ( 0 != ( MmioRead32 ( mI2CBaseAddress + R_IC_ENABLE_STATUS) & 1)) {
-    MicroSecondDelay (10);
-    NumTries --;
-    if(0 == NumTries) {
-      return RETURN_NOT_READY;
-    }
-  }
-  
-  return RETURN_SUCCESS;
-}
-
-/**
-  Enable I2C Bus.
-
-  @param VOID.
-
-  @return Result of the I2C disabling.
-**/
-RETURN_STATUS
-I2cEnable (
-  VOID
-  )
-{
-  //
-  // 0.1 seconds
-  //
-  UINT32 NumTries = 10000;
-  
-  MmioWrite32 (mI2CBaseAddress + R_IC_ENABLE, 1);
-  
-  while (0 == (MmioRead32 (mI2CBaseAddress + R_IC_ENABLE_STATUS) & 1)) {
-    MicroSecondDelay (10);
-    NumTries --;
-    if(0 == NumTries){
-       return RETURN_NOT_READY;
-    }
-  }
-  
-  return RETURN_SUCCESS;
-}
-
-/**
-  Enable I2C Bus.
-
-  @param VOID.
-
-  @return Result of the I2C enabling.
-**/
-RETURN_STATUS
-I2cBusFrequencySet (
-  IN UINTN BusClockHertz
-  )
-{
-  DEBUG((EFI_D_INFO,"InputFreq BusClockHertz: %d\r\n",BusClockHertz));
-  
-  //
-  //  Set the 100 KHz clock divider according to SV result and I2C spec
-  //
-  MmioWrite32 ( mI2CBaseAddress + R_IC_SS_SCL_HCNT, (UINT16)0x214 );
-  MmioWrite32 ( mI2CBaseAddress + R_IC_SS_SCL_LCNT, (UINT16)0x272 );
-  
-  //
-  //  Set the 400 KHz clock divider according to SV result and I2C spec
-  //
-  MmioWrite32 ( mI2CBaseAddress + R_IC_FS_SCL_HCNT, (UINT16)0x50 );
-  MmioWrite32 ( mI2CBaseAddress + R_IC_FS_SCL_LCNT, (UINT16)0xAD );
-
-  switch ( BusClockHertz ) {
-    case 100 * 1000:
-      MmioWrite32 ( mI2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x40);//100K
-      mI2cMode = V_SPEED_STANDARD;
-      break;
-    case 400 * 1000:
-      MmioWrite32 ( mI2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x32);//400K
-      mI2cMode = V_SPEED_FAST;
-      break;
-    default:
-      MmioWrite32 ( mI2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x09);//3.4M
-      mI2cMode = V_SPEED_HIGH;
-  }
-
-  //
-  //  Select the frequency counter,
-  //  Enable restart condition,
-  //  Enable master FSM, disable slave FSM.
-  //
-  mI2cMode |= B_IC_RESTART_EN | B_IC_SLAVE_DISABLE | B_MASTER_MODE;
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Initializes the host controller to execute I2C commands.
-
-  @param I2cControllerIndex Index of I2C controller in LPSS device. 0 represents I2C0, which is PCI function 1 of LPSS device.   
-                                
-  @return EFI_SUCCESS       Opcode initialization on the I2C host controller completed.
-  @return EFI_DEVICE_ERROR  Device error, operation failed.
-**/
-EFI_STATUS
-I2CInit (
-  IN  UINT8  I2cControllerIndex,
-  IN  UINT16 SlaveAddress
-  )
-{
-  EFI_STATUS Status=RETURN_SUCCESS;
-  UINT32    NumTries = 0;
-  UINTN    GnvsI2cBarAddr=0;
-  
-  //
-  // Verify the parameters
-  //
-  if ((1023 < SlaveAddress) || (6 < I2cControllerIndex)) {
-    Status =  RETURN_INVALID_PARAMETER;
-    DEBUG((EFI_D_INFO,"I2CInit Exit with RETURN_INVALID_PARAMETER\r\n"));
-    return Status;
-  }
-  MmioWrite32 ( mI2CBaseAddress + R_IC_TAR, (UINT16)SlaveAddress );
-  mI2CSlaveAddress = SlaveAddress;
-
-  //
-  // 1.PEI: program and init ( before pci enumeration).
-  // 2.DXE:update address and re-init ( after pci enumeration).
-  // 3.BDS:update ACPI address and re-init ( after acpi mode is enabled).
-  //
-  if(mI2CBaseAddress == mLpssPciDeviceList[I2cControllerIndex + 1].Bar0) {
-    
-    //
-    // I2CInit is already  called.
-    //
-    GnvsI2cBarAddr=GetI2cBarAddr(I2cControllerIndex);
-    
-    if((GnvsI2cBarAddr == 0)||(GnvsI2cBarAddr == mI2CBaseAddress)) {
-      DEBUG((EFI_D_INFO,"I2CInit Exit with mI2CBaseAddress:%x == [%x].Bar0\r\n",mI2CBaseAddress,I2cControllerIndex+1));
-      return RETURN_SUCCESS;
-    }
-  }
-  
-  Status=ProgramPciLpssI2C(I2cControllerIndex);
-  if(Status!=EFI_SUCCESS) {
-    return Status;
-  }
-
-
-  mI2CBaseAddress = (UINT32) mLpssPciDeviceList[I2cControllerIndex + 1].Bar0;
-  DEBUG ((EFI_D_ERROR, "mI2CBaseAddress = 0x%x \n",mI2CBaseAddress));
-  
-  //
-  // 1 seconds.
-  //
-  NumTries = 10000; 
-  while ((1 == ( MmioRead32 ( mI2CBaseAddress + R_IC_STATUS) & STAT_MST_ACTIVITY ))) {
-    MicroSecondDelay(10);
-    NumTries --;
-    if(0 == NumTries) {
-      DEBUG((EFI_D_INFO, "Try timeout\r\n"));
-      return RETURN_DEVICE_ERROR;
-    }
-  }
-  
-  Status = I2cDisable();
-  DEBUG((EFI_D_INFO, "I2cDisable Status = %r\r\n", Status));
-  I2cBusFrequencySet(400 * 1000);
-
-  MmioWrite32(mI2CBaseAddress + R_IC_INTR_MASK, 0x0);
-  if (0x7f < SlaveAddress )
-    SlaveAddress = ( SlaveAddress & 0x3ff ) | IC_TAR_10BITADDR_MASTER;
-  MmioWrite32 ( mI2CBaseAddress + R_IC_TAR, (UINT16)SlaveAddress );
-  MmioWrite32 ( mI2CBaseAddress + R_IC_RX_TL, 0);
-  MmioWrite32 ( mI2CBaseAddress + R_IC_TX_TL, 0 );
-  MmioWrite32 ( mI2CBaseAddress + R_IC_CON, mI2cMode);
-  Status = I2cEnable();
-
-  DEBUG((EFI_D_INFO, "I2cEnable Status = %r\r\n", Status));
-  MmioRead32 ( mI2CBaseAddress + R_IC_CLR_TX_ABRT );
-  
-  return EFI_SUCCESS;
-}
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex             I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress      Device Address from which the byte value has to be read
-  @param  Offset            Offset from which the data has to be read
-  @param  *Byte             Address to which the value read has to be stored
-  @param  Start               Whether a RESTART is issued before the byte is sent or received
-  @param  End                 Whether STOP is generated after a data byte is sent or received  
-                                  
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS 
-ByteReadI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  )
-{
-
-  EFI_STATUS Status;
-  UINT32 I2cStatus;
-  UINT16 ReceiveData;
-  UINT8 *ReceiveDataEnd;
-  UINT8 *ReceiveRequest;
-  UINT16 RawIntrStat;
-  UINT32 Count=0;
-
-  Status = EFI_SUCCESS;
-
-  ReceiveDataEnd = &ReadBuffer [ReadBytes];
-  if( ReadBytes ) {
-
-    ReceiveRequest = ReadBuffer;
-    DEBUG((EFI_D_INFO,"Read: ---------------%d bytes to RX\r\n",ReceiveDataEnd - ReceiveRequest));
-
-    while ((ReceiveDataEnd > ReceiveRequest) || (ReceiveDataEnd > ReadBuffer)) {
-      
-      //
-      //  Check for NACK
-      //
-      RawIntrStat = (UINT16)MmioRead32 (mI2CBaseAddress + R_IC_RawIntrStat);
-      if ( 0 != ( RawIntrStat & I2C_INTR_TX_ABRT )) {
-        MmioRead32 ( mI2CBaseAddress + R_IC_CLR_TX_ABRT );
-        Status = RETURN_DEVICE_ERROR;
-        DEBUG((EFI_D_INFO,"TX ABRT ,%d bytes hasn't been transferred\r\n",ReceiveDataEnd - ReceiveRequest));
-        break;
-      }
-      
-      //
-      // Determine if another byte was received
-      //
-      I2cStatus = (UINT16)MmioRead32 (mI2CBaseAddress + R_IC_STATUS);
-      if (0 != ( I2cStatus & STAT_RFNE )) {
-        ReceiveData = (UINT16)MmioRead32 ( mI2CBaseAddress + R_IC_DATA_CMD );
-        *ReadBuffer++ = (UINT8)ReceiveData;
-        DEBUG((EFI_D_INFO,"MmioRead32 ,1 byte 0x:%x is received\r\n",ReceiveData));
-      }
-
-      if(ReceiveDataEnd == ReceiveRequest) {
-        MicroSecondDelay ( FIFO_WRITE_DELAY );
-        DEBUG((EFI_D_INFO,"ReceiveDataEnd==ReceiveRequest------------%x\r\n",I2cStatus & STAT_RFNE));
-        Count++;
-        if(Count<1024) {
-          //
-          // To avoid sys hung  without ul-pmc device  on RVP,
-          // waiting the last request to get data and make (ReceiveDataEnd > ReadBuffer) =TRUE.
-          //
-          continue;
-        } else {
-          break;
-        }
-      }
-      
-      //
-      //  Wait until a read request will fit.
-      //
-      if (0 == (I2cStatus & STAT_TFNF)) {
-        DEBUG((EFI_D_INFO,"Wait until a read request will fit\r\n"));
-        MicroSecondDelay (10);
-        continue;
-      }
-      
-      //
-      //  Issue the next read request.
-      //
-      if(End && Start) {
-        MmioWrite32 ( mI2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_RESTART|B_CMD_STOP);
-      } else if (!End && Start) {
-        MmioWrite32 ( mI2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_RESTART);
-      } else if (End && !Start) {
-        MmioWrite32 ( mI2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_STOP);
-      } else if (!End && !Start) {
-        MmioWrite32 ( mI2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD);
-      }
-      MicroSecondDelay (FIFO_WRITE_DELAY);
-
-      ReceiveRequest += 1;
-    }
-  }
-  
-  return Status;
-}
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be written
-  @param  Offset               Offset from which the data has to be read
-  @param  *Byte                Address to which the value written is stored
-  @param  Start               Whether a RESTART is issued before the byte is sent or received
-  @param  End                 Whether STOP is generated after a data byte is sent or received  
-                                    
-  @return  EFI_SUCCESS         IF the byte value has been successfully written
-  @return  EFI_DEVICE_ERROR    Operation Failed, Device Error
-**/
-EFI_STATUS ByteWriteI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  )
-{
-
-  EFI_STATUS Status;
-  UINT32 I2cStatus;
-  UINT8 *TransmitEnd;
-  UINT16 RawIntrStat;
-  UINT32 Count=0;
-
-  Status = EFI_SUCCESS;
-
-  Status=I2CInit(I2cControllerIndex, SlaveAddress);
-  if(Status!=EFI_SUCCESS)
-    return Status;
-
-  TransmitEnd = &WriteBuffer[WriteBytes];
-  if( WriteBytes ) {
-    DEBUG((EFI_D_INFO,"Write: --------------%d bytes to TX\r\n",TransmitEnd - WriteBuffer));
-    while (TransmitEnd > WriteBuffer) {
-      I2cStatus = MmioRead32 (mI2CBaseAddress + R_IC_STATUS);
-      RawIntrStat = (UINT16)MmioRead32 (mI2CBaseAddress + R_IC_RawIntrStat);
-      if (0 != ( RawIntrStat & I2C_INTR_TX_ABRT)) {
-        MmioRead32 ( mI2CBaseAddress + R_IC_CLR_TX_ABRT);
-        Status = RETURN_DEVICE_ERROR;
-        DEBUG((EFI_D_ERROR,"TX ABRT TransmitEnd:0x%x WriteBuffer:0x%x\r\n", TransmitEnd, WriteBuffer));
-        break;
-      }
-      if (0 == (I2cStatus & STAT_TFNF)) {
-        //
-        // If TX not full , will  send cmd  or continue to wait
-        //
-        MicroSecondDelay (FIFO_WRITE_DELAY);
-        continue;
-      }
-
-      if(End && Start) {
-        MmioWrite32 (mI2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++)|B_CMD_RESTART|B_CMD_STOP);
-      } else if (!End && Start) {
-        MmioWrite32 (mI2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++)|B_CMD_RESTART);
-      } else if (End && !Start) {
-        MmioWrite32 (mI2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++)|B_CMD_STOP);
-      } else if (!End && !Start ) {
-        MmioWrite32 (mI2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++));
-      }
-      
-      //
-      // Add a small delay to work around some odd behavior being seen.  Without this delay bytes get dropped.
-      //
-      MicroSecondDelay ( FIFO_WRITE_DELAY );//wait after send cmd
-      
-      //
-      // Time out
-      //
-      while(1) {
-        RawIntrStat = MmioRead16 ( mI2CBaseAddress + R_IC_RawIntrStat );
-        if (0 != ( RawIntrStat & I2C_INTR_TX_ABRT)) {
-          MmioRead16 (mI2CBaseAddress + R_IC_CLR_TX_ABRT);
-          Status = RETURN_DEVICE_ERROR;
-          DEBUG((EFI_D_ERROR,"TX ABRT TransmitEnd:0x%x WriteBuffer:0x%x\r\n", TransmitEnd, WriteBuffer));
-        }
-        if(0 == MmioRead16(mI2CBaseAddress + R_IC_TXFLR)) break;
-
-        MicroSecondDelay (FIFO_WRITE_DELAY);
-        Count++;
-        if(Count<1024) {
-          //
-          // to avoid sys hung without ul-pmc device on RVP.
-          // Waiting the last request to get data and make (ReceiveDataEnd > ReadBuffer) =TRUE.
-          //
-          continue;
-        } else {
-          break;
-        }
-      }//while( 1 )
-    }
-
-  }
-
-  return Status;
-}
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be read
-  @param  Offset               Offset from which the data has to be read
-  @param  ReadBytes            Number of bytes to be read
-  @param  *ReadBuffer          Address to which the value read has to be stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS ByteReadI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer
-  )
-{
-  EFI_STATUS          Status;
-
-  DEBUG ((EFI_D_INFO, "ByteReadI2C:---offset:0x%x\n",Offset));
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress,1,&Offset,TRUE,FALSE);
-  Status = ByteReadI2CBasic(I2cControllerIndex, SlaveAddress,ReadBytes,ReadBuffer,TRUE,TRUE);
-
-  return Status;
-}
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress        Device Address from which the byte value has to be written
-  @param  Offset              Offset from which the data has to be written
-  @param  WriteBytes          Number of bytes to be written
-  @param  *Byte               Address to which the value written is stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS ByteWriteI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer
-  )
-{
-  EFI_STATUS          Status;
-
-  DEBUG ((EFI_D_INFO, "ByteWriteI2C:---offset/bytes/buf:0x%x,0x%x,0x%x,0x%x\n",Offset,WriteBytes,WriteBuffer,*WriteBuffer));
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress,1,&Offset,TRUE,FALSE);
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress,WriteBytes,WriteBuffer,FALSE,TRUE);
-
-  return Status;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLibDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLibDxe.inf
deleted file mode 100644
index cd10f1de93..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLibDxe.inf
+++ /dev/null
@@ -1,39 +0,0 @@
-## @file
-#  Instance of I2C Library.
-#
-#  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-#
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = I2CLib
-  FILE_GUID                      = 7f62bf44-2ba7-4c2d-9d4a-91c8906ff053
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = I2CLib|DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER UEFI_APPLICATION
-  
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources.common]
-  I2CLib.c
-
-[LibraryClasses]
-  BaseLib
-  IoLib
-  TimerLib
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-
-[Protocols]
-  gEfiGlobalNvsAreaProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRegs.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRegs.h
deleted file mode 100644
index 57455162f6..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRegs.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/** @file
-  Register Definitions for I2C Driver/PEIM.
-  
-  Copyright (c) 2004  - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                               
---*/
-
-#ifndef I2C_REGS_H
-#define I2C_REGS_H
-
-//
-// FIFO write delay value.
-//
-#define FIFO_WRITE_DELAY    2
-
-//
-// MMIO Register Definitions.
-//
-#define    R_IC_CON                          ( 0x00) // I2C Control  
-#define     B_IC_RESTART_EN                  BIT5
-#define     B_IC_SLAVE_DISABLE               BIT6
-#define     V_SPEED_STANDARD                 0x02
-#define     V_SPEED_FAST                     0x04
-#define     V_SPEED_HIGH                     0x06
-#define     B_MASTER_MODE                    BIT0
-
-#define    R_IC_TAR                          ( 0x04) // I2C Target Address
-#define     IC_TAR_10BITADDR_MASTER           BIT12
-
-#define    R_IC_SAR                          ( 0x08) // I2C Slave Address
-#define    R_IC_HS_MADDR                     ( 0x0C) // I2C HS MasterMode Code Address
-#define    R_IC_DATA_CMD                     ( 0x10) // I2C Rx/Tx Data Buffer and Command
-
-#define    B_READ_CMD                         BIT8    // 1 = read, 0 = write
-#define    B_CMD_STOP                         BIT9    // 1 = STOP
-#define    B_CMD_RESTART                      BIT10   // 1 = IC_RESTART_EN
-
-#define    V_WRITE_CMD_MASK                  ( 0xFF)
-
-#define    R_IC_SS_SCL_HCNT                  ( 0x14) // Standard Speed I2C Clock SCL High Count
-#define    R_IC_SS_SCL_LCNT                  ( 0x18) // Standard Speed I2C Clock SCL Low Count
-#define    R_IC_FS_SCL_HCNT                  ( 0x1C) // Full Speed I2C Clock SCL High Count
-#define    R_IC_FS_SCL_LCNT                  ( 0x20) // Full Speed I2C Clock SCL Low Count
-#define    R_IC_HS_SCL_HCNT                  ( 0x24) // High Speed I2C Clock SCL High Count
-#define    R_IC_HS_SCL_LCNT                  ( 0x28) // High Speed I2C Clock SCL Low Count
-#define    R_IC_INTR_STAT                    ( 0x2C) // I2C Inetrrupt Status
-#define    R_IC_INTR_MASK                    ( 0x30) // I2C Interrupt Mask
-#define     I2C_INTR_GEN_CALL                 BIT11  // General call received
-#define     I2C_INTR_START_DET                BIT10
-#define     I2C_INTR_STOP_DET                 BIT9
-#define     I2C_INTR_ACTIVITY                 BIT8
-#define     I2C_INTR_TX_ABRT                  BIT6   // Set on NACK
-#define     I2C_INTR_TX_EMPTY                 BIT4
-#define     I2C_INTR_TX_OVER                  BIT3
-#define     I2C_INTR_RX_FULL                  BIT2   // Data bytes in RX FIFO over threshold
-#define     I2C_INTR_RX_OVER                  BIT1
-#define     I2C_INTR_RX_UNDER                 BIT0
-#define    R_IC_RawIntrStat                ( 0x34) // I2C Raw Interrupt Status
-#define    R_IC_RX_TL                        ( 0x38) // I2C Receive FIFO Threshold
-#define    R_IC_TX_TL                        ( 0x3C) // I2C Transmit FIFO Threshold
-#define    R_IC_CLR_INTR                     ( 0x40) // Clear Combined and Individual Interrupts
-#define    R_IC_CLR_RX_UNDER                 ( 0x44) // Clear RX_UNDER Interrupt
-#define    R_IC_CLR_RX_OVER                  ( 0x48) // Clear RX_OVERinterrupt
-#define    R_IC_CLR_TX_OVER                  ( 0x4C) // Clear TX_OVER interrupt
-#define    R_IC_CLR_RD_REQ                   ( 0x50) // Clear RD_REQ interrupt
-#define    R_IC_CLR_TX_ABRT                  ( 0x54) // Clear TX_ABRT interrupt
-#define    R_IC_CLR_RX_DONE                  ( 0x58) // Clear RX_DONE interrupt
-#define    R_IC_CLR_ACTIVITY                 ( 0x5C) // Clear ACTIVITY interrupt
-#define    R_IC_CLR_STOP_DET                 ( 0x60) // Clear STOP_DET interrupt
-#define    R_IC_CLR_START_DET                ( 0x64) // Clear START_DET interrupt
-#define    R_IC_CLR_GEN_CALL                 ( 0x68) // Clear GEN_CALL interrupt
-#define    R_IC_ENABLE                       ( 0x6C) // I2C Enable
-#define    R_IC_STATUS                       ( 0x70) // I2C Status
-
-#define    R_IC_SDA_HOLD                     ( 0x7C) // I2C IC_DEFAULT_SDA_HOLD//16bits
-
-#define     STAT_MST_ACTIVITY                 BIT5   // Master FSM Activity Status.
-#define     STAT_RFF                          BIT4   // RX FIFO is completely full
-#define     STAT_RFNE                         BIT3   // RX FIFO is not empty
-#define     STAT_TFE                          BIT2   // TX FIFO is completely empty
-#define     STAT_TFNF                         BIT1   // TX FIFO is not full
-
-#define    R_IC_TXFLR                        ( 0x74) // Transmit FIFO Level Register
-#define    R_IC_RXFLR                        ( 0x78) // Receive FIFO Level Register
-#define    R_IC_TX_ABRT_SOURCE               ( 0x80) // I2C Transmit Abort Status Register
-#define    R_IC_SLV_DATA_NACK_ONLY           ( 0x84) // Generate SLV_DATA_NACK Register
-#define    R_IC_DMA_CR                       ( 0x88) // DMA Control Register
-#define    R_IC_DMA_TDLR                     ( 0x8C) // DMA Transmit Data Level
-#define    R_IC_DMA_RDLR                     ( 0x90) // DMA Receive Data Level
-#define    R_IC_SDA_SETUP                    ( 0x94) // I2C SDA Setup Register
-#define    R_IC_ACK_GENERAL_CALL             ( 0x98) // I2C ACK General Call Register
-#define    R_IC_ENABLE_STATUS                ( 0x9C) // I2C Enable Status Register
-#define    R_IC_COMP_PARAM                   ( 0xF4) // Component Parameter Register
-#define    R_IC_COMP_VERSION                 ( 0xF8) // Component Version ID
-#define    R_IC_COMP_TYPE                    ( 0xFC) // Component Type
-
-#define    I2C_SS_SCL_HCNT_VALUE_100M        0x1DD
-#define    I2C_SS_SCL_LCNT_VALUE_100M        0x1E4
-#define    I2C_FS_SCL_HCNT_VALUE_100M        0x54
-#define    I2C_FS_SCL_LCNT_VALUE_100M        0x9a
-#define    I2C_HS_SCL_HCNT_VALUE_100M        0x7
-#define    I2C_HS_SCL_LCNT_VALUE_100M        0xE
-
-#define     IC_TAR_10BITADDR_MASTER           BIT12
-#define     FIFO_SIZE                         32
-#define     R_IC_INTR_STAT                    ( 0x2C) // I2c Inetrrupt Status
-#define     R_IC_INTR_MASK                    ( 0x30) // I2c Interrupt Mask
-#define     I2C_INTR_GEN_CALL                 BIT11  // General call received
-#define     I2C_INTR_START_DET                BIT10
-#define     I2C_INTR_STOP_DET                 BIT9
-#define     I2C_INTR_ACTIVITY                 BIT8
-#define     I2C_INTR_TX_ABRT                  BIT6   // Set on NACK
-#define     I2C_INTR_TX_EMPTY                 BIT4
-#define     I2C_INTR_TX_OVER                  BIT3
-#define     I2C_INTR_RX_FULL                  BIT2   // Data bytes in RX FIFO over threshold
-#define     I2C_INTR_RX_OVER                  BIT1
-#define     I2C_INTR_RX_UNDER                 BIT0
-
-#define R_PCH_LPIO_I2C_MEM_RESETS                 0x804 // Software Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_FUNC            BIT1  // Function Clock Domain Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_APB             BIT0  // APB Domain Reset
-#define R_PCH_LPSS_I2C_MEM_PCP                    0x800 // Private Clock Parameters
-
-#endif
\ No newline at end of file
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAccess.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAccess.h
deleted file mode 100644
index bf6ef4c747..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAccess.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/** @file
-  Misc Registers Definition.
-  
-  Copyright (c) 2011  - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                               
---*/
-
-#ifndef _I2C_ACCESS_H_
-#define _I2C_ACCESS_H_
-
-#include "I2CIoLibPei.h"
-
-#define DEFAULT_PCI_BUS_NUMBER_PCH             0
-
-#define PCI_DEVICE_NUMBER_PCH_LPC              31
-#define PCI_FUNCTION_NUMBER_PCH_LPC            0
-
-#define R_PCH_LPC_ACPI_BASE                    0x40            // ABASE, 16bit
-#define R_PCH_LPC_ACPI_BASEADR                 0x400           // ABASE, 16bit
-#define B_PCH_LPC_ACPI_BASE_EN                 BIT1            // Enable Bit
-#define B_PCH_LPC_ACPI_BASE_BAR                0x0000FF80      // Base Address, 128 Bytes
-#define V_PCH_ACPI_PM1_TMR_MAX_VAL             0x1000000       // The timer is 24 bit overflow
-#define B_PCH_ACPI_PM1_TMR_VAL                 0xFFFFFF        // The timer value mask
-
-#define R_PCH_ACPI_PM1_TMR                     0x08            // Power Management 1 Timer
-#define V_PCH_ACPI_PM1_TMR_FREQUENCY           3579545         // Timer Frequency
-
-
-#define PchLpcPciCfg8(Register) I2CLibPeiMmioRead8 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, 0, Register))
-
-#define PCIEX_BASE_ADDRESS                     0xE0000000
-#define PCI_EXPRESS_BASE_ADDRESS               ((VOID *) (UINTN) PCIEX_BASE_ADDRESS)
-
-#define MmPciAddress( Segment, Bus, Device, Function, Register ) \
-  ( (UINTN)PCI_EXPRESS_BASE_ADDRESS + \
-    (UINTN)(Bus << 20) + \
-    (UINTN)(Device << 15) + \
-    (UINTN)(Function << 12) + \
-    (UINTN)(Register) \
-  )
-#endif
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.c
deleted file mode 100644
index d5f8dfd012..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/** @file
-  MicroSecondDelay implementation of ACPI Timer.
-  
-  Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                               
---*/
-
-#include "PiPei.h"
-#include "I2CAccess.h"
-#include "I2CDelayPei.h"
-#include <Library/DebugLib.h>
-#include <Library/PeiServicesTablePointerLib.h>
-#include <Ppi/Stall.h>
-
-/**
-  Stalls the CPU for at least the given number of microseconds.
-  Stalls the CPU for the number of microseconds specified by MicroSeconds.
-
-  @param  MicroSeconds  The minimum number of microseconds to delay.
-
-  @return EFI_STATUS
-
-**/
-EFI_STATUS
-EFIAPI
-MicroSecondDelay (
-  IN      UINTN                     MicroSeconds
-  )
-{
-
-  EFI_PEI_STALL_PPI              *StallPpi;
-  EFI_STATUS                     Status;
-  CONST EFI_PEI_SERVICES         **PeiServices;
-  
-  PeiServices = GetPeiServicesTablePointer();
-
-
-  Status = (**PeiServices).LocatePpi (PeiServices, &gEfiPeiStallPpiGuid, 0, NULL, &StallPpi);
-  ASSERT(!EFI_ERROR(Status));
-
-  StallPpi->Stall (PeiServices, StallPpi, MicroSeconds);
-
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.h
deleted file mode 100644
index 604f1f67c5..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDelayPei.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/** @file
-  MicroSecondDelay implementation of ACPI Timer.
-
-  Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef __I2C_DELAY_PEI__
-
-#define __I2C_DELAY_PEI__
-#include "PiPei.h"
-
-/**
-  Stalls the CPU for at least the given number of microseconds.
-
-  Stalls the CPU for the number of microseconds specified by MicroSeconds.
-
-  @param  MicroSeconds  The minimum number of microseconds to delay.
-
-  @return MicroSeconds
-
-**/
-EFI_STATUS
-EFIAPI
-MicroSecondDelay (
-  IN      UINTN                     MicroSeconds
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.c
deleted file mode 100644
index 6a37dbec1d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/** @file
-  Functions for access I2C MMIO register.
-
-  Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiPei.h>
-#include <Library/DebugLib.h>
-#include <Library/PeiServicesTablePointerLib.h>
-
-/**
-  Reads an 8-bit MMIO register.
-
-  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 8-bit MMIO register operations are not supported, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-UINT8
-EFIAPI
-I2CLibPeiMmioRead8 (
-  IN UINTN Address
-  )
-{
-  UINT8 Value;
-
-  Value = *(volatile UINT8*)Address;
-  return Value;
-}
-
-/**
-  Reads a 16-bit MMIO register.
-
-  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 16-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 16-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-UINT16
-EFIAPI
-I2CLibPeiMmioRead16 (
-  IN UINTN  Address
-  )
-{
-  UINT16 Value;
-
-  ASSERT ((Address & 1) == 0);
-  Value = *(volatile UINT16*)Address;
-  return Value;
-}
-
-/**
-  Writes a 16-bit MMIO register.
-
-  Writes the 16-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 16-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 16-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write.
-  @param  Value   The value to write to the MMIO register.
-
-  @return Value.
-
-**/
-UINT16
-EFIAPI
-I2CLibPeiMmioWrite16 (
-  IN  UINTN   Address,
-  IN  UINT16  Value
-  )
-{
-  ASSERT ((Address & 1) == 0);
-  *(volatile UINT16*)Address = Value;
-  return Value;
-}
-
-/**
-  Reads a 32-bit MMIO register.
-
-  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioRead32 (
-  IN UINTN Address
-  )
-{
-  UINT32  Value;
-
-  ASSERT ((Address & 3) == 0);
-  Value = *(volatile UINT32*)Address;
-
-  return Value;
-}
-
-/**
-  Writes a 32-bit MMIO register.
-
-  Writes the 32-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write.
-  @param  Value   The value to write to the MMIO register.
-
-  @return Value.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioWrite32 (
-  IN      UINTN                     Address,
-  IN      UINT32                    Value
-  )
-{
-  ASSERT ((Address & 3) == 0);
-  *(volatile UINT32*)Address = Value;
-  return Value;
-}
-
-/**
-  OR a 32-bit MMIO register.
-
-  OR the 32-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write OR.
-  @param  Value   The value to OR to the MMIO register.
-
-  @return Value.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioOr32 (
-  IN      UINTN                     Address,
-  IN      UINT32                    OrData
-  )
-{
-  return I2CLibPeiMmioWrite32 (Address, I2CLibPeiMmioRead32(Address) | OrData);
-}
-
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.h
deleted file mode 100644
index b68bc1ed09..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIoLibPei.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/** @file
-  Functions for access I2C MMIO register.
-
-  Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef __I2C_IOLIB_PEI__
-
-#define __I2C_IOLIB_PEI__
-#include <PiPei.h>
-
-
-/**
-  Reads an 8-bit MMIO register.
-
-  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 8-bit MMIO register operations are not supported, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-
-UINT8
-EFIAPI
-I2CLibPeiMmioRead8 (
-  IN      UINTN                     Address
-  );
-
-
-/**
-  Reads a 16-bit MMIO register.
-
-  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 16-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 16-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-UINT16
-EFIAPI
-I2CLibPeiMmioRead16 (
-  IN      UINTN                     Address
-  );
-
-
-/**
-  Writes a 16-bit MMIO register.
-
-  Writes the 16-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 16-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 16-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write.
-  @param  Value   The value to write to the MMIO register.
-
-  @return Value.
-
-**/
-UINT16
-EFIAPI
-I2CLibPeiMmioWrite16 (
-  IN      UINTN                     Address,
-  IN      UINT16                    Value
-  );
-
-
-/**
-  Reads a 32-bit MMIO register.
-
-  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
-  returned. This function must guarantee that all MMIO read and write
-  operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to read.
-
-  @return The value read.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioRead32 (
-  IN      UINTN                     Address
-  );
-
-
-/**
-  Writes a 32-bit MMIO register.
-
-  Writes the 32-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write.
-  @param  Value   The value to write to the MMIO register.
-
-  @return Value.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioWrite32 (
-  IN      UINTN                     Address,
-  IN      UINT32                    Value
-  );
-
-
-/**
-  OR a 32-bit MMIO register.
-
-  OR the 32-bit MMIO register specified by Address with the value specified
-  by Value and returns Value. This function must guarantee that all MMIO read
-  and write operations are serialized.
-
-  If 32-bit MMIO register operations are not supported, then ASSERT().
-  If Address is not aligned on a 32-bit boundary, then ASSERT().
-
-  @param  Address The MMIO register to write OR.
-  @param  Value   The value to OR to the MMIO register.
-
-  @return Value.
-
-**/
-UINT32
-EFIAPI
-I2CLibPeiMmioOr32 (
-  IN      UINTN                     Address,
-  IN      UINT32                    OrData
-  );
-
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.c
deleted file mode 100644
index dd5cceb70d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.c
+++ /dev/null
@@ -1,638 +0,0 @@
-/** @file
-  I2C PEI Lib Instance.
-
-  Copyright (c) 1999- 2015, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "I2CDelayPei.h"
-#include "I2CIoLibPei.h"
-#include "I2CAccess.h"
-#include "I2CLibPei.h"
-#include <PlatformBaseAddresses.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/PeiServicesTablePointerLib.h>
-#include <Library/HobLib.h>
-#include <PchRegs/PchRegsPcu.h> 
-#include <PchRegs/PchRegsLpss.h> 
-
-#define LPSS_PCI_DEVICE_NUMBER  8
-
-#define R_PCH_LPIO_I2C_MEM_RESETS                 0x804 // Software Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_FUNC            BIT1  // Function Clock Domain Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_APB             BIT0  // APB Domain Reset
-#define R_PCH_LPSS_I2C_MEM_PCP                    0x800 // Private Clock Parameters
-
-#define PEI_TEPM_LPSS_DMA_BAR                     0xFE900000
-#define PEI_TEPM_LPSS_I2C0_BAR                    0xFE910000
-#define PCI_CONFIG_SPACE_SIZE                     0x10000
-
-EFI_GUID  mI2CPeiInitGuid = {
-  0x96DED71A, 0xB9E7, 0x4EAD, 0x96, 0x2C, 0x01, 0x69, 0x3C, 0xED, 0x2A, 0x64
-};
-
-
-UINT16 I2CGPIO[]= {
-  //
-  // 19.1.6  I2C0
-  // I2C0_SDA-OD-O -    write 0x2003CC81 to IOBASE + 0x0210
-  // I2C0_SCL-OD-O -    write 0x2003CC81 to IOBASE + 0x0200
-  //
-  0x0210,
-  0x0200,
-
-  //
-  // 19.1.7  I2C1
-  // I2C1_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x01F0
-  // I2C1_SCL-OD-O/I - write 0x2003CC81 to IOBASE + 0x01E0
-  //
-  0x01F0,
-  0x01E0,
-
-  //
-  // 19.1.8  I2C2
-  // I2C2_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x01D0
-  // I2C2_SCL-OD-O/I - write 0x2003CC81 to IOBASE + 0x01B0
-  //
-  0x01D0,
-  0x01B0,
-
-  //
-  // 19.1.9  I2C3
-  // I2C3_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x0190
-  // I2C3_SCL-OD-O/I - write 0x2003CC81 to IOBASE + 0x01C0
-  // 
-  0x0190,
-  0x01C0,
-
-  //
-  // 19.1.10 I2C4
-  // I2C4_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x01A0
-  // I2C4_SCL-OD-O/I - write 0x2003CC81 to IOBASE + 0x0170
-  //
-  0x01A0,
-  0x0170,
-
-  // 
-  // 19.1.11 I2C5
-  // I2C5_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x0150
-  // I2C5_SCL-OD-O/I - write 0x2003CC81 to IOBASE + 0x0140
-  // 
-  0x0150,
-  0x0140,
-
-  //
-  // 19.1.12 I2C6
-  // I2C6_SDA-OD-O/I - write 0x2003CC81 to IOBASE + 0x0180
-  // I2C6_SCL-OD-O/I -  write 0x2003CC81 to IOBASE + 0x0160
-  // 
-  0x0180,
-  0x0160
-};
-
-/**
-  Constructor of this library.
-
-  @param   VOID
-
-  @return  EFI_SUCCESS
-**/
-EFI_STATUS
-EFIAPI
-IntelI2CPeiLibConstructor (
-  IN EFI_PEI_FILE_HANDLE     FileHandle,
-  IN CONST EFI_PEI_SERVICES  **PeiServices
-  )
-{
-  UINTN Index;
-  
-  for (Index = 0; Index < sizeof(I2CGPIO)/sizeof(UINT16); Index ++) {
-    I2CLibPeiMmioWrite32(IO_BASE_ADDRESS+I2CGPIO[Index], 0x2003CC81);
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Programe all I2C controllers on LPSS. 
-  
-  I2C0 is function 1 of LPSS. I2C1 is function 2 of LPSS, etc..
-
-  @param   VOID
-
-  @return  EFI_SUCCESS
-**/
-EFI_STATUS
-ProgramPciLpssI2C (
-  VOID
-  )
-{
-  UINT32       PmcBase;
-  UINT32       DevID;
-  UINTN        PciMmBase=0;
-  UINTN        Index;
-  UINTN        Bar0;
-  UINTN        Bar1;
-  DEBUG ((EFI_D_INFO, "Pei ProgramPciLpssI2C() Start\n"));
-  
-  //
-  // Set the VLV Function Disable Register to ZERO
-  //
-  PmcBase         = I2CLibPeiMmioRead32(PciD31F0RegBase + R_PCH_LPC_PMC_BASE) & B_PCH_LPC_PMC_BASE_BAR;
-  
-  if(I2CLibPeiMmioRead32(PmcBase + R_PCH_PMC_FUNC_DIS)&
-      (B_PCH_PMC_FUNC_DIS_LPSS2_FUNC1 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC2
-       | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC3 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC4 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC5
-       | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC6 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC7)) {
-    I2CLibPeiMmioWrite32(
-      PmcBase+R_PCH_PMC_FUNC_DIS,
-      I2CLibPeiMmioRead32(PmcBase + R_PCH_PMC_FUNC_DIS)& \
-      ~(B_PCH_PMC_FUNC_DIS_LPSS2_FUNC1 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC2 \
-        | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC3 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC4 \
-        | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC5 | B_PCH_PMC_FUNC_DIS_LPSS2_FUNC6|B_PCH_PMC_FUNC_DIS_LPSS2_FUNC7)
-      );
-    DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() enable all I2C controllers\n"));
-  }
-
-  for(Index = 0; Index < LPSS_PCI_DEVICE_NUMBER; Index ++) {
-
-    PciMmBase = MmPciAddress (
-                  0,
-                  DEFAULT_PCI_BUS_NUMBER_PCH,
-                  PCI_DEVICE_NUMBER_PCH_LPSS_I2C,
-                  Index,
-                  0
-                  );
-    DevID =  I2CLibPeiMmioRead32(PciMmBase);
-
-    Bar0 = PEI_TEPM_LPSS_DMA_BAR + (Index * PCI_CONFIG_SPACE_SIZE);
-    Bar1 = Bar0 + 0x8000;
-
-    DEBUG((EFI_D_ERROR, "Program Pci Lpss I2C Device  Function=%x DevID=%08x\n", Index, DevID));
-    
-    //
-    // Check if device present
-    //
-    if (DevID  != 0xFFFFFFFF)  {
-      if(!(I2CLibPeiMmioRead32 (PciMmBase + R_PCH_LPSS_I2C_STSCMD) & B_PCH_LPSS_I2C_STSCMD_MSE)) {
-        //
-        // Program BAR 0
-        //
-        I2CLibPeiMmioWrite32((UINTN) (PciMmBase + R_PCH_LPSS_I2C_BAR), (UINT32)(Bar0 & B_PCH_LPSS_I2C_BAR_BA));
-        
-        DEBUG ((EFI_D_ERROR, "I2CBaseAddress1 = 0x%x \n",I2CLibPeiMmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR)));
-        
-        //
-        // Program BAR 1
-        //
-        I2CLibPeiMmioWrite32 ((UINTN)(PciMmBase + R_PCH_LPSS_I2C_BAR1), (UINT32)(Bar1 & B_PCH_LPSS_I2C_BAR1_BA));
-        DEBUG ((EFI_D_ERROR, "I2CBaseAddress1 = 0x%x \n",I2CLibPeiMmioRead32(PciMmBase+R_PCH_LPSS_I2C_BAR1)));
-        
-        //
-        // Bus Master Enable & Memory Space Enable
-        //
-        I2CLibPeiMmioWrite32((UINTN) (PciMmBase + R_PCH_LPSS_I2C_STSCMD), (UINT32)(B_PCH_LPSS_I2C_STSCMD_BME | B_PCH_LPSS_I2C_STSCMD_MSE));
-      }
-      
-      //
-      // Release Resets
-      //
-      I2CLibPeiMmioWrite32 (Bar0 + R_PCH_LPIO_I2C_MEM_RESETS, (B_PCH_LPIO_I2C_MEM_RESETS_FUNC | B_PCH_LPIO_I2C_MEM_RESETS_APB));
-      
-      //
-      // Activate Clocks
-      //
-      I2CLibPeiMmioWrite32 (Bar0 + R_PCH_LPSS_I2C_MEM_PCP, 0x80020003);//No use for A0
-
-      DEBUG ((EFI_D_INFO, "ProgramPciLpssI2C() Programmed()\n"));
-    }
-
-  }
-  
-  DEBUG ((EFI_D_INFO, "Pei ProgramPciLpssI2C() End\n"));
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Disable I2C Bus.
-
-  @param I2cControllerIndex   Index of I2C controller.
-
-  @return EFI_SUCCESS
-**/
-EFI_STATUS
-I2cDisable (
-  IN UINT8 I2cControllerIndex
-  )
-{
-  UINTN  I2CBaseAddress;
-  UINT32 NumTries = 10000;  // 0.1 seconds
-  
-  I2CBaseAddress = (UINT32) PEI_TEPM_LPSS_I2C0_BAR + I2cControllerIndex * PCI_CONFIG_SPACE_SIZE;
-  
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_ENABLE, 0);
-  while (0 != ( I2CLibPeiMmioRead16 (I2CBaseAddress + R_IC_ENABLE_STATUS ) & 1)) {
-    MicroSecondDelay (10);
-    NumTries --;
-    if(0 == NumTries) return EFI_NOT_READY;
-  }
-  
-  return EFI_SUCCESS;
-}
-
-/**
-  Enable I2C Bus.
-
-  @param I2cControllerIndex   Index of I2C controller.
-
-  @return EFI_SUCCESS
-**/
-EFI_STATUS
-I2cEnable (
-  IN UINT8 I2cControllerIndex
-  )
-{
-  UINTN   I2CBaseAddress;
-  UINT32 NumTries = 10000;  // 0.1 seconds
-  
-  I2CBaseAddress = (UINT32) PEI_TEPM_LPSS_I2C0_BAR+ I2cControllerIndex * PCI_CONFIG_SPACE_SIZE;
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_ENABLE, 1);
-  while (0 == ( I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_ENABLE_STATUS ) & 1)) {
-    MicroSecondDelay (10);
-    NumTries --;
-    if(0 == NumTries) return EFI_NOT_READY;
-  }
-  
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Set the I2C controller bus clock frequency.
-
-  @param[in] This           Address of the library's I2C context structure
-  @param[in] PlatformData   Address of the platform configuration data
-  @param[in] BusClockHertz  New I2C bus clock frequency in Hertz
-
-  @retval RETURN_SUCCESS      The bus frequency was set successfully.
-  @retval RETURN_UNSUPPORTED  The controller does not support this frequency.
-
-**/
-EFI_STATUS
-I2cBusFrequencySet (
-  IN UINTN   I2CBaseAddress,
-  IN UINTN   BusClockHertz,
-  IN UINT16  *I2cMode
-  )
-{
-  DEBUG((EFI_D_INFO,"InputFreq BusClockHertz: %d\r\n",BusClockHertz));
-
-  *I2cMode = B_IC_RESTART_EN | B_IC_SLAVE_DISABLE | B_MASTER_MODE;
-
-  //
-  //  Set the 100 KHz clock divider
-  //
-  //  From Table 10 of the I2C specification
-  //
-  //    High: 4.00 uS
-  //    Low:  4.70 uS
-  //
-  I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_SS_SCL_HCNT, (UINT16)0x214 );
-  I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_SS_SCL_LCNT, (UINT16)0x272 );
-  
-  //
-  //    Set the 400 KHz clock divider
-  //
-  //    From Table 10 of the I2C specification
-  //
-  //      High: 0.60 uS
-  //      Low:  1.30 uS
-  //
-  I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_FS_SCL_HCNT, (UINT16)0x50 );
-  I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_FS_SCL_LCNT, (UINT16)0xAD );
-
-  switch ( BusClockHertz ) {
-    case 100 * 1000:
-      I2CLibPeiMmioWrite32 ( I2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x40);//100K
-      *I2cMode |= V_SPEED_STANDARD;
-      break;
-    case 400 * 1000:
-      I2CLibPeiMmioWrite32 ( I2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x32);//400K
-      *I2cMode |= V_SPEED_FAST;
-      break;
-    default:
-      I2CLibPeiMmioWrite32 ( I2CBaseAddress + R_IC_SDA_HOLD, (UINT16)0x09);//3.4M
-      *I2cMode |= V_SPEED_HIGH;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Initializes the host controller to execute I2C commands.
-
-  @param I2cControllerIndex Index of I2C controller in LPSS device. 0 represents I2C0, which is PCI function 1 of LPSS device.   
-                                
-  @return EFI_SUCCESS       Opcode initialization on the I2C host controller completed.
-  @return EFI_DEVICE_ERROR  Device error, operation failed.
-**/
-EFI_STATUS
-I2CInit (
-  UINT8 I2cControllerIndex, 
-  UINT16 SlaveAddress
-  )
-{
-  EFI_STATUS   Status;
-  UINT32       NumTries = 0;
-  UINTN        I2CBaseAddress;
-  UINT16       I2cMode;
-  UINTN        PciMmBase=0;
-
-
-  PciMmBase = MmPciAddress (
-                0,
-                DEFAULT_PCI_BUS_NUMBER_PCH,
-                PCI_DEVICE_NUMBER_PCH_LPSS_I2C,
-                (I2cControllerIndex + 1),
-                0
-                );
-
-  I2CBaseAddress = I2CLibPeiMmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR);
-
-  //
-  //  Verify the parameters
-  //
-  if (1023 < SlaveAddress ) {
-    Status =  EFI_INVALID_PARAMETER;
-    DEBUG((EFI_D_INFO,"I2cStartRequest Exit with Status %r\r\n", Status));
-    return Status;
-  }
-
-  if(I2CBaseAddress ==  (PEI_TEPM_LPSS_I2C0_BAR + I2cControllerIndex * PCI_CONFIG_SPACE_SIZE)) {
-    return EFI_SUCCESS;
-  }
-  ProgramPciLpssI2C();
-
-  I2CBaseAddress = (UINT32) (PEI_TEPM_LPSS_I2C0_BAR + I2cControllerIndex * PCI_CONFIG_SPACE_SIZE);
-  DEBUG ((EFI_D_ERROR, "I2CBaseAddress = 0x%x \n",I2CBaseAddress));
-  NumTries = 10000; // 1 seconds
-  while ((1 == ( I2CLibPeiMmioRead32 ( I2CBaseAddress + R_IC_STATUS) & STAT_MST_ACTIVITY ))) {
-    MicroSecondDelay(10);
-    NumTries --;
-    if(0 == NumTries)
-      return EFI_DEVICE_ERROR;
-  }
-
-  Status = I2cDisable (I2cControllerIndex);
-  DEBUG((EFI_D_INFO, "I2cDisable Status = %r\r\n", Status));
-
-  I2cBusFrequencySet(I2CBaseAddress, 400 * 1000, &I2cMode);//Set I2cMode
-
-  I2CLibPeiMmioWrite16(I2CBaseAddress + R_IC_INTR_MASK, 0x0);
-  if (0x7F < SlaveAddress) {
-    SlaveAddress = (SlaveAddress & 0x3ff ) | IC_TAR_10BITADDR_MASTER;
-  }
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_TAR, (UINT16) SlaveAddress );
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_RX_TL, 0);
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_TX_TL, 0 );
-  I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_CON, I2cMode);
-
-  Status = I2cEnable(I2cControllerIndex);
-  DEBUG((EFI_D_INFO, "I2cEnable Status = %r\r\n", Status));
-  I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_CLR_TX_ABRT );
-  
-  return EFI_SUCCESS;
-}
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress        Device Address from which the byte value has to be read
-  @param  Offset              Offset from which the data has to be read
-  @param  *Byte               Address to which the value read has to be stored
-                                
-  @return  EFI_SUCCESS        If the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR   Operation Failed, Device Error
-**/
-EFI_STATUS ByteReadI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  )
-{
-
-  EFI_STATUS Status;
-  UINT32 I2cStatus;
-  UINT16 ReceiveData;
-  UINT8 *ReceiveDataEnd;
-  UINT8 *ReceiveRequest;
-  UINT16 RawIntrStat;
-  UINTN   I2CBaseAddress;
-
-  I2CBaseAddress = (UINT32)(PEI_TEPM_LPSS_I2C0_BAR + I2cControllerIndex * PCI_CONFIG_SPACE_SIZE);
-
-  Status = EFI_SUCCESS;
-
-  I2CInit(I2cControllerIndex, SlaveAddress);
-
-  ReceiveDataEnd = &ReadBuffer [ReadBytes];
-  if(ReadBytes) {
-    ReceiveRequest = ReadBuffer;
-    DEBUG((EFI_D_INFO,"Read: ---------------%d bytes to RX\r\n",ReceiveDataEnd - ReceiveRequest));
-
-    while ((ReceiveDataEnd > ReceiveRequest) || (ReceiveDataEnd > ReadBuffer)) {
-      //
-      // Check for NACK
-      //
-      RawIntrStat = I2CLibPeiMmioRead16 (I2CBaseAddress + R_IC_RawIntrStat );
-      if ( 0 != (RawIntrStat & I2C_INTR_TX_ABRT )) {
-        I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_CLR_TX_ABRT );
-        Status = RETURN_DEVICE_ERROR;
-        DEBUG((EFI_D_INFO,"TX ABRT ,%d bytes hasn't been transferred\r\n",ReceiveDataEnd - ReceiveRequest));
-        break;
-      }
-      
-      //
-      // Determine if another byte was received
-      //
-      I2cStatus = I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_STATUS );
-      if ( 0 != ( I2cStatus & STAT_RFNE )) {
-        ReceiveData = I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_DATA_CMD );
-        *ReadBuffer++ = (UINT8)ReceiveData;
-        DEBUG((EFI_D_INFO,"MmioRead32 ,1 byte 0x:%x is received\r\n",ReceiveData));
-      }
-
-      if(ReceiveDataEnd==ReceiveRequest) {
-        //
-        // Waiting the last request to get data and make (ReceiveDataEnd > ReadBuffer) =TRUE.
-        //
-        continue;
-      }
-      
-      //
-      // Wait until a read request will fit
-      //
-      if ( 0 == ( I2cStatus & STAT_TFNF )) {
-        MicroSecondDelay ( 10 );
-        continue;
-      }
-      
-      //
-      // Issue the next read request
-      //
-      if(End && Start ) {
-        I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_RESTART|B_CMD_STOP);
-      } else if (!End && Start ) {
-        I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_RESTART);
-      } else if (End && !Start ) {
-        I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD|B_CMD_STOP);
-      } else if (!End && !Start ) {
-        I2CLibPeiMmioWrite16 ( I2CBaseAddress + R_IC_DATA_CMD, B_READ_CMD);
-      }
-      ReceiveRequest += 1;
-    }
-
-  }
-  return Status;
-
-}
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be written
-  @param  Offset               Offset from which the data has to be read
-  @param  *Byte                Address to which the value written is stored
-                                
-  @return  EFI_SUCCESS         IF the byte value has been successfully written
-  @return  EFI_DEVICE_ERROR    Operation Failed, Device Error
-**/
-EFI_STATUS 
-ByteWriteI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  )
-{
-
-  EFI_STATUS Status;
-  UINT32 I2cStatus;
-  UINT8 *TransmitEnd;
-  UINT16 RawIntrStat;
-  UINTN   I2CBaseAddress;
-
-  I2CBaseAddress = (UINT32)PEI_TEPM_LPSS_I2C0_BAR+ I2cControllerIndex * PCI_CONFIG_SPACE_SIZE;
-
-  Status = EFI_SUCCESS;
-
-  I2CInit(I2cControllerIndex, SlaveAddress);
-
-  TransmitEnd = &WriteBuffer [WriteBytes];
-  if( WriteBytes ) {
-
-    DEBUG((EFI_D_INFO,"Write: --------------%d bytes to TX\r\n", TransmitEnd - WriteBuffer));
-
-    while ( TransmitEnd > WriteBuffer) {
-      I2cStatus = I2CLibPeiMmioRead16 (I2CBaseAddress + R_IC_STATUS);
-      RawIntrStat = I2CLibPeiMmioRead16 (I2CBaseAddress + R_IC_RawIntrStat);
-      if ( 0 != (RawIntrStat & I2C_INTR_TX_ABRT)) {
-        I2CLibPeiMmioRead16 (I2CBaseAddress + R_IC_CLR_TX_ABRT);
-        Status = RETURN_DEVICE_ERROR;
-        DEBUG((EFI_D_ERROR,"TX ABRT TransmitEnd:0x%x WriteBuffer:0x%x\r\n", TransmitEnd, WriteBuffer));
-        break;
-      }
-      if (0 == ( I2cStatus & STAT_TFNF)) {
-        continue;
-      }
-      if(End && Start) {
-        I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++) | B_CMD_RESTART | B_CMD_STOP);
-      } else if (!End && Start ) {
-        I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++) | B_CMD_RESTART);
-      } else if (End && !Start ) {
-        I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++) | B_CMD_STOP);
-      } else if (!End && !Start ) {
-        I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_DATA_CMD, (*WriteBuffer++));
-      }
-      
-      // Add a small delay to work around some odd behavior being seen.  Without this delay bytes get dropped.
-      MicroSecondDelay ( FIFO_WRITE_DELAY );
-    }
-
-  }
-  
-  if(EFI_ERROR(Status)) {
-    DEBUG((EFI_D_INFO,"I2cStartRequest Exit with Status %r\r\n",Status));
-  }
-    
-  return Status;
-}
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be read
-  @param  Offset               Offset from which the data has to be read
-  @param  ReadBytes            Number of bytes to be read
-  @param  *ReadBuffer          Address to which the value read has to be stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS 
-ByteReadI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer
-  )
-{
-  EFI_STATUS        Status;
-
-  DEBUG ((EFI_D_ERROR, "ByteReadI2C:---offset:0x%x\n",Offset));
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress, 1, &Offset,TRUE,FALSE);
-  Status = ByteReadI2CBasic(I2cControllerIndex, SlaveAddress, ReadBytes, ReadBuffer, TRUE, TRUE);
-
-  return Status;
-}
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress        Device Address from which the byte value has to be written
-  @param  Offset              Offset from which the data has to be written
-  @param  WriteBytes          Number of bytes to be written
-  @param  *Byte               Address to which the value written is stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS ByteWriteI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer
-  )
-{
-  EFI_STATUS        Status;
-
-  DEBUG ((EFI_D_ERROR, "ByteWriteI2C:---offset/bytes/buf:0x%x,0x%x,0x%x,0x%x\n",Offset,WriteBytes,WriteBuffer,*WriteBuffer));
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress, 1, &Offset, TRUE, FALSE);
-  Status = ByteWriteI2CBasic(I2cControllerIndex, SlaveAddress, WriteBytes, WriteBuffer, FALSE, TRUE);
-
-  return Status;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h
deleted file mode 100644
index 47536aebf7..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h
+++ /dev/null
@@ -1,280 +0,0 @@
-/** @file
-  I2C PEI Lib Instance.
-
-  Copyright (c) 1999- 2015, Intel Corporation. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef I2C_PEI_REGS_H
-#define I2C_PEI_REGS_H
-
-#include "PiPei.h"
-
-#define R_PCH_LPC_PMC_BASE                        0x44
-#define B_PCH_LPC_PMC_BASE_BAR                    0xFFFFFE00
-#define R_PCH_PMC_FUNC_DIS                        0x34  // Function Disable Register
-#define PCIEX_BASE_ADDRESS                        0xE0000000
-#define PciD31F0RegBase                           PCIEX_BASE_ADDRESS + (UINT32) (31 << 15)
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC7             BIT7  // LPSS SPI Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC6             BIT6  // LPSS HSUART #2 Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC5             BIT5  // LPSS HSUART #1 Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC4             BIT4  // LPSS I2S Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC3             BIT3  // LPSS PCM Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC2             BIT2  // LPSS I2C #2 Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC1             BIT1  // LPSS I2C #1 Disable
-#define B_PCH_PMC_FUNC_DIS_LPSS_FUNC0             BIT0  // LPSS DMA Disable
-
-
-#define DEFAULT_PCI_BUS_NUMBER_PCH       0
-
-#define R_PCH_LPSS_I2C_STSCMD                     0x04  // Status & Command
-#define B_PCH_LPSS_I2C_STSCMD_RMA                 BIT29 // RMA
-#define B_PCH_LPSS_I2C_STSCMD_RCA                 BIT28 // RCA
-#define B_PCH_LPSS_I2C_STSCMD_CAPLIST             BIT20 // Capability List
-#define B_PCH_LPSS_I2C_STSCMD_INTRSTS             BIT19 // Interrupt Status
-#define B_PCH_LPSS_I2C_STSCMD_INTRDIS             BIT10 // Interrupt Disable
-#define B_PCH_LPSS_I2C_STSCMD_SERREN              BIT8  // SERR# Enable
-#define B_PCH_LPSS_I2C_STSCMD_BME                 BIT2  // Bus Master Enable
-#define B_PCH_LPSS_I2C_STSCMD_MSE                 BIT1  // Memory Space Enable
-
-#define R_PCH_LPSS_I2C_BAR                        0x10  // BAR
-#define B_PCH_LPSS_I2C_BAR_BA                     0xFFFFF000 // Base Address
-#define B_PCH_LPSS_I2C_BAR_SI                     0x00000FF0 // Size Indicator
-#define B_PCH_LPSS_I2C_BAR_PF                     BIT3  // Prefetchable
-#define B_PCH_LPSS_I2C_BAR_TYPE                   (BIT2 | BIT1) // Type
-#define B_PCH_LPSS_I2C_BAR_MS                     BIT0  // Message Space
-
-#define R_PCH_LPSS_I2C_BAR1                       0x14  // BAR 1
-#define B_PCH_LPSS_I2C_BAR1_BA                    0xFFFFF000 // Base Address
-#define B_PCH_LPSS_I2C_BAR1_SI                    0x00000FF0 // Size Indicator
-#define B_PCH_LPSS_I2C_BAR1_PF                    BIT3  // Prefetchable
-#define B_PCH_LPSS_I2C_BAR1_TYPE                  (BIT2 | BIT1) // Type
-#define B_PCH_LPSS_I2C_BAR1_MS                    BIT0  // Message Space
-
-#define NUM_RETRIES         0xFFFF
-
-//
-// LPIO I2C Module Memory Space Registers
-//
-#define R_PCH_LPIO_I2C_MEM_RESETS                 0x804 // Software Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_FUNC            BIT1  // Function Clock Domain Reset
-#define B_PCH_LPIO_I2C_MEM_RESETS_APB             BIT0  // APB Domain Reset
-
-#define R_PCH_LPSS_I2C_MEM_PCP                    0x800 // Private Clock Parameters
-
-#define  bit(a)                   1 << (a)
-
-//
-// MMIO Register Definitions
-//
-
-#define  I2C0_REG_SPACE_ADDR_BASE            0xFF138000  //01K
-
-#define    R_IC_CON                          ( 0x00) // I2C Control
-#define     B_IC_RESTART_EN                  BIT5
-#define     B_IC_SLAVE_DISABLE               BIT6
-#define     V_SPEED_STANDARD                 0x02
-#define     V_SPEED_FAST                     0x04
-#define     V_SPEED_HIGH                     0x06
-#define     B_MASTER_MODE                    BIT0
-
-#define    R_IC_TAR                          ( 0x04) // I2C Target Address
-#define     IC_TAR_10BITADDR_MASTER           BIT12
-
-#define    R_IC_SAR                          ( 0x08) // I2C Slave Address
-#define    R_IC_HS_MADDR                     ( 0x0C) // I2C HS MasterMode Code Address
-#define    R_IC_DATA_CMD                     ( 0x10) // I2C Rx/Tx Data Buffer and Command
-
-#define    B_READ_CMD                         BIT8    // 1 = read, 0 = write
-#define    B_CMD_STOP                         BIT9    // 1 = STOP
-#define    B_CMD_RESTART                      BIT10   // 1 = IC_RESTART_EN
-
-#define    V_WRITE_CMD_MASK                  ( 0xFF)
-
-#define    R_IC_SS_SCL_HCNT                  ( 0x14) // Standard Speed I2C Clock SCL High Count
-#define    R_IC_SS_SCL_LCNT                  ( 0x18) // Standard Speed I2C Clock SCL Low Count
-#define    R_IC_FS_SCL_HCNT                  ( 0x1C) // Full Speed I2C Clock SCL High Count
-#define    R_IC_FS_SCL_LCNT                  ( 0x20) // Full Speed I2C Clock SCL Low Count
-#define    R_IC_HS_SCL_HCNT                  ( 0x24) // High Speed I2C Clock SCL High Count
-#define    R_IC_HS_SCL_LCNT                  ( 0x28) // High Speed I2C Clock SCL Low Count
-#define    R_IC_INTR_STAT                    ( 0x2C) // I2C Inetrrupt Status
-#define    R_IC_INTR_MASK                    ( 0x30) // I2C Interrupt Mask
-#define     I2C_INTR_GEN_CALL                 BIT11  // General call received
-#define     I2C_INTR_START_DET                BIT10
-#define     I2C_INTR_STOP_DET                 BIT9
-#define     I2C_INTR_ACTIVITY                 BIT8
-#define     I2C_INTR_TX_ABRT                  BIT6   // Set on NACK
-#define     I2C_INTR_TX_EMPTY                 BIT4
-#define     I2C_INTR_TX_OVER                  BIT3
-#define     I2C_INTR_RX_FULL                  BIT2   // Data bytes in RX FIFO over threshold
-#define     I2C_INTR_RX_OVER                  BIT1
-#define     I2C_INTR_RX_UNDER                 BIT0
-#define    R_IC_RawIntrStat                ( 0x34) // I2C Raw Interrupt Status
-#define    R_IC_RX_TL                        ( 0x38) // I2C Receive FIFO Threshold
-#define    R_IC_TX_TL                        ( 0x3C) // I2C Transmit FIFO Threshold
-#define    R_IC_CLR_INTR                     ( 0x40) // Clear Combined and Individual Interrupts
-#define    R_IC_CLR_RX_UNDER                 ( 0x44) // Clear RX_UNDER Interrupt
-#define    R_IC_CLR_RX_OVER                  ( 0x48) // Clear RX_OVERinterrupt
-#define    R_IC_CLR_TX_OVER                  ( 0x4C) // Clear TX_OVER interrupt
-#define    R_IC_CLR_RD_REQ                   ( 0x50) // Clear RD_REQ interrupt
-#define    R_IC_CLR_TX_ABRT                  ( 0x54) // Clear TX_ABRT interrupt
-#define    R_IC_CLR_RX_DONE                  ( 0x58) // Clear RX_DONE interrupt
-#define    R_IC_CLR_ACTIVITY                 ( 0x5C) // Clear ACTIVITY interrupt
-#define    R_IC_CLR_STOP_DET                 ( 0x60) // Clear STOP_DET interrupt
-#define    R_IC_CLR_START_DET                ( 0x64) // Clear START_DET interrupt
-#define    R_IC_CLR_GEN_CALL                 ( 0x68) // Clear GEN_CALL interrupt
-#define    R_IC_ENABLE                       ( 0x6C) // I2C Enable
-#define    R_IC_STATUS                       ( 0x70) // I2C Status
-
-#define    R_IC_SDA_HOLD                     ( 0x7C) // I2C IC_DEFAULT_SDA_HOLD//16bits
-
-#define     STAT_MST_ACTIVITY                 BIT5   // Master FSM Activity Status.
-#define     STAT_RFF                          BIT4   // RX FIFO is completely full
-#define     STAT_RFNE                         BIT3   // RX FIFO is not empty
-#define     STAT_TFE                          BIT2   // TX FIFO is completely empty
-#define     STAT_TFNF                         BIT1   // TX FIFO is not full
-
-#define    R_IC_TXFLR                        ( 0x74) // Transmit FIFO Level Register
-#define    R_IC_RXFLR                        ( 0x78) // Receive FIFO Level Register
-#define    R_IC_TX_ABRT_SOURCE               ( 0x80) // I2C Transmit Abort Status Register
-#define    R_IC_SLV_DATA_NACK_ONLY           ( 0x84) // Generate SLV_DATA_NACK Register
-#define    R_IC_DMA_CR                       ( 0x88) // DMA Control Register
-#define    R_IC_DMA_TDLR                     ( 0x8C) // DMA Transmit Data Level
-#define    R_IC_DMA_RDLR                     ( 0x90) // DMA Receive Data Level
-#define    R_IC_SDA_SETUP                    ( 0x94) // I2C SDA Setup Register
-#define    R_IC_ACK_GENERAL_CALL             ( 0x98) // I2C ACK General Call Register
-#define    R_IC_ENABLE_STATUS                ( 0x9C) // I2C Enable Status Register
-#define    R_IC_COMP_PARAM                   ( 0xF4) // Component Parameter Register
-#define    R_IC_COMP_VERSION                 ( 0xF8) // Component Version ID
-#define    R_IC_COMP_TYPE                    ( 0xFC) // Component Type
-
-#define I2C_SS_SCL_HCNT_VALUE_100M           0x1DD
-#define I2C_SS_SCL_LCNT_VALUE_100M           0x1E4
-#define I2C_FS_SCL_HCNT_VALUE_100M           0x54
-#define I2C_FS_SCL_LCNT_VALUE_100M           0x9a
-#define I2C_HS_SCL_HCNT_VALUE_100M           0x7
-#define I2C_HS_SCL_LCNT_VALUE_100M           0xE
-
-//
-// FIFO write workaround value.
-//
-#define     FIFO_WRITE_DELAY    2
-#define     IC_TAR_10BITADDR_MASTER           BIT12
-#define     FIFO_SIZE                         32
-#define     R_IC_INTR_STAT                    ( 0x2C) // I2c Inetrrupt Status
-#define     R_IC_INTR_MASK                    ( 0x30) // I2c Interrupt Mask
-#define     I2C_INTR_GEN_CALL                 BIT11  // General call received
-#define     I2C_INTR_START_DET                BIT10
-#define     I2C_INTR_STOP_DET                 BIT9
-#define     I2C_INTR_ACTIVITY                 BIT8
-#define     I2C_INTR_TX_ABRT                  BIT6   // Set on NACK
-#define     I2C_INTR_TX_EMPTY                 BIT4
-#define     I2C_INTR_TX_OVER                  BIT3
-#define     I2C_INTR_RX_FULL                  BIT2   // Data bytes in RX FIFO over threshold
-#define     I2C_INTR_RX_OVER                  BIT1
-#define     I2C_INTR_RX_UNDER                 BIT0
-
-/**
-  Programe all I2C controllers on LPSS. 
-  
-  I2C0 is function 1 of LPSS. I2C1 is function 2 of LPSS, etc..
-
-  @param   VOID
-
-  @return  EFI_SUCCESS
-**/
-EFI_STATUS
-ProgramPciLpssI2C (
-  VOID
-  );
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress        Device Address from which the byte value has to be read
-  @param  Offset              Offset from which the data has to be read
-  @param  *Byte               Address to which the value read has to be stored
-  @param  Start               Whether a RESTART is issued before the byte is sent or received
-  @param  End                 Whether STOP is generated after a data byte is sent or received  
-                                  
-  @return  EFI_SUCCESS        If the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR   Operation Failed, Device Error
-**/
-EFI_STATUS
-ByteReadI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  );
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be written
-  @param  Offset               Offset from which the data has to be read
-  @param  *Byte                Address to which the value written is stored
-  @param  Start               Whether a RESTART is issued before the byte is sent or received
-  @param  End                 Whether STOP is generated after a data byte is sent or received  
-                                  
-  @return  EFI_SUCCESS         IF the byte value has been successfully written
-  @return  EFI_DEVICE_ERROR    Operation Failed, Device Error
-**/
-EFI_STATUS
-ByteWriteI2CBasic(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer,
-  IN  UINT8 Start,
-  IN  UINT8 End
-  );
-
-/**
-  Reads a Byte from I2C Device.
- 
-  @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress         Device Address from which the byte value has to be read
-  @param  Offset               Offset from which the data has to be read
-  @param  ReadBytes            Number of bytes to be read
-  @param  *ReadBuffer          Address to which the value read has to be stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS
-ByteReadI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN ReadBytes,
-  OUT UINT8 *ReadBuffer
-  );
-
-/**
-  Writes a Byte to I2C Device.
- 
-  @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
-  @param  SlaveAddress        Device Address from which the byte value has to be written
-  @param  Offset              Offset from which the data has to be written
-  @param  WriteBytes          Number of bytes to be written
-  @param  *Byte               Address to which the value written is stored
-                                
-  @return  EFI_SUCCESS       IF the byte value has been successfully read
-  @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
-**/
-EFI_STATUS
-ByteWriteI2C(
-  IN  UINT8 I2cControllerIndex,
-  IN  UINT8 SlaveAddress,
-  IN  UINT8 Offset,
-  IN  UINTN WriteBytes,
-  IN  UINT8 *WriteBuffer
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.inf
deleted file mode 100644
index a78212a0e7..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.inf
+++ /dev/null
@@ -1,40 +0,0 @@
-## @file
-#  Instance of I2C Library.
-#
-#  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-#
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = I2CLibPei
-  FILE_GUID                      = 8EF61509-890B-4FF2-B352-1C0E9CDDEC8B
-  MODULE_TYPE                    = PEIM
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = LockBoxLib|PEIM
-  CONSTRUCTOR                    = IntelI2CPeiLibConstructor
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources.common]
-  I2CLibPei.c
-  I2CIoLibPei.c
-
-[LibraryClasses]
-  TimerLib
-
-[PPIs]
-  gEfiPeiStallPpiGuid
-
-
-[Packages]
-  MdePkg/MdePkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.c
deleted file mode 100644
index b99c3b0122..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-#include "PiPei.h"
-#include <Library/HobLib.h>
-#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
-#include <Guid/MemoryConfigData.h>
-#include <PlatformFspLib.h>
-
-EFI_STATUS
-PlatformHobCreateFromFsp (
-  IN CONST EFI_PEI_SERVICES     **PeiServices,
-  VOID                          *HobList
-  )
-{
-  VOID       *HobData;
-  VOID       *NewHobData;
-  UINTN      DataSize;
-
-  //
-  // Other hob, todo: put this into FspWrapPlatformLib
-  //
-  if ((HobList = GetNextGuidHob (&gEfiMemoryConfigDataGuid, HobList)) != NULL) {
-    HobData = GET_GUID_HOB_DATA (HobList);
-    DataSize = GET_GUID_HOB_DATA_SIZE(HobList);
-    DEBUG((EFI_D_ERROR, "gEfiMemoryConfigDataGuid Hob found: 0x%x.\n", DataSize));
-
-    NewHobData = BuildGuidHob (&gEfiMemoryConfigDataGuid, DataSize);
-    (*PeiServices)->CopyMem (
-                      NewHobData,
-                      HobData,
-                      DataSize
-                      );
-  }
-
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
deleted file mode 100644
index ddd97c5ad9..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/PlatformFspLib.inf
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-#
-# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-#    FSP Platform HOB Library
-#
-#
-#
-##
-
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = PlatformFspLib
-  FILE_GUID                      = 1305A712-33A6-4fa7-BA59-AEAC3362931A
-  MODULE_TYPE                    = BASE
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = PlatformFspLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  PlatformFspLib.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
-
-[LibraryClasses]
-  BaseLib
-  DebugLib
-  HobLib
-
-[Guids]
-  gEfiMemoryConfigDataGuid
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/PlatformSerialPortLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/PlatformSerialPortLib.h
deleted file mode 100644
index fe47e8f68d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/PlatformSerialPortLib.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/** @file
-  Header file of Serial port hardware definition.
-
-  Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef __PLATFORM_SERIAL_PORT_LIB_H_
-#define __PLATFORM_SERIAL_PORT_LIB_H_
-
-#include <Base.h>
-#include <Library/BaseLib.h>
-#include <Library/IoLib.h>
-#include <Library/PcdLib.h>
-#include <Library/SerialPortLib.h>
-
-//
-// UART Register Offsets
-//
-#define BAUD_LOW_OFFSET   0x00
-#define BAUD_HIGH_OFFSET  0x01
-#define IER_OFFSET        0x01
-#define LCR_SHADOW_OFFSET 0x01
-#define FCR_SHADOW_OFFSET 0x02
-#define IR_CONTROL_OFFSET 0x02
-#define FCR_OFFSET        0x02
-#define EIR_OFFSET        0x02
-#define BSR_OFFSET        0x03
-#define LCR_OFFSET        0x03
-#define MCR_OFFSET        0x04
-#define LSR_OFFSET        0x05
-#define MSR_OFFSET        0x06
-
-//
-// UART Register Bit Defines
-//
-#define LSR_TXRDY 0x20
-#define LSR_RXDA  0x01
-#define DLAB      0x01
-
-#define UART_DATA    8
-#define UART_STOP    1
-#define UART_PARITY  0
-#define UART_BREAK_SET  0
-
-VOID
-InitializeSio (
-  VOID
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.c
deleted file mode 100644
index f6012593d0..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/** @file
-  Serial I/O Port library functions with no library constructor/destructor
-
-  Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "PlatformSerialPortLib.h"
-
-UINT16 gComBase  = 0x3f8;
-UINTN  gBps      = 115200;
-UINT8  gData     = 8;
-UINT8  gStop     = 1;
-UINT8  gParity   = 0;
-UINT8  gBreakSet = 0;
-
-/**
-  Initialize Serial Port
-
-  The Baud Rate Divisor registers are programmed and the LCR
-  is used to configure the communications format. Hard coded
-  UART config comes from globals in DebugSerialPlatform lib.
-
-  @param None
-
-  @retval None
-
-**/
-RETURN_STATUS
-EFIAPI
-UARTInitialize (
-  VOID
-  )
-{
-  UINTN Divisor;
-  UINT8 OutputData;
-  UINT8 Data;
-
-  //
-  // Map 5..8 to 0..3
-  //
-  Data = (UINT8) (gData - (UINT8) 5);
-
-  //
-  // Calculate divisor for baud generator
-  //
-  Divisor = 115200 / gBps;
-
-  //
-  // Set communications format
-  //
-  OutputData = (UINT8) ((DLAB << 7) | ((gBreakSet << 6) | ((gParity << 3) | ((gStop << 2) | Data))));
-  IoWrite8 (gComBase + LCR_OFFSET, OutputData);
-
-  //
-  // Configure baud rate
-  //
-  IoWrite8 (gComBase + BAUD_HIGH_OFFSET, (UINT8) (Divisor >> 8));
-  IoWrite8 (gComBase + BAUD_LOW_OFFSET, (UINT8) (Divisor & 0xff));
-
-  //
-  // Switch back to bank 0
-  //
-  OutputData = (UINT8) ((~DLAB << 7) | ((gBreakSet << 6) | ((gParity << 3) | ((gStop << 2) | Data))));
-  IoWrite8 (gComBase + LCR_OFFSET, OutputData);
-
-  return RETURN_SUCCESS;
-}
-
-/**
-  Common function to initialize UART Serial device and USB Serial device.
-
-  @param None
-
-  @retval None
-
-**/
-RETURN_STATUS
-EFIAPI
-SerialPortInitialize (
-  VOID
-  )
-{
-
-  UARTInitialize ();
-
-
-  return RETURN_SUCCESS;
-}
-
-/**
-  Write data to serial device.
-
-  If the buffer is NULL, then return 0;
-  if NumberOfBytes is zero, then return 0.
-
-  @param  Buffer           Point of data buffer which need to be writed.
-  @param  NumberOfBytes    Number of output bytes which are cached in Buffer.
-
-  @retval 0                Write data failed.
-  @retval !0               Actual number of bytes writed to serial device.
-
-**/
-UINTN
-EFIAPI
-UARTDbgOut (
-  IN UINT8     *Buffer,
-  IN UINTN     NumberOfBytes
-)
-{
-  UINTN Result;
-  UINT8 Data;
-
-  if (NULL == Buffer) {
-    return 0;
-  }
-
-  Result = NumberOfBytes;
-
-  while (NumberOfBytes--) {
-    //
-    // Wait for the serial port to be ready.
-    //
-    do {
-      Data = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase) + LSR_OFFSET);
-    } while ((Data & LSR_TXRDY) == 0);
-    IoWrite8 ((UINT16) PcdGet64 (PcdSerialRegisterBase), *Buffer++);
-  }
-
-  return Result;
-}
-
-/**
-  Common function to write data to UART Serial device and USB Serial 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
-)
-{
-  if (FeaturePcdGet (PcdStatusCodeUseIsaSerial)) {
-    UARTDbgOut (Buffer, NumberOfBytes);
-  }
-
-  return RETURN_SUCCESS;
-}
-
-/**
-  Read data from serial device and save the datas in buffer.
-
-  If the buffer is NULL, then return 0;
-  if NumberOfBytes is zero, then return 0.
-
-  @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.
-  @retval !0               Actual number of bytes raed to serial device.
-
-**/
-UINTN
-EFIAPI
-UARTDbgIn (
-  OUT UINT8     *Buffer,
-  IN  UINTN     NumberOfBytes
-)
-{
-  UINTN Result;
-  UINT8 Data;
-
-  if (NULL == Buffer) {
-    return 0;
-  }
-
-  Result = NumberOfBytes;
-
-  while (NumberOfBytes--) {
-    //
-    // Wait for the serial port to be ready.
-    //
-    do {
-      Data = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase) + LSR_OFFSET);
-    } while ((Data & LSR_RXDA) == 0);
-
-    *Buffer++ = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase));
-  }
-
-  return Result;
-}
-
-/**
-  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.
-
-**/
-UINTN
-EFIAPI
-SerialPortRead (
-  OUT UINT8     *Buffer,
-  IN  UINTN     NumberOfBytes
-)
-{
-  if (FeaturePcdGet (PcdStatusCodeUseIsaSerial)) {
-    UARTDbgIn (Buffer, NumberOfBytes);
-  }
-
-  return RETURN_SUCCESS;
-}
-
-
-/**
-  Polls a serial device to see if there is any data waiting to be read.
-
-  Polls aserial 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
-  )
-{
-  UINT8  Data;
-
-  //
-  // Read the serial port status.
-  //
-  Data = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase) + LSR_OFFSET);
-
-  return (BOOLEAN) ((Data & LSR_RXDA) != 0);
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.inf
deleted file mode 100644
index 0e7a6d3cfc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SerialPortLib.inf
+++ /dev/null
@@ -1,52 +0,0 @@
-#/** @file
-#
-# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-#**/
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SerialPortLib
-  FILE_GUID                      = 15B26F43-A389-4bae-BDE3-4BB0719B7D4F
-  MODULE_TYPE                    = BASE
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = SerialPortLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64
-#
-
-[Sources]
-  SerialPortLib.c
-  SioInit.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-
-[LibraryClasses]
-  BaseLib
-  PcdLib
-  IoLib
-  PciLib
-  TimerLib
-
-[FixedPcd.common]
-  gEfiSerialPortTokenSpaceGuid.PcdSerialBoudRate
-  gEfiSerialPortTokenSpaceGuid.PcdSerialRegisterBase
-
-[FeaturePcd]
-  gEfiSerialPortTokenSpaceGuid.PcdStatusCodeUseIsaSerial
-  gEfiSerialPortTokenSpaceGuid.PcdStatusCodeUseUsbSerial
-  gEfiSerialPortTokenSpaceGuid.PcdStatusCodeUseRam
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.c
deleted file mode 100644
index d9d48539dc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-    SioInit.c
-
-Abstract:
-
-    Functions for LpcSio initialization
-
---*/
-
-#include "PlatformSerialPortLib.h"
-#include "SioInit.h"
-
-typedef struct {
-  UINT8 Register;
-  UINT8 Value;
-} EFI_SIO_TABLE;
-
-EFI_SIO_TABLE mSioTableWpcn381u[] = {
-    {0x29, 0x0A0},
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART0},                                       // Select UART0 device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS >> 8)},       // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
-    {WPCN381U_IRQ1_REGISTER, 0x014},                                                      // Set to IRQ4
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART1},                                       // Select UART1 device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS >> 8)},       // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
-    {WPCN381U_IRQ1_REGISTER, 0x013},                                                      // Set to IRQ3
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_GPIO},                                        // Select GPIO device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS >> 8)},               // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS & 0x00FF)},           // Set Base Address LSB
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {0x21, 0x001},                                                                        // Global Device Enable
-    {0x26, 0x000}
-};
-
-EFI_SIO_TABLE mSioTableWdcp376[] = {
-    {0x29, 0x0A0},
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART0},                                       // Select UART0 device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS >> 8)},       // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
-    {WPCN381U_IRQ1_REGISTER, 0x014},                                                      // Set to IRQ4
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART1},                                       // Select UART1 device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS >> 8)},       // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
-    {WPCN381U_IRQ1_REGISTER, 0x013},                                                      // Set to IRQ3
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_GPIO},                                        // Select GPIO device
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS >> 8)},               // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS & 0x00FF)},           // Set Base Address LSB
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {0x21, 0x001},                                                                        // Global Device Enable
-    {0x26, 0x000},
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_PS2K},                                        // Select PS2 Keyboard
-    {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_KB_BASE1_ADDRESS >> 8)},                // Set Base Address MSB
-    {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_KB_BASE1_ADDRESS & 0x00FF)},            // Set Base Address LSB
-    {WPCN381U_BASE2_HI_REGISTER, (UINT8)(WPCN381U_KB_BASE2_ADDRESS >> 8)},                // Set Base Address MSB
-    {WPCN381U_BASE2_LO_REGISTER, (UINT8)(WPCN381U_KB_BASE2_ADDRESS & 0x00FF)},            // Set Base Address LSB
-    {WPCN381U_IRQ1_REGISTER, 0x011},                                                      // Set to IRQ1
-    {0xF0, (SIO_KBC_CLOCK << 6)},                                                         // Select KBC Clock Source
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
-    {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_PS2M},                                        // Select PS2 Mouse
-    {WPCN381U_IRQ1_REGISTER, 0x01c},                                                      // Set to IRQ12
-    {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE}                                 // Enable it with Activation bit
-};
-
-/**
-  Initialization for SIO.
-
-  @param FfsHeader     FV this PEIM was loaded from.
-  @param PeiServices   General purpose services available to every PEIM.
-
-  None
-
-**/
-VOID
-InitializeSio (
-  VOID
-  )
-{
-  UINT16          Index;
-  UINT16          IndexPort;
-  UINT16          DataPort;
-
-  //
-  // Super I/O initialization for Winbond WPCN381U
-  //
-  IndexPort  = WPCN381U_CONFIG_INDEX;
-  DataPort   = WPCN381U_CONFIG_DATA;
-
-  //
-  // Check for Winbond WPCN381U
-  //
-  IoWrite8 (IndexPort, WPCN381U_DEV_ID_REGISTER);   // Winbond WPCN381U Device ID register is 0x20
-
-  if (IoRead8 (DataPort) == WPCN381U_CHIP_ID) {   // Winbond WPCN381U Device ID is 0xF4
-    //
-    // Configure WPCN381U SIO
-    //
-    for (Index = 0; Index < sizeof (mSioTableWpcn381u) / sizeof (EFI_SIO_TABLE); Index++) {
-      IoWrite8 (IndexPort, mSioTableWpcn381u[Index].Register);
-      IoWrite8 (DataPort, mSioTableWpcn381u[Index].Value);
-    }
-  }
-
-  if (IoRead8 (DataPort) == WDCP376_CHIP_ID) {   // Winbond WDCP376 Device ID is 0xF1
-    //
-    // Configure WDCP376 SIO
-    //
-    for (Index = 0; Index < sizeof (mSioTableWdcp376) / sizeof (EFI_SIO_TABLE); Index++) {
-      IoWrite8 (IndexPort, mSioTableWdcp376[Index].Register);
-      IoWrite8 (DataPort, mSioTableWdcp376[Index].Value);
-    }
-  }
-  return;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.h
deleted file mode 100644
index 06fa19b93d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/SioInit.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/** @file
-  Header file of Serial port hardware definition.
-
-  Copyright (c) 2012  - 2017, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _SIO_INIT_H_
-#define _SIO_INIT_H_
-
-#define WPCN381U_CONFIG_INDEX               0x2E
-#define WPCN381U_CONFIG_DATA                0x2F
-#define WPCN381U_CONFIG_INDEX1              0x164E
-#define WPCN381U_CONFIG_DATA1               0x164F
-#define WPCN381U_CHIP_ID                    0xF4
-#define WDCP376_CHIP_ID                     0xF1
-
-//
-// SIO Logical Devices Numbers
-//
-#define WPCN381U_LDN_UART0                  0x03   // LDN for Serial Port Controller
-#define WPCN381U_LDN_UART1                  0x02   // LDN for Parallel Port Controller
-#define WPCN381U_LDN_PS2K                   0x06   // LDN for PS2 Keyboard Controller
-#define WPCN381U_LDN_PS2M                   0x05   // LDN for PS2 Mouse Controller
-#define WPCN381U_KB_BASE1_ADDRESS           0x60   // Base Address of KB controller
-#define WPCN381U_KB_BASE2_ADDRESS           0x64   // Base Address of KB controller
-#define SIO_KBC_CLOCK                       0x01   // 0/1/2 - 8/12/16 MHz KBC Clock Source
-#define WPCN381U_LDN_GPIO                   0x07   // LDN for GPIO
-
-//
-// SIO Registers Layout
-//
-#define WPCN381U_LD_SEL_REGISTER            0x07   // Logical Device Select Register Address
-#define WPCN381U_DEV_ID_REGISTER            0x20   // Device Identification Register Address
-#define WPCN381U_ACTIVATE_REGISTER          0x30   // Device Identification Register Address
-#define WPCN381U_BASE1_HI_REGISTER          0x60   // Device BaseAddres Register #1 MSB Address
-#define WPCN381U_BASE1_LO_REGISTER          0x61   // Device BaseAddres Register #1 LSB Address
-#define WPCN381U_BASE2_HI_REGISTER          0x62   // Device BaseAddres Register #1 MSB Address
-#define WPCN381U_BASE2_LO_REGISTER          0x63   // Device Ba1eAddres Register #1 LSB Address
-#define WPCN381U_IRQ1_REGISTER              0x70   // Device IRQ Register #1 Address
-#define WPCN381U_IRQ2_REGISTER              0x71   // Device IRQ Register #2 Address
-
-//
-// SIO Activation Values
-//
-#define WPCN381U_ACTIVATE_VALUE             0x01   // Value to activate Device
-#define WPCN381U_DEACTIVATE_VALUE           0x00   // Value to deactivate Device
-
-//
-// SIO GPIO
-//
-#define WPCN381U_GPIO_BASE_ADDRESS          0x0A20 // SIO GPIO Base Address
-
-//
-// SIO Serial Port Settings
-//
-#define WPCN381U_SERIAL_PORT0_BASE_ADDRESS  0x03F8 // Base Address of Serial Port 0 (COMA / UART0)
-#define WPCN381U_SERIAL_PORT1_BASE_ADDRESS  0x02F8 // Base Address of Serial Port 1 (COMB / UART1)
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.c b/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.c
deleted file mode 100644
index b1fb4adb34..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-
-  LegacyMetronome.c
-
-Abstract:
-
-  This contains the installation function for the driver.
-
---*/
-
-#include "LegacyMetronome.h"
-
-//
-// Handle for the Metronome Architectural Protocol instance produced by this driver
-//
-EFI_HANDLE                  mMetronomeHandle = NULL;
-
-//
-// The Metronome Architectural Protocol instance produced by this driver
-//
-EFI_METRONOME_ARCH_PROTOCOL mMetronome = {
-  WaitForTick,
-  TICK_PERIOD
-};
-
-//
-// The CPU I/O Protocol used to access system hardware
-//
-EFI_CPU_IO_PROTOCOL         *mCpuIo = NULL;
-
-//
-// Worker Functions
-//
-
-/**
-  Write an 8 bit value to an I/O port and save it to the S3 script
-
-  @param Port  IO Port
-  @param Data  Data in IO Port
-
-  @retval None.
-
-**/
-VOID
-ScriptWriteIo8 (
-  UINT16  Port,
-  UINT8   Data
-  )
-{
-  mCpuIo->Io.Write (
-               mCpuIo,
-               EfiCpuIoWidthUint8,
-               Port,
-               1,
-               &Data
-               );
-
-}
-
-/**
-
-  Read the refresh bit from the REFRESH_PORT
-
-  @param None.
-
-  @retval Refresh bit.
-
-**/
-UINT8
-ReadRefresh (
-  VOID
-  )
-{
-  UINT8 Data;
-
-  mCpuIo->Io.Read (
-               mCpuIo,
-               EfiCpuIoWidthUint8,
-               REFRESH_PORT,
-               1,
-               &Data
-               );
-  return (UINT8) (Data & REFRESH_ON);
-}
-
-/**
-
-  Waits for the TickNumber of ticks from a known platform time source.
-
-  @param This                Pointer to the protocol instance.
-  @param TickNumber          Tick Number to be waited
-
-
-  @retval EFI_SUCCESS         If number of ticks occurred.
-  @retval EFI_NOT_FOUND       Could not locate CPU IO protocol
-
-**/
-EFI_STATUS
-EFIAPI
-WaitForTick (
-  IN EFI_METRONOME_ARCH_PROTOCOL  *This,
-  IN UINT32                       TickNumber
-  )
-{
-  //
-  // Wait for TickNumber toggles of the Refresh bit
-  //
-  for (; TickNumber != 0x00; TickNumber--) {
-    while (ReadRefresh () == REFRESH_ON)
-      ;
-    while (ReadRefresh () == REFRESH_OFF)
-      ;
-  }
-
-  return EFI_SUCCESS;
-}
-
-//
-// Driver Entry Point
-//
-/**
-  Install the LegacyMetronome driver.  Loads a Metronome Arch Protocol based
-  on the Port 61 timer.
-
-  @param ImageHandle      Handle for the image of this driver
-  @param SystemTable      Pointer to the EFI System Table
-
-  @retval EFI_SUCCESS     Metronome Architectural Protocol Installed
-
-**/
-EFI_STATUS
-EFIAPI
-InstallLegacyMetronome (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  EFI_STATUS  Status;
-
-  //
-  // Make sure the Metronome Architectural Protocol is not already installed in the system
-  //
-  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiMetronomeArchProtocolGuid);
-
-  //
-  // Get the CPU I/O Protocol that this driver requires
-  // If the CPU I/O Protocol is not found, then ASSERT because the dependency expression
-  // should guarantee that it is present in the handle database.
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiCpuIoProtocolGuid,
-                  NULL,
-                  (void **)&mCpuIo
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // Program port 61 timer 1 as refresh timer. We could use ACPI timer in the
-  // future.
-  //
-  ScriptWriteIo8 (TIMER1_CONTROL_PORT, LOAD_COUNTER1_LSB);
-  ScriptWriteIo8 (TIMER1_COUNT_PORT, COUNTER1_COUNT);
-
-  //
-  // Install on a new handle
-  //
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &mMetronomeHandle,
-                  &gEfiMetronomeArchProtocolGuid,
-                  &mMetronome,
-                  NULL
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-  return Status;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.h b/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.h
deleted file mode 100644
index 9599eca702..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetronome.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-  LegacyMetronome.h
-
-Abstract:
-
-  Driver implementing the EFI 2.0 metronome protocol using the legacy PORT 61
-  timer.
-
---*/
-
-#ifndef _LEGACY_METRONOME_H
-#define _LEGACY_METRONOME_H
-
-//
-// Statements that include other files
-//
-#include "Protocol/Metronome.h"
-#include "Protocol/CpuIo.h"
-#include "Library/DebugLib.h"
-#include "Library/UefiBootServicesTableLib.h"
-
-
-//
-// Private definitions
-//
-#define TICK_PERIOD         300
-#define REFRESH_PORT        0x61
-#define REFRESH_ON          0x10
-#define REFRESH_OFF         0x00
-#define TIMER1_CONTROL_PORT 0x43
-#define TIMER1_COUNT_PORT   0x41
-#define LOAD_COUNTER1_LSB   0x54
-#define COUNTER1_COUNT      0x12
-
-//
-// Function Prototypes
-//
-/**
-  Waits for the TickNumber of ticks from a known platform time source.
-
-  @param This                 Pointer to the protocol instance.
-  @param TickNumber           Tick Number to be waited
-
-  @retval EFI_SUCCESS         If number of ticks occurred.
-  @retval EFI_NOT_FOUND       Could not locate CPU IO protocol
-
-**/
-EFI_STATUS
-EFIAPI
-WaitForTick (
-  IN EFI_METRONOME_ARCH_PROTOCOL  *This,
-  IN UINT32                       TickNumber
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf b/Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf
deleted file mode 100644
index 173370d652..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-#
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-
-#  Module Name:
-#
-#    LegacyMetronome.inf
-#
-#  Abstract:
-#
-#    Component description file for LegacyMetronome module
-#
-#--*/
-[defines]
-  INF_VERSION	       = 0x00010005
-  BASE_NAME            = LegacyMetronome
-  FILE_GUID            = 07A9330A-F347-11d4-9A49-0090273FC14D
-  MODULE_TYPE          = DXE_DRIVER
-  VERSION_STRING       = 1.0
-  ENTRY_POINT	       = InstallLegacyMetronome
-
-[sources.common]
-  LegacyMetronome.c
-  LegacyMetronome.h
-
-[Packages]
-  MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-
-[LibraryClasses]
-  UefiDriverEntryPoint
-  UefiBootServicesTableLib
-  DevicePathLib
-  UefiLib
-
-[Protocols]
-
-gEfiMetronomeArchProtocolGuid
-gEfiCpuIoProtocolGuid
-
-[Depex]
-gEfiCpuIoProtocolGuid  AND  gEfiBootScriptSaveProtocolGuid
-
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c
deleted file mode 100644
index 26599620ba..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c
+++ /dev/null
@@ -1,252 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-
-    SmmScriptSave.c
-
-Abstract:
-
-    ScriptTableSave module at run time
-
---*/
-
-#include "SmmScriptSave.h"
-
-//
-// internal functions
-//
-
-EFI_STATUS
-BootScriptIoWrite  (
-  IN EFI_SMM_SCRIPT_TABLE     *ScriptTable,
-  IN VA_LIST                  Marker
-  );
-
-EFI_STATUS
-BootScriptPciCfgWrite  (
-  IN EFI_SMM_SCRIPT_TABLE     *ScriptTable,
-  IN VA_LIST                  Marker
-  );
-
-VOID
-SmmCopyMem (
-  IN  UINT8    *Destination,
-  IN  UINT8    *Source,
-  IN  UINTN    ByteCount
-  );
-
-//
-// Function implementations
-//
-EFI_STATUS
-SmmBootScriptWrite (
-  IN OUT EFI_SMM_SCRIPT_TABLE    *ScriptTable,
-  IN UINTN                       Type,
-  IN UINT16                      OpCode,
-  ...
-  )
-{
-  EFI_STATUS    Status;
-  VA_LIST       Marker;
-
-  if (ScriptTable == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Build script according to opcode
-  //
-  switch ( OpCode ) {
-
-    case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:
-      VA_START(Marker, OpCode);
-      Status = BootScriptIoWrite (ScriptTable, Marker);
-      VA_END(Marker);
-      break;
-
-    case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:
-      VA_START(Marker, OpCode);
-      Status = BootScriptPciCfgWrite(ScriptTable, Marker);
-      VA_END(Marker);
-      break;
-
-    default:
-      Status = EFI_SUCCESS;
-      break;
-  }
-
-  return Status;
-}
-
-
-EFI_STATUS
-SmmBootScriptCreateTable (
-  IN OUT EFI_SMM_SCRIPT_TABLE    *ScriptTable,
-  IN UINTN                       Type
-  )
-{
-  BOOT_SCRIPT_POINTERS          Script;
-  UINT8                         *Buffer;
-
-  if (ScriptTable == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Buffer = (UINT8*) ((UINTN)(*ScriptTable));
-
-  //
-  // Fill Table Header
-  //
-  Script.Raw = Buffer;
-  Script.TableInfo->OpCode      = EFI_BOOT_SCRIPT_TABLE_OPCODE;
-  Script.TableInfo->Length      = sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER);
-  Script.TableInfo->TableLength = sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER);
-
-  //
-  // Update current table pointer
-  //
-  *ScriptTable = *ScriptTable + sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER);
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-SmmBootScriptCloseTable (
-  IN EFI_SMM_SCRIPT_TABLE        ScriptTableBase,
-  IN EFI_SMM_SCRIPT_TABLE        ScriptTablePtr,
-  IN UINTN                       Type
-  )
-{
-  BOOT_SCRIPT_POINTERS    Script;
-
-  //
-  // Add final "termination" node to script table
-  //
-  Script.Raw               = (UINT8*) ((UINTN)ScriptTablePtr);
-  Script.Terminate->OpCode = EFI_BOOT_SCRIPT_TERMINATE_OPCODE;
-  Script.Terminate->Length = sizeof (EFI_BOOT_SCRIPT_TERMINATE);
-  ScriptTablePtr          += sizeof (EFI_BOOT_SCRIPT_TERMINATE);
-
-
-  //
-  // Update Table Header
-  //
-  Script.Raw                    = (UINT8*) ((UINTN)ScriptTableBase);
-  Script.TableInfo->OpCode      = EFI_BOOT_SCRIPT_TABLE_OPCODE;
-  Script.TableInfo->Length      = sizeof (EFI_BOOT_SCRIPT_TABLE_HEADER);
-  Script.TableInfo->TableLength = (UINT32)(ScriptTablePtr - ScriptTableBase);
-
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-BootScriptIoWrite  (
-  IN EFI_SMM_SCRIPT_TABLE     *ScriptTable,
-  IN VA_LIST                  Marker
-  )
-{
-  BOOT_SCRIPT_POINTERS    Script;
-  EFI_BOOT_SCRIPT_WIDTH   Width;
-  UINTN                   Address;
-  UINTN                   Count;
-  UINT8                   *Buffer;
-  UINTN                   NodeLength;
-  UINT8                   WidthInByte;
-
-  Width     = VA_ARG(Marker, EFI_BOOT_SCRIPT_WIDTH);
-  Address   = VA_ARG(Marker, UINTN);
-  Count     = VA_ARG(Marker, UINTN);
-  Buffer    = VA_ARG(Marker, UINT8*);
-
-  WidthInByte = (UINT8)(0x01 << (Width & 0x03));
-  Script.Raw  = (UINT8*) ((UINTN)(*ScriptTable));
-  NodeLength  = sizeof (EFI_BOOT_SCRIPT_IO_WRITE) + (WidthInByte * Count);
-
-  //
-  // Build script data
-  //
-  Script.IoWrite->OpCode  = EFI_BOOT_SCRIPT_IO_WRITE_OPCODE;
-  Script.IoWrite->Length  = (UINT8)(NodeLength);
-  Script.IoWrite->Width   = Width;
-  Script.IoWrite->Address = Address;
-  Script.IoWrite->Count   = (UINT32)Count;
-  SmmCopyMem (
-    (UINT8*)(Script.Raw + sizeof (EFI_BOOT_SCRIPT_IO_WRITE)),
-    Buffer,
-    WidthInByte * Count
-    );
-
-  //
-  // Update Script table pointer
-  //
-  *ScriptTable = *ScriptTable + NodeLength;
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-BootScriptPciCfgWrite  (
-  IN EFI_SMM_SCRIPT_TABLE        *ScriptTable,
-  IN VA_LIST                     Marker
-  )
-{
-  BOOT_SCRIPT_POINTERS    Script;
-  EFI_BOOT_SCRIPT_WIDTH   Width;
-  UINT64                  Address;
-  UINTN                   Count;
-  UINT8                   *Buffer;
-  UINTN                   NodeLength;
-  UINT8                   WidthInByte;
-
-  Width     = VA_ARG(Marker, EFI_BOOT_SCRIPT_WIDTH);
-  Address   = VA_ARG(Marker, UINT64);
-  Count     = VA_ARG(Marker, UINTN);
-  Buffer    = VA_ARG(Marker, UINT8*);
-
-  WidthInByte = (UINT8)(0x01 << (Width & 0x03));
-  Script.Raw  = (UINT8*) ((UINTN)(*ScriptTable));
-  NodeLength  = sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE) + (WidthInByte * Count);
-
-  //
-  // Build script data
-  //
-  Script.PciWrite->OpCode  = EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE;
-  Script.PciWrite->Length  = (UINT8)(NodeLength);
-  Script.PciWrite->Width   = Width;
-  Script.PciWrite->Address = Address;
-  Script.PciWrite->Count   = (UINT32)Count;
-  SmmCopyMem (
-    (UINT8*)(Script.Raw + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE)),
-    Buffer,
-    WidthInByte * Count
-    );
-
-  //
-  // Update Script table pointer
-  //
-  *ScriptTable = *ScriptTable + NodeLength;
-  return EFI_SUCCESS;
-}
-
-VOID
-SmmCopyMem (
-  IN  UINT8    *Destination,
-  IN  UINT8    *Source,
-  IN  UINTN    ByteCount
-  )
-{
-  UINTN   Index;
-
-  for (Index = 0; Index < ByteCount; Index++, Destination++, Source++) {
-    *Destination = *Source;
-  }
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.h
deleted file mode 100644
index d3eca8cdc0..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-    SmmScriptSave.h
-
-Abstract:
-
-  This is an implementation of the BootScript at run time.
-
---*/
-
-#ifndef _RUNTIME_SCRIPT_SAVE_H
-#define _RUNTIME_SCRIPT_SAVE_H
-
-#include "Efi.h"
-#include "EfiBootScript.h"
-
-
-typedef EFI_PHYSICAL_ADDRESS     EFI_SMM_SCRIPT_TABLE;
-
-EFI_STATUS
-SmmBootScriptCreateTable (
-  IN OUT EFI_SMM_SCRIPT_TABLE    *ScriptTable,
-  IN UINTN                       Type
-  );
-
-EFI_STATUS
-SmmBootScriptWrite (
-  IN OUT EFI_SMM_SCRIPT_TABLE    *ScriptTable,
-  IN UINTN                       Type,
-  IN UINT16                      OpCode,
-  ...
-  );
-
-EFI_STATUS
-SmmBootScriptCloseTable (
-  IN EFI_SMM_SCRIPT_TABLE        ScriptTableBase,
-  IN EFI_SMM_SCRIPT_TABLE        ScriptTablePtr,
-  IN UINTN                       Type
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.c b/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.c
deleted file mode 100644
index 0dbd6f00e1..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.c
+++ /dev/null
@@ -1,459 +0,0 @@
-/** @file
-  SMM SwDispatch2 Protocol on SMM SwDispatch Protocol Thunk driver.
-
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-
-#include <PiDxe.h>
-#include <FrameworkSmm.h>
-
-#include <Protocol/SmmSwDispatch2.h>
-#include <Protocol/SmmSwDispatch.h>
-#include <Protocol/SmmControl.h>
-#include <Protocol/SmmCpu.h>
-
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/SmmServicesTableLib.h>
-#include <Library/BaseLib.h>
-#include <Library/IoLib.h>
-#include <Library/DebugLib.h>
-
-typedef struct {
-  LIST_ENTRY                     Link;
-  EFI_HANDLE                     DispatchHandle;
-  UINTN                          SwSmiInputValue;
-  UINTN                          DispatchFunction;
-} EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT;
-
-/**
-  Register a child SMI source dispatch function for the specified software SMI.
-
-  This service registers a function (DispatchFunction) which will be called when the software
-  SMI source specified by RegisterContext->SwSmiCpuIndex is detected. On return,
-  DispatchHandle contains a unique handle which may be used later to unregister the function
-  using UnRegister().
-
-  @param[in]  This                  Pointer to the EFI_SMM_SW_DISPATCH2_PROTOCOL instance.
-  @param[in]  DispatchFunction      Function to register for handler when the specified software
-                                    SMI is generated.
-  @param[in, out]  RegisterContext  Pointer to the dispatch function's context.
-                                    The caller fills this context in before calling
-                                    the register function to indicate to the register
-                                    function which Software SMI input value the
-                                    dispatch function should be invoked for.
-  @param[out] DispatchHandle        Handle generated by the dispatcher to track the
-                                    function instance.
-
-  @retval EFI_SUCCESS            The dispatch function has been successfully
-                                 registered and the SMI source has been enabled.
-  @retval EFI_DEVICE_ERROR       The SW driver was unable to enable the SMI source.
-  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The SW SMI input value
-                                 is not within valid range.
-  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or SMM) to manage this
-                                 child.
-  @retval EFI_OUT_OF_RESOURCES   A unique software SMI value could not be assigned
-                                 for this dispatch.
-**/
-EFI_STATUS
-EFIAPI
-SmmSwDispatch2Register (
-  IN  CONST EFI_SMM_SW_DISPATCH2_PROTOCOL  *This,
-  IN        EFI_SMM_HANDLER_ENTRY_POINT2   DispatchFunction,
-  IN  OUT   EFI_SMM_SW_REGISTER_CONTEXT    *RegisterContext,
-  OUT       EFI_HANDLE                     *DispatchHandle
-  );
-
-/**
-  Unregister a child SMI source dispatch function for the specified software SMI.
-
-  This service removes the handler associated with DispatchHandle so that it will no longer be
-  called in response to a software SMI.
-
-  @param[in] This                Pointer to the EFI_SMM_SW_DISPATCH2_PROTOCOL instance.
-  @param[in] DispatchHandle      Handle of dispatch function to deregister.
-
-  @retval EFI_SUCCESS            The dispatch function has been successfully unregistered.
-  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
-**/
-EFI_STATUS
-EFIAPI
-SmmSwDispatch2UnRegister (
-  IN CONST EFI_SMM_SW_DISPATCH2_PROTOCOL  *This,
-  IN       EFI_HANDLE                     DispatchHandle
-  );
-
-EFI_SMM_SW_DISPATCH2_PROTOCOL gSmmSwDispatch2 = {
-  SmmSwDispatch2Register,
-  SmmSwDispatch2UnRegister,
-  0 // MaximumSwiValue
-};
-
-EFI_SMM_SW_DISPATCH_PROTOCOL  *mSmmSwDispatch;
-UINT8                         mSmiTriggerRegister;
-UINT8                         mSmiDataRegister;
-
-EFI_SMM_CPU_PROTOCOL          *mSmmCpuProtocol;
-LIST_ENTRY                    mSmmSwDispatch2ThunkQueue = INITIALIZE_LIST_HEAD_VARIABLE (mSmmSwDispatch2ThunkQueue);
-
-/**
-  This function find SmmSwDispatch2Context by SwSmiInputValue.
-
-  @param SwSmiInputValue The SwSmiInputValue to indentify the SmmSwDispatch2 context
-
-  @return SmmSwDispatch2 context
-**/
-EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT *
-FindSmmSwDispatch2ContextBySwSmiInputValue (
-  IN UINTN   SwSmiInputValue
-  )
-{
-  LIST_ENTRY                            *Link;
-  EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT    *ThunkContext;
-
-  for (Link = mSmmSwDispatch2ThunkQueue.ForwardLink;
-    Link != &mSmmSwDispatch2ThunkQueue;
-    Link = Link->ForwardLink) {
-    ThunkContext = BASE_CR (
-                     Link,
-                     EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT,
-                     Link
-                     );
-    if (ThunkContext->SwSmiInputValue == SwSmiInputValue) {
-      return ThunkContext;
-    }
-  }
-  return NULL;
-}
-
-/**
-  This function find SmmSwDispatch2Context by DispatchHandle.
-
-  @param DispatchHandle The DispatchHandle to indentify the SmmSwDispatch2Thunk context
-
-  @return SmmSwDispatch2Thunk context
-**/
-EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT *
-FindSmmSwDispatch2ContextByDispatchHandle (
-  IN EFI_HANDLE   DispatchHandle
-  )
-{
-  LIST_ENTRY                            *Link;
-  EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT    *ThunkContext;
-
-  for (Link = mSmmSwDispatch2ThunkQueue.ForwardLink;
-       Link != &mSmmSwDispatch2ThunkQueue;
-       Link = Link->ForwardLink) {
-    ThunkContext = BASE_CR (
-                     Link,
-                     EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT,
-                     Link
-                     );
-    if (ThunkContext->DispatchHandle == DispatchHandle) {
-      return ThunkContext;
-    }
-  }
-  return NULL;
-}
-
-/**
-  Framework dispatch function for a Software SMI handler.
-
-  @param  DispatchHandle        The handle of this dispatch function.
-  @param  DispatchContext       The pointer to the dispatch function's context.
-                                The SwSmiInputValue field is filled in
-                                by the software dispatch driver prior to
-                                invoking this dispatch function.
-                                The dispatch function will only be called
-                                for input values for which it is registered.
-
-  @return None
-
-**/
-VOID
-EFIAPI
-FrameworkDispatchFunction (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
-  )
-{
-  EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT    *ThunkContext;
-  EFI_SMM_HANDLER_ENTRY_POINT2          DispatchFunction;
-  EFI_SMM_SW_REGISTER_CONTEXT           RegisterContext;
-  EFI_SMM_SW_CONTEXT                    SwContext;
-  UINTN                                 Size;
-  UINTN                                 Index;
-  EFI_SMM_SAVE_STATE_IO_INFO            IoInfo;
-  EFI_STATUS                            Status;
-
-  //
-  // Search context
-  //
-  ThunkContext = FindSmmSwDispatch2ContextBySwSmiInputValue (DispatchContext->SwSmiInputValue);
-  ASSERT (ThunkContext != NULL);
-  if (ThunkContext == NULL) {
-    return ;
-  }
-
-  //
-  // Construct new context
-  //
-  RegisterContext.SwSmiInputValue = DispatchContext->SwSmiInputValue;
-  Size = sizeof(SwContext);
-  SwContext.CommandPort = IoRead8 (mSmiTriggerRegister);
-  SwContext.DataPort    = IoRead8 (mSmiDataRegister);
-
-  //
-  // Try to find which CPU trigger SWSMI
-  //
-  SwContext.SwSmiCpuIndex = 0;
-  for (Index = 0; Index < gSmst->NumberOfCpus; Index++) {
-    Status = mSmmCpuProtocol->ReadSaveState (
-                                mSmmCpuProtocol,
-                                sizeof(IoInfo),
-                                EFI_SMM_SAVE_STATE_REGISTER_IO,
-                                Index,
-                                &IoInfo
-                                );
-    if (EFI_ERROR (Status)) {
-      continue;
-    }
-    if (IoInfo.IoPort == mSmiTriggerRegister) {
-      //
-      // Great! Find it.
-      //
-      SwContext.SwSmiCpuIndex = Index;
-      break;
-    }
-  }
-
-  //
-  // Dispatch
-  //
-  DispatchFunction = (EFI_SMM_HANDLER_ENTRY_POINT2)ThunkContext->DispatchFunction;
-  DispatchFunction (
-    DispatchHandle,
-    &RegisterContext,
-    &SwContext,
-    &Size
-    );
-  return ;
-}
-
-/**
-  Register a child SMI source dispatch function for the specified software SMI.
-
-  This service registers a function (DispatchFunction) which will be called when the software
-  SMI source specified by RegisterContext->SwSmiCpuIndex is detected. On return,
-  DispatchHandle contains a unique handle which may be used later to unregister the function
-  using UnRegister().
-
-  @param[in]  This                  Pointer to the EFI_SMM_SW_DISPATCH2_PROTOCOL instance.
-  @param[in]  DispatchFunction      Function to register for handler when the specified software
-                                    SMI is generated.
-  @param[in, out]  RegisterContext  Pointer to the dispatch function's context.
-                                    The caller fills this context in before calling
-                                    the register function to indicate to the register
-                                    function which Software SMI input value the
-                                    dispatch function should be invoked for.
-  @param[out] DispatchHandle        Handle generated by the dispatcher to track the
-                                    function instance.
-
-  @retval EFI_SUCCESS            The dispatch function has been successfully
-                                 registered and the SMI source has been enabled.
-  @retval EFI_DEVICE_ERROR       The SW driver was unable to enable the SMI source.
-  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The SW SMI input value
-                                 is not within valid range.
-  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or SMM) to manage this
-                                 child.
-  @retval EFI_OUT_OF_RESOURCES   A unique software SMI value could not be assigned
-                                 for this dispatch.
-**/
-EFI_STATUS
-EFIAPI
-SmmSwDispatch2Register (
-  IN  CONST EFI_SMM_SW_DISPATCH2_PROTOCOL  *This,
-  IN        EFI_SMM_HANDLER_ENTRY_POINT2   DispatchFunction,
-  IN  OUT   EFI_SMM_SW_REGISTER_CONTEXT    *RegisterContext,
-  OUT       EFI_HANDLE                     *DispatchHandle
-  )
-{
-  EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT    *ThunkContext;
-  EFI_SMM_SW_DISPATCH_CONTEXT           DispatchContext;
-  EFI_STATUS                            Status;
-  UINTN                                 Index;
-
-  if (RegisterContext->SwSmiInputValue == (UINTN)-1) {
-    //
-    // If SwSmiInputValue is set to (UINTN) -1 then a unique value will be assigned and returned in the structure.
-    //
-    Status = EFI_NOT_FOUND;
-    for (Index = 1; Index < gSmmSwDispatch2.MaximumSwiValue; Index++) {
-      DispatchContext.SwSmiInputValue = Index;
-      Status = mSmmSwDispatch->Register (
-                                 mSmmSwDispatch,
-                                 FrameworkDispatchFunction,
-                                 &DispatchContext,
-                                 DispatchHandle
-                                 );
-      if (!EFI_ERROR (Status)) {
-        RegisterContext->SwSmiInputValue = Index;
-        break;
-      }
-    }
-    if (RegisterContext->SwSmiInputValue == (UINTN)-1) {
-      return EFI_OUT_OF_RESOURCES;
-    }
-  } else {
-    DispatchContext.SwSmiInputValue = RegisterContext->SwSmiInputValue;
-    Status = mSmmSwDispatch->Register (
-                               mSmmSwDispatch,
-                               FrameworkDispatchFunction,
-                               &DispatchContext,
-                               DispatchHandle
-                               );
-  }
-  if (!EFI_ERROR (Status)) {
-    //
-    // Register
-    //
-    Status = gSmst->SmmAllocatePool (
-                      EfiRuntimeServicesData,
-                      sizeof(*ThunkContext),
-                      (VOID **)&ThunkContext
-                      );
-    ASSERT_EFI_ERROR (Status);
-    if (EFI_ERROR (Status)) {
-      mSmmSwDispatch->UnRegister (mSmmSwDispatch, *DispatchHandle);
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    ThunkContext->SwSmiInputValue  = RegisterContext->SwSmiInputValue;
-    ThunkContext->DispatchFunction = (UINTN)DispatchFunction;
-    ThunkContext->DispatchHandle   = *DispatchHandle;
-    InsertTailList (&mSmmSwDispatch2ThunkQueue, &ThunkContext->Link);
-  }
-
-  return Status;
-}
-
-/**
-  Unregister a child SMI source dispatch function for the specified software SMI.
-
-  This service removes the handler associated with DispatchHandle so that it will no longer be
-  called in response to a software SMI.
-
-  @param[in] This                Pointer to the EFI_SMM_SW_DISPATCH2_PROTOCOL instance.
-  @param[in] DispatchHandle      Handle of dispatch function to deregister.
-
-  @retval EFI_SUCCESS            The dispatch function has been successfully unregistered.
-  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
-**/
-EFI_STATUS
-EFIAPI
-SmmSwDispatch2UnRegister (
-  IN CONST EFI_SMM_SW_DISPATCH2_PROTOCOL  *This,
-  IN       EFI_HANDLE                     DispatchHandle
-  )
-{
-  EFI_SMM_SW_DISPATCH2_THUNK_CONTEXT    *ThunkContext;
-  EFI_STATUS                            Status;
-
-  Status = mSmmSwDispatch->UnRegister (mSmmSwDispatch, DispatchHandle);
-  if (!EFI_ERROR (Status)) {
-    //
-    // Unregister
-    //
-    ThunkContext = FindSmmSwDispatch2ContextByDispatchHandle (DispatchHandle);
-    ASSERT (ThunkContext != NULL);
-    if (ThunkContext != NULL) {
-      RemoveEntryList (&ThunkContext->Link);
-      gSmst->SmmFreePool (ThunkContext);
-    }
-  }
-
-  return Status;
-}
-
-/**
-  Entry Point for this thunk driver.
-
-  @param[in] ImageHandle  Image handle of this driver.
-  @param[in] SystemTable  A Pointer to the EFI System Table.
-
-  @retval EFI_SUCCESS  The entry point is executed successfully.
-  @retval other        Some error occurred when executing this entry point.
-**/
-EFI_STATUS
-EFIAPI
-SmmSwDispatch2ThunkMain (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  EFI_STATUS               Status;
-  EFI_SMM_CONTROL_PROTOCOL *SmmControl;
-  EFI_SMM_CONTROL_REGISTER RegisterInfo;
-
-  //
-  // Locate Framework SMM SwDispatch Protocol
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiSmmSwDispatchProtocolGuid,
-                  NULL,
-                  (VOID **)&mSmmSwDispatch
-                  );
-  ASSERT_EFI_ERROR (Status);
-  gSmmSwDispatch2.MaximumSwiValue = mSmmSwDispatch->MaximumSwiValue;
-  if (gSmmSwDispatch2.MaximumSwiValue == 0x0) {
-    DEBUG ((EFI_D_ERROR, "BUGBUG: MaximumSwiValue is 0, work-around to make it 0xFF\n"));
-    gSmmSwDispatch2.MaximumSwiValue = 0xFF;
-  }
-
-  //
-  // Locate Framework SMM Control Protocol
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiSmmControlProtocolGuid,
-                  NULL,
-                  (VOID **)&SmmControl
-                  );
-
-  ASSERT_EFI_ERROR (Status);
-  Status = SmmControl->GetRegisterInfo (
-                         SmmControl,
-                         &RegisterInfo
-                         );
-  ASSERT_EFI_ERROR (Status);
-  mSmiTriggerRegister = RegisterInfo.SmiTriggerRegister;
-  mSmiDataRegister    = RegisterInfo.SmiDataRegister;
-
-  //
-  // Locate PI SMM CPU protocol
-  //
-  Status = gSmst->SmmLocateProtocol (
-                    &gEfiSmmCpuProtocolGuid,
-                    NULL,
-                    (VOID **)&mSmmCpuProtocol
-                    );
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // Publish PI SMM SwDispatch2 Protocol
-  //
-  ImageHandle = NULL;
-  Status = gSmst->SmmInstallProtocolInterface (
-                    &ImageHandle,
-                    &gEfiSmmSwDispatch2ProtocolGuid,
-                    EFI_NATIVE_INTERFACE,
-                    &gSmmSwDispatch2
-                    );
-  ASSERT_EFI_ERROR (Status);
-  return Status;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf b/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
deleted file mode 100644
index 4f95fc281e..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDispatchThunk/SmmSwDispatch2OnSmmSwDispatchThunk.inf
+++ /dev/null
@@ -1,54 +0,0 @@
-## @file
-#  Component description file for SMM SwDispatch2 Protocol on SMM SwDispatch Protocol Thunk driver.
-#
-#  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SmmSwDispatch2OnSmmSwDispatchThunk
-  FILE_GUID                      = 1410C6AC-9F4B-495b-9C23-8A5AEB0165E9
-  MODULE_TYPE                    = DXE_SMM_DRIVER
-  VERSION_STRING                 = 1.0
-  PI_SPECIFICATION_VERSION       = 0x0001000A
-  ENTRY_POINT                    = SmmSwDispatch2ThunkMain
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64
-#
-
-[Sources]
-  SmmSwDispatch2OnSmmSwDispatchThunk.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-
-[LibraryClasses]
-  UefiDriverEntryPoint
-  UefiBootServicesTableLib
-  SmmServicesTableLib
-  BaseLib
-  IoLib
-  DebugLib
-
-[Protocols]
-  gEfiSmmControlProtocolGuid               # PROTOCOL ALWAYS_CONSUMED
-  gEfiSmmSwDispatchProtocolGuid            # PROTOCOL ALWAYS_CONSUMED
-  gEfiSmmCpuProtocolGuid                   # PROTOCOL ALWAYS_CONSUMED
-  gEfiSmmSwDispatch2ProtocolGuid           # PROTOCOL ALWAYS_PRODUCED
-
-[Depex]
-  gEfiSmmSwDispatchProtocolGuid AND
-  gEfiSmmControlProtocolGuid AND
-  gEfiSmmCpuProtocolGuid
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.c b/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.c
deleted file mode 100644
index de257b35b5..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/** @file
-  A helper driver to save information to SMRAM after SMRR is enabled.
-
-  This driver is for ECP platforms.
-
-  Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-
-#include <PiSmm.h>
-#include <Library/DebugLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/SmmServicesTableLib.h>
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/IoLib.h>
-#include <Protocol/SmmSwDispatch.h>
-#include <Protocol/SmmReadyToLock.h>
-#include <Protocol/SmmControl.h>
-#include <Guid/Vlv2DeviceRefCodePkgTokenSpace.h>
-
-#define SMM_FROM_SMBASE_DRIVER        0x55
-#define SMM_FROM_CPU_DRIVER_SAVE_INFO 0x81
-
-#define EFI_SMRAM_CPU_NVS_HEADER_GUID \
-  { \
-    0x429501d9, 0xe447, 0x40f4, 0x86, 0x7b, 0x75, 0xc9, 0x3a, 0x1d, 0xb5, 0x4e \
-  }
-
-UINT8    mSmiDataRegister;
-BOOLEAN  mLocked = FALSE;
-EFI_GUID mSmramCpuNvsHeaderGuid = EFI_SMRAM_CPU_NVS_HEADER_GUID;
-
-/**
-  Dispatch function for a Software SMI handler.
-
-  @param  DispatchHandle        The handle of this dispatch function.
-  @param  DispatchContext       The pointer to the dispatch function's context.
-                                The SwSmiInputValue field is filled in
-                                by the software dispatch driver prior to
-                                invoking this dispatch function.
-                                The dispatch function will only be called
-                                for input values for which it is registered.
-
-  @return None
-
-**/
-VOID
-EFIAPI
-SmramSaveInfoHandler (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
-  )
-{
-  ASSERT (DispatchContext != NULL);
-  ASSERT (DispatchContext->SwSmiInputValue == SMM_FROM_SMBASE_DRIVER);
-
-  if (!mLocked && IoRead8 (mSmiDataRegister) == SMM_FROM_CPU_DRIVER_SAVE_INFO) {
-      CopyMem (
-        (VOID *)(UINTN)(PcdGetEx64 (&gEfiVLVTokenSpaceGuid, PcdCpuLockBoxDataAddress)),
-        (VOID *)(UINTN)(PcdGetEx64 (&gEfiVLVTokenSpaceGuid, PcdCpuSmramCpuDataAddress)),
-        (UINTN)(PcdGetEx64 (&gEfiVLVTokenSpaceGuid, PcdCpuLockBoxSize))
-        );
-  }
-}
-
-/**
-  Smm Ready To Lock event notification handler.
-
-  It sets a flag indicating that SMRAM has been locked.
-
-  @param[in] Protocol   Points to the protocol's unique identifier.
-  @param[in] Interface  Points to the interface instance.
-  @param[in] Handle     The handle on which the interface was installed.
-
-  @retval EFI_SUCCESS   Notification handler runs successfully.
- **/
-EFI_STATUS
-EFIAPI
-SmmReadyToLockEventNotify (
-  IN CONST EFI_GUID  *Protocol,
-  IN VOID            *Interface,
-  IN EFI_HANDLE      Handle
-  )
-{
-  mLocked = TRUE;
-  return EFI_SUCCESS;
-}
-
-/**
-  Entry point function of this driver.
-
-  @param[in] ImageHandle  The firmware allocated handle for the EFI image.
-  @param[in] SystemTable  A pointer to the EFI System Table.
-
-  @retval EFI_SUCCESS     The entry point is executed successfully.
-  @retval other           Some error occurs when executing this entry point.
-**/
-EFI_STATUS
-EFIAPI
-SmramSaveInfoHandlerSmmMain (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  EFI_STATUS                    Status;
-  EFI_SMM_SW_DISPATCH_PROTOCOL  *SmmSwDispatch;
-  EFI_SMM_SW_DISPATCH_CONTEXT   SmmSwDispatchContext;
-  EFI_HANDLE                    DispatchHandle;
-  EFI_SMM_CONTROL_PROTOCOL      *SmmControl;
-  EFI_SMM_CONTROL_REGISTER      SmmControlRegister;
-  VOID                          *Registration;
-
-  //
-  // Get SMI data register
-  //
-  Status = SystemTable->BootServices->LocateProtocol (
-                                        &gEfiSmmControlProtocolGuid,
-                                        NULL,
-                                        (VOID **)&SmmControl
-                                        );
-  ASSERT_EFI_ERROR (Status);
-  Status = SmmControl->GetRegisterInfo (SmmControl, &SmmControlRegister);
-  ASSERT_EFI_ERROR (Status);
-  mSmiDataRegister = SmmControlRegister.SmiDataRegister;
-
-  //
-  // Register software SMI handler
-  //
-
-  Status = SystemTable->BootServices->LocateProtocol (
-                                        &gEfiSmmSwDispatchProtocolGuid,
-                                        NULL,
-                                        (VOID **)&SmmSwDispatch
-                                        );
-  ASSERT_EFI_ERROR (Status);
-
-  SmmSwDispatchContext.SwSmiInputValue = SMM_FROM_SMBASE_DRIVER;
-  Status = SmmSwDispatch->Register (
-                            SmmSwDispatch,
-                            &SmramSaveInfoHandler,
-                            &SmmSwDispatchContext,
-                            &DispatchHandle
-                            );
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // Register SMM Ready To Lock Protocol notification
-  //
-  Status = gSmst->SmmRegisterProtocolNotify (
-                    &gEfiSmmReadyToLockProtocolGuid,
-                    SmmReadyToLockEventNotify,
-                    &Registration
-                    );
-  ASSERT_EFI_ERROR (Status);
-
-  return Status;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf b/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
deleted file mode 100644
index ec42c84472..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm/SmramSaveInfoHandlerSmm.inf
+++ /dev/null
@@ -1,60 +0,0 @@
-## @file
-#
-#  A helper driver to save information to SMRAM after SMRR is enabled.
-#
-#  Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SmramSaveInfoHandlerSmm
-  FILE_GUID                      = 63296C52-01CF-4eea-A47C-782A14DA6894
-  MODULE_TYPE                    = DXE_SMM_DRIVER
-  VERSION_STRING                 = 1.0
-  PI_SPECIFICATION_VERSION       = 0x0001000A
-
-  ENTRY_POINT                    = SmramSaveInfoHandlerSmmMain
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64
-#
-
-[Sources.common]
-  SmramSaveInfoHandlerSmm.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-
-[LibraryClasses]
-  UefiDriverEntryPoint
-  UefiRuntimeServicesTableLib
-  SmmServicesTableLib
-  BaseLib
-  BaseMemoryLib
-  IoLib
-
-[Protocols]
-  gEfiSmmSwDispatchProtocolGuid      ## CONSUMED
-  gEfiSmmControlProtocolGuid         ## CONSUMED
-  gEfiSmmReadyToLockProtocolGuid     ## CONSUMED
-
-[Pcd.common]
-  gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress
-  gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress
-  gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize
-  
-[Depex]
-  gEfiSmmSwDispatchProtocolGuid AND
-  gEfiSmmControlProtocolGuid
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIHeader/Vacant.bin b/Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIHeader/Vacant.bin
deleted file mode 100644
index 12d359146014baad9277a951b237fd27e819db6e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3928064
zcmeIuF#!Mo0K%aDspo45h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r
z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@
z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK
zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5
zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM
z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*
z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd
z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA
zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj
rFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFz^EdVf>G}

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat b/Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat
deleted file mode 100644
index 200ca05a23..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat
+++ /dev/null
@@ -1,270 +0,0 @@
-@REM @file
-@REM   Windows batch file to build BIOS ROM
-@REM
-@REM Copyright (c) 2006   - 2019, Intel Corporation. All rights reserved.<BR>
-@REM 
-@REM   SPDX-License-Identifier: BSD-2-Clause-Patent
-@REM
-
-@echo off
-SetLocal EnableDelayedExpansion EnableExtensions
-
-set PLATFORM_BIN_PACKAGE=%WORKSPACE%\Vlv2SocBinPkg
-if not exist %PLATFORM_BIN_PACKAGE% (
-  if defined PACKAGES_PATH (
-    for %%i IN (%PACKAGES_PATH%) DO (
-      if exist %%~fi\Vlv2SocBinPkg (
-        set PLATFORM_BIN_PACKAGE=%%~fi\Vlv2SocBinPkg
-        goto PlatformBinPackageFound
-      )
-    )
-  ) else (
-    echo.
-    echo !!! ERROR !!! Cannot find %PLATFORM_NAME% !!!
-    echo.
-    goto BldFail
-  )
-)
-:PlatformBinPackageFound
-
-
-:: Set script defaults
-set exitCode=0
-set BackupRom=1
-set UpdateVBios=1
-set SpiLock=0
-set Stitch_Config=Stitch_Config.txt
-copy /y nul Stitching.log >nul
-
-:: Set default Suffix as:  YYYY_MM_DD_HHMM
-set hour=%time: =0%
-reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International_Temp" /f >nul
-reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f >nul
-for /f "tokens=1" %%i in ("%date%") do set today=%%i
-reg copy "HKCU\Control Panel\International_Temp" "HKCU\Control Panel\International" /f >nul
-reg delete "HKCU\Control Panel\International_Temp" /f >nul
-set IFWI_Suffix=%today%_%hour:~0,2%%time:~3,2%
-
-:: Process input arguments
-if "%~1"=="?"       goto Usage
-if "%~1"=="/?"      goto Usage
-if /i "%~1"=="Help" goto Usage
-
-:OptLoop
-if /i "%~1"=="/nV" (
-    set UpdateVBios=0
-    shift
-    goto OptLoop
-)
-if /i "%~1"=="/nB" (
-    set BackupRom=0
-    shift
-    goto OptLoop
-)
-if /i "%~1"=="/yL" (
-    set SpiLock=1
-    shift
-    goto OptLoop
-)
-
-if /i "%~1"=="/B" (
-    if "%~2"==""  goto Usage
-    if not exist %~2 echo BIOS not found. & goto Usage
-    set BIOS_Names=%~2
-    set BIOS_File_Name=%~n2
-    shift & shift
-    goto OptLoop
-)
-if /i "%~1"=="/C" (
-    if "%~2"==""  goto Usage
-    if not exist %~2 echo ConfigFile not found. & goto Usage
-    set Stitch_Config=%~2
-    shift & shift
-    goto OptLoop
-)
-if /i "%~1"=="/S" (
-    if "%~2"==""  goto Usage
-    set IFWI_Suffix=%~2
-    shift & shift
-    goto OptLoop
-)
-
-if "%BIOS_File_Name:~0,4%"=="MNW2" (
-   set Stitch_Config= MNW2_Stitch_Config.txt
-)
-if "%BIOS_File_Name:~3,4%"=="MNW2" (
-   set Stitch_Config= MNW2_Stitch_Config.txt
-)
-
-:: if no rom specified by user, search in ./ for ROM files
-if "%BIOS_Names%"=="" (
-    set "BIOS_Names= "
-    for /f "tokens=*" %%i in ('dir /b *.rom') do set BIOS_Names=!BIOS_Names! %%i
-    if "!BIOS_Names!"==" " (
-        echo NO .ROM files found !!!
-        goto Usage
-    )
-)
-
-:: Parse the Stitch_Config File
-if not exist %Stitch_Config% (
-    echo Stitch Configuration File %Stitch_Config% not found.
-    goto ScriptFail
-)
-for /f "delims== tokens=1,2" %%i in (%Stitch_Config%) do (
-    if /i "%%i"=="HEADER"      set IFWI_HEADER=%%j
-    if /i "%%i"=="SEC_VERSION" set SEC_VERSION=%%j
-    if /i "%%i"=="Source" (
-        if /i "%%j"=="ALPHA" set Source_Prefix=A_
-        if /i "%%j"=="BF" set Source_Prefix=BF_
-        if /i "%%j"=="BE" set Source_Prefix=BE_
-        if /i "%%j"=="PV" set Source_Prefix=PV_
-        if /i "%%j"=="PR1" set Source_Prefix=PR1_
-    )
-)
-
-if %SpiLock% EQU 1 (
-  set IFWI_HEADER_FILE=IFWIHeader\!IFWI_HEADER!_SPILOCK.bin
-) else (
-  set IFWI_HEADER_FILE=IFWIHeader\!IFWI_HEADER!.bin
-)
-
-:: **********************************************************************
-:: The Main Stitching Loop
-:: **********************************************************************
-echo %date%  %time% >>Stitching.log 2>&1
-echo %date%  %time%
-echo.
-for %%i in (%BIOS_Names%) do (
-
-    REM  ----- Do NOT use :: for comments Inside of code blocks() -------
-    set BIOS_Rom=%%i
-    set BIOS_Name=%%~ni
-    set BIOS_Version=!BIOS_Name:~-7,7!
-
-    REM extract PlatformType from BIOS filename
-    set Platform_Type=!BIOS_Name:~0,4!
-
-    REM Special treat for BayLake FFD8
-    set Temp_Name=!BIOS_Name:~0,7!
-
-
-    REM Capitalize and validate the Platform_Type
-    if /i "!Platform_Type!"=="MNW2" (
-        set Platform_Type=MNW2
-    ) else (
-        echo Error - Unsupported PlatformType: !Platform_Type!
-        goto Usage
-    )
-
-
-    REM search BIOS_Name for Arch substring:  either IA32 or X64
-    if not "!BIOS_Name!"=="!BIOS_Name:_IA32_=!" (
-        set Arch=IA32
-    ) else if not "!BIOS_Name!"=="!BIOS_Name:_X64_=!" (
-        set Arch=X64
-    ) else (
-        echo Error:  Could not determine Architecture for !BIOS_Rom!
-        goto Usage
-    )
-    set IFWI_Prefix=!Platform_Type!_IFWI_%Source_Prefix%!Arch!_!!BIOS_Version!
-
-    REM search BIOS_Name for Build_Target substring: either R or D
-    if not "!BIOS_Name!"=="!BIOS_Name:_R_=!" (
-        set Build_Target=Release
-        set IFWI_Prefix=!IFWI_Prefix!_R
-    ) else if not "!BIOS_Name!"=="!BIOS_Name:_D_=!" (
-        set Build_Target=Debug
-        set IFWI_Prefix=!IFWI_Prefix!_D
-    ) else (
-        echo Error:  Could not determine Build Target for !BIOS_Rom!
-        goto Usage
-    )
-
-    REM Create a BIOS backup before Stitching
-    if %BackupRom% EQU 1 (
-        echo Creating backup of original BIOS rom.
-        copy /y !BIOS_Rom! !BIOS_Rom!.orig >nul
-    )
-
-    echo.  >>Stitching.log
-    echo ********** Stitching !BIOS_Rom! **********  >>Stitching.log
-    echo.  >>Stitching.log
-    echo.
-    echo Stitching IFWI for !BIOS_Rom! ...
-    echo ---------------------------------------------------------------------------
-    echo IFWI  Header: !IFWI_HEADER_FILE!,   SEC version: !SEC_VERSION!,   
-    echo BIOS Version: !BIOS_Version!
-
-    echo Platform Type: !Platform_Type!,     IFWI Prefix: %BIOS_ID%
-    echo ---------------------------------------------------------------------------
-
-    echo -----------------------------
-    echo.
-    echo Generating IFWI... %BIOS_ID%.bin
-    echo.
-
-    copy /b/y !IFWI_HEADER_FILE! + %PLATFORM_BIN_PACKAGE%\SEC\!SEC_VERSION!\VLV_SEC_REGION.bin + %PLATFORM_BIN_PACKAGE%\SEC\!SEC_VERSION!\Vacant.bin + !BIOS_Rom! %BIOS_ID%.bin
-    echo.
-    echo ===========================================================================
-)
-@echo off
-
-::**********************************************************************
-:: end of main loop
-::**********************************************************************
-
-echo.
-echo  -- All specified ROM files Stitched. --
-echo.
-goto Exit
-
-:Usage
-echo.
-echo **************************************************************************************************
-echo This Script is used to Stitch together BIOS, GOP Driver, Microcode Patch and TXE FW
-echo into a single Integrated Firmware Image (IFWI).
-echo.
-echo Usage: IFWIStitch.bat [flags] [/B BIOS.ROM] [/C Stitch_Config] [/S IFWI_Suffix]
-echo.
-echo    This script has NO Required arguments, so that the user can just double click from the GUI.
-echo    However, this requires that the BIOS.ROM file name is formatted correctly.
-echo.
-echo    /nG             Do NOT update the GOP driver.  (applies to all ROM files for this run)
-echo    /nV             Do NOT update the VBIOS.       (applies to all ROM files for this run)
-echo    /nM             Do NOT update the Microcode.   (applies to all ROM files for this run)
-echo    /nB             Do NOT backup BIOS.ROMs. (Default will backup to BIOS.ROM.Orig)
-echo.
-echo    BIOS.ROM:       A single BIOS ROM file to use for stitching
-echo                    (DEFAULT: ALL .ROM files inside the current directory)
-echo    Stitch_Config:  Text file containing version info of each FW component
-echo                    (DEFAULT: Stitch_Config.txt)
-echo    IFWI_Suffix:    Suffix to append to the end of the IFWI filename
-echo                    (DEFAULT: YYYY_MM_DD_HHMM)
-echo.
-echo Examples:
-echo    IFIWStitch.bat                                      : Stitch all ROMs with defaults
-echo    IFIWStitch.bat /B C:/MyRoms/testBIOS.rom            : Stitch single ROM with defaults
-echo    IFIWStitch.bat /B ../testBIOS.rom /S test123        : Stitch single ROM and add custom suffix
-echo    IFIWStitch.bat /nM /nB /B testBIOS.rom /S test456   : Stitch single ROM, keep uCode from .rom,
-echo                                                          don't create backup, and add custom suffix.
-echo ****************************************************************************************************
-pause
-exit /b 1
-
-:ScriptFail
-set exitCode=1
-
-:Exit
-echo  -- See Stitching.log for more info. --
-echo.
-echo %date%  %time%
-echo.
-if "%Platform_Type%"=="MNW2" (
-  echo .
-) else (
-  echo only support MNW2 for this project!
-pause
-)
-exit /b %exitCode%
-EndLocal
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Config.txt b/Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Config.txt
deleted file mode 100644
index 82abe6548f..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Config.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-#
-
-HEADER=IFWI_HEADER
-SEC_VERSION=1.0.2.1060v5
-
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-platforms Patch 04/14] Vlv2TbltDevicePkg: Switch from ISA to SIO modules
  2019-07-01  2:55 ` [edk2-platforms Patch 04/14] Vlv2TbltDevicePkg: Switch from ISA to SIO modules Michael D Kinney
@ 2019-07-01  4:07   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:07 UTC (permalink / raw)
  To: Kinney, Michael D, devel@edk2.groups.io; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: Kinney, Michael D 
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-platforms Patch 04/14] Vlv2TbltDevicePkg: Switch from ISA to SIO modules

Remove IntelFrameworkModulePkg ISA related modules and replace
with MdeModulePkg SIO modules.

* Retire Wpce791 module
* Retire gEfiLpcWpce791PolicyProtocolGuid and include file
* Retire gEfiLpcWpc83627PolicyProtocolGuid and include file
* Remove production of gEfiLpcWpc83627PolicyProtocolGuid from
  PlatformDxe module
* Add PcuSio module
* Use PciSioSerialDxe module

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Include/Protocol/LpcWpc83627Policy.h      |  92 --
 .../Include/Protocol/LpcWpce791Policy.h       |  55 -
 .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c   | 951 ++++++++++++++++++
 .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h   | 363 +++++++
 .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf |  38 +
 .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  |   4 -
 .../PlatformDxe/PlatformDxe.inf               |   2 -
 .../PlatformDxe/SioPlatformPolicy.c           |  82 --
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |   1 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |   2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |   2 +-
 .../Vlv2TbltDevicePkg/Wpce791/LpcDriver.c     | 340 -------
 .../Vlv2TbltDevicePkg/Wpce791/LpcDriver.h     | 112 ---
 .../Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c    | 366 -------
 .../Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h    | 103 --
 .../Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c  | 126 ---
 .../Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h  | 101 --
 .../Vlv2TbltDevicePkg/Wpce791/Wpce791.inf     |  63 --
 18 files changed, 1354 insertions(+), 1449 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc83627Policy.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpce791Policy.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatformPolicy.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc83627Policy.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc83627Policy.h
deleted file mode 100644
index 62d026f133..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc83627Policy.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  LpcWpc83667Policy.h
-
-Abstract:
-
-  Protocol used for WPC83627 Policy definition.
--------------------------------------------------------------------------------
-   Rev   Date<MM/DD/YYYY>    Name    Description
-  -------------------------------------------------------------------------------
-  R01   < 4/22/2011>         LB     Update driver for Sio83627UGH support.
-  -------------------------------------------------------------------------------
-**/
-
-#ifndef _WPC83627_POLICY_PROTOCOL_H_
-#define _WPC83627_POLICY_PROTOCOL_H_
-
-EFI_FORWARD_DECLARATION (EFI_WPC83627_POLICY_PROTOCOL);
-
-#define EFI_WPC83627_POLICY_PROTOCOL_GUID \
-  { \
-    0xd3ecc567, 0x9fd5, 0x44c1, 0x86, 0xcf, 0x5d, 0xa7, 0xa2, 0x4f, 0x4b, 0x5d \
-  }
-
-#define EFI_WPC83627_COM1_ENABLE          0x01
-#define EFI_WPC83627_COM2_ENABLE          0x01
-
-#define EFI_WPC83627_COM3_ENABLE          0x01
-#define EFI_WPC83627_COM4_ENABLE          0x01
-
-#define EFI_WPC83627_LPT1_ENABLE          0x01
-#define EFI_WPC83627_LPT1_ENABLE          0x01
-#define EFI_WPC83627_FDD_ENABLE           0x01
-#define EFI_WPC83627_FDD_WRITE_ENABLE     0x01
-#define EFI_WPC83627_PS2_KBC_ENABLE       0x01
-#define EFI_WPC83627_ECIR_ENABLE	  0x01
-
-#define EFI_WPC83627_COM1_DISABLE         0x00
-#define EFI_WPC83627_COM2_DISABLE         0x00
-
-#define EFI_WPC83627_COM3_DISABLE         0x00
-#define EFI_WPC83627_COM4_DISABLE         0x00
-
-#define EFI_WPC83627_LPT1_DISABLE         0x00
-#define EFI_WPC83627_FDD_DISABLE          0x00
-#define EFI_WPC83627_FDD_WRITE_PROTECT    0x00
-#define EFI_WPC83627_PS2_KBC_DISABLE      0x00
-#define EFI_WPC83627_ECIR_DISABLE         0x00
-#define EFI_WPC83627_RESERVED_DEFAULT     0x00
-
-typedef struct {
-  UINT16  Com1               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Lpt1               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Floppy             :1;             // 0 = Disable, 1 = Enable
-  UINT16  FloppyWriteProtect :1;             // 0 = Write Protect, 1 = Write Enable
-  UINT16  Port80             :1;             // 0 = Disable, 1 = Enable
-  UINT16  CIR                :1;             // CIR enable or disable
-  UINT16  Ps2Keyboard        :1;             // 0 = Disable, 1 = Enable
-  UINT16  Ps2Mouse           :1;             // 0 = Disable, 1 = Enable
-  UINT16  Com2               :1;             // 0 = Disable, 1 = Enable
-
-  UINT16  Com3               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Com4               :1;             // 0 = Disable, 1 = Enable
-
-  UINT16  Dac                :1;             // 0 = Disable, 1 = Enable
-  UINT16  Rsvd               :6;
-} EFI_WPC83627_DEVICE_ENABLES;
-
-typedef enum {
-  LptModeOutput,
-  LptModeBiDirectional,
-  LptModeEpp,
-  LptModeEcp
-} EFI_LPT_MODE;
-
-typedef struct _EFI_WPC83627_POLICY_PROTOCOL {
-  EFI_WPC83627_DEVICE_ENABLES DeviceEnables;
-  EFI_LPT_MODE              LptMode;
-} EFI_WPC83627_POLICY_PROTOCOL;
-
-extern EFI_GUID gEfiLpcWpc83627PolicyProtocolGuid;
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpce791Policy.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpce791Policy.h
deleted file mode 100644
index 1b2459e54a..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpce791Policy.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  LpcWpce791Policy.h
-
-Abstract:
-
-  Protocol used for WPCE791 Policy definition.
-
-**/
-
-#ifndef _WPCE791_POLICY_PROTOCOL_H_
-#define _WPCE791_POLICY_PROTOCOL_H_
-
-
-#define EFI_WPCE791_POLICY_PROTOCOL_GUID \
-  { \
-    0xab2bee2f, 0xc1a6, 0x4399, 0x85, 0x3d, 0xc0, 0x7c, 0x77, 0x4f, 0xfd, 0xd \
-  }
-
-#define EFI_WPCE791_PS2_KEYBOARD_ENABLE       0x01
-#define EFI_WPCE791_PS2_KEYBOARD_DISABLE      0x00
-
-#define EFI_WPCE791_PS2_MOUSE_ENABLE       0x01
-#define EFI_WPCE791_PS2_MOUSE_DISABLE      0x00
-
-typedef struct {
-  UINT16  Com1               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Lpt1               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Floppy             :1;             // 0 = Disable, 1 = Enable
-  UINT16  FloppyWriteProtect :1;             // 0 = Write Protect, 1 = Write Enable
-  UINT16  Port80             :1;             // 0 = Disable, 1 = Enable
-  UINT16  CIR                :1;             // CIR enable or disable
-  UINT16  Ps2Keyboard        :1;             // 0 = Disable, 1 = Enable
-  UINT16  Ps2Mouse           :1;             // 0 = Disable, 1 = Enable
-  UINT16  Com2               :1;             // 0 = Disable, 1 = Enable
-  UINT16  Dac                :1;             // 0 = Disable, 1 = Enable
-  UINT16  Rsvd               :6;
-} EFI_WPCE791_DEVICE_ENABLES;
-
-typedef struct _EFI_WPCE791_POLICY_PROTOCOL {
-  EFI_WPCE791_DEVICE_ENABLES DeviceEnables;
-} EFI_WPCE791_POLICY_PROTOCOL;
-
-extern EFI_GUID gEfiLpcWpce791PolicyProtocolGuid;
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c
new file mode 100644
index 0000000000..d16b1b0abd
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c
@@ -0,0 +1,951 @@
+/** @file
+  Produces the SIO Protocols for ISA devices integrated in the Platform
+  Controller Unit (PCU).
+
+  Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "PcuSio.h"
+
+//
+//  PCU SIO Driver Global Variables
+//
+EFI_DRIVER_BINDING_PROTOCOL gPcuSioDriverBinding = {
+  PcuSioDriverBindingSupported,
+  PcuSioDriverBindingStart,
+  PcuSioDriverBindingStop,
+  0x10,
+  NULL,
+  NULL
+};
+
+//
+// Super I/O Protocol interfaces
+//
+EFI_SIO_PROTOCOL mSioInterface = {
+  SioRegisterAccess,
+  SioGetResources,
+  SioSetResources,
+  SioPossibleResources,
+  SioModify
+};
+
+//
+// COM 1 UART Controller
+//
+GLOBAL_REMOVE_IF_UNREFERENCED
+SIO_RESOURCES_IO mCom1Resources = {
+  { { ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR }, 0x3F8, 8 },
+  { ACPI_END_TAG_DESCRIPTOR,                    0        }
+};
+
+//
+// Table of SIO Controllers
+//
+GLOBAL_REMOVE_IF_UNREFERENCED
+SIO_DEVICE_INFO mDevicesInfo[] = {
+  {
+    EISA_PNP_ID (0x501),
+    0,
+    { (ACPI_SMALL_RESOURCE_HEADER *) &mCom1Resources }
+  }
+};
+
+//
+// ACPI Device Path Node template
+//
+GLOBAL_REMOVE_IF_UNREFERENCED
+ACPI_HID_DEVICE_PATH mAcpiDeviceNodeTemplate = {
+  {        // Header
+    ACPI_DEVICE_PATH,
+    ACPI_DP,
+    {
+      (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)),
+      (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
+    }
+  },
+  0x0,     // HID
+  0x0      // UID
+};
+
+/**
+  Provides a low level access to the registers for the Super I/O.
+
+  @param[in]     This           Indicates a pointer to the calling context.
+  @param[in]     Write          Specifies the type of the register operation.
+                                If this parameter is TRUE, Value is interpreted
+                                as an input parameter and the operation is a
+                                register write. If this parameter is FALSE,
+                                Value is interpreted as an output parameter and
+                                the operation is a register read.
+  @param[in]     ExitCfgMode    Exit Configuration Mode Indicator. If this
+                                parameter is set to TRUE, the Super I/O driver
+                                will turn off configuration mode of the Super
+                                I/O prior to returning from this function. If
+                                this parameter is set to FALSE, the Super I/O
+                                driver will leave Super I/O in the
+                                configuration mode. The Super I/O driver must
+                                track the current state of the Super I/O and
+                                enable the configuration mode of Super I/O if
+                                necessary prior to register access.
+  @param[in]     Register       Register number.
+  @param[in,out] Value          If Write is TRUE, Value is a pointer to the
+                                buffer containing the byte of data to be
+                                written to the Super I/O register. If Write is
+                                FALSE, Value is a pointer to the destination
+                                buffer for the byte of data to be read from the
+                                Super I/O register.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER The Value is NULL.
+  @retval EFI_INVALID_PARAMETER Invalid Register number.
+
+**/
+EFI_STATUS
+EFIAPI
+SioRegisterAccess (
+  IN CONST EFI_SIO_PROTOCOL    *This,
+  IN       BOOLEAN             Write,
+  IN       BOOLEAN             ExitCfgMode,
+  IN       UINT8               Register,
+  IN OUT   UINT8               *Value
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  Provides an interface to get a list of the current resources consumed by the
+  device in the ACPI Resource Descriptor format.
+
+  GetResources() returns a list of resources currently consumed by the device.
+  The ResourceList is a pointer to the buffer containing resource descriptors
+  for the device. The descriptors are in the format of Small or Large ACPI
+  resource descriptor as defined by ACPI specification (2.0 & 3.0). The buffer
+  of resource descriptors is terminated with the 'End tag' resource descriptor.
+
+  @param[in]  This              Indicates a pointer to the calling context.
+  @param[out] ResourceList      A pointer to an ACPI resource descriptor list
+                                that defines the current resources used by the
+                                device.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER ResourceList is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioGetResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  OUT      ACPI_RESOURCE_HEADER_PTR    *ResourceList
+  )
+{
+  SIO_DEV  *SioDevice;
+
+  if (ResourceList == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  SioDevice = SIO_DEV_FROM_SIO (This);
+  if (SioDevice->DeviceIndex < ARRAY_SIZE (mDevicesInfo)) {
+    *ResourceList = mDevicesInfo[SioDevice->DeviceIndex].Resources;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Sets the resources for the device.
+
+  @param[in] This               Indicates a pointer to the calling context.
+  @param[in] ResourceList       Pointer to the ACPI resource descriptor list.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER ResourceList is invalid.
+  @retval EFI_ACCESS_DENIED     Some of the resources in ResourceList are in
+                                use.
+
+**/
+EFI_STATUS
+EFIAPI
+SioSetResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  IN       ACPI_RESOURCE_HEADER_PTR    ResourceList
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  Provides a collection of resource descriptor lists. Each resource descriptor
+  list in the collection defines a combination of resources that can
+  potentially be used by the device.
+
+  @param[in]  This                  Indicates a pointer to the calling context.
+  @param[out] ResourceCollection    Collection of the resource descriptor
+                                    lists.
+
+  @retval EFI_SUCCESS               The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER     ResourceCollection is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioPossibleResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  OUT      ACPI_RESOURCE_HEADER_PTR    *ResourceCollection
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  Provides an interface for a table based programming of the Super I/O
+  registers.
+
+  The Modify() function provides an interface for table based programming of
+  the Super I/O registers. This function can be used to perform programming of
+  multiple Super I/O registers with a single function call. For each table
+  entry, the Register is read, its content is bitwise ANDed with AndMask, and
+  then ORed with OrMask before being written back to the Register. The Super
+  I/O driver must track the current state of the Super I/O and enable the
+  configuration mode of Super I/O if necessary prior to table processing. Once
+  the table is processed, the Super I/O device has to be returned to the
+  original state.
+
+  @param[in] This               Indicates a pointer to the calling context.
+  @param[in] Command            A pointer to an array of NumberOfCommands
+                                EFI_SIO_REGISTER_MODIFY structures. Each
+                                structure specifies a single Super I/O register
+                                modify operation.
+  @param[in] NumberOfCommands   Number of elements in the Command array.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER Command is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioModify (
+  IN CONST EFI_SIO_PROTOCOL           *This,
+  IN CONST EFI_SIO_REGISTER_MODIFY    *Command,
+  IN       UINTN                      NumberOfCommands
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  Create the child device with a given device index.
+
+  @param[in] This              The EFI_DRIVER_BINDING_PROTOCOL instance.
+  @param[in] Controller        The handle of ISA bus controller.
+  @param[in] PciIo             The pointer to the PCI protocol.
+  @param[in] ParentDevicePath  Device path of the ISA bus controller.
+  @param[in] DeviceIndex       Index of the device supported by this driver.
+
+  @retval EFI_SUCCESS          The child device has been created successfully.
+  @retval Others               Error occurred during the child device creation.
+
+**/
+EFI_STATUS
+SioCreateChildDevice (
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
+  IN EFI_HANDLE                   Controller,
+  IN EFI_PCI_IO_PROTOCOL          *PciIo,
+  IN EFI_DEVICE_PATH_PROTOCOL     *ParentDevicePath,
+  IN UINT32                       DeviceIndex
+  )
+{
+  EFI_STATUS  Status;
+  SIO_DEV     *SioDevice;
+
+  //
+  // Initialize the SIO_DEV structure
+  //
+  SioDevice = AllocateZeroPool (sizeof (SIO_DEV));
+  if (SioDevice == NULL) {
+    DEBUG ((DEBUG_ERROR, "SioCreateChildDevice(): Can not allocate SIO Device structure\n"));
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  SioDevice->Signature   = SIO_DEV_SIGNATURE;
+  SioDevice->Handle      = NULL;
+  SioDevice->PciIo       = PciIo;
+  CopyMem (&SioDevice->Sio, &mSioInterface, sizeof (EFI_SIO_PROTOCOL));
+  SioDevice->DeviceIndex = DeviceIndex;
+
+  //
+  // Construct the child device path
+  //
+  mAcpiDeviceNodeTemplate.HID = mDevicesInfo[DeviceIndex].Hid;
+  mAcpiDeviceNodeTemplate.UID = mDevicesInfo[DeviceIndex].Uid;
+  SioDevice->DevicePath = AppendDevicePathNode (
+                            ParentDevicePath,
+                            (EFI_DEVICE_PATH_PROTOCOL *) &mAcpiDeviceNodeTemplate
+                            );
+  if (SioDevice->DevicePath == NULL) {
+    DEBUG ((DEBUG_ERROR, "SioCreateChildDevice(): Can not allocate SIO Device path\n"));
+    Status = EFI_OUT_OF_RESOURCES;
+    goto Done;
+  }
+
+  //
+  // Create a child handle and install Device Path and Super I/O protocols
+  //
+  Status = gBS->InstallMultipleProtocolInterfaces (
+                  &SioDevice->Handle,
+                  &gEfiDevicePathProtocolGuid,
+                  SioDevice->DevicePath,
+                  &gEfiSioProtocolGuid,
+                  &SioDevice->Sio,
+                  NULL
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "SioCreateChildDevice(): Can not install child protocols %r\n", Status));
+    goto Done;
+  }
+
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiPciIoProtocolGuid,
+                  (VOID **) &PciIo,
+                  This->DriverBindingHandle,
+                  SioDevice->Handle,
+                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "SioCreateChildDevice(): Can not open parent PCI I/O Protocol by child controller %r\n", Status));
+    gBS->UninstallMultipleProtocolInterfaces (
+           SioDevice->Handle,
+           &gEfiDevicePathProtocolGuid,
+           SioDevice->DevicePath,
+           &gEfiSioProtocolGuid,
+           &SioDevice->Sio,
+           NULL
+           );
+  }
+
+Done:
+  if (EFI_ERROR (Status)) {
+    if (SioDevice->DevicePath != NULL) {
+      FreePool (SioDevice->DevicePath);
+    }
+    FreePool (SioDevice);
+  }
+
+  return Status;
+}
+
+/**
+  Create all the ISA child devices on the ISA bus controller (PCI to ISA
+  bridge).
+
+  @param[in] This              The EFI_DRIVER_BINDING_PROTOCOL instance.
+  @param[in] Controller        The handle of ISA bus controller.
+  @param[in] PciIo             The pointer to the PCI protocol.
+  @param[in] ParentDevicePath  Device path of the ISA bus controller.
+
+  @retval The number of child device that is successfully created.
+
+**/
+UINT32
+SioCreateAllChildDevices (
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
+  IN EFI_HANDLE                   Controller,
+  IN EFI_PCI_IO_PROTOCOL          *PciIo,
+  IN EFI_DEVICE_PATH_PROTOCOL     *ParentDevicePath
+  )
+{
+  UINT32        Index;
+  UINT32        ChildDeviceNumber;
+  EFI_STATUS    Status;
+
+  ChildDeviceNumber = 0;
+
+  for (Index = 0; Index < ARRAY_SIZE (mDevicesInfo); Index++) {
+    Status = SioCreateChildDevice (
+               This,
+               Controller,
+               PciIo,
+               ParentDevicePath,
+               Index
+               );
+    if (!EFI_ERROR (Status)) {
+      ChildDeviceNumber++;
+    }
+  }
+
+  return ChildDeviceNumber;
+}
+
+/**
+  Tests to see if this driver supports a given controller. If a child device is
+  provided, it further tests to see if this driver supports creating a handle
+  for the specified child device.
+
+  This function checks to see if the driver specified by This supports the
+  device specified by ControllerHandle. Drivers will typically use the device
+  path attached to ControllerHandle and/or the services from the bus I/O
+  abstraction attached to ControllerHandle to determine if the driver supports
+  ControllerHandle. This function may be called many times during platform
+  initialization. In order to reduce boot times, the tests performed by this
+  function must be very small, and take as little time as possible to execute.
+  This function must not change the state of any hardware devices, and this
+  function must be aware that the device specified by ControllerHandle may
+  already be managed by the same driver or a different driver. This function
+  must match its calls to AllocatePages() with FreePages(), AllocatePool() with
+  FreePool(), and OpenProtocol() with CloseProtocol(). Since ControllerHandle
+  may have been previously started by the same driver, if a protocol is already
+  in the opened state, then it must not be closed with CloseProtocol(). This is
+  required to guarantee the state of ControllerHandle is not modified by this
+  function.
+
+  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                   instance.
+  @param[in]  ControllerHandle     The handle of the controller to test. This
+                                   handle must support a protocol interface
+                                   that supplies an I/O abstraction to the
+                                   driver.
+  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
+                                   device path.  This parameter is ignored by
+                                   device drivers, and is optional for bus
+                                   drivers. For bus drivers, if this parameter
+                                   is not NULL, then the bus driver must
+                                   determine if the bus controller specified by
+                                   ControllerHandle and the child controller
+                                   specified by RemainingDevicePath are both
+                                   supported by this bus driver.
+
+  @retval EFI_SUCCESS              The device specified by ControllerHandle and
+                                   RemainingDevicePath is supported by the
+                                   driver specified by This.
+  @retval EFI_ALREADY_STARTED      The device specified by ControllerHandle and
+                                   RemainingDevicePath is already being managed
+                                   by the driver specified by This.
+  @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle and
+                                   RemainingDevicePath is already being managed
+                                   by a different driver or an application that
+                                   requires exclusive access.
+  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle and
+                                   RemainingDevicePath is not supported by the
+                                   driver specified by This.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingSupported (
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
+  IN EFI_HANDLE                     Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
+  )
+{
+  EFI_STATUS           Status;
+  EFI_PCI_IO_PROTOCOL  *PciIo;
+  PCI_TYPE00           Pci;
+
+  //
+  // Get PciIo protocol instance
+  //
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiPciIoProtocolGuid,
+                  (VOID **)&PciIo,
+                  This->DriverBindingHandle,
+                  Controller,
+                  EFI_OPEN_PROTOCOL_BY_DRIVER
+                  );
+
+  if (EFI_ERROR(Status)) {
+    return Status;
+  }
+
+  Status = PciIo->Pci.Read (
+                        PciIo,
+                        EfiPciIoWidthUint32,
+                        0,
+                        sizeof(Pci) / sizeof(UINT32),
+                        &Pci
+                        );
+
+  if (!EFI_ERROR (Status)) {
+    Status = EFI_UNSUPPORTED;
+    if ((Pci.Hdr.Command & 0x03) == 0x03) {
+      if (Pci.Hdr.ClassCode[2] == PCI_CLASS_BRIDGE) {
+        //
+        // See if this is a standard PCI to ISA Bridge from the Base Code
+        // and Class Code
+        //
+        if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA) {
+          Status = EFI_SUCCESS;
+        }
+        //
+        // See if this is an Intel PCI to ISA bridge in Positive Decode Mode
+        //
+        if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE &&
+            Pci.Hdr.VendorId == 0x8086 && Pci.Hdr.DeviceId == 0x7110) {
+          Status = EFI_SUCCESS;
+        }
+      }
+    }
+  }
+
+  gBS->CloseProtocol (
+         Controller,
+         &gEfiPciIoProtocolGuid,
+         This->DriverBindingHandle,
+         Controller
+         );
+
+  return Status;
+}
+
+/**
+  Starts a device controller or a bus controller.
+
+  The Start() function is designed to be invoked from the EFI boot service
+  ConnectController(). As a result, much of the error checking on the
+  parameters to Start() has been moved into this common boot service. It is
+  legal to call Start() from other locations, but the following calling
+  restrictions must be followed or the system behavior will not be
+  deterministic.
+  1. ControllerHandle must be a valid EFI_HANDLE.
+  2. If RemainingDevicePath is not NULL, then it must be a pointer to a
+     naturally aligned EFI_DEVICE_PATH_PROTOCOL.
+  3. Prior to calling Start(), the Supported() function for the driver
+     specified by This must have been called with the same calling parameters,
+     and Supported() must have returned EFI_SUCCESS.
+
+  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                   instance.
+  @param[in]  ControllerHandle     The handle of the controller to start. This
+                                   handle must support a protocol interface
+                                   that supplies an I/O abstraction to the
+                                   driver.
+  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
+                                   device path.  This parameter is ignored by
+                                   device drivers, and is optional for bus
+                                   drivers. For a bus driver, if this parameter
+                                   is NULL, then handles for all the children
+                                   of Controller are created by this driver. If
+                                   this parameter is not NULL and the first
+                                   Device Path Node is not the End of Device
+                                   Path Node, then only the handle for the
+                                   child device specified by the first Device
+                                   Path Node of RemainingDevicePath is created
+                                   by this driver. If the first Device Path
+                                   Node of RemainingDevicePath is the End of
+                                   Device Path Node, no child handle is created
+                                   by this driver.
+
+  @retval EFI_SUCCESS              The device was started.
+  @retval EFI_DEVICE_ERROR         The device could not be started due to a
+                                   device error.
+  @retval EFI_OUT_OF_RESOURCES     The request could not be completed due to a
+                                   lack of resources.
+  @retval Others                   The driver failed to start the device.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingStart (
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
+  IN EFI_HANDLE                   Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
+  )
+{
+  EFI_STATUS                     Status;
+  EFI_PCI_IO_PROTOCOL            *PciIo;
+  EFI_DEVICE_PATH_PROTOCOL       *ParentDevicePath;
+  UINT64                         Supports;
+  UINT64                         OriginalAttributes;
+  UINT64                         Attributes;
+  BOOLEAN                        Enabled;
+  SIO_BUS_DRIVER_PRIVATE_DATA    *Private;
+  UINT32                         ChildDeviceNumber;
+
+  Enabled            = FALSE;
+  Supports           = 0;
+  OriginalAttributes = 0;
+  Private            = NULL;
+
+  //
+  // Open the PCI I/O Protocol Interface
+  //
+  PciIo = NULL;
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiPciIoProtocolGuid,
+                  (VOID**) &PciIo,
+                  This->DriverBindingHandle,
+                  Controller,
+                  EFI_OPEN_PROTOCOL_BY_DRIVER
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): No PCI I/O Protocol %r\n", Status));
+    return Status;
+  }
+
+  //
+  // Open Device Path Protocol
+  //
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiDevicePathProtocolGuid,
+                  (VOID **) &ParentDevicePath,
+                  This->DriverBindingHandle,
+                  Controller,
+                  EFI_OPEN_PROTOCOL_BY_DRIVER
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): No Device Path Protocol %r\n", Status));
+    gBS->CloseProtocol (
+           Controller,
+           &gEfiPciIoProtocolGuid,
+           This->DriverBindingHandle,
+           Controller
+           );
+    return Status;
+  }
+
+  //
+  // Get supported PCI attributes
+  //
+  Status = PciIo->Attributes (
+                    PciIo,
+                    EfiPciIoAttributeOperationSupported,
+                    0,
+                    &Supports
+                    );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error reading PCI I/O Supported Attributes %r\n", Status));
+    goto Done;
+  }
+  Supports &= (UINT64) (EFI_PCI_IO_ATTRIBUTE_ISA_IO |
+                        EFI_PCI_IO_ATTRIBUTE_ISA_IO_16);
+
+  Status = PciIo->Attributes (
+                    PciIo,
+                    EfiPciIoAttributeOperationGet,
+                    0,
+                    &OriginalAttributes
+                    );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error reading PCI I/O Attributes %r\n", Status));
+    goto Done;
+  }
+
+  Attributes = EFI_PCI_DEVICE_ENABLE |
+               Supports |
+               EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO;
+
+  Status = PciIo->Attributes (
+                    PciIo,
+                    EfiPciIoAttributeOperationEnable,
+                    Attributes,
+                    NULL
+                    );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error enabling PCI I/O  Attributes %r\n", Status));
+    goto Done;
+  }
+
+  Enabled = TRUE;
+
+  //
+  // Store the OriginalAttributes for the restore in BindingStop()
+  //
+  Private = AllocateZeroPool (sizeof (SIO_BUS_DRIVER_PRIVATE_DATA));
+  if (Private == NULL) {
+    Status = EFI_OUT_OF_RESOURCES;
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error allocating SIO private data structure %r\n", Status));
+    goto Done;
+  }
+  Private->PciIo              = PciIo;
+  Private->OriginalAttributes = OriginalAttributes;
+
+  Status = gBS->InstallProtocolInterface (
+                  &Controller,
+                  &gEfiCallerIdGuid,
+                  EFI_NATIVE_INTERFACE,
+                  Private
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error installing gEfiCallerIdGuid %r\n", Status));
+    goto Done;
+  }
+
+  //
+  // Report status code for the start of general controller initialization
+  //
+  REPORT_STATUS_CODE_WITH_DEVICE_PATH (
+    EFI_PROGRESS_CODE,
+    (EFI_IO_BUS_LPC | EFI_IOB_PC_INIT),
+    ParentDevicePath
+    );
+
+  //
+  // Report status code for the start of enabling devices on the bus
+  //
+  REPORT_STATUS_CODE_WITH_DEVICE_PATH (
+    EFI_PROGRESS_CODE,
+    (EFI_IO_BUS_LPC | EFI_IOB_PC_ENABLE),
+    ParentDevicePath
+    );
+
+  //
+  // Create all the children upon the first entrance
+  //
+  ChildDeviceNumber = SioCreateAllChildDevices (
+                        This,
+                        Controller,
+                        PciIo,
+                        ParentDevicePath
+                        );
+  if (ChildDeviceNumber == 0) {
+    Status = EFI_DEVICE_ERROR;
+    DEBUG ((DEBUG_ERROR, "PcuSioDriverBindingStart(): Error creating child SIO devices %r\n", Status));
+    goto Done;
+  }
+
+Done:
+  if (EFI_ERROR (Status)) {
+    if (PciIo != NULL && Enabled) {
+      PciIo->Attributes (
+               PciIo,
+               EfiPciIoAttributeOperationSet,
+               OriginalAttributes,
+               NULL
+               );
+    }
+
+    gBS->CloseProtocol (
+           Controller,
+           &gEfiDevicePathProtocolGuid,
+           This->DriverBindingHandle,
+           Controller
+           );
+
+    gBS->CloseProtocol (
+           Controller,
+           &gEfiPciIoProtocolGuid,
+           This->DriverBindingHandle,
+           Controller
+           );
+
+    if (Private != NULL) {
+      gBS->UninstallMultipleProtocolInterfaces (
+             Controller,
+             &gEfiCallerIdGuid,
+             Private,
+             NULL
+             );
+      FreePool (Private);
+    }
+  }
+
+  return Status;
+}
+
+/**
+  Stops a device controller or a bus controller.
+
+  The Stop() function is designed to be invoked from the EFI boot service
+  DisconnectController(). As a result, much of the error checking on the
+  parameters to Stop() has been moved into this common boot service. It is
+  legal to call Stop() from other locations, but the following calling
+  restrictions must be followed or the system behavior will not be
+  deterministic.
+  1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous
+     call to this same driver's Start() function.
+  2. The first NumberOfChildren handles of ChildHandleBuffer must all be a
+     valid EFI_HANDLE. In addition, all of these handles must have been created
+     in this driver's Start() function, and the Start() function must have
+     called OpenProtocol() on ControllerHandle with an Attribute of
+     EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
+
+  @param[in]  This               A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                 instance.
+  @param[in]  ControllerHandle   A handle to the device being stopped. The
+                                 handle must support a bus specific I/O
+                                 protocol for the driver to use to stop the
+                                 device.
+  @param[in]  NumberOfChildren   The number of child device handles in
+                                 ChildHandleBuffer.
+  @param[in]  ChildHandleBuffer  An array of child handles to be freed. May be
+                                 NULL if NumberOfChildren is 0.
+
+  @retval EFI_SUCCESS            The device was stopped.
+  @retval EFI_DEVICE_ERROR       The device could not be stopped due to a
+                                 device error.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingStop (
+  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
+  IN  EFI_HANDLE                     Controller,
+  IN  UINTN                          NumberOfChildren,
+  IN  EFI_HANDLE                     *ChildHandleBuffer
+  )
+{
+  EFI_STATUS                     Status;
+  SIO_BUS_DRIVER_PRIVATE_DATA    *Private;
+  UINTN                          Index;
+  BOOLEAN                        AllChildrenStopped;
+  EFI_SIO_PROTOCOL               *Sio;
+  SIO_DEV                        *SioDevice;
+  EFI_PCI_IO_PROTOCOL            *PciIo;
+
+  if (NumberOfChildren == 0) {
+    //
+    // Restore PCI attributes
+    //
+    Status = gBS->OpenProtocol (
+                    Controller,
+                    &gEfiCallerIdGuid,
+                    (VOID **) &Private,
+                    This->DriverBindingHandle,
+                    Controller,
+                    EFI_OPEN_PROTOCOL_GET_PROTOCOL
+                    );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+
+    Status = Private->PciIo->Attributes (
+                               Private->PciIo,
+                               EfiPciIoAttributeOperationSet,
+                               Private->OriginalAttributes,
+                               NULL
+                               );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+
+    gBS->UninstallProtocolInterface (
+          Controller,
+          &gEfiCallerIdGuid,
+          Private
+          );
+    FreePool (Private);
+
+    //
+    // Close the bus driver
+    //
+    Status = gBS->CloseProtocol (
+                    Controller,
+                    &gEfiDevicePathProtocolGuid,
+                    This->DriverBindingHandle,
+                    Controller
+                    );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+
+    Status = gBS->CloseProtocol (
+                    Controller,
+                    &gEfiPciIoProtocolGuid,
+                    This->DriverBindingHandle,
+                    Controller
+                    );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+
+    return EFI_SUCCESS;
+  }
+
+  //
+  // Stop all the children
+  //
+  AllChildrenStopped = TRUE;
+
+  for (Index = 0; Index < NumberOfChildren; Index++) {
+    Status = gBS->OpenProtocol (
+                    ChildHandleBuffer[Index],
+                    &gEfiSioProtocolGuid,
+                    (VOID **) &Sio,
+                    This->DriverBindingHandle,
+                    Controller,
+                    EFI_OPEN_PROTOCOL_GET_PROTOCOL
+                    );
+    if (!EFI_ERROR (Status)) {
+      SioDevice = SIO_DEV_FROM_SIO (Sio);
+
+      //
+      // Close the child handle
+      //
+      Status = gBS->CloseProtocol (
+                      Controller,
+                      &gEfiPciIoProtocolGuid,
+                      This->DriverBindingHandle,
+                      ChildHandleBuffer[Index]
+                      );
+      Status = gBS->UninstallMultipleProtocolInterfaces (
+                      ChildHandleBuffer[Index],
+                      &gEfiDevicePathProtocolGuid,
+                      SioDevice->DevicePath,
+                      &gEfiSioProtocolGuid,
+                      &SioDevice->Sio,
+                      NULL
+                      );
+
+      if (!EFI_ERROR (Status)) {
+        FreePool (SioDevice->DevicePath);
+        FreePool (SioDevice);
+      } else {
+        //
+        // Re-open PCI IO Protocol on behalf of the child device
+        // because of failure of destroying the child device handle
+        //
+        gBS->OpenProtocol (
+               Controller,
+               &gEfiPciIoProtocolGuid,
+               (VOID **) &PciIo,
+               This->DriverBindingHandle,
+               ChildHandleBuffer[Index],
+               EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
+               );
+      }
+    }
+
+    if (EFI_ERROR (Status)) {
+      AllChildrenStopped = FALSE;
+    }
+  }
+
+  if (!AllChildrenStopped) {
+    return EFI_DEVICE_ERROR;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  The entry point for the PCU SIO driver.
+
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
+  @param[in] SystemTable    A pointer to the EFI System Table.
+
+  @retval EFI_SUCCESS       The entry point is executed successfully.
+  @retval other             Some error occurs when executing this entry point.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverEntryPoint (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  return EfiLibInstallDriverBinding (
+            ImageHandle, 
+            SystemTable, 
+            &gPcuSioDriverBinding, 
+            ImageHandle
+            );
+}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h
new file mode 100644
index 0000000000..3a47e2c5e2
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h
@@ -0,0 +1,363 @@
+/** @file
+  Produces the SIO Protocols for ISA devices integrated in the Platform
+  Controller Unit (PCU).
+
+  Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef __PCU_SIO_H__
+#define __PCU_SIO_H__
+
+#include <Uefi.h>
+#include <Protocol/DriverBinding.h>
+#include <Protocol/PciIo.h>
+#include <Protocol/DevicePath.h>
+#include <Protocol/SuperIo.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ReportStatusCodeLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/UefiLib.h>
+#include <IndustryStandard/Pci.h>
+
+#pragma pack(1)
+
+typedef struct {
+  EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR  Io;
+  EFI_ACPI_END_TAG_DESCRIPTOR                 End;
+} SIO_RESOURCES_IO;
+
+#pragma pack()
+
+typedef struct {
+  UINT32                    Hid;
+  UINT32                    Uid;
+  ACPI_RESOURCE_HEADER_PTR  Resources;
+} SIO_DEVICE_INFO;
+
+//
+// SIO Bus driver private data structure
+//
+typedef struct {
+  EFI_PCI_IO_PROTOCOL  *PciIo;
+  UINT64               OriginalAttributes;
+} SIO_BUS_DRIVER_PRIVATE_DATA;
+
+//
+// SIO device private data structure
+//
+typedef struct {
+  UINT32                    Signature;
+  EFI_HANDLE                Handle;
+  EFI_PCI_IO_PROTOCOL       *PciIo;
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+  EFI_SIO_PROTOCOL          Sio;
+  UINT32                    DeviceIndex;
+} SIO_DEV;
+#define SIO_DEV_SIGNATURE      SIGNATURE_32 ('S', 'I', 'O', 'D')
+#define SIO_DEV_FROM_SIO(a)    CR (a, SIO_DEV, Sio, SIO_DEV_SIGNATURE)
+
+/**
+  Tests to see if this driver supports a given controller. If a child device is
+  provided, it further tests to see if this driver supports creating a handle
+  for the specified child device.
+
+  This function checks to see if the driver specified by This supports the
+  device specified by ControllerHandle. Drivers will typically use the device
+  path attached to ControllerHandle and/or the services from the bus I/O
+  abstraction attached to ControllerHandle to determine if the driver supports
+  ControllerHandle. This function may be called many times during platform
+  initialization. In order to reduce boot times, the tests performed by this
+  function must be very small, and take as little time as possible to execute.
+  This function must not change the state of any hardware devices, and this
+  function must be aware that the device specified by ControllerHandle may
+  already be managed by the same driver or a different driver. This function
+  must match its calls to AllocatePages() with FreePages(), AllocatePool() with
+  FreePool(), and OpenProtocol() with CloseProtocol(). Since ControllerHandle
+  may have been previously started by the same driver, if a protocol is already
+  in the opened state, then it must not be closed with CloseProtocol(). This is
+  required to guarantee the state of ControllerHandle is not modified by this
+  function.
+
+  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                   instance.
+  @param[in]  ControllerHandle     The handle of the controller to test. This
+                                   handle must support a protocol interface
+                                   that supplies an I/O abstraction to the
+                                   driver.
+  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
+                                   device path.  This parameter is ignored by
+                                   device drivers, and is optional for bus
+                                   drivers. For bus drivers, if this parameter
+                                   is not NULL, then the bus driver must
+                                   determine if the bus controller specified by
+                                   ControllerHandle and the child controller
+                                   specified by RemainingDevicePath are both
+                                   supported by this bus driver.
+
+  @retval EFI_SUCCESS              The device specified by ControllerHandle and
+                                   RemainingDevicePath is supported by the
+                                   driver specified by This.
+  @retval EFI_ALREADY_STARTED      The device specified by ControllerHandle and
+                                   RemainingDevicePath is already being managed
+                                   by the driver specified by This.
+  @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle and
+                                   RemainingDevicePath is already being managed
+                                   by a different driver or an application that
+                                   requires exclusive access.
+  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle and
+                                   RemainingDevicePath is not supported by the
+                                   driver specified by This.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingSupported (
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
+  IN EFI_HANDLE                     Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
+  );
+
+/**
+  Starts a device controller or a bus controller.
+
+  The Start() function is designed to be invoked from the EFI boot service
+  ConnectController(). As a result, much of the error checking on the
+  parameters to Start() has been moved into this common boot service. It is
+  legal to call Start() from other locations, but the following calling
+  restrictions must be followed or the system behavior will not be
+  deterministic.
+  1. ControllerHandle must be a valid EFI_HANDLE.
+  2. If RemainingDevicePath is not NULL, then it must be a pointer to a
+     naturally aligned EFI_DEVICE_PATH_PROTOCOL.
+  3. Prior to calling Start(), the Supported() function for the driver
+     specified by This must have been called with the same calling parameters,
+     and Supported() must have returned EFI_SUCCESS.
+
+  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                   instance.
+  @param[in]  ControllerHandle     The handle of the controller to start. This
+                                   handle must support a protocol interface
+                                   that supplies an I/O abstraction to the
+                                   driver.
+  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
+                                   device path.  This parameter is ignored by
+                                   device drivers, and is optional for bus
+                                   drivers. For a bus driver, if this parameter
+                                   is NULL, then handles for all the children
+                                   of Controller are created by this driver. If
+                                   this parameter is not NULL and the first
+                                   Device Path Node is not the End of Device
+                                   Path Node, then only the handle for the
+                                   child device specified by the first Device
+                                   Path Node of RemainingDevicePath is created
+                                   by this driver. If the first Device Path
+                                   Node of RemainingDevicePath is the End of
+                                   Device Path Node, no child handle is created
+                                   by this driver.
+
+  @retval EFI_SUCCESS              The device was started.
+  @retval EFI_DEVICE_ERROR         The device could not be started due to a
+                                   device error.
+  @retval EFI_OUT_OF_RESOURCES     The request could not be completed due to a
+                                   lack of resources.
+  @retval Others                   The driver failded to start the device.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingStart (
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
+  IN EFI_HANDLE                   Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
+  );
+
+/**
+  Stops a device controller or a bus controller.
+
+  The Stop() function is designed to be invoked from the EFI boot service
+  DisconnectController(). As a result, much of the error checking on the
+  parameters to Stop() has been moved into this common boot service. It is
+  legal to call Stop() from other locations, but the following calling
+  restrictions must be followed or the system behavior will not be
+  deterministic.
+  1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous
+     call to this same driver's Start() function.
+  2. The first NumberOfChildren handles of ChildHandleBuffer must all be a
+     valid EFI_HANDLE. In addition, all of these handles must have been created
+     in this driver's Start() function, and the Start() function must have
+     called OpenProtocol() on ControllerHandle with an Attribute of
+     EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
+
+  @param[in]  This               A pointer to the EFI_DRIVER_BINDING_PROTOCOL
+                                 instance.
+  @param[in]  ControllerHandle   A handle to the device being stopped. The
+                                 handle must support a bus specific I/O
+                                 protocol for the driver to use to stop the
+                                 device.
+  @param[in]  NumberOfChildren   The number of child device handles in
+                                 ChildHandleBuffer.
+  @param[in]  ChildHandleBuffer  An array of child handles to be freed. May be
+                                 NULL if NumberOfChildren is 0.
+
+  @retval EFI_SUCCESS            The device was stopped.
+  @retval EFI_DEVICE_ERROR       The device could not be stopped due to a
+                                 device error.
+
+**/
+EFI_STATUS
+EFIAPI
+PcuSioDriverBindingStop (
+  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
+  IN  EFI_HANDLE                     Controller,
+  IN  UINTN                          NumberOfChildren,
+  IN  EFI_HANDLE                     *ChildHandleBuffer
+  );
+
+/**
+  Provides a low level access to the registers for the Super I/O.
+
+  @param[in]     This           Indicates a pointer to the calling context.
+  @param[in]     Write          Specifies the type of the register operation.
+                                If this parameter is TRUE, Value is interpreted
+                                as an input parameter and the operation is a
+                                register write. If this parameter is FALSE,
+                                Value is interpreted as an output parameter and
+                                the operation is a register read.
+  @param[in]     ExitCfgMode    Exit Configuration Mode Indicator. If this
+                                parameter is set to TRUE, the Super I/O driver
+                                will turn off configuration mode of the Super
+                                I/O prior to returning from this function. If
+                                this parameter is set to FALSE, the Super I/O
+                                driver will leave Super I/O in the
+                                configuration mode. The Super I/O driver must
+                                track the current state of the Super I/O and
+                                enable the configuration mode of Super I/O if
+                                necessary prior to register access.
+  @param[in]     Register       Register number.
+  @param[in,out] Value          If Write is TRUE, Value is a pointer to the
+                                buffer containing the byte of data to be
+                                written to the Super I/O register. If Write is
+                                FALSE, Value is a pointer to the destination
+                                buffer for the byte of data to be read from the
+                                Super I/O register.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER The Value is NULL.
+  @retval EFI_INVALID_PARAMETER Invalid Register number.
+
+**/
+EFI_STATUS
+EFIAPI
+SioRegisterAccess (
+  IN CONST EFI_SIO_PROTOCOL    *This,
+  IN       BOOLEAN             Write,
+  IN       BOOLEAN             ExitCfgMode,
+  IN       UINT8               Register,
+  IN OUT   UINT8               *Value
+  );
+
+/**
+  Provides an interface to get a list of the current resources consumed by the
+  device in the ACPI Resource Descriptor format.
+
+  GetResources() returns a list of resources currently consumed by the device.
+  The ResourceList is a pointer to the buffer containing resource descriptors
+  for the device. The descriptors are in the format of Small or Large ACPI
+  resource descriptor as defined by ACPI specification (2.0 & 3.0). The buffer
+  of resource descriptors is terminated with the 'End tag' resource descriptor.
+
+  @param[in]  This              Indicates a pointer to the calling context.
+  @param[out] ResourceList      A pointer to an ACPI resource descriptor list
+                                that defines the current resources used by the
+                                device.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER ResourceList is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioGetResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  OUT      ACPI_RESOURCE_HEADER_PTR    *ResourceList
+  );
+
+/**
+  Sets the resources for the device.
+
+  @param[in] This               Indicates a pointer to the calling context.
+  @param[in] ResourceList       Pointer to the ACPI resource descriptor list.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER ResourceList is invalid.
+  @retval EFI_ACCESS_DENIED     Some of the resources in ResourceList are in
+                                use.
+
+**/
+EFI_STATUS
+EFIAPI
+SioSetResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  IN       ACPI_RESOURCE_HEADER_PTR    ResourceList
+  );
+
+/**
+  Provides a collection of resource descriptor lists. Each resource descriptor
+  list in the collection defines a combination of resources that can
+  potentially be used by the device.
+
+  @param[in]  This                  Indicates a pointer to the calling context.
+  @param[out] ResourceCollection    Collection of the resource descriptor
+                                    lists.
+
+  @retval EFI_SUCCESS               The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER     ResourceCollection is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioPossibleResources (
+  IN CONST EFI_SIO_PROTOCOL            *This,
+  OUT      ACPI_RESOURCE_HEADER_PTR    *ResourceCollection
+  );
+
+/**
+  Provides an interface for a table based programming of the Super I/O
+  registers.
+
+  The Modify() function provides an interface for table based programming of
+  the Super I/O registers. This function can be used to perform programming of
+  multiple Super I/O registers with a single function call. For each table
+  entry, the Register is read, its content is bitwise ANDed with AndMask, and
+  then ORed with OrMask before being written back to the Register. The Super
+  I/O driver must track the current state of the Super I/O and enable the
+  configuration mode of Super I/O if necessary prior to table processing. Once
+  the table is processed, the Super I/O device has to be returned to the
+  original state.
+
+  @param[in] This               Indicates a pointer to the calling context.
+  @param[in] Command            A pointer to an array of NumberOfCommands
+                                EFI_SIO_REGISTER_MODIFY structures. Each
+                                structure specifies a single Super I/O register
+                                modify operation.
+  @param[in] NumberOfCommands   Number of elements in the Command array.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER Command is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+SioModify (
+  IN CONST EFI_SIO_PROTOCOL           *This,
+  IN CONST EFI_SIO_REGISTER_MODIFY    *Command,
+  IN       UINTN                      NumberOfCommands
+  );
+
+#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
new file mode 100644
index 0000000000..2379f93999
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
@@ -0,0 +1,38 @@
+## @file
+#  Produces the SIO Protocols for ISA devices integrated in the Platform
+#  Controller Unit (PCU).
+#
+# Copyright (c)  1999 - 2019, Intel Corporation. All rights reserved
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = PcuSio
+  FILE_GUID                      = F749DEBC-42E6-4F59-821E-1E94EE9FBBB1
+  MODULE_TYPE                    = UEFI_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = PcuSioDriverEntryPoint
+
+[Sources]
+  PcuSio.h
+  PcuSio.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  UefiDriverEntryPoint
+  UefiBootServicesTableLib
+  DebugLib
+  ReportStatusCodeLib
+  BaseMemoryLib
+  MemoryAllocationLib
+  DevicePathLib
+  UefiLib
+
+[Protocols]
+  gEfiPciIoProtocolGuid  ## TO_START
+  gEfiSioProtocolGuid    ## BY_START
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
index 1d90117af6..89923ffec6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
@@ -154,10 +154,6 @@ VOID
 InitVlvPlatformPolicy (
   );
 
-VOID
-InitSioPlatformPolicy(
-  );
-
 VOID
 PchInitBeforeBoot(
   );
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index e8652f2a84..d3f8fa3833 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -36,7 +36,6 @@ [sources.common]
   Platform.c
   IchRegTable.c
   IdccInfo.c
-  SioPlatformPolicy.c
   IchPlatformPolicy.c
   PciDevice.c
   SlotConfig.c
@@ -105,7 +104,6 @@ [Protocols]
   gEfiSmbiosSlotPopulationGuid
   gObservableProtocolGuid
   gEfiCk505ClockPlatformInfoGuid
-  gEfiLpcWpc83627PolicyProtocolGuid
   gEfiTcoResetProtocolGuid
   gEfiWatchdogTimerDriverProtocolGuid
   gEfiPlatformIdeInitProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatformPolicy.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatformPolicy.c
deleted file mode 100644
index 32bee75f95..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatformPolicy.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-
-  SioPlatformPolicy.c
-
-Abstract:
-
-  Sio Platform Policy Setting.
-
-
---*/
-
-#include "PlatformDxe.h"
-#include <Protocol/LpcWpc83627Policy.h>
-
-
-EFI_WPC83627_POLICY_PROTOCOL  mSio83627PolicyData = {
-  { EFI_WPC83627_COM1_ENABLE,       // Com1
-    EFI_WPC83627_LPT1_ENABLE,       // Lpt1
-    EFI_WPC83627_FDD_DISABLE,       // Floppy
-    EFI_WPC83627_FDD_WRITE_ENABLE,  // FloppyWriteProtect
-    EFI_WPC83627_RESERVED_DEFAULT,  // Port80
-    EFI_WPC83627_ECIR_DISABLE,      // CIR
-    EFI_WPC83627_PS2_KBC_ENABLE,    // Ps2Keyboard
-    EFI_WPC83627_RESERVED_DEFAULT,  // Ps2Mouse
-    EFI_WPC83627_COM2_ENABLE,       // Com2
-    EFI_WPC83627_COM3_ENABLE,       // Com3
-    EFI_WPC83627_COM4_ENABLE,       // Com4
-    EFI_WPC83627_RESERVED_DEFAULT,  // Dac
-    0x00                            // Rsvd
-    },
-  LptModeEcp,                       // LptMode
-};
-
-/**
-
-  Publish the platform SIO policy setting.
-
-  @retval EFI_SUCCESS
-
-**/
-VOID
-InitSioPlatformPolicy(
-  )
-{
-
-  EFI_HANDLE              Handle;
-  EFI_STATUS              Status;
-
-  Handle = NULL;
-
-  if((mSystemConfiguration.Serial) || (mBoardFeatures & B_BOARD_FEATURES_SIO_NO_COM1)) {
-    mSio83627PolicyData.DeviceEnables.Com1 = EFI_WPC83627_COM1_DISABLE;
-  }
-
-  if((mSystemConfiguration.Serial2) || ((mBoardFeatures & B_BOARD_FEATURES_SIO_COM2)==0)) {
-    mSio83627PolicyData.DeviceEnables.Com2 = EFI_WPC83627_COM2_DISABLE;
-  }
-
-  mSio83627PolicyData.LptMode = mSystemConfiguration.ParallelMode;
-  if((!mSystemConfiguration.Parallel) || (mBoardFeatures & B_BOARD_FEATURES_SIO_NO_PARALLEL)) {
-    mSio83627PolicyData.DeviceEnables.Lpt1 = EFI_WPC83627_LPT1_DISABLE;
-  }
-
-  Status = gBS->InstallProtocolInterface (
-                  &Handle,
-                  &gEfiLpcWpc83627PolicyProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &mSio83627PolicyData
-                  );
-  ASSERT_EFI_ERROR(Status);
-
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index 9951aa4a58..786b4f6e91 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -66,7 +66,6 @@ [Protocols]
   gEfiSmbiosSlotPopulationGuid            = { 0xef7bf7d6, 0xf8ff, 0x4a76, { 0x82, 0x47, 0xc0, 0xd0, 0xd1, 0xcc, 0x49, 0xc0 } }
   gObservableProtocolGuid                 = { 0xe227c522, 0xd5fe, 0x4a53, { 0x87, 0xb1, 0x0f, 0xbe, 0x57, 0x0f, 0x98, 0xe9 } }
   gEfiCk505ClockPlatformInfoGuid          = { 0x3c485ea4, 0x449a, 0x46ce, { 0xbb, 0x08, 0x2a, 0x33, 0x6e, 0xa9, 0x6b, 0x4e } }
-  gEfiLpcWpc83627PolicyProtocolGuid       = { 0xd3ecc567, 0x9fd5, 0x44c1, { 0x86, 0xcf, 0x5d, 0xa7, 0xa2, 0x4f, 0x4b, 0x5d } }
   gEfiTcoResetProtocolGuid                = { 0xa6a79162, 0xe325, 0x4c30, { 0xbc, 0xc3, 0x59, 0x37, 0x30, 0x64, 0xef, 0xb3 } }
   gEfiWatchdogTimerDriverProtocolGuid     = { 0xd5b06d16, 0x2ea1, 0x4def, { 0x98, 0xd0, 0xa0, 0x5d, 0x40, 0x72, 0x84, 0x17 } }
   gEfiPlatformIdeInitProtocolGuid         = { 0x377c66a3, 0x8fe7, 0x4ee8, { 0x85, 0xb8, 0xf1, 0xa2, 0x82, 0x56, 0x9e, 0x3b } }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index 87b905c95b..3165be1fca 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -535,7 +535,7 @@ [FV.FVMAIN]
 #
 INF Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 !if $(SOURCE_DEBUG_ENABLE) != TRUE
-INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
+INF  MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf
 !endif
 
 #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index 110efe28c3..03941dd23e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -481,7 +481,7 @@ [FV.FVMAIN]
 #
 INF Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
 !if $(SOURCE_DEBUG_ENABLE) != TRUE
-INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
+INF  MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf
 !endif
 
 #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c
deleted file mode 100644
index f98265761b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c
+++ /dev/null
@@ -1,340 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-    LpcDriver.c
-
-Abstract:
-
-    EFI Lpc Driver for a Generic PC Platform
-
-
-
---*/
-
-#include "LpcDriver.h"
-#include "IndustryStandard/Pci22.h"
-
-//
-// This driver is for ACPI(PNP0A03,0)/PCI(0x1f,0)
-//
-
-//
-//  Lpc Driver Global Variables
-//
-
-EFI_DRIVER_BINDING_PROTOCOL gLpcDriver = {
-  LpcDriverSupported,
-  LpcDriverStart,
-  LpcDriverStop,
-  0x10,
-  NULL,
-  NULL
-};
-
-LPC_DEV mLpc = {
-  LPC_DEV_SIGNATURE,
-  NULL,
-  {
-    IsaDeviceEnumerate,
-    IsaDeviceSetPower,
-    IsaGetCurrentResource,
-    IsaGetPossibleResource,
-    IsaSetResource,
-    IsaEnableDevice,
-    IsaInitDevice,
-    LpcInterfaceInit
-  },
-  NULL
-};
-
-BOOLEAN  InitExecuted = FALSE;
-
-/**
-    the entry point of the Lpc driver
-
-**/
-EFI_STATUS
-EFIAPI
-LpcDriverEntryPoint(
-  IN EFI_HANDLE           ImageHandle,
-  IN EFI_SYSTEM_TABLE     *SystemTable
-  )
-{
-
-
-  return EfiLibInstallDriverBinding (ImageHandle, SystemTable, &gLpcDriver, ImageHandle);
-}
-
-/**
-
-  ControllerDriver Protocol Method
-
-**/
-EFI_STATUS
-EFIAPI
-LpcDriverSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN EFI_HANDLE                     Controller,
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
-  )
-{
-  EFI_STATUS                Status;
-  EFI_PCI_IO_PROTOCOL       *PciIo;
-  EFI_DEVICE_PATH_PROTOCOL  *IsaBridgeDevicePath;
-
-  ACPI_HID_DEVICE_PATH      *AcpiNode;
-  PCI_DEVICE_PATH           *PciNode;
-  PCI_TYPE00                Pci;
-
-  //
-  // Get the ISA bridge's Device Path and test it
-  // the following code is specific
-  //
-  Status = gBS->OpenProtocol (
-                  Controller,
-                  &gEfiDevicePathProtocolGuid,
-                  (VOID **)&IsaBridgeDevicePath,
-                  This->DriverBindingHandle,
-                  Controller,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = EFI_SUCCESS;
-  AcpiNode =  (ACPI_HID_DEVICE_PATH *)IsaBridgeDevicePath;
-  if (AcpiNode->Header.Type != ACPI_DEVICE_PATH ||
-      AcpiNode->Header.SubType != ACPI_DP ||
-      DevicePathNodeLength (&AcpiNode->Header) != sizeof(ACPI_HID_DEVICE_PATH) ||
-      AcpiNode -> HID != EISA_PNP_ID(0x0A03) ||
-      AcpiNode -> UID != 0 ) {
-    Status = EFI_UNSUPPORTED;
-  } else {
-    //
-    // Get the next node
-    //
-    IsaBridgeDevicePath = NextDevicePathNode (IsaBridgeDevicePath);
-    PciNode  = (PCI_DEVICE_PATH *)IsaBridgeDevicePath;
-    if (PciNode->Header.Type != HARDWARE_DEVICE_PATH ||
-        PciNode->Header.SubType != HW_PCI_DP ||
-        DevicePathNodeLength (&PciNode->Header) != sizeof (PCI_DEVICE_PATH) ||
-        PciNode -> Function != 0x00 ||
-        PciNode -> Device != 0x1f ) {
-      Status = EFI_UNSUPPORTED;
-    }
-  }
-
-  gBS->CloseProtocol (
-         Controller,
-         &gEfiDevicePathProtocolGuid,
-         This->DriverBindingHandle,
-         Controller
-         );
-
-  if (EFI_ERROR (Status)) {
-    return EFI_UNSUPPORTED;
-  }
-
-  //
-  // Get PciIo protocol instance
-  //
-  Status = gBS->OpenProtocol (
-                  Controller,
-                  &gEfiPciIoProtocolGuid,
-                  (VOID **)&PciIo,
-                  This->DriverBindingHandle,
-                  Controller,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-
-  if (EFI_ERROR(Status)) {
-    return Status;
-  }
-
-  Status = PciIo->Pci.Read (
-                        PciIo,
-                        EfiPciIoWidthUint32,
-                        0,
-                        sizeof(Pci) / sizeof(UINT32),
-                        &Pci
-                        );
-
-  if (!EFI_ERROR (Status)) {
-    Status = EFI_SUCCESS; //TODO: force return success as temp solution EFI_UNSUPPORTED;
-    if ((Pci.Hdr.Command & 0x03) == 0x03) {
-      if (Pci.Hdr.ClassCode[2] == PCI_CLASS_BRIDGE) {
-        //
-        // See if this is a standard PCI to ISA Bridge from the Base Code
-        // and Class Code
-        //
-        if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA) {
-          Status = EFI_SUCCESS;
-        } else {
-        }
-
-        //
-        // See if this is an Intel PCI to ISA bridge in Positive Decode Mode
-        //
-        if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE &&
-            Pci.Hdr.VendorId == 0x8086 &&
-            Pci.Hdr.DeviceId == 0x7110) {
-          Status = EFI_SUCCESS;
-        } else {
-        }
-      } else {
-      }
-    }
-    else {
-    }
-  }
-
-  gBS->CloseProtocol (
-         Controller,
-         &gEfiPciIoProtocolGuid,
-         This->DriverBindingHandle,
-         Controller
-         );
-  return Status;
-}
-
-
-/**
-  Install EFI_ISA_ACPI_PROTOCOL
-
-**/
-EFI_STATUS
-EFIAPI
-LpcDriverStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN EFI_HANDLE                     Controller,
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
-  )
-{
-  EFI_STATUS             Status;
-  EFI_PCI_IO_PROTOCOL    *PciIo;
-
-  //
-  // Get Pci IO
-  //
-  Status = gBS->OpenProtocol (
-                  Controller,
-                  &gEfiPciIoProtocolGuid,
-                  (VOID **)&PciIo,
-                  This->DriverBindingHandle,
-                  Controller,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-
-  if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {
-    return Status;
-  }
-
-  mLpc.PciIo = PciIo;
-
-  //
-  // Install IsaAcpi interface, the Sio interface is not installed!
-  //
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &Controller,
-                  &gEfiIsaAcpiProtocolGuid,
-                  &mLpc.IsaAcpi,
-                  NULL
-                  );
-  return Status;
-}
-
-
-EFI_STATUS
-EFIAPI
-LpcDriverStop (
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN  EFI_HANDLE                     Controller,
-  IN  UINTN                          NumberOfChildren,
-  IN  EFI_HANDLE                     *ChildHandleBuffer
-  )
-{
-  EFI_STATUS             Status;
-  EFI_ISA_ACPI_PROTOCOL  *IsaAcpi;
-  LPC_DEV                *LpcDev;
-
-  //
-  // Get EFI_ISA_ACPI_PROTOCOL interface
-  //
-  Status = gBS->OpenProtocol (
-                  Controller,
-                  &gEfiIsaAcpiProtocolGuid,
-                  (VOID **)&IsaAcpi,
-                  This->DriverBindingHandle,
-                  Controller,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  LpcDev = LPC_ISA_ACPI_FROM_THIS (IsaAcpi);
-
-  //
-  // Uninstall protocol interface: EFI_ISA_ACPI_PROTOCOL
-  //
-  Status = gBS->UninstallProtocolInterface (
-                  Controller,
-                  &gEfiIsaAcpiProtocolGuid,
-                  &LpcDev->IsaAcpi
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  gBS->CloseProtocol (
-         Controller,
-         &gEfiPciIoProtocolGuid,
-         This->DriverBindingHandle,
-         Controller
-         );
-
-  return EFI_SUCCESS;
-}
-
-VOID
-LpcIoRead8 (
-  IN  UINT16  Port,
-  OUT UINT8   *Data
-  )
-{
-  mLpc.PciIo->Io.Read(
-                   mLpc.PciIo,
-                   EfiPciWidthUint8,
-                   EFI_PCI_IO_PASS_THROUGH_BAR,
-                   Port,
-                   1,
-                   Data
-                   );
-}
-
-VOID
-LpcIoWrite8 (
-  IN  UINT16  Port,
-  IN  UINT8   Data
-  )
-{
-  mLpc.PciIo->Io.Write(
-                   mLpc.PciIo,
-                   EfiPciWidthUint8,
-                   EFI_PCI_IO_PASS_THROUGH_BAR,
-                   Port,
-                   1,
-                   &Data
-                   );
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h
deleted file mode 100644
index 5e264485e7..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-    LpcDriver.h
-
-Abstract:
-
-    EFI Lpc Driver for a Generic PC Platform
-
-
-
---*/
-
-#ifndef _LPC_DRIVER_H
-#define _LPC_DRIVER_H
-
- #include "LpcSio.h"
- #include "LpcIsaAcpi.h"
-
-#include "Protocol/IsaAcpi.h"
-#include "Protocol/PciIo.h"
-#include "Protocol/DriverBinding.h"
-#include "Library/UefiBootServicesTableLib.h"
-#include "IsaAcpiDxe/PcatIsaAcpi.h"
-#include "IndustryStandard/Pci22.h"
-#include "Protocol/LpcWpce791Policy.h"
-
-#include <Library/DebugLib.h>
-
-#define ICH_LPC_BRIDGE_BUS_DEV_FUNC 0x1F0000
-
-//
-// LPC device private data structure
-//
-//#define LPC_DEV_SIGNATURE 'W87X'
-#define LPC_DEV_SIGNATURE SIGNATURE_32('X', '7', '8', 'W') //'W87X'
-#define EFI_WPCE791_PS2_KEYBOARD_ENABLE       0x01
-#define EFI_WPCE791_PS2_KEYBOARD_DISABLE      0x00
-
-#define EFI_WPCE791_PS2_MOUSE_ENABLE       0x01
-#define EFI_WPCE791_PS2_MOUSE_DISABLE      0x00
-
-
-
-typedef struct {
-  UINTN                 Signature;
-  EFI_HANDLE            Handle;
-  EFI_ISA_ACPI_PROTOCOL IsaAcpi;
-  EFI_PCI_IO_PROTOCOL   *PciIo;
-
-} LPC_DEV;
-
-#define LPC_ISA_ACPI_FROM_THIS(a) BASE_CR (a, LPC_DEV, IsaAcpi)
-
-//
-// Driver entry point
-//
-EFI_STATUS
-EFIAPI
-LpcDriverEntryPoint (
-  IN EFI_HANDLE           ImageHandle,
-  IN EFI_SYSTEM_TABLE     *SystemTable
-  );
-
-//
-// Prototypes for Driver model protocol interface
-//
-EFI_STATUS
-EFIAPI
-LpcDriverSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN EFI_HANDLE                     Controller,
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
-  );
-
-EFI_STATUS
-EFIAPI
-LpcDriverStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN EFI_HANDLE                     Controller,
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
-  );
-
-EFI_STATUS
-EFIAPI
-LpcDriverStop (
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN  EFI_HANDLE                     Controller,
-  IN  UINTN                          NumberOfChildren,
-  IN  EFI_HANDLE                     *ChildHandleBuffer
-  );
-
-VOID
-LpcIoRead8 (
-  IN  UINT16  Port,
-  OUT UINT8   *Data
-  );
-
-VOID
-LpcIoWrite8 (
-  IN  UINT16  Port,
-  IN  UINT8   Data
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c
deleted file mode 100644
index 9c0b79b15c..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-    LpcIsaAcpi.c
-
-Abstract: IsaAcpi implementation
-
-
-
---*/
-
-#include "LpcDriver.h"
-
-//
-// PS/2 Keyboard Controller
-//
-static EFI_ISA_ACPI_RESOURCE  mLpcWpce791Ps2KeyboardDeviceResources[] = {
-  {EfiIsaAcpiResourceIo,        0, 0x60, 0x64},
-  {EfiIsaAcpiResourceInterrupt, 0, 1,     0},
-  {EfiIsaAcpiResourceEndOfList, 0, 0,     0}
-};
-
-//
-// PS/2 Mouse Controller
-//
-static EFI_ISA_ACPI_RESOURCE  mLpcWpce791Ps2MouseDeviceResources[] = {
-  {EfiIsaAcpiResourceIo,        0, 0x60, 0x64},
-  {EfiIsaAcpiResourceInterrupt, 0, 12,     0},
-  {EfiIsaAcpiResourceEndOfList, 0, 0,     0}
-};
-
-//
-// COM
-//
-static EFI_ISA_ACPI_RESOURCE  mLpcWpce791ComDeviceResources[] = {
-  {EfiIsaAcpiResourceIo,        0, 0x3f8, 0x3ff},
-  {EfiIsaAcpiResourceInterrupt, 0, 4,     0},
-  {EfiIsaAcpiResourceEndOfList, 0, 0,     0}
-};
-
-//
-// Table of ISA Controllers
-//
-EFI_ISA_ACPI_RESOURCE_LIST mLpcWpce791DeviceList[] = {
-  {{EISA_PNP_ID(0x303), 0}, mLpcWpce791Ps2KeyboardDeviceResources }, // PS/2 Keyboard Controller
-  {{EISA_PNP_ID(0xF03), 0}, mLpcWpce791Ps2MouseDeviceResources	  }, // PS/2 Mouse Controller
-  {{EISA_PNP_ID(0x501), 0}, mLpcWpce791ComDeviceResources	      }, // COM
-  {{0,                  0}, NULL                                  }  // End
-};
-
-static ICH_DMA_INIT  mIchDmaInitTable [] = {
-//
-//Register OFFSET,           Value
-//
-
-            0x0D8,           0x000,   // Reset DMA Controller 2
-            0x0D0,           0x000,   // Enable DMA controller 2
-            0x00C,           0x000,   // Reset DMA Controller 1
-            0x008,           0x000,   // Enable DMA controller 1
-
-            //
-            // Channel 4
-            //
-            0x0D6,           0x0c0,   // DMA contr. 2 Cascade mode, addr. increment, disable auto init.
-            0x0D2,           0x000,   // Clear write request register
-            0x0d4,           0x000,   // Enable DREQs for channel
-
-            //
-            // Channel 0
-            //
-            0x00B,           0x040,   // DMA contr. 1 single mode, addr. increment, disable auto init.
-            0x009,           0x000,   // Clear write request register
-            0x00A,           0x000,   // Enable DREQs for channel
-
-            //
-            // Channel 1
-            //
-            0x00B,           0x041,   // DMA contr. 1 single mode, addr. increment, disable auto init.
-            0x009,           0x001,   // Clear write request register
-            0x00A,           0x001,   // Enable DREQs for channel
-
-            //
-            // Channel 2
-            //
-            0x00B,           0x042,   // DMA contr. 1 single mode, addr. increment, disable auto init.
-            0x009,           0x002,   // Clear write request register
-            0x00A,           0x002,   // Enable DREQs for channel
-
-            //
-            // Channel 3
-            //
-            0x00B,           0x043,   // DMA contr. 1 single mode, addr. increment, disable auto init.
-            0x009,           0x003,   // Clear write request register
-            0x00A,           0x003,   // Enable DREQs for channel
-
-            //
-            // Channel 5
-            //
-            0x0D6,           0x041,   // DMA contr. 2 single mode, addr. increment, disable auto init.
-            0x0D2,           0x001,   // Clear write request register
-            0x0D4,           0x001,   // Enable DREQs for channel
-
-            //
-            // Channel 6
-            //
-            0x0D6,           0x042,   // DMA contr. 2 single mode, addr. increment, disable auto init.
-            0x0D2,           0x002,   // Clear write request register
-            0x0D4,           0x002,   // Enable DREQs for channel
-
-            //
-            // Channel 7
-            //
-            0x0D6,           0x043,   // DMA contr. 2 single mode, addr. increment, disable auto init.
-            0x0D2,           0x003,   // Clear write request register
-            0x0D4,           0x003    // Enable DREQs for channel
-
-};
-
-//
-// ISA ACPI Protocol Functions
-//
-/**
-
-  Enumerate the ISA devices on the ISA bus
-
-**/
-VOID
-IsaDeviceLookup (
-  IN  EFI_ISA_ACPI_DEVICE_ID      *Device,
-  OUT EFI_ISA_ACPI_RESOURCE_LIST  **IsaAcpiDevice,
-  OUT EFI_ISA_ACPI_RESOURCE_LIST  **NextIsaAcpiDevice
-  )
-{
-  UINTN  Index;
-
-  *IsaAcpiDevice = NULL;
-  if (NextIsaAcpiDevice != NULL) {
-    *NextIsaAcpiDevice = NULL;
-  }
-  if (Device == NULL) {
-    Index = 0;
-  } else {
-    for(Index = 0; mLpcWpce791DeviceList[Index].Device.HID != 0; Index++) {
-      if (Device->HID == mLpcWpce791DeviceList[Index].Device.HID &&
-          Device->UID == mLpcWpce791DeviceList[Index].Device.UID    ) {
-        break;
-      }
-    }
-    if (mLpcWpce791DeviceList[Index].Device.HID == 0) {
-      return;
-    }
-    *IsaAcpiDevice = &(mLpcWpce791DeviceList[Index]);
-    Index++;
-  }
-  if (NextIsaAcpiDevice != NULL && mLpcWpce791DeviceList[Index].Device.HID != 0){
-    *NextIsaAcpiDevice = &(mLpcWpce791DeviceList[Index]);
-  }
-}
-
-
-/**
-  Enumerate the ISA devices on the ISA bus
-  It is hard code now and future it will get from ACPI table
-
-**/
-EFI_STATUS
-EFIAPI
-IsaDeviceEnumerate (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  OUT    EFI_ISA_ACPI_DEVICE_ID      **Device
-  )
-{
-  EFI_ISA_ACPI_RESOURCE_LIST  *IsaAcpiDevice;
-  EFI_ISA_ACPI_RESOURCE_LIST  *NextIsaAcpiDevice;
-
-  IsaDeviceLookup (*Device, &IsaAcpiDevice, &NextIsaAcpiDevice);
-  if (NextIsaAcpiDevice == NULL) {
-    return EFI_NOT_FOUND;
-  }
-  *Device = &(NextIsaAcpiDevice->Device);
-  return EFI_SUCCESS;
-}
-
-/**
-  Set ISA device power use sio
-
-**/
-EFI_STATUS
-EFIAPI
-IsaDeviceSetPower (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  IN     BOOLEAN                     OnOff
-  )
-{
-  return EFI_UNSUPPORTED;
-}
-
-
-/**
-  Get current Resource of the specific ISA device
-  It is hardcode now and future will get from ACPI table
-
-**/
-EFI_STATUS
-EFIAPI
-IsaGetCurrentResource (
-  IN     EFI_ISA_ACPI_PROTOCOL        *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID       *Device,
-  OUT    EFI_ISA_ACPI_RESOURCE_LIST   **ResourceList
-  )
-{
-  IsaDeviceLookup (Device, ResourceList, NULL);
-  if (*ResourceList == NULL || (*ResourceList)->ResourceItem == NULL) {
-    return EFI_NOT_FOUND;
-  }
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-IsaGetPossibleResource (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  OUT    EFI_ISA_ACPI_RESOURCE_LIST  **ResourceList
-  )
-{
-  //
-  // Not supported yet
-  //
-  return EFI_UNSUPPORTED;
-}
-
-
-EFI_STATUS
-EFIAPI
-IsaSetResource (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  IN     EFI_ISA_ACPI_RESOURCE_LIST  *ResourceList
-  )
-{
-  return EFI_UNSUPPORTED;
-}
-
-EFI_STATUS
-EFIAPI
-IsaEnableDevice (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This,
-  IN    EFI_ISA_ACPI_DEVICE_ID       *Device,
-  IN    BOOLEAN                      Enable
-  )
-{
-
-  return EFI_UNSUPPORTED;
-}
-
-/**
-
-  Clear out Resource List if device is set to disable by platform policy
-
-**/
-VOID
-EmptyResourceList (
-  IN  UINT32      DeviceHid
-  )
-{
-  UINT8     Index;
-  for (Index = 0; mLpcWpce791DeviceList[Index].Device.HID != 0; Index++) {
-    if (DeviceHid == mLpcWpce791DeviceList[Index].Device.HID) {
-      mLpcWpce791DeviceList[Index].ResourceItem = NULL;
-    }
-  }
-  return;
-}
-
-/**
-
-  Clear out Resource List if device is set to disable by platform policy
-
-**/
-VOID
-EmptyResourceListHidUid (
-  IN  UINT32      DeviceHid,
-  IN  UINT32      DeviceUid
-  )
-{
-  UINT8     Index;
-  for (Index = 0; mLpcWpce791DeviceList[Index].Device.HID != 0; Index++) {
-    if ((DeviceHid == mLpcWpce791DeviceList[Index].Device.HID) &&
-        (DeviceUid == mLpcWpce791DeviceList[Index].Device.UID)) {
-      mLpcWpce791DeviceList[Index].ResourceItem = NULL;
-    }
-  }
-  return;
-}
-
-EFI_STATUS
-EFIAPI
-IsaInitDevice (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This,
-  IN    EFI_ISA_ACPI_DEVICE_ID       *Device
-  )
-{
-  EFI_WPCE791_POLICY_PROTOCOL      *LpcWpce791Policy;
-  EFI_STATUS                      Status;
-
-  //
-  // Disable configuration according to platform protocol
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiLpcWpce791PolicyProtocolGuid,
-                  NULL,
-                  (VOID **) &LpcWpce791Policy
-                  );
-  if (!EFI_ERROR(Status)) {
-    if (LpcWpce791Policy->DeviceEnables.Ps2Keyboard == EFI_WPCE791_PS2_KEYBOARD_DISABLE) {
-      EmptyResourceList(EISA_PNP_ID(0x303));
-      DisableLogicalDevice (SIO_KEYBOARD);
-      EmptyResourceList(EISA_PNP_ID(0xF03));
-      DisableLogicalDevice (SIO_KEYBOARD);
-    }
-    if (LpcWpce791Policy->DeviceEnables.Ps2Mouse == EFI_WPCE791_PS2_MOUSE_DISABLE) {
-      EmptyResourceList(EISA_PNP_ID(0xF03));
-      DisableLogicalDevice (SIO_MOUSE);
-    }
-  }
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-LpcInterfaceInit (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This
-  )
-{
-  EFI_PCI_IO_PROTOCOL             *PciIo;
-  UINTN                           Index;
-
-  PciIo = (LPC_ISA_ACPI_FROM_THIS (This))->PciIo;
-
-  //
-  // DMA controller initialize
-  //
-  for (Index=0; Index < (sizeof(mIchDmaInitTable)/sizeof(ICH_DMA_INIT)); Index++) {
-    PciIo->Io.Write (
-                PciIo,
-                EfiPciIoWidthUint8,
-                EFI_PCI_IO_PASS_THROUGH_BAR,
-                mIchDmaInitTable[Index].Register,
-                1,
-                &mIchDmaInitTable[Index].Value
-                );
-  }
-
-  return EFI_SUCCESS;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h
deleted file mode 100644
index 2291fd2c1d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-    LpcIsaAcpi.h
-
-Abstract:
-
-    Isa Acpi interface
-
-
-
---*/
-
-#ifndef _LPC_ISA_ACPI_H
-#define _LPC_ISA_ACPI_H
-
-
-
-#include "Protocol/IsaAcpi.h"
-#include "Library/DevicePathLib.h"
-
-
-typedef struct {
-  UINT8  Register;
-  UINT8  Value;
-} ICH_DMA_INIT;
-
-//
-// Prototypes for the ISA ACPI protocol interface
-//
-EFI_STATUS
-EFIAPI
-IsaDeviceEnumerate (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  OUT    EFI_ISA_ACPI_DEVICE_ID      **Device
-  );
-
-EFI_STATUS
-EFIAPI
-IsaDeviceSetPower (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  IN     BOOLEAN                     OnOff
-  );
-
-EFI_STATUS
-EFIAPI
-IsaGetCurrentResource (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  OUT    EFI_ISA_ACPI_RESOURCE_LIST  **ResourceList
-  );
-
-EFI_STATUS
-EFIAPI
-IsaGetPossibleResource (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  OUT    EFI_ISA_ACPI_RESOURCE_LIST  **ResourceList
-  );
-
-EFI_STATUS
-EFIAPI
-IsaSetResource (
-  IN     EFI_ISA_ACPI_PROTOCOL       *This,
-  IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
-  IN     EFI_ISA_ACPI_RESOURCE_LIST  *ResourceList
-  );
-
-EFI_STATUS
-EFIAPI
-IsaEnableDevice (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This,
-  IN    EFI_ISA_ACPI_DEVICE_ID       *Device,
-  IN    BOOLEAN                      Enable
-  );
-
-EFI_STATUS
-EFIAPI
-IsaInitDevice (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This,
-  IN    EFI_ISA_ACPI_DEVICE_ID       *Device
-  );
-
-EFI_STATUS
-EFIAPI
-LpcInterfaceInit (
-  IN    EFI_ISA_ACPI_PROTOCOL        *This
-);
-
-VOID
-EmptyResourceList (
-  IN    UINT32      DeviceHid
-);
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c
deleted file mode 100644
index f23e48ccf2..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-Module Name:
-
-    LpcSio.c
-
-Abstract: Sio implementation
-
-Revision History
-
---*/
-
-#include "LpcDriver.h"
-#include <Library/S3BootScriptLib.h>
-
-VOID
-WriteRegister (
-  IN  UINT8   Index,
-  IN  UINT8   Data
-  );
-
-typedef struct {
-  UINT8 Register;
-  UINT8 Value;
-} EFI_SIO_TABLE;
-
-EFI_SIO_TABLE mSioTable[] = {
-  //
-  // Init keyboard controller
-  //
-  { REG_LOGICAL_DEVICE, SIO_KEYBOARD },
-  { BASE_ADDRESS_HIGH, 0x00 },
-  { BASE_ADDRESS_LOW, 0x60 },
-  { BASE_ADDRESS_HIGH2, 0x00 },
-  { BASE_ADDRESS_LOW2, 0x64 },
-  { PRIMARY_INTERRUPT_SELECT, 0x01 },
-  { ACTIVATE, 0x1 },
-
-  //
-  // Init Mouse controller
-  //
-  { REG_LOGICAL_DEVICE, SIO_MOUSE },
-  { BASE_ADDRESS_HIGH, 0x00 },
-  { BASE_ADDRESS_LOW, 0x60 },
-  { BASE_ADDRESS_HIGH2, 0x00 },
-  { BASE_ADDRESS_LOW2, 0x64 },
-  { PRIMARY_INTERRUPT_SELECT, 0x0c },
-  { ACTIVATE, 0x1 },
-
-  { REG_LOGICAL_DEVICE, SIO_COM },
-  { BASE_ADDRESS_HIGH, 0x03 },
-  { BASE_ADDRESS_LOW, 0xf8 },
-  { PRIMARY_INTERRUPT_SELECT, 0x04 },
-  { ACTIVATE, 0x1 },
-
-
-};
-
-VOID
-LPCWPCE791SetDefault ()
-{
-  UINT8           Index;
-
-  for (Index = 0; Index < sizeof(mSioTable)/sizeof(EFI_SIO_TABLE); Index++) {
-    WriteRegisterAndSaveToScript (mSioTable[Index].Register, mSioTable[Index].Value);
-  }
-
-  return;
-}
-
-VOID
-DisableLogicalDevice (
-  UINT8       DeviceId
-  )
-{
-  WriteRegisterAndSaveToScript (REG_LOGICAL_DEVICE, DeviceId);
-  WriteRegisterAndSaveToScript (ACTIVATE, 0);
-  WriteRegisterAndSaveToScript (BASE_ADDRESS_HIGH, 0);
-  WriteRegisterAndSaveToScript (BASE_ADDRESS_LOW, 0);
-
-  return;
-}
-
-VOID
-WriteRegister (
-  IN  UINT8   Index,
-  IN  UINT8   Data
-  )
-{
-  LpcIoWrite8(CONFIG_PORT, Index);
-  LpcIoWrite8(DATA_PORT, Data);
-
-  return;
-}
-
-VOID
-WriteRegisterAndSaveToScript (
-  IN  UINT8   Index,
-  IN  UINT8   Data
-  )
-{
-  UINT8  Buffer[2];
-
-  LpcIoWrite8(CONFIG_PORT, Index);
-  LpcIoWrite8(DATA_PORT, Data);
-
-  Buffer[0] = Index;
-  Buffer[1] = Data;
-  S3BootScriptSaveIoWrite (
-    EfiBootScriptWidthUint8,
-    INDEX_PORT,
-    2,
-    Buffer
-    );
-
-  return;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h
deleted file mode 100644
index 52c1499e3d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-    LpcSio.h
-
-Abstract:
-
-    Lpc driver's sio interface
-
-
-
---*/
-
-#ifndef _LPC_SIO_H
-#define _LPC_SIO_H
-
-#include "Protocol/PciRootBridgeIo.h"
-
-#define VARSIOINSTALLED L"VarSIOProcotolInstalled"
-
-//
-// Port address
-//
-#define CONFIG_PORT               0x04E
-#define INDEX_PORT                0x04E
-#define DATA_PORT                 INDEX_PORT + 1
-
-//
-// Logical Device
-//
-#define SIO_COM                   0x3
-#define SIO_MSWC                  0x4
-#define SIO_MOUSE                 0x5
-#define SIO_KEYBOARD              0x6
-#define SIO_SHM                   0xF
-#define SIO_PM1                   0x11
-#define SIO_PM2                   0x12
-#define SIO_PM3                   0x17
-#define SIO_ESHM                  0x1D
-
-//
-// Global register
-//
-#define REG_LOGICAL_DEVICE        0x07
-#define REG_DEVICE_ID             0x20
-#define SIO_CONFIG_1              0x21
-#define REG_CHIP_REV              0x24
-#define SIO_CONFIG_5              0x25
-#define SIO_CONFIG_6              0x26
-#define REG_DEVICE_REV            0x27
-#define SIO_CONFIG_9              0x29
-#define SIO_CONFIG_D              0x2D
-
-#define ACTIVATE                  0x30
-#define BASE_ADDRESS_HIGH         0x60
-#define BASE_ADDRESS_LOW          0x61
-#define BASE_ADDRESS_HIGH2        0x62
-#define BASE_ADDRESS_LOW2         0x63
-#define PRIMARY_INTERRUPT_SELECT  0x70
-#define DMA_CHANNEL_SELECT        0x74
-
-EFI_STATUS
-InitializeLpcSio (
-  IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *RootBridgeIo
-  );
-
-//
-// Prototypes for the sio internal function
-//
-//
-// Internal function
-//
-VOID
-LPCWPCE791SetDefault (
-  VOID
-  );
-
-VOID
-WriteRegisterAndSaveToScript (
-  IN  UINT8   Index,
-  IN  UINT8   Data
-  );
-
-VOID
-FloppyWriteProtect (
-  VOID
-  );
-
-VOID
-DisableLogicalDevice (
-  UINT8       DeviceId
-  );
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf b/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf
deleted file mode 100644
index 5fd458e265..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-#
-# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-#  Module Name:
-#
-#    SiO791.inf
-#
-#  Abstract:
-#
-#    Component description file for SIO791 module.
-#
---*/
-
-[defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SIO791
-  FILE_GUID                      = 04A76C80-06B9-445e-B73E-CB8C61A6A964
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  ENTRY_POINT                    = LpcDriverEntryPoint
-
-[sources.common]
- LpcIsaAcpi.h
- LpcSio.h
- LpcDriver.h
- LpcIsaAcpi.c
- LpcSio.c
- LpcDriver.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
-  PcAtChipsetPkg/PcAtChipsetPkg.dec
-
-
-[LibraryClasses]
-  UefiDriverEntryPoint
-  UefiBootServicesTableLib
-  DevicePathLib
-  UefiLib
-  S3BootScriptLib
-  DebugLib
-
-[Ppis]
-
-[Protocols]
-  gEfiPciIoProtocolGuid
-  gEfiIsaAcpiProtocolGuid
-  gEfiLpcWpce791PolicyProtocolGuid
-
-[Guids]
-
-[Depex]
-  TRUE
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 06/14] Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol
  2019-07-01  2:55 ` [edk2-platforms Patch 06/14] Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol Michael D Kinney
@ 2019-07-01  4:07   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:07 UTC (permalink / raw)
  To: devel@edk2.groups.io, Kinney, Michael D; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Michael D Kinney
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-devel] [edk2-platforms Patch 06/14] Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol

This platform does not have a PS/2 controller, so remove all references to the PS/2 Policy Protocol.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
index cb280764b3..13d904b834 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
@@ -37,7 +37,6 @@ Abstract:
 #include <Guid/BoardFeatures.h>
 #include <Protocol/AcpiSupport.h>
 #include <Protocol/AcpiS3Save.h>
-#include <Protocol/Ps2Policy.h>
 #include <Library/CpuIA32.h>
 #include <SetupMode.h>
 #include <Guid/AcpiTableStorage.h>
@@ -772,7 +771,6 @@ AcpiPlatformEntryPoint (
   UINTN                         VarSize;
   UINTN                         SysCfgSize;
   EFI_HANDLE                    Handle;
-  EFI_PS2_POLICY_PROTOCOL       *Ps2Policy;
   EFI_PEI_HOB_POINTERS          GuidHob;
   EFI_MP_SERVICES_PROTOCOL      *MpService;
   UINTN                         MaximumNumberOfCPUs;
@@ -1131,19 +1129,6 @@ AcpiPlatformEntryPoint (
   //
   mGlobalNvsArea.Area->WPCN381U = GLOBAL_NVS_DEVICE_DISABLE;
   mGlobalNvsArea.Area->DockedSioPresent = GLOBAL_NVS_DEVICE_DISABLE;
-
-  //
-  // Get Ps2 policy to set. Will be use if present.
-  //
-  Status =  gBS->LocateProtocol (
-                   &gEfiPs2PolicyProtocolGuid,
-                   NULL,
-                   (VOID **)&Ps2Policy
-                   );
-  if (!EFI_ERROR (Status)) {
-          Status = Ps2Policy->Ps2InitHardware (ImageHandle);
-  }
-
   mGlobalNvsArea.Area->SDIOMode = mSystemConfiguration.LpssSdioMode;
 
   Handle = NULL;
--
2.21.0.windows.1





^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-platforms Patch 05/14] Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol
  2019-07-01  2:55 ` [edk2-platforms Patch 05/14] Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol Michael D Kinney
@ 2019-07-01  4:07   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:07 UTC (permalink / raw)
  To: Kinney, Michael D, devel@edk2.groups.io; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: Kinney, Michael D 
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-platforms Patch 05/14] Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol

* Remove unused references to CPU I/O Protocol defined in
  IntelFrameworkPkg
* Convert valid usage of CPU I/O Protocol to the CPU I/O 2
  Protocol

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../AcpiPlatform/AcpiPlatform.c               | 47 ---------------
 .../AcpiPlatform/AcpiPlatform.h               |  1 -
 .../AcpiPlatform/AcpiPlatform.inf             |  4 +-
 .../Include/Library/EfiRegTableLib.h          | 40 ++-----------
 .../Library/EfiRegTableLib/EfiRegTableLib.c   | 57 ++-----------------
 .../PciPlatform/PciPlatform.c                 |  7 +--
 .../PciPlatform/PciPlatform.inf               |  1 -
 .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.c   |  8 +--
 .../PlatformDxe/IchRegTable.c                 |  8 +--
 .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  |  4 +-
 .../PlatformDxe/PlatformDxe.h                 |  4 +-
 .../PlatformDxe/PlatformDxe.inf               |  1 -
 .../PlatformGopPolicy/PlatformGopPolicy.inf   |  3 +-
 .../PlatformInitPei/PchInitPeim.c             | 10 +---
 .../PlatformSetupDxe/PlatformSetupDxe.inf     |  1 -
 .../PlatformSetupDxe/SetupInfoRecords.c       |  1 -
 .../Vlv2TbltDevicePkg/PlatformSmm/Platform.c  |  1 -
 .../PlatformSmm/PlatformSmm.inf               |  1 -
 .../SmBiosMiscDxe/MiscOemType0x94Function.c   |  2 -
 .../VlvPlatformInitDxe/IgdOpRegion.c          |  6 +-
 .../VlvPlatformInitDxe/VlvPlatformInitDxe.inf |  4 +-
 21 files changed, 30 insertions(+), 181 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
index 1f4d575b73..cb280764b3 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
@@ -34,7 +34,6 @@ Abstract:
 #include <Guid/GlobalVariable.h>
 #include <Guid/SetupVariable.h>
 #include <Guid/PlatformInfo.h>
-#include <Protocol/CpuIo.h>
 #include <Guid/BoardFeatures.h>
 #include <Protocol/AcpiSupport.h>
 #include <Protocol/AcpiS3Save.h>
@@ -54,7 +53,6 @@ CHAR16    gACPIOSFRModelStringVariableName[] = ACPI_OSFR_MODEL_STRING_VARIABLE_N
 CHAR16    gACPIOSFRRefDataBlockVariableName[] = ACPI_OSFR_REF_DATA_BLOCK_VARIABLE_NAME;
 CHAR16    gACPIOSFRMfgStringVariableName[] = ACPI_OSFR_MFG_STRING_VARIABLE_NAME;
 
-EFI_CPU_IO_PROTOCOL                    *mCpuIo;
 EFI_GLOBAL_NVS_AREA_PROTOCOL            mGlobalNvsArea;
 #ifndef __GNUC__
 #pragma optimize("", off)
@@ -776,7 +774,6 @@ AcpiPlatformEntryPoint (
   EFI_HANDLE                    Handle;
   EFI_PS2_POLICY_PROTOCOL       *Ps2Policy;
   EFI_PEI_HOB_POINTERS          GuidHob;
-  UINT8                         PortData;
   EFI_MP_SERVICES_PROTOCOL      *MpService;
   UINTN                         MaximumNumberOfCPUs;
   UINTN                         NumberOfEnabledCPUs;
@@ -1132,53 +1129,9 @@ AcpiPlatformEntryPoint (
   //
   // SIO related option.
   //
-  Status = gBS->LocateProtocol (&gEfiCpuIoProtocolGuid, NULL, (void **)&mCpuIo);
-  ASSERT_EFI_ERROR (Status);
-
   mGlobalNvsArea.Area->WPCN381U = GLOBAL_NVS_DEVICE_DISABLE;
-
   mGlobalNvsArea.Area->DockedSioPresent = GLOBAL_NVS_DEVICE_DISABLE;
 
-  if (mGlobalNvsArea.Area->DockedSioPresent != GLOBAL_NVS_DEVICE_ENABLE) {
-    //
-    // Check ID for SIO WPCN381U.
-    //
-    Status = mCpuIo->Io.Read (
-                          mCpuIo,
-                          EfiCpuIoWidthUint8,
-                          WPCN381U_CONFIG_INDEX,
-                          1,
-                          &PortData
-                          );
-    ASSERT_EFI_ERROR (Status);
-    if (PortData != 0xFF) {
-      PortData = 0x20;
-      Status = mCpuIo->Io.Write (
-                            mCpuIo,
-                            EfiCpuIoWidthUint8,
-                            WPCN381U_CONFIG_INDEX,
-                            1,
-                            &PortData
-                            );
-      ASSERT_EFI_ERROR (Status);
-      Status = mCpuIo->Io.Read (
-                            mCpuIo,
-                            EfiCpuIoWidthUint8,
-                            WPCN381U_CONFIG_DATA,
-                            1,
-                            &PortData
-                            );
-      ASSERT_EFI_ERROR (Status);
-      if ((PortData == WPCN381U_CHIP_ID) || (PortData == WDCP376_CHIP_ID)) {
-        mGlobalNvsArea.Area->WPCN381U = GLOBAL_NVS_DEVICE_ENABLE;
-        mGlobalNvsArea.Area->OnboardCom = GLOBAL_NVS_DEVICE_ENABLE;
-        mGlobalNvsArea.Area->OnboardComCir = GLOBAL_NVS_DEVICE_DISABLE;
-      }
-    }
-  }
-
-
-
   //
   // Get Ps2 policy to set. Will be use if present.
   //
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
index f45590ea24..b27ca661ff 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
@@ -36,7 +36,6 @@ Abstract:
 #include <IndustryStandard/Acpi.h>
 #include <Protocol/AcpiSystemDescriptionTable.h>
 #include <Protocol/MpService.h>
-#include <Protocol/CpuIo.h>
 #include <IndustryStandard/Acpi30.h>
 #include <IndustryStandard/Acpi20.h>
 #include <Library/HobLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
index 817ad58a81..ce4db9fa85 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
@@ -79,6 +79,4 @@ [Depex]
   gEfiVariableArchProtocolGuid        AND
   gEfiVariableWriteArchProtocolGuid   AND
   gEfiAcpiSupportProtocolGuid AND
-  gEfiMpServiceProtocolGuid AND
-  gEfiCpuIoProtocolGuid
-
+  gEfiMpServiceProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
index 12e44efed0..b295cf46cc 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/EfiRegTableLib.h
@@ -13,7 +13,7 @@ Abstract:
   Definitions and macros for building register tables for chipset
   initialization..
 
-  Components linking this lib must include CpuIo, PciRootBridgeIo, and
+  Components linking this lib must include PciRootBridgeIo and
   BootScriptSave protocols in their DPX.
 
 
@@ -129,10 +129,9 @@ typedef union {
   entries.
 
   No parameter checking is done so the caller must be careful about omitting
-  values for PciRootBridgeIo or CpuIo parameters.  If the regtable does
+  values for PciRootBridgeIo parameters.  If the regtable does
   not contain any PCI accesses, it is safe to omit the PciRootBridgeIo (supply
-  NULL).  If the regtable does not contain any IO or Mem entries, it is safe to
-  omit the CpuIo (supply NULL).
+  NULL).
 
   The RegTableEntry parameter is not checked, but is required.
 
@@ -146,44 +145,13 @@ typedef union {
   @param[in] PciRootBridgeIo  A pointer to the instance of PciRootBridgeIo that is used
                               when processing PCI table entries
 
-  @param[in] CpuIo            A pointer to the instance of CpuIo that is used when processing IO and
-                              MEM table entries
-
   @retval Nothing.
 
 **/
 VOID
 ProcessRegTablePci (
   EFI_REG_TABLE                   * RegTableEntry,
-  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * PciRootBridgeIo,
-  EFI_CPU_IO_PROTOCOL             * CpuIo
-  );
-
-/**
-  Processes register table assuming which may contain IO, MEM, and STALL
-  entries, but must NOT contain any PCI entries.  Any PCI entries cause an
-  ASSERT in a DEBUG build and are skipped in a free build.
-
-  No parameter checking is done.  Both RegTableEntry and CpuIo parameters are
-  required.
-
-  gBS is assumed to have been defined and is used when processing stalls.
-
-  The function processes each entry sequentially until an OP_TERMINATE_TABLE
-  entry is encountered.
-
-  @param[in] RegTableEntry - A pointer to the register table to process
-
-  @param[in] CpuIo - A pointer to the instance of CpuIo that is used when processing IO and
-                  MEM table entries
-
-  @retval Nothing.
-
-**/
-VOID
-ProcessRegTableCpu (
-  EFI_REG_TABLE                   * RegTableEntry,
-  EFI_CPU_IO_PROTOCOL             * CpuIo
+  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * PciRootBridgeIo
   );
 
 #endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.c
index b7d896d9fd..d698f3ada9 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTableLib.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/EfiRegTableLib/EfiRegTabl
+++ eLib.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-                                                                                   

+Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   EfiRegTableLib.c
@@ -188,10 +185,9 @@ MemReadModifyWrite (
   entries.
 
   No parameter checking is done so the caller must be careful about omitting
-  values for PciRootBridgeIo or CpuIo parameters.  If the regtable does
+  values for PciRootBridgeIo parameters.  If the regtable does
   not contain any PCI accesses, it is safe to omit the PciRootBridgeIo (supply
-  NULL).  If the regtable does not contain any IO or Mem entries, it is safe to
-  omit the CpuIo (supply NULL).
+  NULL).
 
   The RegTableEntry parameter is not checked, but is required.
 
@@ -205,17 +201,13 @@ MemReadModifyWrite (
   @param PciRootBridgeIo  A pointer to the instance of PciRootBridgeIo that is used
                           when processing PCI table entries
 
-  @param CpuIo            A pointer to the instance of CpuIo that is used when processing IO and
-                          MEM table entries
-
   @retval Nothing.
 
 **/
 VOID
 ProcessRegTablePci (
   EFI_REG_TABLE                       *RegTableEntry,
-  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL     *PciRootBridgeIo,
-  EFI_CPU_IO_PROTOCOL                 *CpuIo
+  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL     *PciRootBridgeIo
   )
 {
   while (OPCODE_BASE (RegTableEntry->Generic.OpCode) != OP_TERMINATE_TABLE) { @@ -241,42 +233,3 @@ ProcessRegTablePci (
     RegTableEntry++;
   }
 }
-
-/**
-  Processes register table assuming which may contain IO, MEM, and STALL
-  entries, but must NOT contain any PCI entries.  Any PCI entries cause an
-  ASSERT in a DEBUG build and are skipped in a free build.
-
-  No parameter checking is done.  Both RegTableEntry and CpuIo parameters are
-  required.
-
-  gBS is assumed to have been defined and is used when processing stalls.
-
-  The function processes each entry sequentially until an OP_TERMINATE_TABLE
-  entry is encountered.
-
-  @param  RegTableEntry   A pointer to the register table to process
-
-  @param  CpuIo           A pointer to the instance of CpuIo that is used when processing IO and
-                          MEM table entries
-
-  @retval Nothing.
-
-**/
-VOID
-ProcessRegTableCpu (
-  EFI_REG_TABLE                       *RegTableEntry,
-  EFI_CPU_IO_PROTOCOL                 *CpuIo
-  )
-{
-  while (OPCODE_BASE (RegTableEntry->Generic.OpCode) != OP_TERMINATE_TABLE) {
-    switch (OPCODE_BASE (RegTableEntry->Generic.OpCode)) {
-    default:
-      DEBUG ((EFI_D_ERROR, "RegTable ERROR: Unknown RegTable OpCode (%x)\n", OPCODE_BASE (RegTableEntry->Generic.OpCode)));
-      ASSERT (0);
-      break;
-    }
-
-    RegTableEntry++;
-  }
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c
index b135e2646c..b1c01afc16 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights 
+ reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -23,7 +21,6 @@ Abstract:
 
 #include <Library/BaseLib.h>
 #include <Library/BaseMemoryLib.h>
-#include <Protocol/CpuIo.h>
 #include <Protocol/PciIo.h>
 #include <Guid/SetupVariable.h>
 #include <Protocol/PciRootBridgeIo.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
index 18012a1d53..685c6103a9 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
@@ -33,7 +33,6 @@ [Guids]
 
 [Protocols]
   gEfiPciPlatformProtocolGuid
-  gEfiCpuIoProtocolGuid
   gEfiFirmwareVolume2ProtocolGuid
   gEfiPciRootBridgeIoProtocolGuid
   gEfiPciIoProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.c
index d35a158181..7f3f58e4d1 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInfoDxe.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformCpuInfoDxe/PlatformCpuInf
+++ oDxe.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights 
+ reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   PlatformCpuInfoDxe.c
@@ -41,7 +39,7 @@ PlatformCpuInfoInit (
       //
       // Write the Platform CPU Info to volatile memory for runtime purposes.
       // This must be done in its own driver because SetVariable protocol is dependent on chipset,
-      // which is dependent on CpuIo, PlatformInfo, and Metronome.
+      // which is dependent on CpuIo2, PlatformInfo, and Metronome.
       //
       Status = gRT->SetVariable(
                       EfiPlatformCpuInfoVariable, diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IchRegTable.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IchRegTable.c
index cac61bffd0..28883c166d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IchRegTable.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IchRegTable.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights 
+ reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -129,6 +127,6 @@ InitializeSubsystemIds (
   //
   // Program the SSVID/SSDID
   //
-  ProcessRegTablePci (mSubsystemIdRegs, mPciRootBridgeIo, NULL);
+  ProcessRegTablePci (mSubsystemIdRegs, mPciRootBridgeIo);
 
 }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
index 89923ffec6..7e083e3933 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
@@ -1260,7 +1260,7 @@ UpdateDVMTSetup(
 
 UINT8
 ReadCmosBank1Byte (
-  IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
+  IN  EFI_CPU_IO2_PROTOCOL            *CpuIo,
   IN  UINT8                           Index
   )
 {
@@ -1273,7 +1273,7 @@ ReadCmosBank1Byte (
 
 VOID
 WriteCmosBank1Byte (
-  IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
+  IN  EFI_CPU_IO2_PROTOCOL            *CpuIo,
   IN  UINT8                           Index,
   IN  UINT8                           Data
   )
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
index 621fb08274..5c60f823de 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
@@ -145,13 +145,13 @@ PciBusEvent (
 
 UINT8
 ReadCmosBank1Byte (
-  IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
+  IN  EFI_CPU_IO2_PROTOCOL            *CpuIo,
   IN  UINT8                           Index
   );
 
 VOID
 WriteCmosBank1Byte (
-  IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
+  IN  EFI_CPU_IO2_PROTOCOL            *CpuIo,
   IN  UINT8                           Index,
   IN  UINT8                           Data
   );
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index d3f8fa3833..a81f102bac 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -108,7 +108,6 @@ [Protocols]
   gEfiWatchdogTimerDriverProtocolGuid
   gEfiPlatformIdeInitProtocolGuid
   gEfiGlobalNvsAreaProtocolGuid
-  gEfiCpuIo2ProtocolGuid
   gIgdOpRegionProtocolGuid
   gEdkiiVariableLockProtocolGuid
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
index c00553e224..584355291b 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPoli
+++ cy.inf
@@ -37,9 +37,8 @@ [Guids]
   gEfiNormalSetupGuid
 
 [Protocols]
-  gEfiCpuIoProtocolGuid
   gEfiFirmwareVolume2ProtocolGuid
   gPlatformGOPPolicyGuid
 
 [Depex]
-  gEfiCpuIoProtocolGuid AND gEfiVariableArchProtocolGuid
+  gEfiVariableArchProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PchInitPeim.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PchInitPeim.c
index 38b17156f4..4a51a47e36 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PchInitPeim.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PchInitPeim.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights 
+ reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   PchInitPeim.c
@@ -84,9 +81,6 @@ WriteCmosBank1Byte (
 /**
   Turn off system if needed.
 
-  @param PeiServices Pointer to PEI Services
-  @param CpuIo       Pointer to CPU I/O Protocol
-
   @retval None.
 
 **/
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
index ae100df26d..1afd8a254e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe
+++ .inf
@@ -120,7 +120,6 @@ [Protocols]
   gEfiDiskInfoProtocolGuid                      ## CONSUMED
   gEfiMpServiceProtocolGuid
   gDxePchPlatformPolicyProtocolGuid
-  gEfiCpuIo2ProtocolGuid
   gEfiTdtOperationProtocolGuid
   gEfiSmbiosProtocolGuid                        ## PROTOCOL CONSUMES
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
index fb82cdb984..c767021aed 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords
+++ .c
@@ -23,7 +23,6 @@ Revision History:
 #include <Protocol/IdeControllerInit.h>  #include <Protocol/MpService.h>  #include <Protocol/PchPlatformPolicy.h> -#include <Protocol/CpuIo2.h>  #include <Protocol/Smbios.h>  #include <IndustryStandard/SmBios.h>  #include <Library/IoLib.h> diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
index 14b9250e99..fb9d090ada 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
@@ -16,7 +16,6 @@ Abstract:
 --*/
 
 #include "SmmPlatform.h"
-#include <Protocol/CpuIo2.h>
 
 
 //
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
index 3c4f55cf54..73c3b6f2d0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
@@ -56,7 +56,6 @@ [Protocols]
   gEfiSmmPowerButtonDispatchProtocolGuid
   gEfiSmmSxDispatchProtocolGuid
   gEfiSmmVariableProtocolGuid
-  gEfiCpuIo2ProtocolGuid
 
 [Packages]
   MdePkg/MdePkg.dec
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
index 81b66ce9af..2f25ab802b 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Func
+++ tion.c
@@ -19,7 +19,6 @@ Abstract:
 #include "MiscSubclassDriver.h"
 #include <Protocol/DataHub.h>
 #include <Library/HiiLib.h>
-#include <Protocol/CpuIo2.h>
 #include <Library/PrintLib.h>
 #include <Protocol/PciRootBridgeIo.h>
 #include <Protocol/SimpleNetwork.h>
@@ -28,7 +27,6 @@ Abstract:
 #include <Protocol/IdeControllerInit.h>  #include <Protocol/MpService.h>  #include <Protocol/PchPlatformPolicy.h> -#include <Protocol/CpuIo2.h>  #include <Protocol/I2cBus.h>
 
 #include <Library/IoLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
index 8fe1482106..99db5490b6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
@@ -41,7 +41,7 @@ Abstract:
 #include <Protocol/FirmwareVolume2.h>
 #include <Protocol/PlatformGopPolicy.h>  #include <Protocol/PciIo.h> -#include <Protocol/CpuIo.h>
+#include <Protocol/CpuIo2.h>
 #include <Protocol/GlobalNvsArea.h>
 #include <Protocol/DxeSmmReadyToLock.h>  #include <Protocol/PciRootBridgeIo.h> @@ -631,7 +631,7 @@ IgdOpRegionInit (
   EFI_STATUS                    Status;
   EFI_GLOBAL_NVS_AREA_PROTOCOL  *GlobalNvsArea;
   UINT32                        DwordData;
-  EFI_CPU_IO_PROTOCOL           *CpuIo;
+  EFI_CPU_IO2_PROTOCOL          *CpuIo;
   UINT16                        Data16;
   UINT16                        AcpiBase;
   VOID                          *gConOutNotifyReg;
@@ -879,7 +879,7 @@ IgdOpRegionInit (
   // Find the CPU I/O Protocol.  ASSERT if not found.
   //
   Status = gBS->LocateProtocol (
-                  &gEfiCpuIoProtocolGuid,
+                  &gEfiCpuIo2ProtocolGuid,
                   NULL,
                   (void **)&CpuIo
                   );
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
index 1e86adadb3..fe81a6e3bd 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformIni
+++ tDxe.inf
@@ -59,12 +59,12 @@ [Protocols]
   gEfiGlobalNvsAreaProtocolGuid
   gEfiPciIoProtocolGuid
   gEfiFirmwareVolume2ProtocolGuid
-  gEfiCpuIoProtocolGuid
+  gEfiCpuIo2ProtocolGuid
 
 [Depex]
   gDxeVlvPlatformPolicyGuid              AND
   gEfiPciRootBridgeIoProtocolGuid     AND
-  gEfiCpuIoProtocolGuid                      AND
+  gEfiCpuIo2ProtocolGuid                  AND
   gEfiDataHubProtocolGuid                 AND
   gEfiGlobalNvsAreaProtocolGuid       AND
   gEfiFirmwareVolume2ProtocolGuid   AND
--
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-platforms Patch 07/14] Vlv2TbltDevicePkg: Remove use of BIOS ID tools
  2019-07-01  2:55 ` [edk2-platforms Patch 07/14] Vlv2TbltDevicePkg: Remove use of BIOS ID tools Michael D Kinney
@ 2019-07-01  4:07   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:07 UTC (permalink / raw)
  To: Kinney, Michael D, devel@edk2.groups.io; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: Kinney, Michael D 
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-platforms Patch 07/14] Vlv2TbltDevicePkg: Remove use of BIOS ID tools

Remove the use of VLV2 specific BIOS ID tools.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env  |  25 --
 Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env  |  25 --
 .../Intel/Vlv2TbltDevicePkg/BiosIdx64D.env    |  25 --
 .../Intel/Vlv2TbltDevicePkg/BiosIdx64R.env    |  25 --
 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId    | Bin 12236 -> 0 bytes
 .../Intel/Vlv2TbltDevicePkg/GenBiosId.exe     | Bin 384000 -> 0 bytes
 .../Vlv2TbltDevicePkg/Include/Guid/BiosId.h   |  30 --
 .../Include/Library/BiosIdLib.h               |  22 +-
 .../Library/BiosIdLib/BiosIdLib.c             | 279 ++----------------
 .../Library/BiosIdLib/BiosIdLib.inf           |  21 +-
 .../PlatformDxe/PlatformDxe.inf               |   2 +-
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |   1 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |   4 -
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |   4 -
 .../PlatformSetupDxe/PlatformSetupDxe.inf     |   1 +
 .../SmBiosMiscDxe/MiscBiosVendorFunction.c    |   9 +-
 Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat  |   8 +-
 Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh   |  52 +---
 18 files changed, 33 insertions(+), 500 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env
 delete mode 100755 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/GenBiosId.exe
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env b/Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env
deleted file mode 100644
index 85313dfbd7..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env
+++ /dev/null
@@ -1,25 +0,0 @@
-#/** @file
-#  This file is used to define the BIOS ID parameters of the build.
-#  This file is processed by GenBiosId.
-#  The BIOS ID format conforms to "BIOS Revision Identification Specification", Rev. 0.7, 6/27/2001.
-#
-#  BIOS ID string format:
-#    $(BOARD_ID)$(BOARD_REV).$(OEM_ID).$(VERSION_MAJOR).$(BUILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM
-#  All fields must have a fixed length.
-#    Example: "TRFTCRB1.86C.0008.D03.0506081529"
-#
-#  Copyright (c) 2008  - 2015, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#**/
-
-BOARD_REV     = 1
-OEM_ID        = I32
-BUILD_TYPE    = D
-
-BOARD_ID = BLAKCRB
-VERSION_MAJOR = 0084
-VERSION_MINOR = 01
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env b/Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env
deleted file mode 100644
index 4af249dc19..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env
+++ /dev/null
@@ -1,25 +0,0 @@
-#/** @file
-#  This file is used to define the BIOS ID parameters of the build.
-#  This file is processed by GenBiosId.
-#  The BIOS ID format conforms to "BIOS Revision Identification Specification", Rev. 0.7, 6/27/2001.
-#
-#  BIOS ID string format:
-#    $(BOARD_ID)$(BOARD_REV).$(OEM_ID).$(VERSION_MAJOR).$(BUILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM
-#  All fields must have a fixed length.
-#    Example: "TRFTCRB1.86C.0008.D03.0506081529"
-#
-#  Copyright (c) 2008  - 2015, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#**/
-
-BOARD_REV     = 1
-OEM_ID        = I32
-BUILD_TYPE    = R
-
-BOARD_ID = BLAKCRB
-VERSION_MAJOR = 0084
-VERSION_MINOR = 01
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env b/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env
deleted file mode 100644
index a2173b7e44..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env
+++ /dev/null
@@ -1,25 +0,0 @@
-#/** @file
-#  This file is used to define the BIOS ID parameters of the build.
-#  This file is processed by GenBiosId.
-#  The BIOS ID format conforms to "BIOS Revision Identification Specification", Rev. 0.7, 6/27/2001.
-#
-#  BIOS ID string format:
-#    $(BOARD_ID)$(BOARD_REV).$(OEM_ID).$(VERSION_MAJOR).$(BUILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM
-#  All fields must have a fixed length.
-#    Example: "TRFTCRB1.86C.0008.D03.0506081529"
-#
-#  Copyright (c) 2008  - 2015, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#**/
-
-BOARD_REV     = 1
-OEM_ID        = X64
-BUILD_TYPE    = D
-
-VERSION_MAJOR = 0084
-VERSION_MINOR = 01
-BOARD_ID = BBAYCRB 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env b/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env
deleted file mode 100644
index c235177e1b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env
+++ /dev/null
@@ -1,25 +0,0 @@
-#/** @file
-#  This file is used to define the BIOS ID parameters of the build.
-#  This file is processed by GenBiosId.
-#  The BIOS ID format conforms to "BIOS Revision Identification Specification", Rev. 0.7, 6/27/2001.
-#
-#  BIOS ID string format:
-#    $(BOARD_ID)$(BOARD_REV).$(OEM_ID).$(VERSION_MAJOR).$(BUILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM
-#  All fields must have a fixed length.
-#    Example: "TRFTCRB1.86C.0008.D03.0506081529"
-#
-#  Copyright (c) 2008  - 2015, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#**/
-
-BOARD_REV     = 1
-OEM_ID        = X64
-BUILD_TYPE    = R
-
-VERSION_MAJOR = 0084
-VERSION_MINOR = 01
-BOARD_ID = BBAYCRB 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/GenBiosId b/Platform/Intel/Vlv2TbltDevicePkg/GenBiosId
deleted file mode 100755
index ef1578f2bcb8922905e0693035245c4329809aa7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12236
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
Oj(!g3>{OC7S^N)t{R~b3

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/GenBiosId.exe b/Platform/Intel/Vlv2TbltDevicePkg/GenBiosId.exe
deleted file mode 100644
index 323b87c444915b173b7f32d5481c67e4471b047b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 384000
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%0D_cl4iKT8j
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
ZjZG+N4<D9DmnW{lYNQ{GdHj36{y$a{V$uKr

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h
deleted file mode 100644
index e86fc852fc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*++
-
-Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-    BiosId.h
-
-Abstract:
-
-    GUIDs used for Bios ID.
-
---*/
-
-#ifndef _BIOS_ID_H_
-#define _BIOS_ID_H_
-
-
-#define EFI_BIOS_ID_GUID \
-{ 0xC3E36D09, 0x8294, 0x4b97, 0xA8, 0x57, 0xD5, 0x28, 0x8F, 0xE3, 0x3E, 0x28 }
-
-
-extern EFI_GUID gEfiBiosIdGuid;
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/BiosIdLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/BiosIdLib.h
index 484b358264..bd08c9a80f 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/BiosIdLib.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Include/Library/BiosIdLib.h
@@ -1,12 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   BiosIdLib.h
@@ -66,21 +63,6 @@ typedef struct {
 
 #pragma pack()
 
-/**
-  This function returns BIOS ID by searching HOB or FV.
-
-  @param[in]  BiosIdImage         The BIOS ID got from HOB or FV
-
-  @retval  EFI_SUCCESS            All parameters were valid and BIOS ID has been got.
-  @retval  EFI_NOT_FOUND          BiosId image is not found, and no parameter will be modified.
-  @retval  EFI_INVALID_PARAMETER  The parameter is NULL.
-
-**/
-EFI_STATUS
-GetBiosId (
-  OUT BIOS_ID_IMAGE     *BiosIdImage
-  );
-
 /**
   This function returns the Version & Release Date and Time by getting and converting
   BIOS ID.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.c
index 3f0e20c7a8..f6ab37313c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.c
@@ -1,11 +1,9 @@
 /*++
 
-Copyright (c) 2011  - 2014, Intel Corporation. All rights reserved
-                                                                                   

+Copyright (c) 2011  - 2019, Intel Corporation. All rights reserved
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   BiosIdLib.c
@@ -21,237 +19,8 @@ Abstract:
 
 #include <PiDxe.h>
 #include <Library/BaseLib.h>
-#include <Library/HobLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
 
 #include <Library/BiosIdLib.h>
-#include <Guid/BiosId.h>
-#include <Protocol/FirmwareVolume2.h>
-#include <Protocol/LoadedImage.h>
-
-
-EFI_STATUS
-GetImageFromFv (
-  IN  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv,
-  IN  EFI_GUID           *NameGuid,
-  IN  EFI_SECTION_TYPE   SectionType,
-  OUT VOID               **Buffer,
-  OUT UINTN              *Size
-  )
-{
-  EFI_STATUS                Status;
-  EFI_FV_FILETYPE           FileType;
-  EFI_FV_FILE_ATTRIBUTES    Attributes;
-  UINT32                    AuthenticationStatus;
-
-  //
-  // Read desired section content in NameGuid file
-  //
-  *Buffer     = NULL;
-  *Size       = 0;
-  Status      = Fv->ReadSection (
-                      Fv,
-                      NameGuid,
-                      SectionType,
-                      0,
-                      Buffer,
-                      Size,
-                      &AuthenticationStatus
-                      );
-
-  if (EFI_ERROR (Status) && (SectionType == EFI_SECTION_TE)) {
-    //
-    // Try reading PE32 section, since the TE section does not exist
-    //
-    *Buffer = NULL;
-    *Size   = 0;
-    Status  = Fv->ReadSection (
-                    Fv,
-                    NameGuid,
-                    EFI_SECTION_PE32,
-                    0,
-                    Buffer,
-                    Size,
-                    &AuthenticationStatus
-                    );
-  }
-
-  if (EFI_ERROR (Status) &&
-      ((SectionType == EFI_SECTION_TE) || (SectionType == EFI_SECTION_PE32))) {
-    //
-    // Try reading raw file, since the desired section does not exist
-    //
-    *Buffer = NULL;
-    *Size   = 0;
-    Status  = Fv->ReadFile (
-                    Fv,
-                    NameGuid,
-                    Buffer,
-                    Size,
-                    &FileType,
-                    &Attributes,
-                    &AuthenticationStatus
-                    );
-  }
-
-  return Status;
-}
-
-
-EFI_STATUS
-GetImageEx (
-  IN  EFI_HANDLE         ImageHandle,
-  IN  EFI_GUID           *NameGuid,
-  IN  EFI_SECTION_TYPE   SectionType,
-  OUT VOID               **Buffer,
-  OUT UINTN              *Size,
-  BOOLEAN                WithinImageFv
-  )
-{
-  EFI_STATUS                    Status;
-  EFI_HANDLE                    *HandleBuffer;
-  UINTN                         HandleCount;
-  UINTN                         Index;
-  EFI_LOADED_IMAGE_PROTOCOL     *LoadedImage;
-
-  EFI_FIRMWARE_VOLUME2_PROTOCOL *ImageFv;
-  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
-
-
-  if (ImageHandle == NULL && WithinImageFv) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Status  = EFI_NOT_FOUND;
-  ImageFv = NULL;
-  if (ImageHandle != NULL) {
-    Status = gBS->HandleProtocol (
-                    ImageHandle,
-                    &gEfiLoadedImageProtocolGuid,
-                    (VOID **) &LoadedImage
-                    );
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-    Status = gBS->HandleProtocol (
-                    LoadedImage->DeviceHandle,
-                    &gEfiFirmwareVolume2ProtocolGuid,
-                    (VOID **) &ImageFv
-                    );
-    if (!EFI_ERROR (Status)) {
-      Status = GetImageFromFv (ImageFv, NameGuid, SectionType, Buffer, Size);
-    }
-  }
-
-  if (Status == EFI_SUCCESS || WithinImageFv) {
-    return Status;
-  }
-
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiFirmwareVolume2ProtocolGuid,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuffer
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Find desired image in all Fvs
-  //
-  for (Index = 0; Index < HandleCount; ++Index) {
-    Status = gBS->HandleProtocol (
-                    HandleBuffer[Index],
-                    &gEfiFirmwareVolume2ProtocolGuid,
-                    (VOID**)&Fv
-                    );
-
-    if (EFI_ERROR (Status)) {
-      gBS->FreePool(HandleBuffer);
-      return Status;
-    }
-
-    if (ImageFv != NULL && Fv == ImageFv) {
-      continue;
-    }
-
-    Status = GetImageFromFv (Fv, NameGuid, SectionType, Buffer, Size);
-
-    if (!EFI_ERROR (Status)) {
-      break;
-    }
-  }
-  gBS->FreePool(HandleBuffer);
-
-  //
-  // Not found image
-  //
-  if (Index == HandleCount) {
-    return EFI_NOT_FOUND;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  This function returns BIOS ID by searching HOB or FV.
-
-  @param BiosIdImage             The BIOS ID got from HOB or FV.
-
-  @retval EFI_SUCCESS            All parameters were valid and BIOS ID has been got.
-  @retval EFI_NOT_FOUND          BiosId image is not found, and no parameter will be modified.
-  @retval EFI_INVALID_PARAMETER  The parameter is NULL.
-
-**/
-EFI_STATUS
-GetBiosId (
-  OUT BIOS_ID_IMAGE     *BiosIdImage
-  )
-
-{
-  EFI_STATUS    Status;
-  VOID          *Address = NULL;
-  UINTN         Size = 0;
-
-    DEBUG ((EFI_D_INFO, "Get BIOS ID from FV\n"));
-
-    Status = GetImageEx (
-               NULL,
-               &gEfiBiosIdGuid,
-               EFI_SECTION_RAW,
-               &Address,
-               &Size,
-               FALSE
-               );
-
-    if (Status == EFI_SUCCESS) {
-      //
-      // BiosId image is present in FV
-      //
-      if (Address != NULL) {
-        Size = sizeof (BIOS_ID_IMAGE);
-        gBS->CopyMem (
-              (void *) BiosIdImage,
-              Address,
-              Size
-              );
-        //
-        // GetImage () allocated buffer for Address, now clear it.
-        //
-        gBS->FreePool (Address);
-
-        DEBUG ((EFI_D_INFO, "Get BIOS ID from FV successfully\n"));
-        DEBUG ((EFI_D_INFO, "BIOS ID: %s\n", (CHAR16 *) (&(BiosIdImage->BiosIdString))));
-
-        return EFI_SUCCESS;
-      }
-    }
-  return EFI_NOT_FOUND;
-}
 
 /**
   This function returns the Version & Release Date and Time by getting and converting
@@ -273,47 +42,39 @@ GetBiosVersionDateTime (
   OUT CHAR16    *BiosReleaseTime OPTIONAL
   )
 {
-  EFI_STATUS        Status;
-  BIOS_ID_IMAGE     BiosIdImage;
-
   if ((BiosVersion == NULL) && (BiosReleaseDate == NULL) && (BiosReleaseTime == NULL)) {
     return EFI_INVALID_PARAMETER;
   }
 
-  Status = GetBiosId (&BiosIdImage);
-  if (EFI_ERROR (Status)) {
-    return EFI_NOT_FOUND;
-  }
-
   if (BiosVersion != NULL) {
     //
     // Fill the BiosVersion data from the BIOS ID.
     //
-    StrCpy (BiosVersion, (CHAR16 *) (&(BiosIdImage.BiosIdString)));
+    StrCpy (BiosVersion, L"MNW2MAX1.X64.0084.D01");
   }
 
   if (BiosReleaseDate != NULL) {
     //
     // Fill the build timestamp date from the BIOS ID in the "MM/DD/YY" format.
     //
-    BiosReleaseDate[0] = BiosIdImage.BiosIdString.TimeStamp[2];
-    BiosReleaseDate[1] = BiosIdImage.BiosIdString.TimeStamp[3];
-    BiosReleaseDate[2] = (CHAR16) ((UINT8) ('/'));
+    BiosReleaseDate[0] = L'0';
+    BiosReleaseDate[1] = L'1';
+    BiosReleaseDate[2] = L'/';
 
-    BiosReleaseDate[3] = BiosIdImage.BiosIdString.TimeStamp[4];
-    BiosReleaseDate[4] = BiosIdImage.BiosIdString.TimeStamp[5];
-    BiosReleaseDate[5] = (CHAR16) ((UINT8) ('/'));
+    BiosReleaseDate[3] = L'0';
+    BiosReleaseDate[4] = L'1';
+    BiosReleaseDate[5] = L'/';
 
     //
     // Add 20 for SMBIOS table
     // Current Linux kernel will misjudge 09 as year 0, so using 2009 for SMBIOS table
     //
-    BiosReleaseDate[6] = '2';
-    BiosReleaseDate[7] = '0';
-    BiosReleaseDate[8] = BiosIdImage.BiosIdString.TimeStamp[0];
-    BiosReleaseDate[9] = BiosIdImage.BiosIdString.TimeStamp[1];
+    BiosReleaseDate[6] = L'2';
+    BiosReleaseDate[7] = L'0';
+    BiosReleaseDate[8] = L'1';
+    BiosReleaseDate[9] = L'9';
 
-    BiosReleaseDate[10] = (CHAR16) ((UINT8) ('\0'));
+    BiosReleaseDate[10] = L'\0';
   }
 
   if (BiosReleaseTime != NULL) {
@@ -322,14 +83,14 @@ GetBiosVersionDateTime (
     // Fill the build timestamp time from the BIOS ID in the "HH:MM" format.
     //
 
-    BiosReleaseTime[0] = BiosIdImage.BiosIdString.TimeStamp[6];
-    BiosReleaseTime[1] = BiosIdImage.BiosIdString.TimeStamp[7];
-    BiosReleaseTime[2] = (CHAR16) ((UINT8) (':'));
+    BiosReleaseTime[0] = L'0';
+    BiosReleaseTime[1] = L'0';
+    BiosReleaseTime[2] = L':';
 
-    BiosReleaseTime[3] = BiosIdImage.BiosIdString.TimeStamp[8];
-    BiosReleaseTime[4] = BiosIdImage.BiosIdString.TimeStamp[9];
+    BiosReleaseTime[3] = L'0';
+    BiosReleaseTime[4] = L'0';
 
-    BiosReleaseTime[5] = (CHAR16) ((UINT8) ('\0'));
+    BiosReleaseTime[5] = L'\0';
   }
 
   return  EFI_SUCCESS;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
index 3e53680d08..0d38d73ada 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/BiosIdLib/BiosIdLib.inf
@@ -1,11 +1,8 @@
 #/*++
 #
-# Copyright (c)  2010  - 2014, Intel Corporation. All rights reserved
-#                                                                                  

+# Copyright (c)  2010  - 2019, Intel Corporation. All rights reserved
+#
 # SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-
 #
 #  Module Name:
 #
@@ -34,17 +31,3 @@ [Packages]
   MdeModulePkg/MdeModulePkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-
-[LibraryClasses]
-  HobLib
-
-[Guids]
-  gEfiBiosIdGuid
-
-[Protocols]
-  gEfiLoadedImageProtocolGuid
-  gEfiFirmwareVolume2ProtocolGuid
-
-[Depex]
-  gEfiLoadedImageProtocolGuid AND
-  gEfiFirmwareVolume2ProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index a81f102bac..0c432642e4 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -73,9 +73,9 @@ [LibraryClasses]
   EfiRegTableLib
   BiosIdLib
   BaseCryptLib
+  HobLib
 
 [Guids]
-  gEfiBiosIdGuid
   gEfiPlatformBootModeGuid
   gEfiBoardFeaturesGuid
   gItkDataVarGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index 786b4f6e91..bfde7be398 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -37,7 +37,6 @@ [Guids]
   gProcessorProducerGuid                  = { 0x1bf06aea, 0x5bec, 0x4a8d, { 0x95, 0x76, 0x74, 0x9b, 0x09, 0x56, 0x2d, 0x30 } }
   gEfiPowerOnHobGuid                      = { 0x0468a601, 0xc535, 0x46fd, { 0xa9, 0x5d, 0xbb, 0xab, 0x99, 0x1b, 0x17, 0x8c } }
   gEfiPlatformCpuInfoGuid                 = { 0xbb9c7ab7, 0xb8d9, 0x4bf3, { 0x9c, 0x29, 0x9b, 0xf3, 0x41, 0xe2, 0x17, 0xbc } }
-  gEfiBiosIdGuid                          = { 0xC3E36D09, 0x8294, 0x4b97, { 0xA8, 0x57, 0xD5, 0x28, 0x8F, 0xE3, 0x3E, 0x28 } }
   gEfiPlatformBootModeGuid                = { 0xce845704, 0x1683, 0x4d38, { 0xa4, 0xf9, 0x7d, 0x0b, 0x50, 0x77, 0x57, 0x93 } }
   gEfiBoardFeaturesGuid                   = { 0x94b9e8ae, 0x8877, 0x479a, { 0x98, 0x42, 0xf5, 0x97, 0x4b, 0x82, 0xce, 0xd3 } }
   gItkDataVarGuid                         = { 0x3812723d, 0x7e48, 0x4e29, { 0xbc, 0x27, 0xf5, 0xa3, 0x9a, 0xc9, 0x4e, 0xf1 } }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index 3165be1fca..4c60d0a0f2 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -381,10 +381,6 @@ [FV.FVMAIN]
   INF  MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
   }
 
-FILE FREEFORM = C3E36D09-8294-4b97-A857-D5288FE33E28 {
-    SECTION RAW = $(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/$(DXE_ARCHITECTURE)/BiosId.bin
-  }
-
   #
   # EDK II Related Platform codes
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index 03941dd23e..61e1adcd14 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -327,10 +327,6 @@ [FV.FVMAIN]
   INF  MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
   }
 
-FILE FREEFORM = C3E36D09-8294-4b97-A857-D5288FE33E28 {
-    SECTION RAW = $(OUTPUT_DIRECTORY)/$(TARGET)_$(TOOL_CHAIN_TAG)/$(DXE_ARCHITECTURE)/BiosId.bin
-  }
-
   #
   # EDK II Related Platform codes
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
index 1afd8a254e..b745574421 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
@@ -80,6 +80,7 @@ [LibraryClasses]
   BiosIdLib
   CpuIA32Lib
   IoLib
+  HobLib
 
 [Guids]
   ##  This GUID C Name is not required for build since it is from UefiLib and not directly used by this module source.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBiosVendorFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBiosVendorFunction.c
index 1817f456cb..fb4fa820a5 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBiosVendorFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBiosVendorFunction.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscBiosVendorFunction.c
@@ -166,7 +163,6 @@ MISC_SMBIOS_TABLE_FUNCTION(MiscBiosVendor)
   SMBIOS_TABLE_TYPE0    *SmbiosRecord;
   EFI_SMBIOS_HANDLE     SmbiosHandle;
   EFI_MISC_BIOS_VENDOR *ForType0InputData;
-  BIOS_ID_IMAGE         BiosIdImage;
   UINT16                UVerStr[32];
   UINTN                 LoopIndex;
   UINTN                 CopyIndex;
@@ -183,7 +179,6 @@ MISC_SMBIOS_TABLE_FUNCTION(MiscBiosVendor)
   if (RecordData == NULL) {
     return EFI_INVALID_PARAMETER;
   }
-  GetBiosId (&BiosIdImage);
 
   //
   //  Add VLV2 BIOS Version and Release data
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
index 8cf8938a4e..5cae78bb6d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
+++ b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat
@@ -137,19 +137,15 @@ if /i "%~1"=="/IA32" (
 :: Required argument(s)
 if "%~1"=="" goto Usage
 
-::Remove the values for Platform_Type and Build_Target from BiosIdX.env and stage in Conf\
 if "%Arch%"=="IA32" (
-    findstr /b /v "BOARD_ID  BUILD_TYPE" %PLATFORM_PACKAGE%\BiosIdR.env > %WORKSPACE%\Conf\BiosId.env
     echo DEFINE X64_CONFIG = FALSE  >> %auto_config_inc%
 ) else if "%Arch%"=="X64" (
-    findstr /b /v "BOARD_ID  BUILD_TYPE" %PLATFORM_PACKAGE%\BiosIdx64R.env > %WORKSPACE%\Conf\BiosId.env
     echo DEFINE X64_CONFIG = TRUE  >> %auto_config_inc%
 )
 
 :: -- Build flags settings for each Platform --
-echo Setting  %1  platform configuration and BIOS ID...
+echo Setting  %1  platform configuration...
 if /i "%~1" == "MNW2" (
-    echo BOARD_ID = MNW2MAX >> %WORKSPACE%\Conf\BiosId.env
     echo DEFINE ENBDT_PF_BUILD = TRUE   >> %auto_config_inc%
     
 ) else (
@@ -160,10 +156,8 @@ set Platform_Type=%~1
 
 if /i "%~2" == "RELEASE" (
     set target=RELEASE
-    echo BUILD_TYPE = R >> %WORKSPACE%\Conf\BiosId.env
 ) else (
     set target=DEBUG
-    echo BUILD_TYPE = D >> %WORKSPACE%\Conf\BiosId.env
 )
 
 ::**********************************************************************
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh
index ec3a325db7..1eefa5de73 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh
+++ b/Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh
@@ -97,11 +97,6 @@ for (( i=1; i<=$#; ))
         rm -r Build
       fi
       shift
-    elif [ "$(echo $1 | tr 'a-z' 'A-Z')" == "/ECP" ]; then
-      ECP_SOURCE=$WORKSPACE/EdkCompatibilityPkgEcp
-      EDK_SOURCE=$WORKSPACE/EdkCompatibilityPkgEcp
-      echo DEFINE ECP_BUILD_ENABLE = TRUE >> $auto_config_inc
-      shift
     elif [ "$(echo $1 | tr 'a-z' 'A-Z')" == "/X64" ]; then
       Arch=X64
       shift
@@ -113,10 +108,6 @@ for (( i=1; i<=$#; ))
     fi
   done
 
-
-
-
-
 ## Required argument(s)
 if [ "$2" == "" ]; then
   Usage
@@ -203,54 +194,19 @@ fi
 ##**********************************************************************
 ## Build BIOS
 ##**********************************************************************
-echo Skip "Running UniTool..."
-echo "Make GenBiosId Tool..."
-BUILD_PATH=Build/$PLATFORM_PACKAGE/"$TARGET"_"$TOOL_CHAIN_TAG"
-if [ ! -d "$BUILD_PATH/$Arch" ]; then
-  mkdir -p $BUILD_PATH/$Arch
-fi
-if [ -e "$BUILD_PATH/$Arch/BiosId.bin" ]; then
-  rm -f $BUILD_PATH/$Arch/BiosId.bin
-fi
-
-
-./$PLATFORM_PACKAGE/GenBiosId -i Conf/BiosId.env -o $BUILD_PATH/$Arch/BiosId.bin
-
-
 echo "Invoking EDK2 build..."
 build
 
-if [ $SpiLock == "1" ]; then
-  IFWI_HEADER_FILE=./$PLATFORM_PACKAGE/Stitch/IFWIHeader/IFWI_HEADER_SPILOCK.bin
-else
-  IFWI_HEADER_FILE=./$PLATFORM_PACKAGE/Stitch/IFWIHeader/IFWI_HEADER.bin
-fi
-
-echo $IFWI_HEADER_FILE
-
 ##**********************************************************************
 ## Post Build processing and cleanup
 ##**********************************************************************
-
 echo Skip "Running fce..."
 
-echo Skip "Running KeyEnroll..."
+##**********************************************************************
+## Build Capsules
+##**********************************************************************
+build -p %PLATFORM_PACKAGE%\PlatformCapsule.dsc
 
-## Set the Board_Id, Build_Type, Version_Major, and Version_Minor environment variables
-VERSION_MAJOR=$(grep '^VERSION_MAJOR' Conf/BiosId.env | cut -d ' ' -f 3 | cut -c 1-4)
-VERSION_MINOR=$(grep '^VERSION_MINOR' Conf/BiosId.env | cut -d ' ' -f 3 | cut -c 1-2)
-BOARD_ID=$(grep '^BOARD_ID' Conf/BiosId.env | cut -d ' ' -f 3 | cut -c 1-7)
-BIOS_Name="$BOARD_ID"_"$Arch"_"$BUILD_TYPE"_"$VERSION_MAJOR"_"$VERSION_MINOR".ROM
-BIOS_ID="$BOARD_ID"_"$Arch"_"$BUILD_TYPE"_"$VERSION_MAJOR"_"$VERSION_MINOR"_GCC.bin
-SEC_VERSION=1.0.2.1060v5
-cat $IFWI_HEADER_FILE ../Vlv2Binaries/Vlv2SocBinPkg/SEC/$SEC_VERSION/VLV_SEC_REGION.bin ../Vlv2Binaries/Vlv2SocBinPkg/SEC/$SEC_VERSION/Vacant.bin $BUILD_PATH/FV/VLV.fd > ./$PLATFORM_PACKAGE/Stitch/$BIOS_ID
-
-
-echo Skip "Running BIOS_Signing ..."
-
-echo
-echo Build location:     $BUILD_PATH
-echo BIOS ROM Created:   $BIOS_Name
 echo
 echo -------------------- The EDKII BIOS build has successfully completed. --------------------
 echo
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 08/14] Vlv2TbltDevicePkg: Remove use of Data Hub Protocol
  2019-07-01  2:55 ` [edk2-platforms Patch 08/14] Vlv2TbltDevicePkg: Remove use of Data Hub Protocol Michael D Kinney
@ 2019-07-01  4:08   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:08 UTC (permalink / raw)
  To: devel@edk2.groups.io, Kinney, Michael D; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Michael D Kinney
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-devel] [edk2-platforms Patch 08/14] Vlv2TbltDevicePkg: Remove use of Data Hub Protocol

Update all platform code to stop using the Data Hub Protocol
from the IntelFrameworkPkg.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Vlv2TbltDevicePkg/Include/Guid/IdccData.h |  104 -
 .../Vlv2TbltDevicePkg/Include/Guid/ItkData.h  |   18 +-
 .../Vlv2TbltDevicePkg/PlatformDxe/BoardId.c   |   45 +-
 .../PlatformDxe/ClockControl.c                |   80 +-
 .../Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c  |   72 -
 .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  |    1 -
 .../PlatformDxe/PlatformDxe.h                 |    2 -
 .../PlatformDxe/PlatformDxe.inf               |    2 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |    1 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |    6 -
 .../Vlv2TbltDevicePkg/PlatformPkgConfig.dsc   |    1 -
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |    6 -
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |    7 -
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |    7 -
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |    7 -
 .../PlatformSetupDxe/PlatformSetupDxe.h       |    2 -
 .../PlatformSetupDxe/SetupFunctions.c         |   38 +-
 .../PlatformSetupDxe/SetupInfoRecords.c       |  477 +--
 .../SmBiosMiscDxe/CommonHeader.h              |   10 +-
 .../SmBiosMiscDxe/DataHubRecords.h            | 2934 +++++++++++++++++
 .../SmBiosMiscDxe/MiscMemoryDeviceFunction.c  |  318 +-
 .../SmBiosMiscDxe/MiscOemType0x94Function.c   |    1 -
 .../SmBiosMiscDxe/MiscProcessorCacheData.c    |   11 +-
 .../MiscProcessorCacheFunction.c              |  273 +-
 .../MiscProcessorInformationFunction.c        |  203 +-
 .../MiscSubclassDriverDataTable.c             |   14 +-
 .../MiscSubclassDriverEntryPoint.c            |   13 +-
 .../SmBiosMiscDxe/SmBiosMiscDxe.inf           |    3 +-
 .../VlvPlatformInitDxe/IgdOpRegion.c          |    3 -
 .../VlvPlatformInitDxe/VlvPlatformInitDxe.inf |    6 +-
 30 files changed, 3458 insertions(+), 1207 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRecords.h

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h
deleted file mode 100644
index 7e3b965666..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  IdccData.h
-
-Abstract:
-
---*/
-
-#ifndef _IDCCDATAHUB_GUID_H_
-#define _IDCCDATAHUB_GUID_H_
-
-//
-// This GUID is for the IDCC related data found in the Data Hub.
-//
-#define IDCC_DATA_HUB_GUID \
-  { 0x788e1d9f, 0x1eab, 0x47d2, 0xa2, 0xf3, 0x78, 0xca, 0xe8, 0x7d, 0x60, 0x12 }
-
-extern EFI_GUID gIdccDataHubGuid;
-
-#pragma pack(1)
-
-typedef struct {
-  UINT32    Type;
-  UINT32    RecordLength;
-} EFI_IDCC_DATA_HEADER;
-
-typedef struct {
-  EFI_IDCC_DATA_HEADER  IdccHeader;
-  UINT32                Tcontrol;
-} EFI_IDCC_TCONTROL;
-
-typedef struct {
-  UINT32    EntryCount;
-} EFI_IDCC_CLOCK_COMMON;
-
-typedef struct {
-  UINT8     Polarity;
-  UINT8     Percent;
-  UINT32    FpValue;
-} EFI_IDCC_TYPE_2_DATA;
-
-typedef struct {
-  UINT8     SetupVal;
-  UINT32    FpValue;
-} EFI_IDCC_TYPE_3_4_DATA;
-
-typedef struct {
-  EFI_IDCC_DATA_HEADER  IdccHeader;
-  UINT32                ProcessorRatio;
-} EFI_IDCC_PROCESSOR_RATIO;
-
-typedef struct {
-  EFI_IDCC_DATA_HEADER  IdccHeader;
-  UINT32                BoardFormFactor;
-} EFI_IDCC_BOARD_FORM_FACTOR;
-
-typedef struct {
-  EFI_IDCC_DATA_HEADER  IdccHeader;
-  UINT32                ProcessorInfo;
-} EFI_IDCC_PROCESSOR_INFO;
-
-#define EFI_IDCC_PROCESSOR_UNCON    (1 << 0)  // Bit 0: UnCon CPU
-#define EFI_IDCC_PROCESSOR_UNLOCK   (1 << 1)  // Bit 1: UnLock CPU
-#define EFI_IDCC_PROCESSOR_CNR      (1 << 2)  // Bit 2: CNR CPU
-#define EFI_IDCC_PROCESSOR_KNF      (1 << 3)  // Bit 3: KNF CPU
-
-typedef struct {
-  EFI_IDCC_DATA_HEADER  IdccHeader;
-  UINT32    MinFSB;
-  UINT32    MaxFSB;
-  UINT8     StepFSB;
-} EFI_IDCC_FSB_DATA;
-
-#pragma pack()
-
-#define EFI_IDCC_POSITIVE   0
-#define EFI_IDCC_NEGATIVE   1
-
-//
-// Board Form Factor equates.
-//
-#define ATX_FORM_FACTOR		0x00
-#define BTX_FORM_FACTOR		0x01
-
-
-#define EFI_IDCC_TCONTROL_TYPE          1
-#define EFI_IDCC_FSB_TYPE               2
-#define EFI_IDCC_PCI_TYPE               3
-#define EFI_IDCC_PCIE_TYPE              4
-#define EFI_IDCC_PROC_RATIO_TYPE        5
-#define EFI_IDCC_BOARD_FORM_FACTOR_TYPE 6
-#define EFI_IDCC_PROC_INFO_TYPE         7
-#define EFI_IDCC_FSB_DATA_TYPE          8
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/ItkData.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/ItkData.h
index e7bd29e6e4..2dcaac15f3 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/ItkData.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/ItkData.h
@@ -1,11 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
   ItkData.h
@@ -14,16 +12,8 @@ Abstract:
 
 --*/
 
-#ifndef _ITKDATAHUB_GUID_H_
-#define _ITKDATAHUB_GUID_H_
-
-//
-// This GUID is for the ITK related data found in the Data Hub {E7060843-A336-4d5b-9598-13402F5D7375}
-//
-#define ITK_DATA_HUB_GUID \
-  { 0xe7060843, 0xa336, 0x4d5b, 0x95, 0x98, 0x13, 0x40, 0x2f, 0x5d, 0x73, 0x75 }
-
-extern EFI_GUID gItkDataHubGuid;
+#ifndef _ITKDATA_GUID_H_
+#define _ITKDATA_GUID_H_
 
 //
 // This GUID is for the ITK related data found in a Variable  {3812723D-7E48-4e29-BC27-F5A39AC94EF1}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/BoardId.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/BoardId.c
index 7d774568e3..66c76453a8 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/BoardId.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/BoardId.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -23,13 +21,9 @@ Abstract:
 
 #include "PchRegs.h"
 #include "PlatformDxe.h"
-#include <Guid/IdccData.h>
 #include <Guid/EfiVpdData.h>
-#include <Protocol/DataHub.h>
 
 
-extern EFI_GUID mPlatformDriverGuid;
-
 //
 // Global module data
 //
@@ -52,8 +46,6 @@ InitializeBoardId (
 {
 
   UINT32                        BoardIdBufferSize;
-  EFI_IDCC_BOARD_FORM_FACTOR    IdccBoardFormFactor;
-  EFI_DATA_HUB_PROTOCOL         *DataHub;
   EFI_STATUS                    Status;
   DMI_DATA                      DmiDataVariable;
   UINTN                         Size;
@@ -186,38 +178,5 @@ InitializeBoardId (
          BoardIdBufferSize,
          &mBoardFeatures
          );
-
-  //
-  // Get the Data Hub protocol
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiDataHubProtocolGuid,
-                  NULL,
-                  (VOID **) &DataHub
-                  );
-  if (!(EFI_ERROR(Status))) {
-    //
-    // Fill out data
-    //
-    IdccBoardFormFactor.IdccHeader.Type = EFI_IDCC_BOARD_FORM_FACTOR_TYPE;
-    IdccBoardFormFactor.IdccHeader.RecordLength = sizeof(EFI_IDCC_BOARD_FORM_FACTOR);
-    if ((mBoardFeatures & B_BOARD_FEATURES_FORM_FACTOR_ATX) || (mBoardFeatures & B_BOARD_FEATURES_FORM_FACTOR_MICRO_ATX)) {
-        IdccBoardFormFactor.BoardFormFactor = ATX_FORM_FACTOR; // ATX
-    } else {
-        IdccBoardFormFactor.BoardFormFactor = BTX_FORM_FACTOR; // BTX
-    }
-
-    //
-    // Publish the Board Form Factor value for IDCC
-    //
-    Status = DataHub->LogData (
-                        DataHub,
-                        &gIdccDataHubGuid,
-                        &mPlatformDriverGuid,
-                        EFI_DATA_RECORD_CLASS_DATA,
-                        &IdccBoardFormFactor,
-                        sizeof(EFI_IDCC_BOARD_FORM_FACTOR)
-                        );
-  }
 }
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/ClockControl.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/ClockControl.c
index 1669f0357f..596f55bcbe 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/ClockControl.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/ClockControl.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -75,71 +73,6 @@ EFI_CLOCK_PLATFORM_INFO mAtxClockSettings = {
   sizeof(mAtxSxClocks) / sizeof(mAtxSxClocks[0])
 };
 
-#if defined( RVP_SUPPORT ) && RVP_SUPPORT
-//
-// RVP Clock Settings
-//
-// Static clock table.
-//  This should be used to define any clock settings that are static
-//  (Always On or Always Off).  Dynamic clocks should be set to enabled
-//  in this table.
-//
-//UPSD_TBD Check with Jan if any porting required.
-//
-EFI_STATIC_SIGNALS mRvpStaticClocks[] = {
-  {SrcClk11,  Enabled,  All},     // Not used/not present but leave coding enabled
-  {SrcClk10,  Enabled,  All},     // Not used/not present but leave coding enabled
-  {SrcClk9,   Enabled,  All},     // Not used/not present but leave coding enabled
-  {SrcClk8,   Enabled,  All},     // ICHSATAII
-  {SrcClk7,   Enabled,  All},     // DPL_REFSSCLKIN
-  {SrcClk6,   Enabled,  All},     // 100M_MCH
-  {SrcClk5,   Enabled,  All},     // Mini-PCIe  //TODO PNV: Need to check ICH GPIO38:
-                                                // 0: turn on; 1: turn off
-  {SrcClk4,   Enabled,  All},     // ICHSATA
-  {SrcClk3,   Enabled,  All},     // 100M_ICH
-  {SrcClk2,   Enabled,  All},     // 100M_LAN
-  {SrcClk1,   Enabled,  All},     // 25M_LAN
-  {SrcClk0,   Enabled,  All},     // 96M_DREF
-  {Ref0,      Enabled,  All},
-  {Dot96,     Enabled,  All},
-  {Usb48,     Enabled,  All},
-  {PciClkF5,  Enabled,  All},     // 33M_ICH
-  {PciClk0,   Enabled,  All},     // 33M_RISER
-  {PciClk1,   Enabled,  All},     // 33M_RISER
-  {PciClk2,   Enabled,  All},     // VDD_Clock
-  {PciClk3,   Enabled,  All},     // 33M_S1
-  {PciClk4,   Enabled,  All},     // 33M_PA
-};
-
-//
-// Dynamic clock table
-// This is used to determine if a clock should be left on or turned off based
-// on the presence of a device.  The bridge information is used so the bus
-// number for the device to be detected can be found.
-//
-
-//
-// ClockSxInfo Table
-// This is a list of clocks that need to be set to a known state when the
-// system enters S4 or S5.
-//
-EFI_STATIC_SIGNALS mRvpSxClocks[] = {
-  {SaveClockConfiguration, Disabled, All}
-};
-
-//
-// RVP settings structure
-//
-EFI_CLOCK_PLATFORM_INFO mRvpClockSettings = {
-  mRvpStaticClocks,
-  sizeof(mRvpStaticClocks) / sizeof(mRvpStaticClocks[0]),
-  0,  // No clocks will be turned off mRvpDynamicClocks,
-  0, // No clocks will be turned off sizeof(mRvpDynamicClocks) / sizeof(mRvpDynamicClocks[0]),
-  mRvpSxClocks,
-  sizeof(mRvpSxClocks) / sizeof(mRvpSxClocks[0])
-};
-#endif
-
 VOID
 InitializeClockRouting(
   )
@@ -165,12 +98,6 @@ InitializeClockRouting(
                   );
   if (!EFI_ERROR (Status)) {
 
-#if defined( RVP_SUPPORT ) && RVP_SUPPORT
-    if (BoardIdVar & B_BOARD_FEATURES_RVP) {
-      ClockPolicy = &mRvpClockSettings;
-    }
-#else
-
     //
     // Isolate board type information
     //
@@ -183,9 +110,6 @@ InitializeClockRouting(
         BoardIdVar == B_BOARD_FEATURES_FORM_FACTOR_MICRO_ATX) {
       ClockPolicy = &mAtxClockSettings;
     }
-
-#endif
-
   }
 
   Handle = NULL;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c
deleted file mode 100644
index 3b3e4b4c82..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-
-  IdccInfo.c
-
-Abstract:
-
-  Platform information used by IDCC.
-
-Revision History
-
---*/
-
-#include "PlatformDxe.h"
-
-#include <Guid/IdccData.h>
-
-extern EFI_GUID mPlatformDriverGuid;
-
-
-EFI_STATUS
-WriteIdccInfo (
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DATA_HUB_PROTOCOL     *DataHub;
-  UINT8                     Ratio;
-  EFI_IDCC_PROCESSOR_RATIO  ProcRatio;
-
-  //
-  // Locate the data hub protocol
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiDataHubProtocolGuid,
-                  NULL,
-                  (VOID **) &DataHub
-                  );
-
-  //
-  // Find processor actual ratio
-  //
-  Ratio = 15; //Temporary - some dummy value.
-
-  //
-  // Fill in IDCC Type 5 structure
-  //
-  ProcRatio.IdccHeader.Type = EFI_IDCC_PROC_RATIO_TYPE;
-  ProcRatio.IdccHeader.RecordLength = sizeof(EFI_IDCC_PROCESSOR_RATIO);
-  ProcRatio.ProcessorRatio = Ratio;
-
-  //
-  // Write data to the data hub
-  //
-  Status = DataHub->LogData (
-                      DataHub,
-                      &gIdccDataHubGuid,
-                      &mPlatformDriverGuid,
-                      EFI_DATA_RECORD_CLASS_DATA,
-                      &ProcRatio,
-                      sizeof(EFI_IDCC_PROCESSOR_RATIO)
-                      );
-
-  return Status;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
index 7e083e3933..0bc3f44c49 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
@@ -55,7 +55,6 @@ GPIO_CONF_PAD_INIT mTB_BL_GpioInitData_SC_TRI_Exit_boot_Service[] =
 
 
 EFI_GUID mSystemHiiExportDatabase = EFI_HII_EXPORT_DATABASE_GUID;
-EFI_GUID mPlatformDriverGuid = EFI_PLATFORM_DRIVER_GUID;
 SYSTEM_CONFIGURATION  mSystemConfiguration;
 EFI_HANDLE            mImageHandle;
 BOOLEAN               mMfgMode = FALSE;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
index 5c60f823de..f2f0097efc 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.h
@@ -43,8 +43,6 @@ Abstract:
 #include <Protocol/CpuIo2.h>
 #include <Guid/GlobalVariable.h>
 #include <Guid/BoardFeatures.h>
-#include <Guid/DataHubRecords.h>
-#include <Protocol/DataHub.h>
 #include <Protocol/PciIo.h>
 #include <Protocol/Speaker.h>
 #include <IndustryStandard/Pci22.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index 0c432642e4..a9ef744ef7 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -35,7 +35,6 @@ [sources.common]
   ClockControl.c
   Platform.c
   IchRegTable.c
-  IdccInfo.c
   IchPlatformPolicy.c
   PciDevice.c
   SlotConfig.c
@@ -80,7 +79,6 @@ [Guids]
   gEfiBoardFeaturesGuid
   gItkDataVarGuid
   gDmiDataGuid
-  gIdccDataHubGuid
   gEfiPciLanInfoGuid
   gEfiNormalSetupGuid
   gEfiGlobalVariableGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index bfde7be398..5b255f4b05 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -41,7 +41,6 @@ [Guids]
   gEfiBoardFeaturesGuid                   = { 0x94b9e8ae, 0x8877, 0x479a, { 0x98, 0x42, 0xf5, 0x97, 0x4b, 0x82, 0xce, 0xd3 } }
   gItkDataVarGuid                         = { 0x3812723d, 0x7e48, 0x4e29, { 0xbc, 0x27, 0xf5, 0xa3, 0x9a, 0xc9, 0x4e, 0xf1 } }
   gDmiDataGuid                            = { 0x70e56c5e, 0x280c, 0x44b0, { 0xa4, 0x97, 0x09, 0x68, 0x1a, 0xbc, 0x37, 0x5e } }
-  gIdccDataHubGuid                        = { 0x788e1d9f, 0x1eab, 0x47d2, { 0xa2, 0xf3, 0x78, 0xca, 0xe8, 0x7d, 0x60, 0x12 } }
   gEfiSetupVariableGuid                   = { 0xec87d643, 0xeba4, 0x4bb5, { 0xa1, 0xe5, 0x3f, 0x3e, 0x36, 0xb2, 0x0d, 0xa9 } }
   gEfiPlatformInfoGuid                    = { 0x1e2acc41, 0xe26a, 0x483d, { 0xaf, 0xc7, 0xa0, 0x56, 0xc3, 0x4e, 0x08, 0x7b } }
   gMfgModeVariableGuid                    = { 0xEF14FD78, 0x0793, 0x4e2b, { 0xAC, 0x6D, 0x06, 0x28, 0x47, 0xE0, 0x17, 0x91 } }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index 4c60d0a0f2..15a4251cf8 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -430,9 +430,6 @@ [FV.FVMAIN]
 
 INF Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
-!if $(DATAHUB_ENABLE) == TRUE
-INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf
-!endif
 INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
 
 INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
@@ -584,9 +581,6 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
 INF Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
-
-
 #
 # FAT file system
 #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
index d5068b514c..7b48d7b44e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgConfig.dsc
@@ -48,7 +48,6 @@
 DEFINE MICOCODE_CAPSULE_ENABLE = TRUE
 
 DEFINE GOP_DRIVER_ENABLE = TRUE
-DEFINE DATAHUB_ENABLE = TRUE
 DEFINE USB_ENABLE = TRUE
 
 DEFINE ISA_SERIAL_STATUS_CODE_ENABLE = TRUE
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index 61e1adcd14..b8ac61d710 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -376,9 +376,6 @@ [FV.FVMAIN]
 
 INF Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
-!if $(DATAHUB_ENABLE) == TRUE
-INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf
-!endif
 INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
 
 INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/Dptf.inf
@@ -530,9 +527,6 @@ [FV.FVMAIN]
 INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
 INF Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-INF RuleOverride = BINARY Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
-
-
 #
 # FAT file system
 #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index 25d1beb400..b16883e98c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -984,12 +984,6 @@ [Components.X64]
 
   Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
-!if $(DATAHUB_ENABLE) == TRUE
-  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
-    <PcdsFixedAtBuild>
-      gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
-  }
-!endif
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
   Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
   PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
@@ -1212,7 +1206,6 @@ [Components.X64]
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
   Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index 8a5c42577d..c9335a98c8 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -968,12 +968,6 @@ [Components.IA32]
 
   Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
-!if $(DATAHUB_ENABLE) == TRUE
-  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
-    <PcdsFixedAtBuild>
-      gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
-  }
-!endif
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
   Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
   PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
@@ -1196,7 +1190,6 @@ [Components.IA32]
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
   Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index c0fe0892ac..fd9ddebfd9 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -983,12 +983,6 @@ [Components.X64]
 
   Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
 
-!if $(DATAHUB_ENABLE) == TRUE
-  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf {
-    <PcdsFixedAtBuild>
-      gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
-  }
-!endif
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
   Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/PchS3SupportDxe.inf
   PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
@@ -1211,7 +1205,6 @@ [Components.X64]
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
   Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
 
-  Vlv2SocBinPkg/$(DXE_ARCHITECTURE)$(TARGET)/$(DXE_ARCHITECTURE)/SmbiosMemory.inf
   #
   # CPU/FW Microde
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
index 1ba75175e1..b4a30511ac 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.h
@@ -25,10 +25,8 @@
 #include <Protocol/DevicePathToText.h>
 #include <Protocol/DevicePath.h>
 #include <Protocol/PlatformDriverOverride.h>
-#include <Protocol/DataHub.h>
 #include <Guid/MdeModuleHii.h>
 #include <Guid/VariableFormat.h>
-#include <Guid/DataHubRecords.h>
 
 #include <Library/BaseLib.h>
 #include <Library/DebugLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupFunctions.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupFunctions.c
index a84b425826..f3bc823056 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupFunctions.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupFunctions.c
@@ -1,12 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
     SetupFunctions.c
@@ -52,34 +49,3 @@ SwapEntries (
 
   return;
 }
-
-UINT32
-ConvertBase10ToRaw (
-  IN  EFI_EXP_BASE10_DATA             *Data)
-{
-  UINTN         Index;
-  UINT32        RawData;
-
-  RawData = Data->Value;
-  for (Index = 0; Index < (UINTN) Data->Exponent; Index++) {
-     RawData *= 10;
-  }
-
-  return  RawData;
-}
-
-UINT32
-ConvertBase2ToRaw (
-  IN  EFI_EXP_BASE2_DATA             *Data)
-{
-  UINTN         Index;
-  UINT32        RawData;
-
-  RawData = Data->Value;
-  for (Index = 0; Index < (UINTN) Data->Exponent; Index++) {
-     RawData <<= 1;
-  }
-
-  return  RawData;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
index c767021aed..efd4a723e1 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
@@ -79,9 +79,6 @@ SB_REV  SBRevisionTable[] = {
 
 BOOLEAN                         mSetupInfoDone = FALSE;
 UINT8                           mUseProductKey = 0;
-EFI_EXP_BASE10_DATA             mProcessorFrequency;
-EFI_EXP_BASE10_DATA             mProcessorFsbFrequency;
-
 EFI_GUID                        mProcessorProducerGuid;
 EFI_HII_HANDLE                  mHiiHandle;
 EFI_PLATFORM_CPU_INFO           mPlatformCpuInfo;
@@ -91,50 +88,7 @@ EFI_PLATFORM_INFO_HOB           *mPlatformInfo;
 
 #define memset SetMem
 
-UINT16                mMemorySpeed         = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelASlot0  = 0;
-UINT16                mMemorySpeedChannelASlot0 = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelASlot1  = 0;
-UINT16                mMemorySpeedChannelASlot1 = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelBSlot0  = 0;
-UINT16                mMemorySpeedChannelBSlot0 = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelBSlot1  = 0;
-UINT16                mMemorySpeedChannelBSlot1 = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelCSlot0  = 0;
-UINT16                mMemorySpeedChannelCSlot0 = 0xffff;
-EFI_PHYSICAL_ADDRESS  mMemorySizeChannelCSlot1  = 0;
-UINT16                mMemorySpeedChannelCSlot1 = 0xffff;
-UINTN                 mMemoryMode          = 0xff;
-
 #define CHARACTER_NUMBER_FOR_VALUE  30
-  typedef struct {
-  EFI_STRING_TOKEN            MemoryDeviceLocator;
-  EFI_STRING_TOKEN            MemoryBankLocator;
-  EFI_STRING_TOKEN            MemoryManufacturer;
-  EFI_STRING_TOKEN            MemorySerialNumber;
-  EFI_STRING_TOKEN            MemoryAssetTag;
-  EFI_STRING_TOKEN            MemoryPartNumber;
-  EFI_INTER_LINK_DATA         MemoryArrayLink;
-  EFI_INTER_LINK_DATA         MemorySubArrayLink;
-  UINT16                      MemoryTotalWidth;
-  UINT16                      MemoryDataWidth;
-  UINT64                      MemoryDeviceSize;
-  EFI_MEMORY_FORM_FACTOR      MemoryFormFactor;
-  UINT8                       MemoryDeviceSet;
-  EFI_MEMORY_ARRAY_TYPE       MemoryType;
-  EFI_MEMORY_TYPE_DETAIL      MemoryTypeDetail;
-  UINT16                      MemorySpeed;
-  EFI_MEMORY_STATE            MemoryState;
-} EFI_MEMORY_ARRAY_LINK;
-
-
-typedef struct {
-  EFI_PHYSICAL_ADDRESS        MemoryArrayStartAddress;
-  EFI_PHYSICAL_ADDRESS        MemoryArrayEndAddress;
-  EFI_INTER_LINK_DATA         PhysicalMemoryArrayLink;
-  UINT16                      MemoryArrayPartitionWidth;
-} EFI_MEMORY_ARRAY_START_ADDRESS;
-
 
 typedef enum {
   PCH_SATA_MODE_IDE = 0,
@@ -421,73 +375,6 @@ VOID UpdateLatestBootTime() {
   HiiSetString(mHiiHandle,STRING_TOKEN(STR_LOG_BOOT_TIME_VALUE), Buffer, NULL);
 }
 
-/**
-  Get Cache Type for the specified Cache. This function is invoked when there is data records
-  available in the Data Hub.
-
-  Get Cache Type function arguments:
-
-  @param  Instance        The instance number of the subclass with the same ProducerName..
-  @param  SubInstance     The instance number of the RecordType for the same Instance.
-  @param  CacheType       Cache type, see definition of EFI_CACHE_TYPE_DATA.
-
-  @retval EFI_STATUS
-
-**/
-EFI_STATUS
-GetCacheType(
-  IN  UINT16                            Instance,
-  IN  UINT16                            SubInstance,
-  IN  EFI_CACHE_TYPE_DATA*              CacheType)
-{
-  EFI_STATUS                  Status;
-  EFI_DATA_HUB_PROTOCOL       *DataHub;
-  EFI_DATA_RECORD_HEADER      *Record;
-  UINT64                      MonotonicCount;
-  EFI_CACHE_VARIABLE_RECORD*  CacheVariableRecord;
-  EFI_SUBCLASS_TYPE1_HEADER   *DataHeader;
-
-  Status = gBS->LocateProtocol (
-                  &gEfiDataHubProtocolGuid,
-                  NULL,
-                  (void **)&DataHub
-                  );
-  ASSERT_EFI_ERROR(Status);
-
-  //
-  // Get all available data records from data hub
-  //
-  MonotonicCount = 0;
-  Record = NULL;
-
-  do {
-    Status = DataHub->GetNextRecord (
-	                    DataHub,
-						&MonotonicCount,
-						NULL,
-						&Record
-						);
-    if (!EFI_ERROR(Status)) {
-      if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
-        DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);
-
-        if(CompareGuid(&Record->DataRecordGuid, &gEfiCacheSubClassGuid) &&
-          (DataHeader->RecordType == CacheTypeRecordType) &&
-          (DataHeader->Instance == Instance) &&
-          (DataHeader->SubInstance == SubInstance)) {
-          CacheVariableRecord     = (EFI_CACHE_VARIABLE_RECORD  *)(DataHeader + 1);
-          if(CacheType){
-            *CacheType = CacheVariableRecord->CacheType;
-            return EFI_SUCCESS;
-          }
-        }
-      }
-    }
-  } while(!EFI_ERROR(Status) && (MonotonicCount != 0));
-
-  return EFI_NOT_FOUND;
-}
-
 /**
   Setup data filter function. This function is invoked when there is data records
   available in the Data Hub.
@@ -504,230 +391,23 @@ VOID
 PrepareSetupInformation (
   )
 {
-
   EFI_STATUS                  Status;
-  EFI_DATA_HUB_PROTOCOL       *DataHub;
-  EFI_DATA_RECORD_HEADER      *Record;
-  UINT8                       *SrcData;
-  EFI_SUBCLASS_TYPE1_HEADER   *DataHeader;
   CHAR16                      *NewString;
-  CHAR16                      *NewString2;
-  CHAR16                      *NewStringToken;
   STRING_REF                  TokenToUpdate;
-  EFI_PROCESSOR_VERSION_DATA  *ProcessorVersion;
-  UINTN                       Index;
-  UINTN                       DataOutput;
-
-  EFI_PROCESSOR_MICROCODE_REVISION_DATA   *CpuUcodeRevisionData;
-  EFI_MEMORY_ARRAY_START_ADDRESS          *MemoryArray;
-  EFI_MEMORY_ARRAY_LINK                   *MemoryArrayLink;
-  UINT64                      MonotonicCount;
-
   CHAR16                      Version[100];         //Assuming that strings are < 100 UCHAR
   CHAR16                      ReleaseDate[100];     //Assuming that strings are < 100 UCHAR
   CHAR16                      ReleaseTime[100];     //Assuming that strings are < 100 UCHAR
 
   NewString = AllocateZeroPool (0x100);
-  NewString2 = AllocateZeroPool (0x100);
   SetMem(Version, sizeof(Version), 0);
   SetMem(ReleaseDate, sizeof(ReleaseDate), 0);
   SetMem(ReleaseTime, sizeof(ReleaseTime), 0);
 
-  //
-  // Get the Data Hub Protocol. Assume only one instance
-  //
-  Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, (void **)&DataHub);
-  ASSERT_EFI_ERROR(Status);
-
-  //
-  // Get all available data records from data hub
-  //
-  MonotonicCount = 0;
-  Record = NULL;
-
-  do {
-    Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record);
-    if (!EFI_ERROR(Status)) {
-      if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
-        DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);
-        SrcData     = (UINT8  *)(DataHeader + 1);
-
-        //
-        // Processor
-        //
-        if (CompareGuid(&Record->DataRecordGuid, &gEfiProcessorSubClassGuid)) {
-          CopyMem (&mProcessorProducerGuid, &Record->ProducerName, sizeof(EFI_GUID));
-          switch (DataHeader->RecordType) {
-            case ProcessorCoreFrequencyRecordType:
-              CopyMem(&mProcessorFrequency, SrcData, sizeof(EFI_EXP_BASE10_DATA));
-              Index = EfiValueToString (
-			            NewString,
-						ConvertBase10ToRaw ((EFI_EXP_BASE10_DATA *)SrcData)/1000000000,
-						PREFIX_ZERO,
-						0
-						);
-              StrCat (NewString, L".");
-              EfiValueToString (
-			    NewString + Index + 1,
-				((ConvertBase10ToRaw ((EFI_EXP_BASE10_DATA *)SrcData)%1000000000)/10000000),
-				PREFIX_ZERO,
-				0
-				);
-              StrCat (NewString, L" GHz");
-              TokenToUpdate = (STRING_REF)STR_PROCESSOR_SPEED_VALUE;
-              HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-              break;
-
-            case ProcessorVersionRecordType:
-              ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *)SrcData;
-              NewStringToken = HiiGetPackageString(&mProcessorProducerGuid, *ProcessorVersion, NULL);
-              TokenToUpdate = (STRING_REF)STR_PROCESSOR_VERSION_VALUE;
-              HiiSetString(mHiiHandle, TokenToUpdate, NewStringToken, NULL);
-              break;
-            case CpuUcodeRevisionDataRecordType:
-              CpuUcodeRevisionData = (EFI_PROCESSOR_MICROCODE_REVISION_DATA *) SrcData;
-              if (CpuUcodeRevisionData->ProcessorMicrocodeRevisionNumber != 0) {
-                EfiValueToHexStr (
-				  NewString,
-                  CpuUcodeRevisionData->ProcessorMicrocodeRevisionNumber,
-                  PREFIX_ZERO,
-                  8
-				  );
-                TokenToUpdate = (STRING_REF)STR_PROCESSOR_MICROCODE_VALUE;
-                HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-              }
-              break;
-            default:
-              break;
-          }
-
-        //
-        // Cache
-        //
-        } else if (CompareGuid(&Record->DataRecordGuid, &gEfiCacheSubClassGuid) &&
-                   (DataHeader->RecordType == CacheSizeRecordType)) {
-          if (DataHeader->SubInstance == EFI_CACHE_L1) {
-            EFI_CACHE_TYPE_DATA              CacheType;
-            if (EFI_SUCCESS == GetCacheType(DataHeader->Instance, DataHeader->SubInstance,&CacheType)){
-              if (CacheType == EfiCacheTypeData) {
-                TokenToUpdate = (STRING_REF)STR_PROCESSOR_L1_DATA_CACHE_VALUE;
-              } else if (CacheType == EfiCacheTypeInstruction) {
-                  TokenToUpdate = (STRING_REF)STR_PROCESSOR_L1_INSTR_CACHE_VALUE;
-              } else {
-                continue;
-              }
-            } else {
-              continue;
-            }
-          }
-          else if (DataHeader->SubInstance == EFI_CACHE_L2) {
-            TokenToUpdate = (STRING_REF)STR_PROCESSOR_L2_CACHE_VALUE;
-          } else {
-            continue;
-          }
-          if (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData)) {
-            DataOutput = ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10;
-            EfiValueToString (NewString, DataOutput, PREFIX_ZERO, 0);
-
-            StrCat (NewString, L" KB");
-            if (DataHeader->SubInstance == EFI_CACHE_L3) {
-              HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-            } else if(DataHeader->SubInstance == EFI_CACHE_L2 && mPlatformCpuInfo.CpuPackage.CoresPerPhysicalPackage > 1){
-			  //
-              // Show XxL2 string
-			  //
-              EfiValueToString (
-			    NewString2,
-                mPlatformCpuInfo.CpuPackage.CoresPerPhysicalPackage,
-                PREFIX_ZERO,
-                0
-				);
-              StrCat(NewString2, L"x ");
-              StrCat(NewString2, NewString);
-              HiiSetString(mHiiHandle, TokenToUpdate, NewString2, NULL);
-            } else {
-              HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-            }
-          }
-
-        //
-        // Memory
-        //
-        } else if (CompareGuid(&Record->DataRecordGuid, &gEfiMemorySubClassGuid)) {
-          switch (DataHeader->RecordType) {
-            case EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER:
-              MemoryArrayLink = (EFI_MEMORY_ARRAY_LINK *)SrcData;
-
-              if (MemoryArrayLink->MemorySpeed > 0) {
-                //
-                // Save the lowest speed memory module
-                //
-                if (MemoryArrayLink->MemorySpeed < mMemorySpeed) {
-                  mMemorySpeed = MemoryArrayLink->MemorySpeed;
-                }
-                switch (DataHeader->SubInstance) {
-                  case 1:
-                    mMemorySpeedChannelASlot0 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelASlot0 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  case 2:
-                    mMemorySpeedChannelASlot1 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelASlot1 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  case 3:
-                    mMemorySpeedChannelBSlot0 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelBSlot0 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  case 4:
-                    mMemorySpeedChannelBSlot1 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelBSlot1 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  case 5:
-                    mMemorySpeedChannelCSlot0 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelCSlot0 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  case 6:
-                    mMemorySpeedChannelCSlot1 = MemoryArrayLink->MemorySpeed;
-                    mMemorySizeChannelCSlot1 = MemoryArrayLink->MemoryDeviceSize;
-                    break;
-                  default:
-                    break;
-                  }
-              }
-              break;
-
-            case EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER:
-              MemoryArray = (EFI_MEMORY_ARRAY_START_ADDRESS *)SrcData;
-              if (MemoryArray->MemoryArrayEndAddress - MemoryArray->MemoryArrayStartAddress) {
-              	DataOutput = (UINTN)RShiftU64((MemoryArray->MemoryArrayEndAddress - MemoryArray->MemoryArrayStartAddress + 1), 20);
-              	EfiValueToString (NewString, DataOutput / 1024, PREFIX_ZERO, 0);
-              	if(DataOutput % 1024) {
-              	  StrCat (NewString, L".");
-              	  DataOutput = ((DataOutput % 1024) * 1000) / 1024;
-              	  while(!(DataOutput % 10))
-              	    DataOutput = DataOutput / 10;
-                  EfiValueToString (NewString2, DataOutput, PREFIX_ZERO, 0);
-                  StrCat (NewString, NewString2);
-                }
-                StrCat (NewString, L" GB");
-                TokenToUpdate = (STRING_REF)STR_TOTAL_MEMORY_SIZE_VALUE;
-                HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-              }
-              break;
-
-            default:
-              break;
-          }
-        }
-      }
-    }
-  } while (!EFI_ERROR(Status) && (MonotonicCount != 0));
-
   Status = GetBiosVersionDateTime (
              Version,
-			 ReleaseDate,
-			 ReleaseTime
-			 );
+             ReleaseDate,
+             ReleaseTime
+             );
 
   DEBUG ((EFI_D_ERROR, "GetBiosVersionDateTime :%s %s %s \n", Version, ReleaseDate, ReleaseTime));
   if (!EFI_ERROR (Status)) {
@@ -750,24 +430,7 @@ PrepareSetupInformation (
     HiiSetString(mHiiHandle, TokenToUpdate, BuildDateTime, NULL);
   }
 
-  //
-  // Calculate and update memory speed display in Main Page
-  //
-  //
-  // Update the overall memory speed
-  //
-  if (mMemorySpeed != 0xffff) {
-    EfiValueToString (NewString, mMemorySpeed, PREFIX_ZERO, 0);
-    StrCat (NewString, L" MHz");
-
-    TokenToUpdate = (STRING_REF)STR_SYSTEM_MEMORY_SPEED_VALUE;
-    HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL);
-  }
-
   gBS->FreePool(NewString);
-  gBS->FreePool(NewString2);
-
-  return;
 }
 
 /**
@@ -782,65 +445,23 @@ UpdateAdditionalInformation (
   )
 {
   EFI_STATUS                      Status;
-  UINT64                          MonotonicCount;
-  EFI_DATA_HUB_PROTOCOL           *DataHub;
-  EFI_DATA_RECORD_HEADER          *Record;
-  EFI_SUBCLASS_TYPE1_HEADER       *DataHeader;
   EFI_SMBIOS_PROTOCOL             *Smbios;
   EFI_SMBIOS_HANDLE               SmbiosHandle;
   EFI_SMBIOS_TABLE_HEADER         *SmbiosRecord;
   SMBIOS_TABLE_TYPE0              *Type0Record;
+  SMBIOS_TABLE_TYPE4              *Type4Record;
+  SMBIOS_TABLE_TYPE7              *Type7Record;
+  SMBIOS_TABLE_TYPE17             *Type17Record;
   UINT8                           StrIndex;
   CHAR16                          *BiosVersion = NULL;
+  CHAR16                          *ProcessorVersion = NULL;
   CHAR16                          *IfwiVersion = NULL;
   UINT16                          SearchIndex;
   EFI_STRING_ID                   TokenToUpdate;
-#if defined( RVP_SUPPORT ) && RVP_SUPPORT
-  EFI_MISC_SYSTEM_MANUFACTURER    *SystemManufacturer;
-#endif
-
-  Status = gBS->LocateProtocol (
-                  &gEfiDataHubProtocolGuid,
-                  NULL,
-                  (void **)&DataHub
-                  );
-
-  ASSERT_EFI_ERROR(Status);
-
-  MonotonicCount  = 0;
-  Record = NULL;
-  do {
-    Status = DataHub->GetNextRecord (
-                        DataHub,
-                        &MonotonicCount,
-                        NULL,
-                        &Record
-                        );
-    if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
-      DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);
-
-      if (CompareGuid(&Record->DataRecordGuid, &gEfiMiscSubClassGuid) &&
-          (DataHeader->RecordType == EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER)) {
-#if defined( RVP_SUPPORT ) && RVP_SUPPORT
-        //
-        // System Information
-        //
-        SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER *)(DataHeader + 1);
-
-        //
-        // UUID  (System Information)
-        //
-        SMBIOSString = EfiLibAllocateZeroPool (0x100);
-        GuidToString ( &SystemManufacturer->SystemUuid, SMBIOSString, 0x00 );
-
-        TokenToUpdate = (STRING_REF)STR_SYSTEM_UUID_VALUE;
-        HiiSetString(mHiiHandle, TokenToUpdate, SMBIOSString, NULL);
-
-        gBS->FreePool(SMBIOSString);
-#endif
-      }
-    }
-  } while (!EFI_ERROR(Status) && (MonotonicCount != 0));
+  UINT32                          MicrocodeRevision;
+  CHAR16                          NewString[0x100];
+  UINTN                           TotalMemorySize;
+  UINT16                          MemorySpeed;
 
   Status = gBS->LocateProtocol (
                   &gEfiSmbiosProtocolGuid,
@@ -850,6 +471,8 @@ UpdateAdditionalInformation (
   ASSERT_EFI_ERROR (Status);
 
   SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+  TotalMemorySize = 0;
+  MemorySpeed = 0xffff;
   do {
     Status = Smbios->GetNext (
                        Smbios,
@@ -858,6 +481,70 @@ UpdateAdditionalInformation (
                        &SmbiosRecord,
                        NULL
                        );
+
+
+    if (SmbiosRecord->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) {
+      Type4Record = (SMBIOS_TABLE_TYPE4 *) SmbiosRecord;
+      UnicodeSPrint (NewString, sizeof (NewString), L"%d.%d GHz",
+        Type4Record->CurrentSpeed / 1000,
+        Type4Record->CurrentSpeed % 1000
+        );
+      HiiSetString (mHiiHandle, STR_PROCESSOR_SPEED_VALUE, NewString, NULL);
+
+      StrIndex = Type4Record->ProcessorVersion;
+      GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type4Record + Type4Record->Hdr.Length), StrIndex, &ProcessorVersion);
+      HiiSetString (mHiiHandle, STR_PROCESSOR_VERSION_VALUE, ProcessorVersion, NULL);
+
+      MicrocodeRevision = (UINT32) RShiftU64 (AsmReadMsr64 (EFI_MSR_IA32_BIOS_SIGN_ID), 32);
+      UnicodeSPrint (NewString, sizeof (NewString), L"%8x", MicrocodeRevision);
+      HiiSetString (mHiiHandle, STR_PROCESSOR_MICROCODE_VALUE, NewString, NULL);
+    }
+    if (SmbiosRecord->Type == SMBIOS_TYPE_CACHE_INFORMATION) {
+      Type7Record = (SMBIOS_TABLE_TYPE7 *) SmbiosRecord;
+      UnicodeSPrint (NewString, sizeof (NewString), L"%d KB", Type7Record->InstalledSize);
+      switch (Type7Record->CacheConfiguration & 0x03) {
+      case 0:
+        //
+        // Level 1 Cache
+        //
+        if (Type7Record->SystemCacheType == CacheTypeInstruction) {
+          HiiSetString (mHiiHandle, STR_PROCESSOR_L1_INSTR_CACHE_VALUE, NewString, NULL);
+        }
+        if (Type7Record->SystemCacheType == CacheTypeData) {
+          HiiSetString (mHiiHandle, STR_PROCESSOR_L1_DATA_CACHE_VALUE, NewString, NULL);
+        }
+        break;
+      case 1:
+        //
+        // Level 2 Cache
+        //
+        HiiSetString (mHiiHandle, STR_PROCESSOR_L2_CACHE_VALUE, NewString, NULL);
+        break;
+      default:
+        break;
+      }
+      HiiSetString (mHiiHandle, STR_PROCESSOR_MICROCODE_VALUE, NewString, NULL);
+    }
+    if (SmbiosRecord->Type == EFI_SMBIOS_TYPE_MEMORY_DEVICE) {
+      Type17Record = (SMBIOS_TABLE_TYPE17 *) SmbiosRecord;
+      if (Type17Record->Size > 0) {
+        if ((Type17Record->Size & BIT15) != 0) {
+          //
+          // Size is in KB
+          //
+          TotalMemorySize = TotalMemorySize + Type17Record->Size;
+        } else {
+          //
+          // Size is in MB
+          //
+          TotalMemorySize = TotalMemorySize + (UINTN)LShiftU64 (Type17Record->Size, 10);
+        }
+        if (Type17Record->Speed < MemorySpeed) {
+          MemorySpeed = Type17Record->Speed;
+        }
+      }
+    }
+
     if (SmbiosRecord->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) {
       Type0Record = (SMBIOS_TABLE_TYPE0 *) SmbiosRecord;
       StrIndex = Type0Record->BiosVersion;
@@ -884,6 +571,16 @@ UpdateAdditionalInformation (
     }
   } while (!EFI_ERROR(Status));
 
+  if ((TotalMemorySize % 1024) != 0) {
+    UnicodeSPrint (NewString, sizeof (NewString), L"%d.%d GB", TotalMemorySize / 1024, ((TotalMemorySize % 1024) * 100) / 1024);
+  } else {
+    UnicodeSPrint (NewString, sizeof (NewString), L"%d GB", TotalMemorySize / 1024);
+  }
+  HiiSetString (mHiiHandle, STR_TOTAL_MEMORY_SIZE_VALUE, NewString, NULL);
+
+  UnicodeSPrint (NewString, sizeof (NewString), L"%d MHz", MemorySpeed);
+  HiiSetString(mHiiHandle, STR_SYSTEM_MEMORY_SPEED_VALUE, NewString, NULL);
+
   UpdateLatestBootTime();
 
   return  EFI_SUCCESS;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/CommonHeader.h b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/CommonHeader.h
index e339b31065..f95e6bbc2d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/CommonHeader.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/CommonHeader.h
@@ -3,11 +3,10 @@
 
   This file includes package header files, library classes and protocol, PPI & GUID definitions.
 
-  Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2006  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

 **/
 
 #ifndef __COMMON_HEADER_H_
@@ -15,11 +14,10 @@
 
 
 
-#include <FrameworkDxe.h>
+#include <PiDxe.h>
 #include <IndustryStandard/SmBios.h>
 #include <Protocol/Smbios.h>
 
-#include <Guid/DataHubRecords.h>
 #include <Guid/MdeModuleHii.h>
 
 #include <Library/DebugLib.h>
@@ -36,4 +34,6 @@
 #include <Library/PchPlatformLib.h>
 #include <Library/PrintLib.h>
 
+#include "DataHubRecords.h"
+
 #endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRecords.h b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRecords.h
new file mode 100644
index 0000000000..f57a5a8c0f
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRecords.h
@@ -0,0 +1,2934 @@
+/** @file
+  DataHubRecord.h includes all data hub subclass GUID definitions.
+
+  This file includes all data hub sub class defitions from
+  Cache subclass specification 0.9, DataHub SubClass specification 0.9, Memory SubClass Spec 0.9,
+  Processor Subclass specification 0.9, and Misc SubClass specification 0.9.
+
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#ifndef _DATAHUB_RECORDS_GUID_H_
+#define _DATAHUB_RECORDS_GUID_H_
+
+//
+// Local defintion of STRING_REF
+//
+typedef UINT16  STRING_REF;
+
+//
+// The include is required to retrieve type EFI_EXP_BASE10_DATA
+//
+#include <Guid/StatusCodeDataTypeId.h>
+
+#define EFI_PROCESSOR_SUBCLASS_GUID \
+  { 0x26fdeb7e, 0xb8af, 0x4ccf, {0xaa, 0x97, 0x02, 0x63, 0x3c, 0xe4, 0x8c, 0xa7 } }
+
+extern  EFI_GUID gEfiProcessorSubClassGuid;
+
+
+#define EFI_CACHE_SUBCLASS_GUID \
+  { 0x7f0013a7, 0xdc79, 0x4b22, {0x80, 0x99, 0x11, 0xf7, 0x5f, 0xdc, 0x82, 0x9d } }
+
+extern  EFI_GUID gEfiCacheSubClassGuid;
+
+///
+/// The memory subclass belongs to the data class and is identified as the memory
+/// subclass by the GUID.
+///
+#define EFI_MEMORY_SUBCLASS_GUID \
+  {0x4E8F4EBB, 0x64B9, 0x4e05, {0x9B, 0x18, 0x4C, 0xFE, 0x49, 0x23, 0x50, 0x97} }
+
+extern  EFI_GUID  gEfiMemorySubClassGuid;
+
+#define EFI_MISC_SUBCLASS_GUID \
+  { 0x772484B2, 0x7482, 0x4b91, {0x9F, 0x9A, 0xAD, 0x43, 0xF8, 0x1C, 0x58, 0x81 } }
+
+extern  EFI_GUID  gEfiMiscSubClassGuid;
+
+
+///
+/// Inconsistent with specification here:
+/// In ProcSubclass specification 0.9, the value is 0x0100.
+/// Keep it unchanged from the perspective of binary consistency.
+///
+#define EFI_PROCESSOR_SUBCLASS_VERSION    0x00010000
+
+#pragma pack(1)
+
+typedef struct _USB_PORT_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} USB_PORT_DEVICE_PATH;
+
+//
+// IDE
+//
+typedef struct _IDE_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} IDE_DEVICE_PATH;
+
+//
+// RMC Connector
+//
+typedef struct _RMC_CONN_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} RMC_CONN_DEVICE_PATH;
+
+//
+// RIDE
+//
+typedef struct _RIDE_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} RIDE_DEVICE_PATH;
+
+//
+// Gigabit NIC
+//
+typedef struct _GB_NIC_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciXBridgeDevicePath;
+  PCI_DEVICE_PATH                   PciXBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} GB_NIC_DEVICE_PATH;
+
+//
+// P/S2 Connector
+//
+typedef struct _PS2_CONN_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   LpcBridgeDevicePath;
+  ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} PS2_CONN_DEVICE_PATH;
+
+//
+// Serial Port Connector
+//
+typedef struct _SERIAL_CONN_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   LpcBridgeDevicePath;
+  ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} SERIAL_CONN_DEVICE_PATH;
+
+//
+// Parallel Port Connector
+//
+typedef struct _PARALLEL_CONN_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   LpcBridgeDevicePath;
+  ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} PARALLEL_CONN_DEVICE_PATH;
+
+//
+// Floopy Connector
+//
+typedef struct _FLOOPY_CONN_DEVICE_PATH {
+  ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
+  PCI_DEVICE_PATH                   LpcBridgeDevicePath;
+  ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
+} FLOOPY_CONN_DEVICE_PATH;
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+/// It's implementation-specific to simplify the code logic.
+///
+typedef union _EFI_MISC_PORT_DEVICE_PATH {
+  USB_PORT_DEVICE_PATH              UsbDevicePath;
+  IDE_DEVICE_PATH                   IdeDevicePath;
+  RMC_CONN_DEVICE_PATH              RmcConnDevicePath;
+  RIDE_DEVICE_PATH                  RideDevicePath;
+  GB_NIC_DEVICE_PATH                GbNicDevicePath;
+  PS2_CONN_DEVICE_PATH              Ps2ConnDevicePath;
+  SERIAL_CONN_DEVICE_PATH           SerialConnDevicePath;
+  PARALLEL_CONN_DEVICE_PATH         ParallelConnDevicePath;
+  FLOOPY_CONN_DEVICE_PATH           FloppyConnDevicePath;
+} EFI_MISC_PORT_DEVICE_PATH;
+
+#pragma pack()
+
+///
+/// String Token Definition
+///
+/// Inconsistent with specification here:
+/// The macro isn't defined by any specification.
+/// Keep it unchanged for backward compatibility.
+///
+#define EFI_STRING_TOKEN          UINT16
+
+///
+/// Each data record that is a member of some subclass starts with a standard
+/// header of type EFI_SUBCLASS_TYPE1_HEADER.
+/// This header is only a guideline and applicable only to a data
+/// subclass that is producing SMBIOS data records. A subclass can start with a
+/// different header if needed.
+///
+typedef struct {
+  ///
+  /// The version of the specification to which a specific subclass data record adheres.
+  ///
+  UINT32                            Version;
+  ///
+  /// The size in bytes of this data class header.
+  ///
+  UINT32                            HeaderSize;
+  ///
+  /// The instance number of the subclass with the same ProducerName. This number is
+  /// applicable in cases where multiple subclass instances that were produced by the same
+  /// driver exist in the system. This entry is 1 based; 0 means Reserved and -1 means Not
+  /// Applicable. All data consumer drivers should be able to handle all the possible values
+  /// of Instance, including Not Applicable and Reserved.
+  ///
+  UINT16                            Instance;
+  ///
+  /// The instance number of the RecordType for the same Instance. This number is
+  /// applicable in cases where multiple instances of the RecordType exist for a specific
+  /// Instance. This entry is 1 based; 0 means Reserved and -1 means Not Applicable.
+  /// All data consumer drivers should be able to handle all the possible values of
+  /// SubInstance, including Not Applicable and Reserved.
+  ///
+  UINT16                            SubInstance;
+  ///
+  /// The record number for the data record being specified. The numbering scheme and
+  /// definition is defined in the specific subclass specification.
+  ///
+  UINT32                            RecordType;
+} EFI_SUBCLASS_TYPE1_HEADER;
+
+///
+/// This structure is used to link data records in the same subclasses. A data record is
+/// defined as a link to another data record in the same subclass using this structure.
+///
+typedef struct {
+  ///
+  /// An EFI_GUID that identifies the component that produced this data record. Type
+  /// EFI_GUID is defined in InstallProtocolInterface() in the EFI 1.10 Specification.
+  ///
+  EFI_GUID                          ProducerName;
+  ///
+  /// The instance number of the subclass with the same ProducerName. This number is
+  /// applicable in cases where multiple subclass instances that were produced by the same
+  /// driver exist in the system. This entry is 1 based; 0 means Reserved and -1 means Not
+  /// Applicable. All data consumer drivers should be able to handle all the possible values
+  /// of Instance, including Not Applicable and Reserved.
+  ///
+  UINT16                            Instance;
+  /// The instance number of the RecordType for the same Instance. This number is
+  /// applicable in cases where multiple instances of the RecordType exist for a specific
+  /// Instance. This entry is 1 based; 0 means Reserved and -1 means Not Applicable.
+  /// All data consumer drivers should be able to handle all the possible values of
+  /// SubInstance, including Not Applicable and Reserved.
+  UINT16                            SubInstance;
+} EFI_INTER_LINK_DATA;
+
+//
+// EXP data
+//
+///
+/// This macro provides a calculation for base-10 representations. Value and Exponent are each
+/// INT16. It is signed to cover negative values and is 16 bits wide (15 bits for data and 1 bit
+/// for the sign).
+///
+typedef struct {
+  ///
+  /// The INT16 number by which to multiply the base-10 representation.
+  ///
+  UINT16                            Value;
+  ///
+  /// The INT16 number by which to raise the base-10 calculation.
+  ///
+  UINT16                            Exponent;
+} EFI_EXP_BASE2_DATA;
+
+typedef EFI_EXP_BASE10_DATA        EFI_PROCESSOR_MAX_CORE_FREQUENCY_DATA;
+typedef EFI_EXP_BASE10_DATA        EFI_PROCESSOR_MAX_FSB_FREQUENCY_DATA;
+typedef EFI_EXP_BASE10_DATA        EFI_PROCESSOR_CORE_FREQUENCY_DATA;
+
+///
+/// This data record refers to the list of frequencies that the processor core supports. The list of
+/// supported frequencies is determined by the firmware based on hardware capabilities--for example,
+/// it could be a common subset of all processors and the chipset. The unit of measurement of this data
+/// record is in Hertz. For asynchronous processors, the content of this data record is zero.
+/// The list is terminated by -1 in the Value field of the last element. A Value field of zero means
+/// that the processor/driver supports automatic frequency selection.
+///
+/// Inconsistent with specification here:
+/// According to MiscSubclass 0.9 specification, it should be a pointer since it refers to a list of frequencies.
+///
+typedef EFI_EXP_BASE10_DATA        *EFI_PROCESSOR_CORE_FREQUENCY_LIST_DATA;
+
+///
+/// This data record refers to the list of supported frequencies of the processor external bus. The list of
+/// supported frequencies is determined by the firmware based on hardware capabilities--for example,
+/// it could be a common subset of all processors and the chipset. The unit of measurement of this data
+/// record is in Hertz. For asynchronous processors, the content of this data record is NULL.
+/// The list is terminated by -1 in the Value field of the last element. A Value field of zero means
+/// that the processor/driver supports automatic frequency selection.
+///
+typedef EFI_EXP_BASE10_DATA        *EFI_PROCESSOR_FSB_FREQUENCY_LIST_DATA;
+typedef EFI_EXP_BASE10_DATA        EFI_PROCESSOR_FSB_FREQUENCY_DATA;
+typedef STRING_REF                 EFI_PROCESSOR_VERSION_DATA;
+typedef STRING_REF                 EFI_PROCESSOR_MANUFACTURER_DATA;
+typedef STRING_REF                 EFI_PROCESSOR_SERIAL_NUMBER_DATA;
+typedef STRING_REF                 EFI_PROCESSOR_ASSET_TAG_DATA;
+typedef STRING_REF                 EFI_PROCESSOR_PART_NUMBER_DATA;
+
+typedef struct {
+  UINT32                            ProcessorSteppingId:4;
+  UINT32                            ProcessorModel:     4;
+  UINT32                            ProcessorFamily:    4;
+  UINT32                            ProcessorType:      2;
+  UINT32                            ProcessorReserved1: 2;
+  UINT32                            ProcessorXModel:    4;
+  UINT32                            ProcessorXFamily:   8;
+  UINT32                            ProcessorReserved2: 4;
+} EFI_PROCESSOR_SIGNATURE;
+
+
+///
+/// Inconsistent with specification here:
+/// The name of third field in ProcSubClass specification 0.9 is LogicalProcessorCount.
+/// Keep it unchanged for backward compatibility.
+///
+typedef struct {
+  UINT32                            ProcessorBrandIndex    :8;
+  UINT32                            ProcessorClflush       :8;
+  UINT32                            ProcessorReserved      :8;
+  UINT32                            ProcessorDfltApicId    :8;
+} EFI_PROCESSOR_MISC_INFO;
+
+typedef struct {
+  UINT32                            ProcessorFpu:       1;
+  UINT32                            ProcessorVme:       1;
+  UINT32                            ProcessorDe:        1;
+  UINT32                            ProcessorPse:       1;
+  UINT32                            ProcessorTsc:       1;
+  UINT32                            ProcessorMsr:       1;
+  UINT32                            ProcessorPae:       1;
+  UINT32                            ProcessorMce:       1;
+  UINT32                            ProcessorCx8:       1;
+  UINT32                            ProcessorApic:      1;
+  UINT32                            ProcessorReserved1: 1;
+  UINT32                            ProcessorSep:       1;
+  UINT32                            ProcessorMtrr:      1;
+  UINT32                            ProcessorPge:       1;
+  UINT32                            ProcessorMca:       1;
+  UINT32                            ProcessorCmov:      1;
+  UINT32                            ProcessorPat:       1;
+  UINT32                            ProcessorPse36:     1;
+  UINT32                            ProcessorPsn:       1;
+  UINT32                            ProcessorClfsh:     1;
+  UINT32                            ProcessorReserved2: 1;
+  UINT32                            ProcessorDs:        1;
+  UINT32                            ProcessorAcpi:      1;
+  UINT32                            ProcessorMmx:       1;
+  UINT32                            ProcessorFxsr:      1;
+  UINT32                            ProcessorSse:       1;
+  UINT32                            ProcessorSse2:      1;
+  UINT32                            ProcessorSs:        1;
+  UINT32                            ProcessorReserved3: 1;
+  UINT32                            ProcessorTm:        1;
+  UINT32                            ProcessorReserved4: 2;
+} EFI_PROCESSOR_FEATURE_FLAGS;
+
+///
+/// This data record refers to the unique ID that identifies a set of processors. This data record is 16
+/// bytes in length. The data in this structure is processor specific and reserved values can be defined
+/// for future use. The consumer of this data should not make any assumption and should use this data
+/// with respect to the processor family defined in the Family record number.
+///
+typedef struct {
+  ///
+  /// Identifies the processor.
+  ///
+  EFI_PROCESSOR_SIGNATURE           Signature;
+  ///
+  /// Provides additional processor information.
+  ///
+  EFI_PROCESSOR_MISC_INFO           MiscInfo;
+  ///
+  /// Reserved for future use.
+  ///
+  UINT32                            Reserved;
+  ///
+  /// Provides additional processor information.
+  ///
+  EFI_PROCESSOR_FEATURE_FLAGS       FeatureFlags;
+} EFI_PROCESSOR_ID_DATA;
+
+///
+/// This data record refers to the general classification of the processor. This data record is 4 bytes in
+/// length.
+///
+typedef enum {
+  EfiProcessorOther    = 1,
+  EfiProcessorUnknown  = 2,
+  EfiCentralProcessor  = 3,
+  EfiMathProcessor     = 4,
+  EfiDspProcessor      = 5,
+  EfiVideoProcessor    = 6
+} EFI_PROCESSOR_TYPE_DATA;
+
+///
+/// This data record refers to the family of the processor as defined by the DMTF.
+/// This data record is 4 bytes in length.
+///
+typedef enum {
+  EfiProcessorFamilyOther                  = 0x01,
+  EfiProcessorFamilyUnknown                = 0x02,
+  EfiProcessorFamily8086                   = 0x03,
+  EfiProcessorFamily80286                  = 0x04,
+  EfiProcessorFamilyIntel386               = 0x05,
+  EfiProcessorFamilyIntel486               = 0x06,
+  EfiProcessorFamily8087                   = 0x07,
+  EfiProcessorFamily80287                  = 0x08,
+  EfiProcessorFamily80387                  = 0x09,
+  EfiProcessorFamily80487                  = 0x0A,
+  EfiProcessorFamilyPentium                = 0x0B,
+  EfiProcessorFamilyPentiumPro             = 0x0C,
+  EfiProcessorFamilyPentiumII              = 0x0D,
+  EfiProcessorFamilyPentiumMMX             = 0x0E,
+  EfiProcessorFamilyCeleron                = 0x0F,
+  EfiProcessorFamilyPentiumIIXeon          = 0x10,
+  EfiProcessorFamilyPentiumIII             = 0x11,
+  EfiProcessorFamilyM1                     = 0x12,
+  EfiProcessorFamilyM2                     = 0x13,
+  EfiProcessorFamilyM1Reserved2            = 0x14,
+  EfiProcessorFamilyM1Reserved3            = 0x15,
+  EfiProcessorFamilyM1Reserved4            = 0x16,
+  EfiProcessorFamilyM1Reserved5            = 0x17,
+  EfiProcessorFamilyAmdDuron               = 0x18,
+  EfiProcessorFamilyK5                     = 0x19,
+  EfiProcessorFamilyK6                     = 0x1A,
+  EfiProcessorFamilyK6_2                   = 0x1B,
+  EfiProcessorFamilyK6_3                   = 0x1C,
+  EfiProcessorFamilyAmdAthlon              = 0x1D,
+  EfiProcessorFamilyAmd29000               = 0x1E,
+  EfiProcessorFamilyK6_2Plus               = 0x1F,
+  EfiProcessorFamilyPowerPC                = 0x20,
+  EfiProcessorFamilyPowerPC601             = 0x21,
+  EfiProcessorFamilyPowerPC603             = 0x22,
+  EfiProcessorFamilyPowerPC603Plus         = 0x23,
+  EfiProcessorFamilyPowerPC604             = 0x24,
+  EfiProcessorFamilyPowerPC620             = 0x25,
+  EfiProcessorFamilyPowerPCx704            = 0x26,
+  EfiProcessorFamilyPowerPC750             = 0x27,
+  EfiProcessorFamilyAlpha3                 = 0x30,
+  EfiProcessorFamilyAlpha21064             = 0x31,
+  EfiProcessorFamilyAlpha21066             = 0x32,
+  EfiProcessorFamilyAlpha21164             = 0x33,
+  EfiProcessorFamilyAlpha21164PC           = 0x34,
+  EfiProcessorFamilyAlpha21164a            = 0x35,
+  EfiProcessorFamilyAlpha21264             = 0x36,
+  EfiProcessorFamilyAlpha21364             = 0x37,
+  EfiProcessorFamilyMips                   = 0x40,
+  EfiProcessorFamilyMIPSR4000              = 0x41,
+  EfiProcessorFamilyMIPSR4200              = 0x42,
+  EfiProcessorFamilyMIPSR4400              = 0x43,
+  EfiProcessorFamilyMIPSR4600              = 0x44,
+  EfiProcessorFamilyMIPSR10000             = 0x45,
+  EfiProcessorFamilySparc                  = 0x50,
+  EfiProcessorFamilySuperSparc             = 0x51,
+  EfiProcessorFamilymicroSparcII           = 0x52,
+  EfiProcessorFamilymicroSparcIIep         = 0x53,
+  EfiProcessorFamilyUltraSparc             = 0x54,
+  EfiProcessorFamilyUltraSparcII           = 0x55,
+  EfiProcessorFamilyUltraSparcIIi          = 0x56,
+  EfiProcessorFamilyUltraSparcIII          = 0x57,
+  ///
+  /// Inconsistent with specification here:
+  /// This field in ProcSubClass specification 0.9 is defined as EfiProcessorFamilyUltraSparcIIi.
+  /// Change it to EfiProcessorFamilyUltraSparcIIIi to avoid build break.
+  ///
+  EfiProcessorFamilyUltraSparcIIIi         = 0x58,
+  EfiProcessorFamily68040                  = 0x60,
+  EfiProcessorFamily68xxx                  = 0x61,
+  EfiProcessorFamily68000                  = 0x62,
+  EfiProcessorFamily68010                  = 0x63,
+  EfiProcessorFamily68020                  = 0x64,
+  EfiProcessorFamily68030                  = 0x65,
+  EfiProcessorFamilyHobbit                 = 0x70,
+  EfiProcessorFamilyCrusoeTM5000           = 0x78,
+  EfiProcessorFamilyCrusoeTM3000           = 0x79,
+  EfiProcessorFamilyEfficeonTM8000         = 0x7A,
+  EfiProcessorFamilyWeitek                 = 0x80,
+  EfiProcessorFamilyItanium                = 0x82,
+  EfiProcessorFamilyAmdAthlon64            = 0x83,
+  EfiProcessorFamilyAmdOpteron             = 0x84,
+  EfiProcessorFamilyAmdSempron             = 0x85,
+  EfiProcessorFamilyAmdTurion64Mobile      = 0x86,
+  EfiProcessorFamilyDualCoreAmdOpteron     = 0x87,
+  EfiProcessorFamilyAmdAthlon64X2DualCore  = 0x88,
+  EfiProcessorFamilyAmdTurion64X2Mobile    = 0x89,
+  EfiProcessorFamilyPARISC                 = 0x90,
+  EfiProcessorFamilyPaRisc8500             = 0x91,
+  EfiProcessorFamilyPaRisc8000             = 0x92,
+  EfiProcessorFamilyPaRisc7300LC           = 0x93,
+  EfiProcessorFamilyPaRisc7200             = 0x94,
+  EfiProcessorFamilyPaRisc7100LC           = 0x95,
+  EfiProcessorFamilyPaRisc7100             = 0x96,
+  EfiProcessorFamilyV30                    = 0xA0,
+  EfiProcessorFamilyPentiumIIIXeon         = 0xB0,
+  EfiProcessorFamilyPentiumIIISpeedStep    = 0xB1,
+  EfiProcessorFamilyPentium4               = 0xB2,
+  EfiProcessorFamilyIntelXeon              = 0xB3,
+  EfiProcessorFamilyAS400                  = 0xB4,
+  EfiProcessorFamilyIntelXeonMP            = 0xB5,
+  EfiProcessorFamilyAMDAthlonXP            = 0xB6,
+  EfiProcessorFamilyAMDAthlonMP            = 0xB7,
+  EfiProcessorFamilyIntelItanium2          = 0xB8,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelPentiumM          = 0xB9,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelCeleronD          = 0xBA,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelPentiumD          = 0xBB,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelPentiumEx         = 0xBC,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelCoreSolo          = 0xBD,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyReserved               = 0xBE,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIntelCore2             = 0xBF,
+  EfiProcessorFamilyIBM390                 = 0xC8,
+  EfiProcessorFamilyG4                     = 0xC9,
+  EfiProcessorFamilyG5                     = 0xCA,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification  0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyG6                     = 0xCB,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyzArchitectur           = 0xCC,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyViaC7M                 = 0xD2,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyViaC7D                 = 0xD3,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyViaC7                  = 0xD4,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyViaEden                = 0xD5,
+  EfiProcessorFamilyi860                   = 0xFA,
+  EfiProcessorFamilyi960                   = 0xFB,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyIndicatorFamily2       = 0xFE,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorFamilyReserved1              = 0xFF
+} EFI_PROCESSOR_FAMILY_DATA;
+
+typedef enum {
+  EfiProcessorFamilySh3           = 0x104,
+  EfiProcessorFamilySh4           = 0x105,
+  EfiProcessorFamilyArm           = 0x118,
+  EfiProcessorFamilyStrongArm     = 0x119,
+  EfiProcessorFamily6x86          = 0x12C,
+  EfiProcessorFamilyMediaGx       = 0x12D,
+  EfiProcessorFamilyMii           = 0x12E,
+  EfiProcessorFamilyWinChip       = 0x140,
+  EfiProcessorFamilyDsp           = 0x15E,
+  EfiProcessorFamilyVideo         = 0x1F4
+} EFI_PROCESSOR_FAMILY2_DATA;
+
+///
+/// This data record refers to the core voltage of the processor being defined. The unit of measurement
+/// of this data record is in volts.
+///
+typedef EFI_EXP_BASE10_DATA         EFI_PROCESSOR_VOLTAGE_DATA;
+
+///
+/// This data record refers to the base address of the APIC of the processor being defined. This data
+/// record is a physical address location.
+///
+typedef EFI_PHYSICAL_ADDRESS        EFI_PROCESSOR_APIC_BASE_ADDRESS_DATA;
+
+///
+/// This data record refers to the ID of the APIC of the processor being defined. This data record is a
+/// 4-byte entry.
+///
+typedef UINT32                      EFI_PROCESSOR_APIC_ID_DATA;
+
+///
+/// This data record refers to the version number of the APIC of the processor being defined. This data
+/// record is a 4-byte entry.
+///
+typedef UINT32                      EFI_PROCESSOR_APIC_VERSION_NUMBER_DATA;
+
+typedef enum {
+  EfiProcessorIa32Microcode    = 1,
+  EfiProcessorIpfPalAMicrocode = 2,
+  EfiProcessorIpfPalBMicrocode = 3
+} EFI_PROCESSOR_MICROCODE_TYPE;
+
+///
+/// This data record refers to the revision of the processor microcode that is loaded in the processor.
+/// This data record is a 4-byte entry.
+///
+typedef struct {
+  ///
+  /// Identifies what type of microcode the data is.
+  ///
+  EFI_PROCESSOR_MICROCODE_TYPE      ProcessorMicrocodeType;
+  ///
+  /// Indicates the revision number of this microcode.
+  ///
+  UINT32                            ProcessorMicrocodeRevisionNumber;
+} EFI_PROCESSOR_MICROCODE_REVISION_DATA;
+
+///
+/// This data record refers to the status of the processor.
+///
+typedef struct {
+  UINT32       CpuStatus                 :3; ///< Indicates the status of the processor.
+  UINT32       Reserved1                 :3; ///< Reserved for future use. Should be set to zero.
+  UINT32       SocketPopulated           :1; ///< Indicates if the processor is socketed or not.
+  UINT32       Reserved2                 :1; ///< Reserved for future use. Should be set to zero.
+  UINT32       ApicEnable                :1; ///< Indicates if the APIC is enabled or not.
+  UINT32       BootApplicationProcessor  :1; ///< Indicates if this processor is the boot processor.
+  UINT32       Reserved3                 :22;///< Reserved for future use. Should be set to zero.
+} EFI_PROCESSOR_STATUS_DATA;
+
+typedef enum {
+  EfiCpuStatusUnknown        = 0,
+  EfiCpuStatusEnabled        = 1,
+  EfiCpuStatusDisabledByUser = 2,
+  EfiCpuStatusDisabledbyBios = 3,
+  EfiCpuStatusIdle           = 4,
+  EfiCpuStatusOther          = 7
+} EFI_CPU_STATUS;
+
+typedef enum {
+  EfiProcessorSocketOther            = 1,
+  EfiProcessorSocketUnknown          = 2,
+  EfiProcessorSocketDaughterBoard    = 3,
+  EfiProcessorSocketZIF              = 4,
+  EfiProcessorSocketReplacePiggyBack = 5,
+  EfiProcessorSocketNone             = 6,
+  EfiProcessorSocketLIF              = 7,
+  EfiProcessorSocketSlot1            = 8,
+  EfiProcessorSocketSlot2            = 9,
+  EfiProcessorSocket370Pin           = 0xA,
+  EfiProcessorSocketSlotA            = 0xB,
+  EfiProcessorSocketSlotM            = 0xC,
+  EfiProcessorSocket423              = 0xD,
+  EfiProcessorSocketA462             = 0xE,
+  EfiProcessorSocket478              = 0xF,
+  EfiProcessorSocket754              = 0x10,
+  EfiProcessorSocket940              = 0x11,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorSocket939              = 0x12,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorSocketmPGA604          = 0x13,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorSocketLGA771           = 0x14,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiProcessorSocketLGA775           = 0x15
+
+} EFI_PROCESSOR_SOCKET_TYPE_DATA;
+
+typedef STRING_REF                  EFI_PROCESSOR_SOCKET_NAME_DATA;
+
+///
+/// Inconsistent with specification here:
+/// In ProcSubclass specification 0.9, the naming is EFI_PROCESSOR_CACHE_ASSOCIATION_DATA.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef EFI_INTER_LINK_DATA         EFI_CACHE_ASSOCIATION_DATA;
+
+///
+/// This data record refers to the health status of the processor.
+///
+/// Inconsistent with specification here:
+/// In ProcSubclass specification 0.9, the naming is EFI_PROCESSOR_HEALTH_STATUS_DATA.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef enum {
+  EfiProcessorHealthy        = 1,
+  EfiProcessorPerfRestricted = 2,
+  EfiProcessorFuncRestricted = 3
+} EFI_PROCESSOR_HEALTH_STATUS;
+
+///
+/// This data record refers to the package number of this processor. Multiple logical processors can
+/// exist in a system and each logical processor can be correlated to the physical processor using this
+/// record type.
+///
+typedef UINTN                       EFI_PROCESSOR_PACKAGE_NUMBER_DATA;
+
+typedef UINT8                       EFI_PROCESSOR_CORE_COUNT_DATA;
+typedef UINT8                       EFI_PROCESSOR_ENABLED_CORE_COUNT_DATA;
+typedef UINT8                       EFI_PROCESSOR_THREAD_COUNT_DATA;
+
+typedef struct {
+  UINT16  Reserved              :1;
+  UINT16  Unknown               :1;
+  UINT16  Capable64Bit          :1;
+  UINT16  Reserved2             :13;
+} EFI_PROCESSOR_CHARACTERISTICS_DATA;
+
+///
+/// Inconsistent with specification here:
+/// In ProcSubclass specification 0.9, the enumeration type data structure is NOT defined.
+/// The equivalent in specification is
+///      #define EFI_PROCESSOR_FREQUENCY_RECORD_NUMBER           0x00000001
+///      #define EFI_PROCESSOR_BUS_FREQUENCY_RECORD_NUMBER       0x00000002
+///      #define EFI_PROCESSOR_VERSION_RECORD_NUMBER             0x00000003
+///      #define EFI_PROCESSOR_MANUFACTURER_RECORD_NUMBER        0x00000004
+///      #define EFI_PROCESSOR_SERIAL_NUMBER_RECORD_NUMBER       0x00000005
+///      #define EFI_PROCESSOR_ID_RECORD_NUMBER                  0x00000006
+///      #define EFI_PROCESSOR_TYPE_RECORD_NUMBER                0x00000007
+///      #define EFI_PROCESSOR_FAMILY_RECORD_NUMBER              0x00000008
+///      #define EFI_PROCESSOR_VOLTAGE_RECORD_NUMBER             0x00000009
+///      #define EFI_PROCESSOR_APIC_BASE_ADDRESS_RECORD_NUMBER   0x0000000A
+///      #define EFI_PROCESSOR_APIC_ID_RECORD_NUMBER             0x0000000B
+///      #define EFI_PROCESSOR_APIC_VER_NUMBER_RECORD_NUMBER     0x0000000C
+///      #define EFI_PROCESSOR_MICROCODE_REVISION_RECORD_NUMBER  0x0000000D
+///      #define EFI_PROCESSOR_STATUS_RECORD_NUMBER              0x0000000E
+///      #define EFI_PROCESSOR_SOCKET_TYPE_RECORD_NUMBER         0x0000000F
+///      #define EFI_PROCESSOR_SOCKET_NAME_RECORD_NUMBER         0x00000010
+///      #define EFI_PROCESSOR_CACHE_ASSOCIATION_RECORD_NUMBER   0x00000011
+///      #define EFI_PROCESSOR_MAX_FREQUENCY_RECORD_NUMBER       0x00000012
+///      #define EFI_PROCESSOR_ASSET_TAG_RECORD_NUMBER           0x00000013
+///      #define EFI_PROCESSOR_MAX_FSB_FREQUENCY_RECORD_NUMBER   0x00000014
+///      #define EFI_PROCESSOR_PACKAGE_NUMBER_RECORD_NUMBER      0x00000015
+///      #define EFI_PROCESSOR_FREQUENCY_LIST_RECORD_NUMBER      0x00000016
+///      #define EFI_PROCESSOR_FSB_FREQUENCY_LIST_RECORD_NUMBER  0x00000017
+///      #define EFI_PROCESSOR_HEALTH_STATUS_RECORD_NUMBER       0x00000018
+///
+/// Keep the definition unchanged for backward compatibility.
+typedef enum {
+  ProcessorCoreFrequencyRecordType     = 1,
+  ProcessorFsbFrequencyRecordType      = 2,
+  ProcessorVersionRecordType           = 3,
+  ProcessorManufacturerRecordType      = 4,
+  ProcessorSerialNumberRecordType      = 5,
+  ProcessorIdRecordType                = 6,
+  ProcessorTypeRecordType              = 7,
+  ProcessorFamilyRecordType            = 8,
+  ProcessorVoltageRecordType           = 9,
+  ProcessorApicBaseAddressRecordType   = 10,
+  ProcessorApicIdRecordType            = 11,
+  ProcessorApicVersionNumberRecordType = 12,
+  CpuUcodeRevisionDataRecordType       = 13,
+  ProcessorStatusRecordType            = 14,
+  ProcessorSocketTypeRecordType        = 15,
+  ProcessorSocketNameRecordType        = 16,
+  CacheAssociationRecordType           = 17,
+  ProcessorMaxCoreFrequencyRecordType  = 18,
+  ProcessorAssetTagRecordType          = 19,
+  ProcessorMaxFsbFrequencyRecordType   = 20,
+  ProcessorPackageNumberRecordType     = 21,
+  ProcessorCoreFrequencyListRecordType = 22,
+  ProcessorFsbFrequencyListRecordType  = 23,
+  ProcessorHealthStatusRecordType      = 24,
+  ProcessorCoreCountRecordType         = 25,
+  ProcessorEnabledCoreCountRecordType  = 26,
+  ProcessorThreadCountRecordType       = 27,
+  ProcessorCharacteristicsRecordType   = 28,
+  ProcessorFamily2RecordType           = 29,
+  ProcessorPartNumberRecordType        = 30,
+} EFI_CPU_VARIABLE_RECORD_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In ProcSubclass specification 0.9, the union type data structure is NOT defined.
+/// It's implementation-specific to simplify the code logic.
+///
+typedef union {
+  EFI_PROCESSOR_CORE_FREQUENCY_LIST_DATA  ProcessorCoreFrequencyList;
+  EFI_PROCESSOR_FSB_FREQUENCY_LIST_DATA   ProcessorFsbFrequencyList;
+  EFI_PROCESSOR_SERIAL_NUMBER_DATA        ProcessorSerialNumber;
+  EFI_PROCESSOR_CORE_FREQUENCY_DATA       ProcessorCoreFrequency;
+  EFI_PROCESSOR_FSB_FREQUENCY_DATA        ProcessorFsbFrequency;
+  EFI_PROCESSOR_MAX_CORE_FREQUENCY_DATA   ProcessorMaxCoreFrequency;
+  EFI_PROCESSOR_MAX_FSB_FREQUENCY_DATA    ProcessorMaxFsbFrequency;
+  EFI_PROCESSOR_VERSION_DATA              ProcessorVersion;
+  EFI_PROCESSOR_MANUFACTURER_DATA         ProcessorManufacturer;
+  EFI_PROCESSOR_ID_DATA                   ProcessorId;
+  EFI_PROCESSOR_TYPE_DATA                 ProcessorType;
+  EFI_PROCESSOR_FAMILY_DATA               ProcessorFamily;
+  EFI_PROCESSOR_VOLTAGE_DATA              ProcessorVoltage;
+  EFI_PROCESSOR_APIC_BASE_ADDRESS_DATA    ProcessorApicBase;
+  EFI_PROCESSOR_APIC_ID_DATA              ProcessorApicId;
+  EFI_PROCESSOR_APIC_VERSION_NUMBER_DATA  ProcessorApicVersionNumber;
+  EFI_PROCESSOR_MICROCODE_REVISION_DATA   CpuUcodeRevisionData;
+  EFI_PROCESSOR_STATUS_DATA               ProcessorStatus;
+  EFI_PROCESSOR_SOCKET_TYPE_DATA          ProcessorSocketType;
+  EFI_PROCESSOR_SOCKET_NAME_DATA          ProcessorSocketName;
+  EFI_PROCESSOR_ASSET_TAG_DATA            ProcessorAssetTag;
+  EFI_PROCESSOR_PART_NUMBER_DATA          ProcessorPartNumber;
+  EFI_PROCESSOR_HEALTH_STATUS             ProcessorHealthStatus;
+  EFI_PROCESSOR_PACKAGE_NUMBER_DATA       ProcessorPackageNumber;
+  EFI_PROCESSOR_CORE_COUNT_DATA           ProcessorCoreCount;
+  EFI_PROCESSOR_ENABLED_CORE_COUNT_DATA   ProcessorEnabledCoreCount;
+  EFI_PROCESSOR_THREAD_COUNT_DATA         ProcessorThreadCount;
+  EFI_PROCESSOR_CHARACTERISTICS_DATA      ProcessorCharacteristics;
+  EFI_PROCESSOR_FAMILY2_DATA              ProcessorFamily2;
+} EFI_CPU_VARIABLE_RECORD;
+
+typedef struct {
+  EFI_SUBCLASS_TYPE1_HEADER         DataRecordHeader;
+  EFI_CPU_VARIABLE_RECORD           VariableRecord;
+} EFI_CPU_DATA_RECORD;
+
+#define EFI_CACHE_SUBCLASS_VERSION    0x00010000
+
+typedef EFI_EXP_BASE2_DATA          EFI_CACHE_SIZE_DATA;
+///
+/// Inconsistent with specification here:
+/// In CacheSubclass specification 0.9, the naming is EFI_CACHE_MAXIMUM_SIZE_DATA.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef EFI_EXP_BASE2_DATA          EFI_MAXIMUM_CACHE_SIZE_DATA;
+typedef EFI_EXP_BASE10_DATA         EFI_CACHE_SPEED_DATA;
+typedef STRING_REF                  EFI_CACHE_SOCKET_DATA;
+
+typedef struct {
+  UINT32                            Other         :1;
+  UINT32                            Unknown       :1;
+  UINT32                            NonBurst      :1;
+  UINT32                            Burst         :1;
+  UINT32                            PipelineBurst :1;
+  ///
+  /// Inconsistent between CacheSubclass 0.9 and SMBIOS specifications here:
+  /// In CacheSubclass specification 0.9, the sequence of Asynchronous and Synchronous fileds
+  /// are opposite to SMBIOS specification.
+  ///
+  UINT32                            Asynchronous  :1;
+  UINT32                            Synchronous   :1;
+  UINT32                            Reserved      :25;
+} EFI_CACHE_SRAM_TYPE_DATA;
+
+typedef EFI_CACHE_SRAM_TYPE_DATA    EFI_CACHE_SRAM_INSTALL_DATA;
+
+typedef enum {
+  EfiCacheErrorOther     = 1,
+  EfiCacheErrorUnknown   = 2,
+  EfiCacheErrorNone      = 3,
+  EfiCacheErrorParity    = 4,
+  EfiCacheErrorSingleBit = 5,
+  EfiCacheErrorMultiBit  = 6
+} EFI_CACHE_ERROR_TYPE_DATA;
+
+typedef enum {
+  EfiCacheTypeOther       = 1,
+  EfiCacheTypeUnknown     = 2,
+  EfiCacheTypeInstruction = 3,
+  EfiCacheTypeData        = 4,
+  EfiCacheTypeUnified     = 5
+} EFI_CACHE_TYPE_DATA;
+
+typedef enum {
+  EfiCacheAssociativityOther        = 1,
+  EfiCacheAssociativityUnknown      = 2,
+  EfiCacheAssociativityDirectMapped = 3,
+  EfiCacheAssociativity2Way         = 4,
+  EfiCacheAssociativity4Way         = 5,
+  EfiCacheAssociativityFully        = 6,
+  EfiCacheAssociativity8Way         = 7,
+  EfiCacheAssociativity16Way        = 8
+} EFI_CACHE_ASSOCIATIVITY_DATA;
+
+///
+/// Inconsistent with specification here:
+/// In CacheSubclass 0.9 specification. It defines the field type as UINT16.
+/// In fact, it should be UINT32 type because it refers to a 32bit width data.
+///
+typedef struct {
+  UINT32                            Level           :3;
+  UINT32                            Socketed        :1;
+  UINT32                            Reserved2       :1;
+  UINT32                            Location        :2;
+  UINT32                            Enable          :1;
+  UINT32                            OperationalMode :2;
+  UINT32                            Reserved1       :22;
+} EFI_CACHE_CONFIGURATION_DATA;
+
+#define EFI_CACHE_L1            1
+#define EFI_CACHE_L2            2
+#define EFI_CACHE_L3            3
+#define EFI_CACHE_L4            4
+#define EFI_CACHE_LMAX          EFI_CACHE_L4
+
+#define EFI_CACHE_SOCKETED      1
+#define EFI_CACHE_NOT_SOCKETED  0
+
+typedef enum {
+  EfiCacheInternal = 0,
+  EfiCacheExternal = 1,
+  EfiCacheReserved = 2,
+  EfiCacheUnknown  = 3
+} EFI_CACHE_LOCATION;
+
+#define EFI_CACHE_ENABLED       1
+#define EFI_CACHE_DISABLED      0
+
+typedef enum {
+  EfiCacheWriteThrough = 0,
+  EfiCacheWriteBack    = 1,
+  EfiCacheDynamicMode  = 2,
+  EfiCacheUnknownMode  = 3
+} EFI_CACHE_OPERATIONAL_MODE;
+
+
+///
+/// Inconsistent with specification here:
+/// In CacheSubclass specification 0.9, the enumeration type data structure is NOT defined.
+/// The equivalent in specification is
+///      #define EFI_CACHE_SIZE_RECORD_NUMBER                    0x00000001
+///      #define EFI_CACHE_MAXIMUM_SIZE_RECORD_NUMBER            0x00000002
+///      #define EFI_CACHE_SPEED_RECORD_NUMBER                   0x00000003
+///      #define EFI_CACHE_SOCKET_RECORD_NUMBER                  0x00000004
+///      #define EFI_CACHE_SRAM_SUPPORT_RECORD_NUMBER            0x00000005
+///      #define EFI_CACHE_SRAM_INSTALL_RECORD_NUMBER            0x00000006
+///      #define EFI_CACHE_ERROR_SUPPORT_RECORD_NUMBER           0x00000007
+///      #define EFI_CACHE_TYPE_RECORD_NUMBER                    0x00000008
+///      #define EFI_CACHE_ASSOCIATIVITY_RECORD_NUMBER           0x00000009
+///      #define EFI_CACHE_CONFIGURATION_RECORD_NUMBER           0x0000000A
+/// Keep the definition unchanged for backward compatibility.
+///
+typedef enum {
+  CacheSizeRecordType              = 1,
+  MaximumSizeCacheRecordType       = 2,
+  CacheSpeedRecordType             = 3,
+  CacheSocketRecordType            = 4,
+  CacheSramTypeRecordType          = 5,
+  CacheInstalledSramTypeRecordType = 6,
+  CacheErrorTypeRecordType         = 7,
+  CacheTypeRecordType              = 8,
+  CacheAssociativityRecordType     = 9,
+  CacheConfigRecordType            = 10
+} EFI_CACHE_VARIABLE_RECORD_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In CacheSubclass specification 0.9, the union type data structure is NOT defined.
+/// It's implementation-specific to simplify the code logic.
+///
+typedef union {
+  EFI_CACHE_SIZE_DATA                         CacheSize;
+  EFI_MAXIMUM_CACHE_SIZE_DATA                 MaximumCacheSize;
+  EFI_CACHE_SPEED_DATA                        CacheSpeed;
+  EFI_CACHE_SOCKET_DATA                       CacheSocket;
+  EFI_CACHE_SRAM_TYPE_DATA                    CacheSramType;
+  EFI_CACHE_SRAM_TYPE_DATA                    CacheInstalledSramType;
+  EFI_CACHE_ERROR_TYPE_DATA                   CacheErrorType;
+  EFI_CACHE_TYPE_DATA                         CacheType;
+  EFI_CACHE_ASSOCIATIVITY_DATA                CacheAssociativity;
+  EFI_CACHE_CONFIGURATION_DATA                CacheConfig;
+  EFI_CACHE_ASSOCIATION_DATA                  CacheAssociation;
+} EFI_CACHE_VARIABLE_RECORD;
+
+typedef struct {
+   EFI_SUBCLASS_TYPE1_HEADER        DataRecordHeader;
+   EFI_CACHE_VARIABLE_RECORD        VariableRecord;
+} EFI_CACHE_DATA_RECORD;
+
+#define EFI_MEMORY_SUBCLASS_VERSION     0x0100
+#define EFI_MEMORY_SIZE_RECORD_NUMBER   0x00000001
+
+typedef enum _EFI_MEMORY_REGION_TYPE {
+  EfiMemoryRegionMemory             = 0x01,
+  EfiMemoryRegionReserved           = 0x02,
+  EfiMemoryRegionAcpi               = 0x03,
+  EfiMemoryRegionNvs                = 0x04
+} EFI_MEMORY_REGION_TYPE;
+
+///
+/// This data record refers to the size of a memory region. The regions that are
+/// described can refer to physical memory, memory-mapped I/O, or reserved BIOS memory regions.
+/// The unit of measurement of this data record is in bytes.
+///
+typedef struct {
+  ///
+  /// A zero-based value that indicates which processor(s) can access the memory region.
+  /// A value of 0xFFFF indicates the region is accessible by all processors.
+  ///
+  UINT32                            ProcessorNumber;
+  ///
+  /// A zero-based value that indicates the starting bus that can access the memory region.
+  ///
+  UINT16                            StartBusNumber;
+  ///
+  /// A zero-based value that indicates the ending bus that can access the memory region.
+  /// A value of 0xFF for a PCI system indicates the region is accessible by all buses and
+  /// is global in scope. An example of the EndBusNumber not being 0xFF is a system
+  /// with two or more peer-to-host PCI bridges.
+  ///
+  UINT16                            EndBusNumber;
+  ///
+  /// The type of memory region from the operating system's point of view.
+  /// MemoryRegionType values are equivalent to the legacy INT 15 AX = E820 BIOS
+  /// command values.
+  ///
+  EFI_MEMORY_REGION_TYPE            MemoryRegionType;
+  ///
+  /// The size of the memory region in bytes.
+  ///
+  EFI_EXP_BASE2_DATA                MemorySize;
+  ///
+  /// The starting physical address of the memory region.
+  ///
+  EFI_PHYSICAL_ADDRESS              MemoryStartAddress;
+} EFI_MEMORY_SIZE_DATA;
+
+
+#define EFI_MEMORY_ARRAY_LOCATION_RECORD_NUMBER    0x00000002
+
+typedef enum _EFI_MEMORY_ARRAY_LOCATION {
+  EfiMemoryArrayLocationOther                 = 0x01,
+  EfiMemoryArrayLocationUnknown               = 0x02,
+  EfiMemoryArrayLocationSystemBoard           = 0x03,
+  EfiMemoryArrayLocationIsaAddonCard          = 0x04,
+  EfiMemoryArrayLocationEisaAddonCard         = 0x05,
+  EfiMemoryArrayLocationPciAddonCard          = 0x06,
+  EfiMemoryArrayLocationMcaAddonCard          = 0x07,
+  EfiMemoryArrayLocationPcmciaAddonCard       = 0x08,
+  EfiMemoryArrayLocationProprietaryAddonCard  = 0x09,
+  EfiMemoryArrayLocationNuBus                 = 0x0A,
+  EfiMemoryArrayLocationPc98C20AddonCard      = 0xA0,
+  EfiMemoryArrayLocationPc98C24AddonCard      = 0xA1,
+  EfiMemoryArrayLocationPc98EAddonCard        = 0xA2,
+  EfiMemoryArrayLocationPc98LocalBusAddonCard = 0xA3
+} EFI_MEMORY_ARRAY_LOCATION;
+
+typedef enum _EFI_MEMORY_ARRAY_USE {
+  EfiMemoryArrayUseOther                      = 0x01,
+  EfiMemoryArrayUseUnknown                    = 0x02,
+  EfiMemoryArrayUseSystemMemory               = 0x03,
+  EfiMemoryArrayUseVideoMemory                = 0x04,
+  EfiMemoryArrayUseFlashMemory                = 0x05,
+  EfiMemoryArrayUseNonVolatileRam             = 0x06,
+  EfiMemoryArrayUseCacheMemory                = 0x07
+} EFI_MEMORY_ARRAY_USE;
+
+typedef enum _EFI_MEMORY_ERROR_CORRECTION {
+  EfiMemoryErrorCorrectionOther               = 0x01,
+  EfiMemoryErrorCorrectionUnknown             = 0x02,
+  EfiMemoryErrorCorrectionNone                = 0x03,
+  EfiMemoryErrorCorrectionParity              = 0x04,
+  EfiMemoryErrorCorrectionSingleBitEcc        = 0x05,
+  EfiMemoryErrorCorrectionMultiBitEcc         = 0x06,
+  EfiMemoryErrorCorrectionCrc                 = 0x07
+} EFI_MEMORY_ERROR_CORRECTION;
+
+///
+/// This data record refers to the physical memory array. This data record is a structure.
+/// The type definition structure for EFI_MEMORY_ARRAY_LOCATION_DATA is in SMBIOS 2.3.4:
+/// - Table 3.3.17.1, Type 16, Offset 0x4
+/// - Table 3.3.17.2, Type 16, Offset 0x5
+/// - Table 3.3.17.3, Type 16, with the following offsets:
+///     -- Offset 0x6
+///     -- Offset 0x7
+///     -- Offset 0xB
+///     -- Offset 0xD
+///
+typedef struct {
+  ///
+  /// The physical location of the memory array.
+  ///
+  EFI_MEMORY_ARRAY_LOCATION         MemoryArrayLocation;
+  ///
+  /// The memory array usage.
+  ///
+  EFI_MEMORY_ARRAY_USE              MemoryArrayUse;
+  ///
+  /// The primary error correction or detection supported by this memory array.
+  ///
+  EFI_MEMORY_ERROR_CORRECTION       MemoryErrorCorrection;
+  ///
+  /// The maximum memory capacity size in kilobytes. If capacity is unknown, then
+  /// values of MaximumMemoryCapacity.Value = 0x00 and
+  /// MaximumMemoryCapacity.Exponent = 0x8000 are used.
+  ///
+  EFI_EXP_BASE2_DATA                MaximumMemoryCapacity;
+  ///
+  /// The number of memory slots or sockets that are available for memory devices
+  /// in this array.
+  ///
+  UINT16                            NumberMemoryDevices;
+} EFI_MEMORY_ARRAY_LOCATION_DATA;
+
+
+#define EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER    0x00000003
+
+typedef enum _EFI_MEMORY_FORM_FACTOR {
+  EfiMemoryFormFactorOther                    = 0x01,
+  EfiMemoryFormFactorUnknown                  = 0x02,
+  EfiMemoryFormFactorSimm                     = 0x03,
+  EfiMemoryFormFactorSip                      = 0x04,
+  EfiMemoryFormFactorChip                     = 0x05,
+  EfiMemoryFormFactorDip                      = 0x06,
+  EfiMemoryFormFactorZip                      = 0x07,
+  EfiMemoryFormFactorProprietaryCard          = 0x08,
+  EfiMemoryFormFactorDimm                     = 0x09,
+  EfiMemoryFormFactorTsop                     = 0x0A,
+  EfiMemoryFormFactorRowOfChips               = 0x0B,
+  EfiMemoryFormFactorRimm                     = 0x0C,
+  EfiMemoryFormFactorSodimm                   = 0x0D,
+  EfiMemoryFormFactorSrimm                    = 0x0E,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiMemoryFormFactorFbDimm                   = 0x0F
+} EFI_MEMORY_FORM_FACTOR;
+
+typedef enum _EFI_MEMORY_ARRAY_TYPE {
+  EfiMemoryTypeOther                          = 0x01,
+  EfiMemoryTypeUnknown                        = 0x02,
+  EfiMemoryTypeDram                           = 0x03,
+  EfiMemoryTypeEdram                          = 0x04,
+  EfiMemoryTypeVram                           = 0x05,
+  EfiMemoryTypeSram                           = 0x06,
+  EfiMemoryTypeRam                            = 0x07,
+  EfiMemoryTypeRom                            = 0x08,
+  EfiMemoryTypeFlash                          = 0x09,
+  EfiMemoryTypeEeprom                         = 0x0A,
+  EfiMemoryTypeFeprom                         = 0x0B,
+  EfiMemoryTypeEprom                          = 0x0C,
+  EfiMemoryTypeCdram                          = 0x0D,
+  EfiMemoryType3Dram                          = 0x0E,
+  EfiMemoryTypeSdram                          = 0x0F,
+  EfiMemoryTypeSgram                          = 0x10,
+  EfiMemoryTypeRdram                          = 0x11,
+  EfiMemoryTypeDdr                            = 0x12,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiMemoryTypeDdr2                           = 0x13,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiMemoryTypeDdr2FbDimm                     = 0x14
+} EFI_MEMORY_ARRAY_TYPE;
+
+typedef struct {
+  UINT32                            Reserved        :1;
+  UINT32                            Other           :1;
+  UINT32                            Unknown         :1;
+  UINT32                            FastPaged       :1;
+  UINT32                            StaticColumn    :1;
+  UINT32                            PseudoStatic    :1;
+  UINT32                            Rambus          :1;
+  UINT32                            Synchronous     :1;
+  UINT32                            Cmos            :1;
+  UINT32                            Edo             :1;
+  UINT32                            WindowDram      :1;
+  UINT32                            CacheDram       :1;
+  UINT32                            Nonvolatile     :1;
+  UINT32                            Reserved1       :19;
+} EFI_MEMORY_TYPE_DETAIL;
+
+typedef enum {
+  EfiMemoryStateEnabled      = 0,
+  EfiMemoryStateUnknown      = 1,
+  EfiMemoryStateUnsupported  = 2,
+  EfiMemoryStateError        = 3,
+  EfiMemoryStateAbsent       = 4,
+  EfiMemoryStateDisabled     = 5,
+  ///
+  /// Inconsistent with specification here:
+  /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification.
+  ///
+  EfiMemoryStatePartial      = 6
+} EFI_MEMORY_STATE;
+
+///
+/// This data record describes a memory device. This data record is a structure.
+/// The type definition structure for EFI_MEMORY_ARRAY_LINK_DATA is in SMBIOS 2.3.4.
+///
+typedef struct {
+  ///
+  /// A string that identifies the physically labeled socket or board position where the
+  /// memory device is located.
+  ///
+  STRING_REF                        MemoryDeviceLocator;
+  ///
+  /// A string denoting the physically labeled bank where the memory device is located.
+  ///
+  STRING_REF                        MemoryBankLocator;
+  ///
+  /// A string denoting the memory manufacturer.
+  ///
+  STRING_REF                        MemoryManufacturer;
+  ///
+  /// A string denoting the serial number of the memory device.
+  ///
+  STRING_REF                        MemorySerialNumber;
+  ///
+  /// The asset tag of the memory device.
+  ///
+  STRING_REF                        MemoryAssetTag;
+  ///
+  /// A string denoting the part number of the memory device.
+  ///
+  STRING_REF                        MemoryPartNumber;
+  ///
+  /// A link to a memory array structure set.
+  ///
+  EFI_INTER_LINK_DATA               MemoryArrayLink;
+  ///
+  /// A link to a memory array structure set.
+  ///
+  EFI_INTER_LINK_DATA               MemorySubArrayLink;
+  ///
+  /// The total width in bits of this memory device. If there are no error correcting bits,
+  /// then the total width equals the data width. If the width is unknown, then set the field
+  /// to 0xFFFF.
+  ///
+  UINT16                            MemoryTotalWidth;
+  ///
+  /// The data width in bits of the memory device. A data width of 0x00 and a total width
+  /// of 0x08 indicate that the device is used solely for error correction.
+  ///
+  UINT16                            MemoryDataWidth;
+  ///
+  /// The size in bytes of the memory device. A value of 0x00 denotes that no device is
+  /// installed, while a value of all Fs denotes that the size is not known.
+  ///
+  EFI_EXP_BASE2_DATA                MemoryDeviceSize;
+  ///
+  /// The form factor of the memory device.
+  ///
+  EFI_MEMORY_FORM_FACTOR            MemoryFormFactor;
+  ///
+  /// A memory device set that must be populated with all devices of the same type and
+  /// size. A value of 0x00 indicates that the device is not part of any set. A value of 0xFF
+  /// indicates that the attribute is unknown. Any other value denotes the set number.
+  ///
+  UINT8                             MemoryDeviceSet;
+  ///
+  /// The memory type in the socket.
+  ///
+  EFI_MEMORY_ARRAY_TYPE             MemoryType;
+  ///
+  /// The memory type details.
+  ///
+  EFI_MEMORY_TYPE_DETAIL            MemoryTypeDetail;
+  ///
+  /// The memory speed in megahertz (MHz). A value of 0x00 denotes that
+  /// the speed is unknown.
+  /// Inconsistent with specification here:
+  /// In MemSubclass specification 0.9, the naming is MemoryTypeSpeed.
+  /// Keep it unchanged for backward compatibilty.
+  ///
+  EFI_EXP_BASE10_DATA               MemorySpeed;
+  ///
+  /// The memory state.
+  ///
+  EFI_MEMORY_STATE                  MemoryState;
+} EFI_MEMORY_ARRAY_LINK_DATA;
+
+
+#define EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER    0x00000004
+
+///
+/// This data record refers to a specified physical memory array associated with
+/// a given memory range.
+///
+typedef struct {
+  ///
+  /// The starting physical address in bytes of memory mapped to a specified physical
+  /// memory array.
+  ///
+  EFI_PHYSICAL_ADDRESS              MemoryArrayStartAddress;
+  ///
+  /// The last physical address in bytes of memory mapped to a specified physical memory
+  /// array.
+  ///
+  EFI_PHYSICAL_ADDRESS              MemoryArrayEndAddress;
+  ///
+  /// See Physical Memory Array (Type 16) for physical memory array structures.
+  ///
+  EFI_INTER_LINK_DATA               PhysicalMemoryArrayLink;
+  ///
+  /// The number of memory devices that form a single row of memory for the address
+  /// partition.
+  ///
+  UINT16                            MemoryArrayPartitionWidth;
+} EFI_MEMORY_ARRAY_START_ADDRESS_DATA;
+
+
+#define EFI_MEMORY_DEVICE_START_ADDRESS_RECORD_NUMBER    0x00000005
+
+///
+/// This data record refers to a physical memory device that is associated with
+/// a given memory range.
+///
+typedef struct {
+  ///
+  /// The starting physical address that is associated with the device.
+  ///
+  EFI_PHYSICAL_ADDRESS              MemoryDeviceStartAddress;
+  ///
+  /// The ending physical address that is associated with the device.
+  ///
+  EFI_PHYSICAL_ADDRESS              MemoryDeviceEndAddress;
+  ///
+  /// A link to the memory device data structure.
+  ///
+  EFI_INTER_LINK_DATA               PhysicalMemoryDeviceLink;
+  ///
+  /// A link to the memory array data structure.
+  ///
+  EFI_INTER_LINK_DATA               PhysicalMemoryArrayLink;
+  ///
+  /// The position of the memory device in a row. A value of 0x00 is reserved and a value
+  /// of 0xFF indicates that the position is unknown.
+  ///
+  UINT8                             MemoryDevicePartitionRowPosition;
+  ///
+  /// The position of the device in an interleave.
+  ///
+  UINT8                             MemoryDeviceInterleavePosition;
+  ///
+  /// The maximum number of consecutive rows from the device that are accessed in a
+  /// single interleave transfer. A value of 0x00 indicates that the device is not interleaved
+  /// and a value of 0xFF indicates that the interleave configuration is unknown.
+  ///
+  UINT8                             MemoryDeviceInterleaveDataDepth;
+} EFI_MEMORY_DEVICE_START_ADDRESS_DATA;
+
+
+//
+//  Memory. Channel Device Type -  SMBIOS Type 37
+//
+
+#define EFI_MEMORY_CHANNEL_TYPE_RECORD_NUMBER    0x00000006
+
+typedef enum _EFI_MEMORY_CHANNEL_TYPE {
+  EfiMemoryChannelTypeOther                   = 1,
+  EfiMemoryChannelTypeUnknown                 = 2,
+  EfiMemoryChannelTypeRambus                  = 3,
+  EfiMemoryChannelTypeSyncLink                = 4
+} EFI_MEMORY_CHANNEL_TYPE;
+
+///
+/// This data record refers the type of memory that is associated with the channel. This data record is a
+/// structure.
+/// The type definition structure for EFI_MEMORY_CHANNEL_TYPE_DATA is in SMBIOS 2.3.4,
+/// Table 3.3.38, Type 37, with the following offsets:
+///   - Offset 0x4
+///   - Offset 0x5
+///   - Offset 0x6
+///
+typedef struct {
+  ///
+  /// The type of memory that is associated with the channel.
+  ///
+  EFI_MEMORY_CHANNEL_TYPE           MemoryChannelType;
+  ///
+  /// The maximum load that is supported by the channel.
+  ///
+  UINT8                             MemoryChannelMaximumLoad;
+  ///
+  /// The number of memory devices on this channel.
+  ///
+  UINT8                             MemoryChannelDeviceCount;
+} EFI_MEMORY_CHANNEL_TYPE_DATA;
+
+#define EFI_MEMORY_CHANNEL_DEVICE_RECORD_NUMBER    0x00000007
+
+///
+/// This data record refers to the memory device that is associated with the memory channel. This data
+/// record is a structure.
+/// The type definition structure for EFI_MEMORY_CHANNEL_DEVICE_DATA is in SMBIOS 2.3.4,
+/// Table 3.3.38, Type 37, with the following offsets:
+///   - Offset 0x7
+///   - Offset 0x8
+///
+typedef struct {
+  ///
+  /// A number between one and MemoryChannelDeviceCount plus an arbitrary base.
+  ///
+  UINT8                             DeviceId;
+  ///
+  /// The Link of the associated memory device. See Memory Device (Type 17) for
+  /// memory devices.
+  ///
+  EFI_INTER_LINK_DATA               DeviceLink;
+  ///
+  /// The number of load units that this device consumes.
+  ///
+  UINT8                             MemoryChannelDeviceLoad;
+} EFI_MEMORY_CHANNEL_DEVICE_DATA;
+
+//
+//  Memory. Controller Information - SMBIOS Type 5
+//
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+#define EFI_MEMORY_CONTROLLER_INFORMATION_RECORD_NUMBER    0x00000008
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef enum {
+  EfiErrorDetectingMethodOther   = 1,
+  EfiErrorDetectingMethodUnknown = 2,
+  EfiErrorDetectingMethodNone    = 3,
+  EfiErrorDetectingMethodParity  = 4,
+  EfiErrorDetectingMethod32Ecc   = 5,
+  EfiErrorDetectingMethod64Ecc   = 6,
+  EfiErrorDetectingMethod128Ecc  = 7,
+  EfiErrorDetectingMethodCrc     = 8
+} EFI_MEMORY_ERROR_DETECT_METHOD_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  UINT8                             Other                 :1;
+  UINT8                             Unknown               :1;
+  UINT8                             None                  :1;
+  UINT8                             SingleBitErrorCorrect :1;
+  UINT8                             DoubleBitErrorCorrect :1;
+  UINT8                             ErrorScrubbing        :1;
+  UINT8                             Reserved              :2;
+} EFI_MEMORY_ERROR_CORRECT_CAPABILITY;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef enum {
+  EfiMemoryInterleaveOther      = 1,
+  EfiMemoryInterleaveUnknown    = 2,
+  EfiMemoryInterleaveOneWay     = 3,
+  EfiMemoryInterleaveTwoWay     = 4,
+  EfiMemoryInterleaveFourWay    = 5,
+  EfiMemoryInterleaveEightWay   = 6,
+  EfiMemoryInterleaveSixteenWay = 7
+} EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  UINT16                            Other    :1;
+  UINT16                            Unknown  :1;
+  UINT16                            SeventyNs:1;
+  UINT16                            SixtyNs  :1;
+  UINT16                            FiftyNs  :1;
+  UINT16                            Reserved :11;
+} EFI_MEMORY_SPEED_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  UINT16                            Other       :1;
+  UINT16                            Unknown     :1;
+  UINT16                            Standard    :1;
+  UINT16                            FastPageMode:1;
+  UINT16                            EDO         :1;
+  UINT16                            Parity      :1;
+  UINT16                            ECC         :1;
+  UINT16                            SIMM        :1;
+  UINT16                            DIMM        :1;
+  UINT16                            BurstEdo    :1;
+  UINT16                            SDRAM       :1;
+  UINT16                            Reserved    :5;
+} EFI_MEMORY_SUPPORTED_TYPE;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  UINT8                             Five    :1;
+  UINT8                             Three   :1;
+  UINT8                             Two     :1;
+  UINT8                             Reserved:5;
+} EFI_MEMORY_MODULE_VOLTAGE_TYPE;
+
+///
+/// EFI_MEMORY_CONTROLLER_INFORMATION is obsolete
+/// Use EFI_MEMORY_CONTROLLER_INFORMATION_DATA instead
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  EFI_MEMORY_ERROR_DETECT_METHOD_TYPE ErrorDetectingMethod;
+  EFI_MEMORY_ERROR_CORRECT_CAPABILITY ErrorCorrectingCapability;
+  EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE  MemorySupportedInterleave;
+  EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE  MemoryCurrentInterleave;
+  UINT8                               MaxMemoryModuleSize;
+  EFI_MEMORY_SPEED_TYPE               MemorySpeedType;
+  EFI_MEMORY_SUPPORTED_TYPE           MemorySupportedType;
+  EFI_MEMORY_MODULE_VOLTAGE_TYPE      MemoryModuleVoltage;
+  UINT8                               NumberofMemorySlot;
+  EFI_MEMORY_ERROR_CORRECT_CAPABILITY EnabledCorrectingCapability;
+  UINT16                              *MemoryModuleConfigHandles;
+} EFI_MEMORY_CONTROLLER_INFORMATION;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 5.
+///
+typedef struct {
+  EFI_MEMORY_ERROR_DETECT_METHOD_TYPE   ErrorDetectingMethod;
+  EFI_MEMORY_ERROR_CORRECT_CAPABILITY   ErrorCorrectingCapability;
+  EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE    MemorySupportedInterleave;
+  EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE    MemoryCurrentInterleave;
+  UINT8                                 MaxMemoryModuleSize;
+  EFI_MEMORY_SPEED_TYPE                 MemorySpeedType;
+  EFI_MEMORY_SUPPORTED_TYPE             MemorySupportedType;
+  EFI_MEMORY_MODULE_VOLTAGE_TYPE        MemoryModuleVoltage;
+  UINT8                                 NumberofMemorySlot;
+  EFI_MEMORY_ERROR_CORRECT_CAPABILITY   EnabledCorrectingCapability;
+  EFI_INTER_LINK_DATA                   MemoryModuleConfig[1];
+} EFI_MEMORY_CONTROLLER_INFORMATION_DATA;
+
+///
+/// Memory. Error Information - SMBIOS Type 18
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 18.
+///
+#define EFI_MEMORY_32BIT_ERROR_INFORMATION_RECORD_NUMBER    0x00000009
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 18.
+///
+typedef enum {
+  EfiMemoryErrorOther             = 1,
+  EfiMemoryErrorUnknown           = 2,
+  EfiMemoryErrorOk                = 3,
+  EfiMemoryErrorBadRead           = 4,
+  EfiMemoryErrorParity            = 5,
+  EfiMemoryErrorSigleBit          = 6,
+  EfiMemoryErrorDoubleBit         = 7,
+  EfiMemoryErrorMultiBit          = 8,
+  EfiMemoryErrorNibble            = 9,
+  EfiMemoryErrorChecksum          = 10,
+  EfiMemoryErrorCrc               = 11,
+  EfiMemoryErrorCorrectSingleBit  = 12,
+  EfiMemoryErrorCorrected         = 13,
+  EfiMemoryErrorUnCorrectable     = 14
+} EFI_MEMORY_ERROR_TYPE;
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 18.
+///
+typedef enum {
+  EfiMemoryGranularityOther               = 1,
+  EfiMemoryGranularityOtherUnknown        = 2,
+  EfiMemoryGranularityDeviceLevel         = 3,
+  EfiMemoryGranularityMemPartitionLevel   = 4
+} EFI_MEMORY_ERROR_GRANULARITY_TYPE;
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 18.
+///
+typedef enum {
+  EfiMemoryErrorOperationOther            = 1,
+  EfiMemoryErrorOperationUnknown          = 2,
+  EfiMemoryErrorOperationRead             = 3,
+  EfiMemoryErrorOperationWrite            = 4,
+  EfiMemoryErrorOperationPartialWrite     = 5
+} EFI_MEMORY_ERROR_OPERATION_TYPE;
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 18.
+///
+typedef struct {
+  EFI_MEMORY_ERROR_TYPE               MemoryErrorType;
+  EFI_MEMORY_ERROR_GRANULARITY_TYPE   MemoryErrorGranularity;
+  EFI_MEMORY_ERROR_OPERATION_TYPE     MemoryErrorOperation;
+  UINT32                              VendorSyndrome;
+  UINT32                              MemoryArrayErrorAddress;
+  UINT32                              DeviceErrorAddress;
+  UINT32                              DeviceErrorResolution;
+} EFI_MEMORY_32BIT_ERROR_INFORMATION;
+
+///
+/// Memory. Error Information - SMBIOS Type 33.
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 33.
+///
+#define EFI_MEMORY_64BIT_ERROR_INFORMATION_RECORD_NUMBER    0x0000000A
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 type 33.
+///
+typedef struct {
+  EFI_MEMORY_ERROR_TYPE             MemoryErrorType;
+  EFI_MEMORY_ERROR_GRANULARITY_TYPE MemoryErrorGranularity;
+  EFI_MEMORY_ERROR_OPERATION_TYPE   MemoryErrorOperation;
+  UINT32                            VendorSyndrome;
+  UINT64                            MemoryArrayErrorAddress;
+  UINT64                            DeviceErrorAddress;
+  UINT32                            DeviceErrorResolution;
+} EFI_MEMORY_64BIT_ERROR_INFORMATION;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It is implementation-specific to simplify the code logic.
+///
+typedef union _EFI_MEMORY_SUBCLASS_RECORDS {
+  EFI_MEMORY_SIZE_DATA                 SizeData;
+  EFI_MEMORY_ARRAY_LOCATION_DATA       ArrayLocationData;
+  EFI_MEMORY_ARRAY_LINK_DATA           ArrayLink;
+  EFI_MEMORY_ARRAY_START_ADDRESS_DATA  ArrayStartAddress;
+  EFI_MEMORY_DEVICE_START_ADDRESS_DATA DeviceStartAddress;
+  EFI_MEMORY_CHANNEL_TYPE_DATA         ChannelTypeData;
+  EFI_MEMORY_CHANNEL_DEVICE_DATA       ChannelDeviceData;
+  EFI_MEMORY_CONTROLLER_INFORMATION    MemoryControllerInfo;
+  EFI_MEMORY_32BIT_ERROR_INFORMATION   Memory32bitErrorInfo;
+  EFI_MEMORY_64BIT_ERROR_INFORMATION   Memory64bitErrorInfo;
+} EFI_MEMORY_SUBCLASS_RECORDS;
+
+typedef struct {
+  EFI_SUBCLASS_TYPE1_HEADER         Header;
+  EFI_MEMORY_SUBCLASS_RECORDS       Record;
+} EFI_MEMORY_SUBCLASS_DRIVER_DATA;
+
+#define EFI_MISC_SUBCLASS_VERSION     0x0100
+
+#pragma pack(1)
+
+//
+// Last PCI Bus Number
+//
+#define EFI_MISC_LAST_PCI_BUS_RECORD_NUMBER    0x00000001
+
+typedef struct {
+  UINT8                             LastPciBus;
+} EFI_MISC_LAST_PCI_BUS_DATA;
+
+//
+// Misc. BIOS Vendor - SMBIOS Type 0
+//
+#define EFI_MISC_BIOS_VENDOR_RECORD_NUMBER    0x00000002
+
+typedef struct {
+  UINT64                            Reserved1                         :2;
+  UINT64                            Unknown                           :1;
+  UINT64                            BiosCharacteristicsNotSupported   :1;
+  UINT64                            IsaIsSupported                    :1;
+  UINT64                            McaIsSupported                    :1;
+  UINT64                            EisaIsSupported                   :1;
+  UINT64                            PciIsSupported                    :1;
+  UINT64                            PcmciaIsSupported                 :1;
+  UINT64                            PlugAndPlayIsSupported            :1;
+  UINT64                            ApmIsSupported                    :1;
+  UINT64                            BiosIsUpgradable                  :1;
+  UINT64                            BiosShadowingAllowed              :1;
+  UINT64                            VlVesaIsSupported                 :1;
+  UINT64                            EscdSupportIsAvailable            :1;
+  UINT64                            BootFromCdIsSupported             :1;
+  UINT64                            SelectableBootIsSupported         :1;
+  UINT64                            RomBiosIsSocketed                 :1;
+  UINT64                            BootFromPcmciaIsSupported         :1;
+  UINT64                            EDDSpecificationIsSupported       :1;
+  UINT64                            JapaneseNecFloppyIsSupported      :1;
+  UINT64                            JapaneseToshibaFloppyIsSupported  :1;
+  UINT64                            Floppy525_360IsSupported          :1;
+  UINT64                            Floppy525_12IsSupported           :1;
+  UINT64                            Floppy35_720IsSupported           :1;
+  UINT64                            Floppy35_288IsSupported           :1;
+  UINT64                            PrintScreenIsSupported            :1;
+  UINT64                            Keyboard8042IsSupported           :1;
+  UINT64                            SerialIsSupported                 :1;
+  UINT64                            PrinterIsSupported                :1;
+  UINT64                            CgaMonoIsSupported                :1;
+  UINT64                            NecPc98                           :1;
+  UINT64                            AcpiIsSupported                   :1;
+  UINT64                            UsbLegacyIsSupported              :1;
+  UINT64                            AgpIsSupported                    :1;
+  UINT64                            I20BootIsSupported                :1;
+  UINT64                            Ls120BootIsSupported              :1;
+  UINT64                            AtapiZipDriveBootIsSupported      :1;
+  UINT64                            Boot1394IsSupported               :1;
+  UINT64                            SmartBatteryIsSupported           :1;
+  UINT64                            BiosBootSpecIsSupported           :1;
+  UINT64                            FunctionKeyNetworkBootIsSupported :1;
+  UINT64                            Reserved                          :22;
+} EFI_MISC_BIOS_CHARACTERISTICS;
+
+typedef struct {
+  UINT64                            BiosReserved  :16;
+  UINT64                            SystemReserved:16;
+  UINT64                            Reserved      :32;
+} EFI_MISC_BIOS_CHARACTERISTICS_EXTENSION;
+
+typedef struct {
+  STRING_REF                        BiosVendor;
+  STRING_REF                        BiosVersion;
+  STRING_REF                        BiosReleaseDate;
+  EFI_PHYSICAL_ADDRESS              BiosStartingAddress;
+  EFI_EXP_BASE2_DATA                BiosPhysicalDeviceSize;
+  EFI_MISC_BIOS_CHARACTERISTICS     BiosCharacteristics1;
+  EFI_MISC_BIOS_CHARACTERISTICS_EXTENSION
+                                    BiosCharacteristics2;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 0.
+  ///
+  UINT8                             BiosMajorRelease;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 0.
+  ///
+  UINT8                             BiosMinorRelease;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 0.
+  ///
+  UINT8                             BiosEmbeddedFirmwareMajorRelease;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 0.
+  ///
+  UINT8                             BiosEmbeddedFirmwareMinorRelease;
+} EFI_MISC_BIOS_VENDOR_DATA;
+
+//
+// Misc. System Manufacturer - SMBIOS Type 1
+//
+#define EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER    0x00000003
+
+typedef enum {
+  EfiSystemWakeupTypeReserved        = 0,
+  EfiSystemWakeupTypeOther           = 1,
+  EfiSystemWakeupTypeUnknown         = 2,
+  EfiSystemWakeupTypeApmTimer        = 3,
+  EfiSystemWakeupTypeModemRing       = 4,
+  EfiSystemWakeupTypeLanRemote       = 5,
+  EfiSystemWakeupTypePowerSwitch     = 6,
+  EfiSystemWakeupTypePciPme          = 7,
+  EfiSystemWakeupTypeAcPowerRestored = 8
+} EFI_MISC_SYSTEM_WAKEUP_TYPE;
+
+typedef struct {
+  STRING_REF                        SystemManufacturer;
+  STRING_REF                        SystemProductName;
+  STRING_REF                        SystemVersion;
+  STRING_REF                        SystemSerialNumber;
+  EFI_GUID                          SystemUuid;
+  EFI_MISC_SYSTEM_WAKEUP_TYPE       SystemWakeupType;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 1.
+  ///
+  STRING_REF                        SystemSKUNumber;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 1.
+  ///
+  STRING_REF                        SystemFamily;
+} EFI_MISC_SYSTEM_MANUFACTURER_DATA;
+
+//
+// Misc. Base Board Manufacturer - SMBIOS Type 2
+//
+#define EFI_MISC_BASE_BOARD_MANUFACTURER_RECORD_NUMBER    0x00000004
+
+typedef struct {
+  UINT32                            Motherboard           :1;
+  UINT32                            RequiresDaughterCard  :1;
+  UINT32                            Removable             :1;
+  UINT32                            Replaceable           :1;
+  UINT32                            HotSwappable          :1;
+  UINT32                            Reserved              :27;
+} EFI_BASE_BOARD_FEATURE_FLAGS;
+
+typedef enum {
+  EfiBaseBoardTypeUnknown                = 1,
+  EfiBaseBoardTypeOther                  = 2,
+  EfiBaseBoardTypeServerBlade            = 3,
+  EfiBaseBoardTypeConnectivitySwitch     = 4,
+  EfiBaseBoardTypeSystemManagementModule = 5,
+  EfiBaseBoardTypeProcessorModule        = 6,
+  EfiBaseBoardTypeIOModule               = 7,
+  EfiBaseBoardTypeMemoryModule           = 8,
+  EfiBaseBoardTypeDaughterBoard          = 9,
+  EfiBaseBoardTypeMotherBoard            = 0xA,
+  EfiBaseBoardTypeProcessorMemoryModule  = 0xB,
+  EfiBaseBoardTypeProcessorIOModule      = 0xC,
+  EfiBaseBoardTypeInterconnectBoard      = 0xD
+} EFI_BASE_BOARD_TYPE;
+
+typedef struct {
+  STRING_REF                        BaseBoardManufacturer;
+  STRING_REF                        BaseBoardProductName;
+  STRING_REF                        BaseBoardVersion;
+  STRING_REF                        BaseBoardSerialNumber;
+  STRING_REF                        BaseBoardAssetTag;
+  STRING_REF                        BaseBoardChassisLocation;
+  EFI_BASE_BOARD_FEATURE_FLAGS      BaseBoardFeatureFlags;
+  EFI_BASE_BOARD_TYPE               BaseBoardType;
+  EFI_INTER_LINK_DATA               BaseBoardChassisLink;
+  UINT32                            BaseBoardNumberLinks;
+  EFI_INTER_LINK_DATA               LinkN;
+} EFI_MISC_BASE_BOARD_MANUFACTURER_DATA;
+
+//
+// Misc. System/Chassis Enclosure - SMBIOS Type 3
+//
+#define EFI_MISC_CHASSIS_MANUFACTURER_RECORD_NUMBER    0x00000005
+
+typedef enum {
+  EfiMiscChassisTypeOther               = 0x1,
+  EfiMiscChassisTypeUnknown             = 0x2,
+  EfiMiscChassisTypeDeskTop             = 0x3,
+  EfiMiscChassisTypeLowProfileDesktop   = 0x4,
+  EfiMiscChassisTypePizzaBox            = 0x5,
+  EfiMiscChassisTypeMiniTower           = 0x6,
+  EfiMiscChassisTypeTower               = 0x7,
+  EfiMiscChassisTypePortable            = 0x8,
+  EfiMiscChassisTypeLapTop              = 0x9,
+  EfiMiscChassisTypeNotebook            = 0xA,
+  EfiMiscChassisTypeHandHeld            = 0xB,
+  EfiMiscChassisTypeDockingStation      = 0xC,
+  EfiMiscChassisTypeAllInOne            = 0xD,
+  EfiMiscChassisTypeSubNotebook         = 0xE,
+  EfiMiscChassisTypeSpaceSaving         = 0xF,
+  EfiMiscChassisTypeLunchBox            = 0x10,
+  EfiMiscChassisTypeMainServerChassis   = 0x11,
+  EfiMiscChassisTypeExpansionChassis    = 0x12,
+  EfiMiscChassisTypeSubChassis          = 0x13,
+  EfiMiscChassisTypeBusExpansionChassis = 0x14,
+  EfiMiscChassisTypePeripheralChassis   = 0x15,
+  EfiMiscChassisTypeRaidChassis         = 0x16,
+  EfiMiscChassisTypeRackMountChassis    = 0x17,
+  EfiMiscChassisTypeSealedCasePc        = 0x18,
+  EfiMiscChassisMultiSystemChassis      = 0x19
+} EFI_MISC_CHASSIS_TYPE;
+
+typedef struct {
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass 0.9 specification, it has the incorrect field name "EFI_MISC_CHASSIS_TYPE".
+  /// Change it to "ChassisType" to pass build.
+  ///
+  UINT32                            ChassisType       :16;
+  UINT32                            ChassisLockPresent:1;
+  UINT32                            Reserved          :15;
+} EFI_MISC_CHASSIS_STATUS;
+
+typedef enum {
+  EfiChassisStateOther           = 0x01,
+  EfiChassisStateUnknown         = 0x02,
+  EfiChassisStateSafe            = 0x03,
+  EfiChassisStateWarning         = 0x04,
+  EfiChassisStateCritical        = 0x05,
+  EfiChassisStateNonRecoverable  = 0x06
+} EFI_MISC_CHASSIS_STATE;
+
+typedef enum {
+  EfiChassisSecurityStatusOther                          = 0x01,
+  EfiChassisSecurityStatusUnknown                        = 0x02,
+  EfiChassisSecurityStatusNone                           = 0x03,
+  EfiChassisSecurityStatusExternalInterfaceLockedOut     = 0x04,
+  EfiChassisSecurityStatusExternalInterfaceLockedEnabled = 0x05
+} EFI_MISC_CHASSIS_SECURITY_STATE;
+
+typedef struct {
+  UINT32                            RecordType :1;
+  UINT32                            Type       :7;
+  UINT32                            Reserved   :24;
+} EFI_MISC_ELEMENT_TYPE;
+
+typedef struct {
+  EFI_MISC_ELEMENT_TYPE             ChassisElementType;
+  EFI_INTER_LINK_DATA               ChassisElementStructure;
+  EFI_BASE_BOARD_TYPE               ChassisBaseBoard;
+  UINT32                            ChassisElementMinimum;
+  UINT32                            ChassisElementMaximum;
+} EFI_MISC_ELEMENTS;
+
+typedef struct {
+  STRING_REF                        ChassisManufacturer;
+  STRING_REF                        ChassisVersion;
+  STRING_REF                        ChassisSerialNumber;
+  STRING_REF                        ChassisAssetTag;
+  EFI_MISC_CHASSIS_STATUS           ChassisType;
+  EFI_MISC_CHASSIS_STATE            ChassisBootupState;
+  EFI_MISC_CHASSIS_STATE            ChassisPowerSupplyState;
+  EFI_MISC_CHASSIS_STATE            ChassisThermalState;
+  EFI_MISC_CHASSIS_SECURITY_STATE   ChassisSecurityState;
+  UINT32                            ChassisOemDefined;
+  UINT32                            ChassisHeight;
+  UINT32                            ChassisNumberPowerCords;
+  UINT32                            ChassisElementCount;
+  UINT32                            ChassisElementRecordLength;
+  EFI_MISC_ELEMENTS                 ChassisElements;
+} EFI_MISC_CHASSIS_MANUFACTURER_DATA;
+
+//
+// Misc. Port Connector Information - SMBIOS Type 8
+//
+#define EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_RECORD_NUMBER    0x00000006
+
+typedef enum {
+  EfiPortConnectorTypeNone                   = 0x00,
+  EfiPortConnectorTypeCentronics             = 0x01,
+  EfiPortConnectorTypeMiniCentronics         = 0x02,
+  EfiPortConnectorTypeProprietary            = 0x03,
+  EfiPortConnectorTypeDB25Male               = 0x04,
+  EfiPortConnectorTypeDB25Female             = 0x05,
+  EfiPortConnectorTypeDB15Male               = 0x06,
+  EfiPortConnectorTypeDB15Female             = 0x07,
+  EfiPortConnectorTypeDB9Male                = 0x08,
+  EfiPortConnectorTypeDB9Female              = 0x09,
+  EfiPortConnectorTypeRJ11                   = 0x0A,
+  EfiPortConnectorTypeRJ45                   = 0x0B,
+  EfiPortConnectorType50PinMiniScsi          = 0x0C,
+  EfiPortConnectorTypeMiniDin                = 0x0D,
+  EfiPortConnectorTypeMicriDin               = 0x0E,
+  EfiPortConnectorTypePS2                    = 0x0F,
+  EfiPortConnectorTypeInfrared               = 0x10,
+  EfiPortConnectorTypeHpHil                  = 0x11,
+  EfiPortConnectorTypeUsb                    = 0x12,
+  EfiPortConnectorTypeSsaScsi                = 0x13,
+  EfiPortConnectorTypeCircularDin8Male       = 0x14,
+  EfiPortConnectorTypeCircularDin8Female     = 0x15,
+  EfiPortConnectorTypeOnboardIde             = 0x16,
+  EfiPortConnectorTypeOnboardFloppy          = 0x17,
+  EfiPortConnectorType9PinDualInline         = 0x18,
+  EfiPortConnectorType25PinDualInline        = 0x19,
+  EfiPortConnectorType50PinDualInline        = 0x1A,
+  EfiPortConnectorType68PinDualInline        = 0x1B,
+  EfiPortConnectorTypeOnboardSoundInput      = 0x1C,
+  EfiPortConnectorTypeMiniCentronicsType14   = 0x1D,
+  EfiPortConnectorTypeMiniCentronicsType26   = 0x1E,
+  EfiPortConnectorTypeHeadPhoneMiniJack      = 0x1F,
+  EfiPortConnectorTypeBNC                    = 0x20,
+  EfiPortConnectorType1394                   = 0x21,
+  EfiPortConnectorTypePC98                   = 0xA0,
+  EfiPortConnectorTypePC98Hireso             = 0xA1,
+  EfiPortConnectorTypePCH98                  = 0xA2,
+  EfiPortConnectorTypePC98Note               = 0xA3,
+  EfiPortConnectorTypePC98Full               = 0xA4,
+  EfiPortConnectorTypeOther                  = 0xFF
+} EFI_MISC_PORT_CONNECTOR_TYPE;
+
+typedef enum {
+  EfiPortTypeNone                      = 0x00,
+  EfiPortTypeParallelXtAtCompatible    = 0x01,
+  EfiPortTypeParallelPortPs2           = 0x02,
+  EfiPortTypeParallelPortEcp           = 0x03,
+  EfiPortTypeParallelPortEpp           = 0x04,
+  EfiPortTypeParallelPortEcpEpp        = 0x05,
+  EfiPortTypeSerialXtAtCompatible      = 0x06,
+  EfiPortTypeSerial16450Compatible     = 0x07,
+  EfiPortTypeSerial16550Compatible     = 0x08,
+  EfiPortTypeSerial16550ACompatible    = 0x09,
+  EfiPortTypeScsi                      = 0x0A,
+  EfiPortTypeMidi                      = 0x0B,
+  EfiPortTypeJoyStick                  = 0x0C,
+  EfiPortTypeKeyboard                  = 0x0D,
+  EfiPortTypeMouse                     = 0x0E,
+  EfiPortTypeSsaScsi                   = 0x0F,
+  EfiPortTypeUsb                       = 0x10,
+  EfiPortTypeFireWire                  = 0x11,
+  EfiPortTypePcmciaTypeI               = 0x12,
+  EfiPortTypePcmciaTypeII              = 0x13,
+  EfiPortTypePcmciaTypeIII             = 0x14,
+  EfiPortTypeCardBus                   = 0x15,
+  EfiPortTypeAccessBusPort             = 0x16,
+  EfiPortTypeScsiII                    = 0x17,
+  EfiPortTypeScsiWide                  = 0x18,
+  EfiPortTypePC98                      = 0x19,
+  EfiPortTypePC98Hireso                = 0x1A,
+  EfiPortTypePCH98                     = 0x1B,
+  EfiPortTypeVideoPort                 = 0x1C,
+  EfiPortTypeAudioPort                 = 0x1D,
+  EfiPortTypeModemPort                 = 0x1E,
+  EfiPortTypeNetworkPort               = 0x1F,
+  EfiPortType8251Compatible            = 0xA0,
+  EfiPortType8251FifoCompatible        = 0xA1,
+  EfiPortTypeOther                     = 0xFF
+} EFI_MISC_PORT_TYPE;
+
+typedef struct {
+  STRING_REF                        PortInternalConnectorDesignator;
+  STRING_REF                        PortExternalConnectorDesignator;
+  EFI_MISC_PORT_CONNECTOR_TYPE      PortInternalConnectorType;
+  EFI_MISC_PORT_CONNECTOR_TYPE      PortExternalConnectorType;
+  EFI_MISC_PORT_TYPE                PortType;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this type of field is defined as EFI_DEVICE_PATH_PROTOCOL,
+  /// which causes the implementation some complexity. Keep it unchanged for backward
+  /// compatibility.
+  ///
+  EFI_MISC_PORT_DEVICE_PATH         PortPath;
+} EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA;
+
+//
+// Misc. System Slots - SMBIOS Type 9
+//
+#define EFI_MISC_SYSTEM_SLOT_DESIGNATION_RECORD_NUMBER    0x00000007
+
+typedef enum {
+  EfiSlotTypeOther                        = 0x01,
+  EfiSlotTypeUnknown                      = 0x02,
+  EfiSlotTypeIsa                          = 0x03,
+  EfiSlotTypeMca                          = 0x04,
+  EfiSlotTypeEisa                         = 0x05,
+  EfiSlotTypePci                          = 0x06,
+  EfiSlotTypePcmcia                       = 0x07,
+  EfiSlotTypeVlVesa                       = 0x08,
+  EfiSlotTypeProprietary                  = 0x09,
+  EfiSlotTypeProcessorCardSlot            = 0x0A,
+  EfiSlotTypeProprietaryMemoryCardSlot    = 0x0B,
+  EfiSlotTypeIORiserCardSlot              = 0x0C,
+  EfiSlotTypeNuBus                        = 0x0D,
+  EfiSlotTypePci66MhzCapable              = 0x0E,
+  EfiSlotTypeAgp                          = 0x0F,
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, its naming should be EfiSlotTypeAgp2X
+  /// rather than EfiSlotTypeApg2X.
+  ///
+  EfiSlotTypeAgp2X                        = 0x10,
+  EfiSlotTypeAgp4X                        = 0x11,
+  EfiSlotTypePciX                         = 0x12,
+  EfiSlotTypeAgp8x                        = 0x13,
+  EfiSlotTypePC98C20                      = 0xA0,
+  EfiSlotTypePC98C24                      = 0xA1,
+  EfiSlotTypePC98E                        = 0xA2,
+  EfiSlotTypePC98LocalBus                 = 0xA3,
+  EfiSlotTypePC98Card                     = 0xA4,
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, these fields aren't defined.
+  /// They're introduced for SmBios 2.6 specification type 9.
+  ///
+  EfiSlotTypePciExpress                   = 0xA5,
+  EfiSlotTypePciExpressX1                 = 0xA6,
+  EfiSlotTypePciExpressX2                 = 0xA7,
+  EfiSlotTypePciExpressX4                 = 0xA8,
+  EfiSlotTypePciExpressX8                 = 0xA9,
+  EfiSlotTypePciExpressX16                = 0xAA
+} EFI_MISC_SLOT_TYPE;
+
+typedef enum {
+  EfiSlotDataBusWidthOther      = 0x01,
+  EfiSlotDataBusWidthUnknown    = 0x02,
+  EfiSlotDataBusWidth8Bit       = 0x03,
+  EfiSlotDataBusWidth16Bit      = 0x04,
+  EfiSlotDataBusWidth32Bit      = 0x05,
+  EfiSlotDataBusWidth64Bit      = 0x06,
+  EfiSlotDataBusWidth128Bit     = 0x07,
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, these fields aren't defined.
+  /// They're introduced for SmBios 2.6 specification type 9.
+  ///
+  EfiSlotDataBusWidth1xOrx1     = 0x8,
+  EfiSlotDataBusWidth2xOrx2     = 0x9,
+  EfiSlotDataBusWidth4xOrx4     = 0xA,
+  EfiSlotDataBusWidth8xOrx8     = 0xB,
+  EfiSlotDataBusWidth12xOrx12   = 0xC,
+  EfiSlotDataBusWidth16xOrx16   = 0xD,
+  EfiSlotDataBusWidth32xOrx32   = 0xE
+} EFI_MISC_SLOT_DATA_BUS_WIDTH;
+
+typedef enum {
+  EfiSlotUsageOther     = 1,
+  EfiSlotUsageUnknown   = 2,
+  EfiSlotUsageAvailable = 3,
+  EfiSlotUsageInUse     = 4
+} EFI_MISC_SLOT_USAGE;
+
+typedef enum {
+  EfiSlotLengthOther   = 1,
+  EfiSlotLengthUnknown = 2,
+  EfiSlotLengthShort   = 3,
+  EfiSlotLengthLong    = 4
+} EFI_MISC_SLOT_LENGTH;
+
+typedef struct {
+  UINT32                            CharacteristicsUnknown  :1;
+  UINT32                            Provides50Volts         :1;
+  UINT32                            Provides33Volts         :1;
+  UINT32                            SharedSlot              :1;
+  UINT32                            PcCard16Supported       :1;
+  UINT32                            CardBusSupported        :1;
+  UINT32                            ZoomVideoSupported      :1;
+  UINT32                            ModemRingResumeSupported:1;
+  UINT32                            PmeSignalSupported      :1;
+  UINT32                            HotPlugDevicesSupported :1;
+  UINT32                            SmbusSignalSupported    :1;
+  UINT32                            Reserved                :21;
+} EFI_MISC_SLOT_CHARACTERISTICS;
+
+typedef struct {
+  STRING_REF                        SlotDesignation;
+  EFI_MISC_SLOT_TYPE                SlotType;
+  EFI_MISC_SLOT_DATA_BUS_WIDTH      SlotDataBusWidth;
+  EFI_MISC_SLOT_USAGE               SlotUsage;
+  EFI_MISC_SLOT_LENGTH              SlotLength;
+  UINT16                            SlotId;
+  EFI_MISC_SLOT_CHARACTERISTICS     SlotCharacteristics;
+  EFI_DEVICE_PATH_PROTOCOL          SlotDevicePath;
+} EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA;
+
+//
+// Misc. Onboard Device - SMBIOS Type 10
+//
+#define EFI_MISC_ONBOARD_DEVICE_RECORD_NUMBER    0x00000008
+
+typedef enum {
+  EfiOnBoardDeviceTypeOther          = 1,
+  EfiOnBoardDeviceTypeUnknown        = 2,
+  EfiOnBoardDeviceTypeVideo          = 3,
+  EfiOnBoardDeviceTypeScsiController = 4,
+  EfiOnBoardDeviceTypeEthernet       = 5,
+  EfiOnBoardDeviceTypeTokenRing      = 6,
+  EfiOnBoardDeviceTypeSound          = 7
+} EFI_MISC_ONBOARD_DEVICE_TYPE;
+
+typedef struct {
+  UINT32                            DeviceType    :16;
+  UINT32                            DeviceEnabled :1;
+  UINT32                            Reserved      :15;
+} EFI_MISC_ONBOARD_DEVICE_STATUS;
+
+typedef struct {
+  STRING_REF                        OnBoardDeviceDescription;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, the name is OnBoardDeviceType.
+  /// Keep it unchanged for backward compatibilty.
+  ///
+  EFI_MISC_ONBOARD_DEVICE_STATUS    OnBoardDeviceStatus;
+  EFI_DEVICE_PATH_PROTOCOL          OnBoardDevicePath;
+} EFI_MISC_ONBOARD_DEVICE_DATA;
+
+//
+// Misc. BIOS Language Information - SMBIOS Type 11
+//
+#define EFI_MISC_OEM_STRING_RECORD_NUMBER    0x00000009
+
+typedef struct {
+  STRING_REF                        OemStringRef[1];
+} EFI_MISC_OEM_STRING_DATA;
+
+//
+// Misc. System Options - SMBIOS Type 12
+//
+typedef struct {
+  STRING_REF                        SystemOptionStringRef[1];
+} EFI_MISC_SYSTEM_OPTION_STRING_DATA;
+
+#define EFI_MISC_SYSTEM_OPTION_STRING_RECORD_NUMBER    0x0000000A
+
+//
+// Misc. Number of Installable Languages - SMBIOS Type 13
+//
+#define EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_RECORD_NUMBER    0x0000000B
+
+typedef struct {
+  UINT32                            AbbreviatedLanguageFormat :1;
+  UINT32                            Reserved                  :31;
+} EFI_MISC_LANGUAGE_FLAGS;
+
+typedef struct {
+  UINT16                            NumberOfInstallableLanguages;
+  EFI_MISC_LANGUAGE_FLAGS           LanguageFlags;
+  UINT16                            CurrentLanguageNumber;
+} EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA;
+
+//
+// Misc. System Language String
+//
+#define EFI_MISC_SYSTEM_LANGUAGE_STRING_RECORD_NUMBER    0x0000000C
+
+typedef struct {
+  UINT16                            LanguageId;
+  STRING_REF                        SystemLanguageString;
+} EFI_MISC_SYSTEM_LANGUAGE_STRING_DATA;
+
+//
+// Group Associations - SMBIOS Type 14
+//
+#define EFI_MISC_GROUP_NAME_RECORD_NUMBER    0x0000000D
+
+typedef struct {
+  STRING_REF                        GroupName;
+  UINT16                            NumberGroupItems;
+  UINT16                            GroupId;
+} EFI_MISC_GROUP_NAME_DATA;
+
+//
+// Group Item Set Element
+//
+#define EFI_MISC_GROUP_ITEM_SET_RECORD_NUMBER    0x0000000E
+
+typedef struct {
+  EFI_GUID                          SubClass;
+  EFI_INTER_LINK_DATA               GroupLink;
+  UINT16                            GroupId;
+  UINT16                            GroupElementId;
+} EFI_MISC_GROUP_ITEM_SET_DATA;
+
+//
+//  Misc. Pointing Device Type - SMBIOS Type 21
+//
+#define EFI_MISC_POINTING_DEVICE_TYPE_RECORD_NUMBER    0x0000000F
+
+typedef enum {
+  EfiPointingDeviceTypeOther         = 0x01,
+  EfiPointingDeviceTypeUnknown       = 0x02,
+  EfiPointingDeviceTypeMouse         = 0x03,
+  EfiPointingDeviceTypeTrackBall     = 0x04,
+  EfiPointingDeviceTypeTrackPoint    = 0x05,
+  EfiPointingDeviceTypeGlidePoint    = 0x06,
+  EfiPointingDeviceTouchPad          = 0x07,
+  EfiPointingDeviceTouchScreen       = 0x08,
+  EfiPointingDeviceOpticalSensor     = 0x09
+} EFI_MISC_POINTING_DEVICE_TYPE;
+
+typedef enum {
+  EfiPointingDeviceInterfaceOther              = 0x01,
+  EfiPointingDeviceInterfaceUnknown            = 0x02,
+  EfiPointingDeviceInterfaceSerial             = 0x03,
+  EfiPointingDeviceInterfacePs2                = 0x04,
+  EfiPointingDeviceInterfaceInfrared           = 0x05,
+  EfiPointingDeviceInterfaceHpHil              = 0x06,
+  EfiPointingDeviceInterfaceBusMouse           = 0x07,
+  EfiPointingDeviceInterfaceADB                = 0x08,
+  EfiPointingDeviceInterfaceBusMouseDB9        = 0xA0,
+  EfiPointingDeviceInterfaceBusMouseMicroDin   = 0xA1,
+  EfiPointingDeviceInterfaceUsb                = 0xA2
+} EFI_MISC_POINTING_DEVICE_INTERFACE;
+
+typedef struct {
+  EFI_MISC_POINTING_DEVICE_TYPE       PointingDeviceType;
+  EFI_MISC_POINTING_DEVICE_INTERFACE  PointingDeviceInterface;
+  UINT16                              NumberPointingDeviceButtons;
+  EFI_DEVICE_PATH_PROTOCOL            PointingDevicePath;
+} EFI_MISC_POINTING_DEVICE_TYPE_DATA;
+
+//
+// Portable Battery - SMBIOS Type 22
+//
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the name is EFI_MISC_BATTERY_LOCATION_RECORD_NUMBER.
+/// Keep it unchanged for backward compatibilty.
+///
+#define EFI_MISC_PORTABLE_BATTERY_RECORD_NUMBER   0x00000010
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_BATTERY_DEVICE_CHEMISTRY.
+/// And all field namings are also different with specification.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef enum {
+  EfiPortableBatteryDeviceChemistryOther = 1,
+  EfiPortableBatteryDeviceChemistryUnknown = 2,
+  EfiPortableBatteryDeviceChemistryLeadAcid = 3,
+  EfiPortableBatteryDeviceChemistryNickelCadmium = 4,
+  EfiPortableBatteryDeviceChemistryNickelMetalHydride = 5,
+  EfiPortableBatteryDeviceChemistryLithiumIon = 6,
+  EfiPortableBatteryDeviceChemistryZincAir = 7,
+  EfiPortableBatteryDeviceChemistryLithiumPolymer = 8
+} EFI_MISC_PORTABLE_BATTERY_DEVICE_CHEMISTRY;
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_BATTERY_LOCATION_DATA.
+/// Also, the name and the order of the fields vary with specifications.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef struct {
+  STRING_REF                        Location;
+  STRING_REF                        Manufacturer;
+  STRING_REF                        ManufactureDate;
+  STRING_REF                        SerialNumber;
+  STRING_REF                        DeviceName;
+  EFI_MISC_PORTABLE_BATTERY_DEVICE_CHEMISTRY
+                                    DeviceChemistry;
+  UINT16                            DesignCapacity;
+  UINT16                            DesignVoltage;
+  STRING_REF                        SBDSVersionNumber;
+  UINT8                             MaximumError;
+  UINT16                            SBDSSerialNumber;
+  UINT16                            SBDSManufactureDate;
+  STRING_REF                        SBDSDeviceChemistry;
+  UINT8                             DesignCapacityMultiplier;
+  UINT32                            OEMSpecific;
+  UINT8                             BatteryNumber; // Temporary
+  BOOLEAN                           Valid; // Is entry valid - Temporary
+} EFI_MISC_PORTABLE_BATTERY;
+
+
+//
+// Misc. Reset Capabilities - SMBIOS Type 23
+//
+#define EFI_MISC_RESET_CAPABILITIES_RECORD_NUMBER    0x00000011
+
+typedef struct {
+  UINT32                            Status              :1;
+  UINT32                            BootOption          :2;
+  UINT32                            BootOptionOnLimit   :2;
+  UINT32                            WatchdogTimerPresent:1;
+  UINT32                            Reserved            :26;
+} EFI_MISC_RESET_CAPABILITIES_TYPE;
+
+typedef struct {
+  EFI_MISC_RESET_CAPABILITIES_TYPE  ResetCapabilities;
+  UINT16                            ResetCount;
+  UINT16                            ResetLimit;
+  UINT16                            ResetTimerInterval;
+  UINT16                            ResetTimeout;
+} EFI_MISC_RESET_CAPABILITIES;
+
+typedef struct {
+    EFI_MISC_RESET_CAPABILITIES     ResetCapabilities;
+    UINT16                          ResetCount;
+    UINT16                          ResetLimit;
+    UINT16                          ResetTimerInterval;
+    UINT16                          ResetTimeout;
+} EFI_MISC_RESET_CAPABILITIES_DATA;
+
+//
+// Misc. Hardware Security - SMBIOS Type 24
+//
+#define EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA_RECORD_NUMBER    0x00000012
+
+///
+/// Inconsistent with specification here:
+/// The MiscSubclass specification 0.9 only mentions the possible value of each field in
+/// EFI_MISC_HARDWARE_SECURITY_SETTINGS.
+/// It's implementation-specific in order to to simplify the code logic.
+///
+typedef enum {
+  EfiHardwareSecurityStatusDisabled       = 0,
+  EfiHardwareSecurityStatusEnabled        = 1,
+  EfiHardwareSecurityStatusNotImplemented = 2,
+  EfiHardwareSecurityStatusUnknown        = 3
+} EFI_MISC_HARDWARE_SECURITY_STATUS;
+
+typedef struct {
+  UINT32 FrontPanelResetStatus       :2;
+  UINT32 AdministratorPasswordStatus :2;
+  UINT32 KeyboardPasswordStatus      :2;
+  UINT32 PowerOnPasswordStatus       :2;
+  UINT32 Reserved                    :24;
+} EFI_MISC_HARDWARE_SECURITY_SETTINGS;
+
+typedef struct {
+  EFI_MISC_HARDWARE_SECURITY_SETTINGS HardwareSecuritySettings;
+} EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA;
+
+//
+// System Power Controls - SMBIOS Type 25
+//
+#define EFI_MISC_SCHEDULED_POWER_ON_MONTH_RECORD_NUMBER    0x00000013
+
+typedef struct {
+  UINT16                            ScheduledPoweronMonth;
+  UINT16                            ScheduledPoweronDayOfMonth;
+  UINT16                            ScheduledPoweronHour;
+  UINT16                            ScheduledPoweronMinute;
+  UINT16                            ScheduledPoweronSecond;
+} EFI_MISC_SCHEDULED_POWER_ON_MONTH_DATA;
+
+//
+// Voltage Probe - SMBIOS Type 26
+//
+#define EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_RECORD_NUMBER    0x00000014
+
+typedef struct {
+  UINT32                            VoltageProbeSite        :5;
+  UINT32                            VoltageProbeStatus      :3;
+  UINT32                            Reserved                :24;
+} EFI_MISC_VOLTAGE_PROBE_LOCATION;
+
+typedef struct {
+  STRING_REF                        VoltageProbeDescription;
+  EFI_MISC_VOLTAGE_PROBE_LOCATION   VoltageProbeLocation;
+  EFI_EXP_BASE10_DATA               VoltageProbeMaximumValue;
+  EFI_EXP_BASE10_DATA               VoltageProbeMinimumValue;
+  EFI_EXP_BASE10_DATA               VoltageProbeResolution;
+  EFI_EXP_BASE10_DATA               VoltageProbeTolerance;
+  EFI_EXP_BASE10_DATA               VoltageProbeAccuracy;
+  EFI_EXP_BASE10_DATA               VoltageProbeNominalValue;
+  EFI_EXP_BASE10_DATA               MDLowerNoncriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperNoncriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDLowerCriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperCriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDLowerNonrecoverableThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperNonrecoverableThreshold;
+  UINT32                            VoltageProbeOemDefined;
+} EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_DATA;
+
+//
+// Cooling Device - SMBIOS Type 27
+//
+#define EFI_MISC_COOLING_DEVICE_TEMP_LINK_RECORD_NUMBER    0x00000015
+
+typedef struct {
+  UINT32                            CoolingDevice       :5;
+  UINT32                            CoolingDeviceStatus :3;
+  UINT32                            Reserved            :24;
+} EFI_MISC_COOLING_DEVICE_TYPE;
+
+typedef struct {
+  EFI_MISC_COOLING_DEVICE_TYPE      CoolingDeviceType;
+  EFI_INTER_LINK_DATA               CoolingDeviceTemperatureLink;
+  UINT8                             CoolingDeviceUnitGroup;
+  UINT16                            CoolingDeviceNominalSpeed;
+  UINT32                            CoolingDeviceOemDefined;
+} EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA;
+
+//
+// Temperature Probe - SMBIOS Type 28
+//
+#define EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_RECORD_NUMBER    0x00000016
+
+typedef struct {
+  UINT32                            TemperatureProbeSite   :5;
+  UINT32                            TemperatureProbeStatus :3;
+  UINT32                            Reserved               :24;
+} EFI_MISC_TEMPERATURE_PROBE_LOCATION;
+
+typedef struct {
+  STRING_REF                        TemperatureProbeDescription;
+  EFI_MISC_TEMPERATURE_PROBE_LOCATION
+                                    TemperatureProbeLocation;
+  ///
+  /// Inconsistent with specification here:
+  /// MiscSubclass 0.9 specification defines the fields type as EFI_EXP_BASE10_DATA.
+  /// In fact, they should be UINT16 type because they refer to 16bit width data.
+  /// Keeping this inconsistency for backward compatibility.
+  ///
+  UINT16                            TemperatureProbeMaximumValue;
+  UINT16                            TemperatureProbeMinimumValue;
+  UINT16                            TemperatureProbeResolution;
+  UINT16                            TemperatureProbeTolerance;
+  UINT16                            TemperatureProbeAccuracy;
+  UINT16                            TemperatureProbeNominalValue;
+  UINT16                            MDLowerNoncriticalThreshold;
+  UINT16                            MDUpperNoncriticalThreshold;
+  UINT16                            MDLowerCriticalThreshold;
+  UINT16                            MDUpperCriticalThreshold;
+  UINT16                            MDLowerNonrecoverableThreshold;
+  UINT16                            MDUpperNonrecoverableThreshold;
+  UINT32                            TemperatureProbeOemDefined;
+} EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA;
+
+//
+// Electrical Current Probe - SMBIOS Type 29
+//
+
+#define EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_RECORD_NUMBER    0x00000017
+
+typedef struct {
+  UINT32                            ElectricalCurrentProbeSite    :5;
+  UINT32                            ElectricalCurrentProbeStatus  :3;
+  UINT32                            Reserved                      :24;
+} EFI_MISC_ELECTRICAL_CURRENT_PROBE_LOCATION;
+
+typedef struct {
+  STRING_REF                        ElectricalCurrentProbeDescription;
+  EFI_MISC_ELECTRICAL_CURRENT_PROBE_LOCATION
+                                    ElectricalCurrentProbeLocation;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeMaximumValue;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeMinimumValue;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeResolution;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeTolerance;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeAccuracy;
+  EFI_EXP_BASE10_DATA               ElectricalCurrentProbeNominalValue;
+  EFI_EXP_BASE10_DATA               MDLowerNoncriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperNoncriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDLowerCriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperCriticalThreshold;
+  EFI_EXP_BASE10_DATA               MDLowerNonrecoverableThreshold;
+  EFI_EXP_BASE10_DATA               MDUpperNonrecoverableThreshold;
+  UINT32                            ElectricalCurrentProbeOemDefined;
+} EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_DATA;
+
+//
+// Out-of-Band Remote Access - SMBIOS Type 30
+//
+
+#define EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_RECORD_NUMBER    0x00000018
+
+typedef struct  {
+  UINT32                            InboundConnectionEnabled  :1;
+  UINT32                            OutboundConnectionEnabled :1;
+  UINT32                            Reserved                  :30;
+} EFI_MISC_REMOTE_ACCESS_CONNECTIONS;
+
+typedef struct {
+  STRING_REF                         RemoteAccessManufacturerNameDescription;
+  EFI_MISC_REMOTE_ACCESS_CONNECTIONS RemoteAccessConnections;
+} EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_DATA;
+
+//
+// Misc. BIS Entry Point - SMBIOS Type 31
+//
+#define EFI_MISC_BIS_ENTRY_POINT_RECORD_NUMBER    0x00000019
+
+typedef struct {
+  EFI_PHYSICAL_ADDRESS              BisEntryPoint;
+} EFI_MISC_BIS_ENTRY_POINT_DATA;
+
+//
+// Misc. Boot Information - SMBIOS Type 32
+//
+#define EFI_MISC_BOOT_INFORMATION_STATUS_RECORD_NUMBER    0x0000001A
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_BOOT_INFORMATION_STATUS_TYPE.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef enum {
+  EfiBootInformationStatusNoError                  = 0x00,
+  EfiBootInformationStatusNoBootableMedia          = 0x01,
+  EfiBootInformationStatusNormalOSFailedLoading    = 0x02,
+  EfiBootInformationStatusFirmwareDetectedFailure  = 0x03,
+  EfiBootInformationStatusOSDetectedFailure        = 0x04,
+  EfiBootInformationStatusUserRequestedBoot        = 0x05,
+  EfiBootInformationStatusSystemSecurityViolation  = 0x06,
+  EfiBootInformationStatusPreviousRequestedImage   = 0x07,
+  EfiBootInformationStatusWatchdogTimerExpired     = 0x08,
+  EfiBootInformationStatusStartReserved            = 0x09,
+  EfiBootInformationStatusStartOemSpecific         = 0x80,
+  EfiBootInformationStatusStartProductSpecific     = 0xC0
+} EFI_MISC_BOOT_INFORMATION_STATUS_DATA_TYPE;
+
+typedef struct {
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, the field name is EFI_MISC_BOOT_INFORMATION_STATUS_TYPE.
+  /// Keep it unchanged for backward compatibilty.
+  ///
+  EFI_MISC_BOOT_INFORMATION_STATUS_DATA_TYPE BootInformationStatus;
+  UINT8                                      BootInformationData[9];
+} EFI_MISC_BOOT_INFORMATION_STATUS_DATA;
+
+//
+// Management Device - SMBIOS Type 34
+//
+#define EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_RECORD_NUMBER    0x0000001B
+
+typedef enum {
+  EfiManagementDeviceTypeOther      = 0x01,
+  EfiManagementDeviceTypeUnknown    = 0x02,
+  EfiManagementDeviceTypeLm75       = 0x03,
+  EfiManagementDeviceTypeLm78       = 0x04,
+  EfiManagementDeviceTypeLm79       = 0x05,
+  EfiManagementDeviceTypeLm80       = 0x06,
+  EfiManagementDeviceTypeLm81       = 0x07,
+  EfiManagementDeviceTypeAdm9240    = 0x08,
+  EfiManagementDeviceTypeDs1780     = 0x09,
+  EfiManagementDeviceTypeMaxim1617  = 0x0A,
+  EfiManagementDeviceTypeGl518Sm    = 0x0B,
+  EfiManagementDeviceTypeW83781D    = 0x0C,
+  EfiManagementDeviceTypeHt82H791   = 0x0D
+} EFI_MISC_MANAGEMENT_DEVICE_TYPE;
+
+typedef enum {
+  EfiManagementDeviceAddressTypeOther   = 1,
+  EfiManagementDeviceAddressTypeUnknown = 2,
+  EfiManagementDeviceAddressTypeIOPort  = 3,
+  EfiManagementDeviceAddressTypeMemory  = 4,
+  EfiManagementDeviceAddressTypeSmbus   = 5
+} EFI_MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE;
+
+typedef struct {
+  STRING_REF                        ManagementDeviceDescription;
+  EFI_MISC_MANAGEMENT_DEVICE_TYPE   ManagementDeviceType;
+  UINTN                             ManagementDeviceAddress;
+  EFI_MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE
+                                    ManagementDeviceAddressType;
+} EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_DATA;
+
+//
+// Management Device Component - SMBIOS Type 35
+//
+
+#define EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_RECORD_NUMBER    0x0000001C
+
+typedef struct {
+  STRING_REF                        ManagementDeviceComponentDescription;
+  EFI_INTER_LINK_DATA               ManagementDeviceLink;
+  EFI_INTER_LINK_DATA               ManagementDeviceComponentLink;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this field is NOT defined.
+  /// It's introduced for SmBios 2.6 specification type 35.
+  ///
+  EFI_INTER_LINK_DATA               ManagementDeviceThresholdLink;
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, this field is NOT defined.
+  /// It's implementation-specific to simplify the code logic.
+  ///
+  UINT8                             ComponentType;
+} EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA;
+
+//
+// IPMI Data Record - SMBIOS Type 38
+//
+typedef enum {
+  EfiIpmiOther = 0,
+  EfiIpmiKcs   = 1,
+  EfiIpmiSmic  = 2,
+  EfiIpmiBt    = 3
+} EFI_MISC_IPMI_INTERFACE_TYPE;
+
+typedef struct {
+  UINT16                            IpmiSpecLeastSignificantDigit:4;
+  UINT16                            IpmiSpecMostSignificantDigit: 4;
+  UINT16                            Reserved:                     8;
+} EFI_MISC_IPMI_SPECIFICATION_REVISION;
+
+typedef struct {
+  EFI_MISC_IPMI_INTERFACE_TYPE      IpmiInterfaceType;
+  EFI_MISC_IPMI_SPECIFICATION_REVISION
+                                    IpmiSpecificationRevision;
+  UINT16                            IpmiI2CSlaveAddress;
+  UINT16                            IpmiNvDeviceAddress;
+  UINT64                            IpmiBaseAddress;
+  EFI_DEVICE_PATH_PROTOCOL          IpmiDevicePath;
+} EFI_MISC_IPMI_INTERFACE_TYPE_DATA;
+
+#define EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER    0x0000001D
+///
+/// The definition above is *NOT* defined in MiscSubclass specifications 0.9.
+/// It's defined for backward compatibility.
+///
+#define EFI_MISC_IPMI_INTERFACE_TYPE_DATA_RECORD_NUMBER EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER
+
+///
+/// System Power supply Record - SMBIOS Type 39
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the type of all fields are UINT32.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef struct {
+  UINT16                            PowerSupplyHotReplaceable:1;
+  UINT16                            PowerSupplyPresent       :1;
+  UINT16                            PowerSupplyUnplugged     :1;
+  UINT16                            InputVoltageRangeSwitch  :4;
+  UINT16                            PowerSupplyStatus        :3;
+  UINT16                            PowerSupplyType          :4;
+  UINT16                            Reserved                 :2;
+} EFI_MISC_POWER_SUPPLY_CHARACTERISTICS;
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_POWER_SUPPLY_UNIT_GROUP_DATA.
+/// Keep it unchanged for backward compatibilty.
+///
+typedef struct {
+  UINT16                                 PowerUnitGroup;
+  STRING_REF                             PowerSupplyLocation;
+  STRING_REF                             PowerSupplyDeviceName;
+  STRING_REF                             PowerSupplyManufacturer;
+  STRING_REF                             PowerSupplySerialNumber;
+  STRING_REF                             PowerSupplyAssetTagNumber;
+  STRING_REF                             PowerSupplyModelPartNumber;
+  STRING_REF                             PowerSupplyRevisionLevel;
+  UINT16                                 PowerSupplyMaxPowerCapacity;
+  EFI_MISC_POWER_SUPPLY_CHARACTERISTICS  PowerSupplyCharacteristics;
+  EFI_INTER_LINK_DATA                    PowerSupplyInputVoltageProbeLink;
+  EFI_INTER_LINK_DATA                    PowerSupplyCoolingDeviceLink;
+  EFI_INTER_LINK_DATA                    PowerSupplyInputCurrentProbeLink;
+} EFI_MISC_SYSTEM_POWER_SUPPLY_DATA;
+
+#define EFI_MISC_SYSTEM_POWER_SUPPLY_RECORD_NUMBER    0x0000001E
+
+///
+/// OEM Data Record - SMBIOS Type 0x80-0xFF
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the structure name is EFI_SMBIOS_STRUCTURE_HDR.
+/// Due to this, the structure is commonly used by vendors to construct SmBios type 0x80~0xFF table,
+/// Keep it unchanged for backward compatibilty.
+///
+typedef struct {
+  UINT8                             Type;
+  UINT8                             Length;
+  UINT16                            Handle;
+} SMBIOS_STRUCTURE_HDR;
+
+typedef struct {
+  ///
+  /// Inconsistent with specification here:
+  /// In MiscSubclass specification 0.9, the field name is EFI_SMBIOS_STRUCTURE_HDR.
+  /// Keep it unchanged for backward compatibilty.
+  ///
+  SMBIOS_STRUCTURE_HDR              Header;
+  UINT8                             RawData[1];
+} EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA;
+
+#define EFI_MISC_SMBIOS_STRUCT_ENCAP_RECORD_NUMBER    0x0000001F
+
+///
+/// Misc. System Event Log  - SMBIOS Type 15
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 specification type 15.
+///
+#define EFI_MISC_SYSTEM_EVENT_LOG_RECORD_NUMBER    0x00000020
+
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 specification type 15.
+///
+typedef struct {
+  UINT16                            LogAreaLength;
+  UINT16                            LogHeaderStartOffset;
+  UINT16                            LogDataStartOffset;
+  UINT8                             AccessMethod;
+  UINT8                             LogStatus;
+  UINT32                            LogChangeToken;
+  UINT32                            AccessMethodAddress;
+  UINT8                             LogHeaderFormat;
+  UINT8                             NumberOfSupportedLogType;
+  UINT8                             LengthOfLogDescriptor;
+} EFI_MISC_SYSTEM_EVENT_LOG_DATA;
+
+//
+// Access Method.
+//  0x00~0x04:  as following definition
+//  0x05~0x7f:  Available for future assignment.
+//  0x80~0xff:  BIOS Vendor/OEM-specific.
+//
+#define ACCESS_INDEXIO_1INDEX8BIT_DATA8BIT    0x00
+#define ACCESS_INDEXIO_2INDEX8BIT_DATA8BIT    0X01
+#define ACCESS_INDEXIO_1INDEX16BIT_DATA8BIT   0X02
+#define ACCESS_MEMORY_MAPPED                  0x03
+#define ACCESS_GPNV                           0x04
+
+///
+/// Management Device Threshold Data Record - SMBIOS Type 36
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 specification type 36.
+///
+#define EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD_RECORD_NUMBER    0x00000021
+///
+/// Inconsistent with specification here:
+/// In MiscSubclass specification 0.9, the following data structures are NOT defined.
+/// It's introduced for SmBios 2.6 specification type 36.
+///
+typedef struct {
+  UINT16                            LowerThresNonCritical;
+  UINT16                            UpperThresNonCritical;
+  UINT16                            LowerThresCritical;
+  UINT16                            UpperThresCritical;
+  UINT16                            LowerThresNonRecover;
+  UINT16                            UpperThresNonRecover;
+} EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD;
+
+//
+// Declare the following strutures alias to use them more conviniently.
+//
+typedef EFI_MISC_LAST_PCI_BUS_DATA                        EFI_MISC_LAST_PCI_BUS;
+typedef EFI_MISC_BIOS_VENDOR_DATA                         EFI_MISC_BIOS_VENDOR;
+typedef EFI_MISC_SYSTEM_MANUFACTURER_DATA                 EFI_MISC_SYSTEM_MANUFACTURER;
+typedef EFI_MISC_BASE_BOARD_MANUFACTURER_DATA             EFI_MISC_BASE_BOARD_MANUFACTURER;
+typedef EFI_MISC_CHASSIS_MANUFACTURER_DATA                EFI_MISC_CHASSIS_MANUFACTURER;
+typedef EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA  EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR;
+typedef EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA             EFI_MISC_SYSTEM_SLOT_DESIGNATION;
+typedef EFI_MISC_ONBOARD_DEVICE_DATA                      EFI_MISC_ONBOARD_DEVICE;
+typedef EFI_MISC_POINTING_DEVICE_TYPE_DATA                EFI_MISC_ONBOARD_DEVICE_TYPE_DATA;
+typedef EFI_MISC_OEM_STRING_DATA                          EFI_MISC_OEM_STRING;
+typedef EFI_MISC_SYSTEM_OPTION_STRING_DATA                EFI_MISC_SYSTEM_OPTION_STRING;
+typedef EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA     EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES;
+typedef EFI_MISC_SYSTEM_LANGUAGE_STRING_DATA              EFI_MISC_SYSTEM_LANGUAGE_STRING;
+typedef EFI_MISC_SYSTEM_EVENT_LOG_DATA                    EFI_MISC_SYSTEM_EVENT_LOG;
+typedef EFI_MISC_BIS_ENTRY_POINT_DATA                     EFI_MISC_BIS_ENTRY_POINT;
+typedef EFI_MISC_BOOT_INFORMATION_STATUS_DATA             EFI_MISC_BOOT_INFORMATION_STATUS;
+typedef EFI_MISC_SYSTEM_POWER_SUPPLY_DATA                 EFI_MISC_SYSTEM_POWER_SUPPLY;
+typedef EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA         EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION;
+typedef EFI_MISC_SCHEDULED_POWER_ON_MONTH_DATA            EFI_MISC_SCHEDULED_POWER_ON_MONTH;
+typedef EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_DATA           EFI_MISC_VOLTAGE_PROBE_DESCRIPTION;
+typedef EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA            EFI_MISC_COOLING_DEVICE_TEMP_LINK;
+typedef EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA       EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION;
+typedef EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_DATA
+                                                          EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION;
+typedef EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_DATA       EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION;
+typedef EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_DATA EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION;
+typedef EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA
+                                                          EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It is implementation-specific to simplify the code logic.
+///
+typedef union {
+  EFI_MISC_LAST_PCI_BUS_DATA                         LastPciBus;
+  EFI_MISC_BIOS_VENDOR_DATA                          MiscBiosVendor;
+  EFI_MISC_SYSTEM_MANUFACTURER_DATA                  MiscSystemManufacturer;
+  EFI_MISC_BASE_BOARD_MANUFACTURER_DATA              MiscBaseBoardManufacturer;
+  EFI_MISC_CHASSIS_MANUFACTURER_DATA                 MiscChassisManufacturer;
+  EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA   MiscPortInternalConnectorDesignator;
+  EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA              MiscSystemSlotDesignation;
+  EFI_MISC_ONBOARD_DEVICE_DATA                       MiscOnboardDevice;
+  EFI_MISC_OEM_STRING_DATA                           MiscOemString;
+  EFI_MISC_SYSTEM_OPTION_STRING_DATA                 MiscOptionString;
+  EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA      NumberOfInstallableLanguages;
+  EFI_MISC_SYSTEM_LANGUAGE_STRING_DATA               MiscSystemLanguageString;
+  EFI_MISC_SYSTEM_EVENT_LOG_DATA                     MiscSystemEventLog;
+  EFI_MISC_GROUP_NAME_DATA                           MiscGroupNameData;
+  EFI_MISC_GROUP_ITEM_SET_DATA                       MiscGroupItemSetData;
+  EFI_MISC_POINTING_DEVICE_TYPE_DATA                 MiscPointingDeviceTypeData;
+  EFI_MISC_RESET_CAPABILITIES_DATA                   MiscResetCapablilitiesData;
+  EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA           MiscHardwareSecuritySettingsData;
+  EFI_MISC_SCHEDULED_POWER_ON_MONTH_DATA             MiscScheduledPowerOnMonthData;
+  EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_DATA            MiscVoltagePorbeDescriptionData;
+  EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA             MiscCoolingDeviceTempLinkData;
+  EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA        MiscTemperatureProbeDescriptionData;
+  EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_DATA MiscElectricalCurrentProbeDescriptionData;
+  EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_DATA
+                                                     MiscRemoteAccessManufacturerDescriptionData;
+  EFI_MISC_BIS_ENTRY_POINT_DATA                      MiscBisEntryPoint;
+  EFI_MISC_BOOT_INFORMATION_STATUS_DATA              MiscBootInformationStatus;
+  EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_DATA        MiscMangementDeviceDescriptionData;
+  EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA
+                                                     MiscmangementDeviceComponentDescriptionData;
+  EFI_MISC_IPMI_INTERFACE_TYPE_DATA                  MiscIpmiInterfaceTypeData;
+  EFI_MISC_SYSTEM_POWER_SUPPLY_DATA                  MiscPowerSupplyInfo;
+  EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA          MiscSmbiosStructEncapsulation;
+  EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD               MiscManagementDeviceThreshold;
+} EFI_MISC_SUBCLASS_RECORDS;
+
+///
+/// Inconsistent with specification here:
+/// In MemSubclass specification 0.9, the following data structures are NOT defined.
+/// It is implementation-specific to simplify the code logic.
+///
+typedef struct {
+  EFI_SUBCLASS_TYPE1_HEADER         Header;
+  EFI_MISC_SUBCLASS_RECORDS         Record;
+} EFI_MISC_SUBCLASS_DRIVER_DATA;
+#pragma pack()
+
+///
+/// Inconsistent with specification here:
+/// In DataHubSubclass specification 0.9 page 16, the following symbol is NOT defined.
+/// But value is meaningful, 0 means Reserved.
+///
+#define EFI_SUBCLASS_INSTANCE_RESERVED       0
+///
+/// Inconsistent with specification here:
+/// In DataHubSubclass specification 0.9 page 16, the following symbol is NOT defined.
+/// But value is meaningful, -1 means Not Applicable.
+///
+#define EFI_SUBCLASS_INSTANCE_NON_APPLICABLE 0xFFFF
+
+#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryDeviceFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryDeviceFunction.c
index 3872312c30..3e74ec31db 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryDeviceFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryDeviceFunction.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2006  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscMemoryDeviceFunction.c
@@ -22,8 +19,6 @@ Abstract:
 
 #include "CommonHeader.h"
 #include "MiscSubclassDriver.h"
-#include <Protocol/DataHub.h>
-#include <Guid/DataHubRecords.h>
 #include <Protocol/MemInfo.h>
 
 
@@ -46,13 +41,6 @@ enum {
 };
 
 
-typedef struct {
-  EFI_PHYSICAL_ADDRESS        MemoryArrayStartAddress;
-  EFI_PHYSICAL_ADDRESS        MemoryArrayEndAddress;
-  EFI_INTER_LINK_DATA         PhysicalMemoryArrayLink;
-  UINT16                      MemoryArrayPartitionWidth;
-} EFI_MEMORY_ARRAY_START_ADDRESS;
-
 /**
   This function makes boot time changes to the contents of the
   MiscBiosVendor (Type 0).
@@ -108,6 +96,7 @@ MISC_SMBIOS_TABLE_FUNCTION( MiscMemoryDevice )
     EFI_STATUS                      Status;
     STRING_REF                      TokenToGet;
     SMBIOS_TABLE_TYPE17             *SmbiosRecord;
+    SMBIOS_TABLE_TYPE19             *SmbiosRecord19;
     EFI_SMBIOS_HANDLE               SmbiosHandle;
     EFI_MEMORY_ARRAY_LINK_DATA      *ForType17InputData;
     UINT16                          DdrFreq=0;
@@ -117,6 +106,7 @@ MISC_SMBIOS_TABLE_FUNCTION( MiscMemoryDevice )
 
     UINT8                           Dimm;
     UINT8                           NumSlots;
+    UINT64                          TotalMemorySize;
     STRING_REF                      DevLocator[] = {
       STRING_TOKEN(STR_MISC_MEM_DEV_LOCATOR0), STRING_TOKEN(STR_MISC_MEM_DEV_LOCATOR1)
     };
@@ -183,137 +173,193 @@ MISC_SMBIOS_TABLE_FUNCTION( MiscMemoryDevice )
           break;
     }
 
-    for (Dimm = 0; Dimm < NumSlots; Dimm++) {
-    //
-    // Memory Device Locator
-    //
-    TokenToGet = DevLocator[Dimm];
-    MemDevice = SmbiosMiscGetString (TokenToGet);
-    MemDeviceStrLen = StrLen(MemDevice);
-    if (MemDeviceStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    TokenToGet = DevLocator[Dimm];
-    MemDevice = SmbiosMiscGetString (TokenToGet);
-    MemDeviceStrLen = StrLen(MemDevice);
-    if (MemDeviceStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Memory Bank Locator
-    //
-    TokenToGet = BankLocator[Dimm];
-    MemBankLocator = SmbiosMiscGetString (TokenToGet);
-    MemBankLocatorStrLen = StrLen(MemBankLocator);
-    if (MemBankLocatorStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Memory Manufacturer
-    //
-    TokenToGet = STRING_TOKEN (STR_MISC_MEM_MANUFACTURER);
-    MemManufacturer = SmbiosMiscGetString (TokenToGet);
-    MemManufacturerStrLen = StrLen(MemManufacturer);
-    if (MemManufacturerStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Memory Serial Number
-    //
-    TokenToGet = STRING_TOKEN (STR_MISC_MEM_SERIAL_NO);
-    MemSerialNumber = SmbiosMiscGetString (TokenToGet);
-    MemSerialNumberStrLen = StrLen(MemSerialNumber);
-    if (MemSerialNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Memory Asset Tag Number
-    //
-    TokenToGet = STRING_TOKEN (STR_MISC_MEM_ASSET_TAG);
-    MemAssetTag = SmbiosMiscGetString (TokenToGet);
-    MemAssetTagStrLen = StrLen(MemAssetTag);
-    if (MemAssetTagStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Memory Part Number
-    //
-    TokenToGet = STRING_TOKEN (STR_MISC_MEM_PART_NUMBER);
-    MemPartNumber = SmbiosMiscGetString (TokenToGet);
-    MemPartNumberStrLen = StrLen(MemPartNumber);
-    if (MemPartNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Two zeros following the last string.
-    //
-    SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE17) + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1 + MemAssetTagStrLen+1 + MemPartNumberStrLen + 1 + 1);
-    ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE17) +  MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1 + MemAssetTagStrLen+1 + MemPartNumberStrLen + 1 + 1);
-
-    SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_MEMORY_DEVICE;
-    SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE17);
-
-    //
-    // Make handle chosen by smbios protocol.add automatically.
-    //
-    SmbiosRecord->Hdr.Handle = 0;
-
-    //
-    // Memory Array Handle will be the 3rd optional string following the formatted structure.
-    //
     GetType16Hndl( Smbios, &Type16Handle);
-    SmbiosRecord->MemoryArrayHandle = Type16Handle;
+    TotalMemorySize = 0;
+    for (Dimm = 0; Dimm < NumSlots; Dimm++) {
+      //
+      // Memory Device Locator
+      //
+      TokenToGet = DevLocator[Dimm];
+      MemDevice = SmbiosMiscGetString (TokenToGet);
+      MemDeviceStrLen = StrLen(MemDevice);
+      if (MemDeviceStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
 
-    //
-    // Memory Size
-    //
-    if ((MemInfoHob->MemInfoData.dimmSize[Dimm])!=0){
-    SmbiosRecord->TotalWidth = 32;
-    SmbiosRecord->DataWidth = 32;
-    SmbiosRecord->Size = MemInfoHob->MemInfoData.dimmSize[Dimm];
-    SmbiosRecord->Speed = DdrFreq;
-    SmbiosRecord->ConfiguredMemoryClockSpeed = DdrFreq;
-    SmbiosRecord->FormFactor = EfiMemoryFormFactorDimm;
-    }
+      TokenToGet = DevLocator[Dimm];
+      MemDevice = SmbiosMiscGetString (TokenToGet);
+      MemDeviceStrLen = StrLen(MemDevice);
+      if (MemDeviceStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Memory Bank Locator
+      //
+      TokenToGet = BankLocator[Dimm];
+      MemBankLocator = SmbiosMiscGetString (TokenToGet);
+      MemBankLocatorStrLen = StrLen(MemBankLocator);
+      if (MemBankLocatorStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Memory Manufacturer
+      //
+      TokenToGet = STRING_TOKEN (STR_MISC_MEM_MANUFACTURER);
+      MemManufacturer = SmbiosMiscGetString (TokenToGet);
+      MemManufacturerStrLen = StrLen(MemManufacturer);
+      if (MemManufacturerStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Memory Serial Number
+      //
+      TokenToGet = STRING_TOKEN (STR_MISC_MEM_SERIAL_NO);
+      MemSerialNumber = SmbiosMiscGetString (TokenToGet);
+      MemSerialNumberStrLen = StrLen(MemSerialNumber);
+      if (MemSerialNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Memory Asset Tag Number
+      //
+      TokenToGet = STRING_TOKEN (STR_MISC_MEM_ASSET_TAG);
+      MemAssetTag = SmbiosMiscGetString (TokenToGet);
+      MemAssetTagStrLen = StrLen(MemAssetTag);
+      if (MemAssetTagStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Memory Part Number
+      //
+      TokenToGet = STRING_TOKEN (STR_MISC_MEM_PART_NUMBER);
+      MemPartNumber = SmbiosMiscGetString (TokenToGet);
+      MemPartNumberStrLen = StrLen(MemPartNumber);
+      if (MemPartNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {
+        return EFI_UNSUPPORTED;
+      }
+
+      //
+      // Two zeros following the last string.
+      //
+      SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE17) + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1 + MemAssetTagStrLen+1 + MemPartNumberStrLen + 1 + 1);
+      ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE17) +  MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1 + MemAssetTagStrLen+1 + MemPartNumberStrLen + 1 + 1);
+
+      SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_MEMORY_DEVICE;
+      SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE17);
+
+      //
+      // Make handle chosen by smbios protocol.add automatically.
+      //
+      SmbiosRecord->Hdr.Handle = 0;
+
+      //
+      // Memory Array Handle will be the 3rd optional string following the formatted structure.
+      //
+      SmbiosRecord->MemoryArrayHandle = Type16Handle;
+
+      //
+      // Memory Size
+      //
+      if ((MemInfoHob->MemInfoData.dimmSize[Dimm])!=0){
+        SmbiosRecord->TotalWidth = 32;
+        SmbiosRecord->DataWidth = 32;
+        SmbiosRecord->Size = MemInfoHob->MemInfoData.dimmSize[Dimm];
+        SmbiosRecord->Speed = DdrFreq;
+        SmbiosRecord->ConfiguredMemoryClockSpeed = DdrFreq;
+        SmbiosRecord->FormFactor = EfiMemoryFormFactorDimm;
+      }
 
-    SmbiosRecord->DeviceSet =(UINT8) ForType17InputData->MemoryDeviceSet;
-    SmbiosRecord->DeviceLocator= 1;
-    SmbiosRecord->BankLocator = 2;
+      SmbiosRecord->DeviceSet =(UINT8) ForType17InputData->MemoryDeviceSet;
+      SmbiosRecord->DeviceLocator= 1;
+      SmbiosRecord->BankLocator = 2;
 
 
-    SmbiosRecord->Manufacturer = 3;
-    SmbiosRecord->SerialNumber= 4;
-    SmbiosRecord->AssetTag= 5;
-    SmbiosRecord->PartNumber= 6;
-    SmbiosRecord->Attributes = (UINT8) ForType17InputData->MemoryState;
-    SmbiosRecord->MemoryType = MemoryType;
+      SmbiosRecord->Manufacturer = 3;
+      SmbiosRecord->SerialNumber= 4;
+      SmbiosRecord->AssetTag= 5;
+      SmbiosRecord->PartNumber= 6;
+      SmbiosRecord->Attributes = (UINT8) ForType17InputData->MemoryState;
+      SmbiosRecord->MemoryType = MemoryType;
 
-    OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
-    UnicodeStrToAsciiStr(MemDevice, OptionalStrStart);
-    UnicodeStrToAsciiStr(MemBankLocator, OptionalStrStart + MemDeviceStrLen + 1);
-    UnicodeStrToAsciiStr(MemManufacturer, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1);
-    UnicodeStrToAsciiStr(MemSerialNumber, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1);
-    UnicodeStrToAsciiStr(MemAssetTag, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1);
-    UnicodeStrToAsciiStr(MemPartNumber, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1+ MemAssetTagStrLen+1 );
+      OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
+      UnicodeStrToAsciiStr(MemDevice, OptionalStrStart);
+      UnicodeStrToAsciiStr(MemBankLocator, OptionalStrStart + MemDeviceStrLen + 1);
+      UnicodeStrToAsciiStr(MemManufacturer, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1);
+      UnicodeStrToAsciiStr(MemSerialNumber, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1);
+      UnicodeStrToAsciiStr(MemAssetTag, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1);
+      UnicodeStrToAsciiStr(MemPartNumber, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1+ MemAssetTagStrLen+1 );
+
+      //
+      // Now we have got the full smbios record, call smbios protocol to add this record.
+      //
+      SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+      Status = Smbios-> Add(
+                          Smbios,
+                          NULL,
+                          &SmbiosHandle,
+                          (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord
+                          );
+
+      if ((SmbiosRecord->Size & BIT15) != 0) {
+        //
+        // Size is in KB
+        //
+        TotalMemorySize = TotalMemorySize + LShiftU64 (SmbiosRecord->Size, 10);
+      } else {
+        //
+        // Size is in MB
+        //
+        TotalMemorySize = TotalMemorySize + LShiftU64 (SmbiosRecord->Size, 20);
+      }
+
+      FreePool(SmbiosRecord);
+    }
+
+    //
+    // Allocate and zero SMBIOS TYPE 19 Record
+    //
+    SmbiosRecord19 = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE19));
+    ASSERT (SmbiosRecord19 != NULL);
+
+    //
+    // Fill in SMBIOS type 19 information
+    //
+    SmbiosRecord19->Hdr.Type = SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS;
+    SmbiosRecord19->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE19);
+    SmbiosRecord19->Hdr.Handle = 0;
+
+    SmbiosRecord19->MemoryArrayHandle       = Type16Handle;
+    SmbiosRecord19->PartitionWidth          = NumSlots;
+    if (TotalMemorySize <= SIZE_4TB) {
+      SmbiosRecord19->StartingAddress         = 0x0;
+      //
+      // Convert bytes to KB
+      //
+      SmbiosRecord19->EndingAddress           = (UINT32)RShiftU64 (TotalMemorySize, 10) - 1;
+      SmbiosRecord19->ExtendedStartingAddress = 0;
+      SmbiosRecord19->ExtendedEndingAddress   = 0;
+    } else {
+      SmbiosRecord19->StartingAddress         = 0xffffffff;
+      SmbiosRecord19->EndingAddress           = 0xffffffff;
+      SmbiosRecord19->ExtendedStartingAddress = 0;
+      SmbiosRecord19->ExtendedEndingAddress   = TotalMemorySize - 1;
+    }
 
     //
-    // Now we have got the full smbios record, call smbios protocol to add this record.
+    // Add SMBIOS type 19 record to SMBIOS table.
     //
     SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
-    Status = Smbios-> Add(
-                        Smbios,
-                        NULL,
-                        &SmbiosHandle,
-                        (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord
-                        );
-    FreePool(SmbiosRecord);
-    }
+    Smbios->Add(
+              Smbios,
+              NULL,
+              &SmbiosHandle,
+              (EFI_SMBIOS_TABLE_HEADER *)SmbiosRecord19
+              );
+
     return Status;
 }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
index 2f25ab802b..97a782e362 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
@@ -17,7 +17,6 @@ Abstract:
 #include "CommonHeader.h"
 
 #include "MiscSubclassDriver.h"
-#include <Protocol/DataHub.h>
 #include <Library/HiiLib.h>
 #include <Library/PrintLib.h>
 #include <Protocol/PciRootBridgeIo.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheData.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheData.c
index 6af7f56107..44f2530ac3 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheData.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheData.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c) 2012 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2012 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscBiosProcessorCache.c
@@ -28,6 +25,4 @@ Abstract:
 //
 // Static (possibly build generated) Processor cache data.
 //
-MISC_SMBIOS_TABLE_DATA(EFI_CACHE_VARIABLE_RECORD, MiscProcessorCache) = {
-0
-};
+MISC_SMBIOS_TABLE_DATA(UINTN, MiscProcessorCache) = 0;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheFunction.c
index ca121525a0..c64e87e20b 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheFunction.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2006  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscProcessorCacheFunction.c
@@ -20,170 +17,144 @@ Abstract:
 --*/
 #include "CommonHeader.h"
 #include "MiscSubclassDriver.h"
-#include <Protocol/DataHub.h>
-#include <Guid/DataHubRecords.h>
-
-UINT32
-ConvertBase2ToRaw (
-  IN  EFI_EXP_BASE2_DATA             *Data)
-{
-  UINTN         Index;
-  UINT32        RawData;
-
-  RawData = Data->Value;
-  for (Index = 0; Index < (UINTN) Data->Exponent; Index++) {
-     RawData <<= 1;
-  }
-
-  return  RawData;
-}
-
+#include <Register/Cpuid.h>
 
 MISC_SMBIOS_TABLE_FUNCTION(MiscProcessorCache)
 {
 	EFI_SMBIOS_HANDLE     SmbiosHandle;
-	SMBIOS_TABLE_TYPE7            *SmbiosRecordL1;
-	SMBIOS_TABLE_TYPE7            *SmbiosRecordL2;
+	SMBIOS_TABLE_TYPE7            *SmbiosRecord;
 
 	EFI_CACHE_SRAM_TYPE_DATA      CacheSramType;
 	CHAR16                          *SocketDesignation;
 	CHAR8                           *OptionalStrStart;
 	UINTN                           SocketStrLen;
 	STRING_REF                      TokenToGet;
-	EFI_DATA_HUB_PROTOCOL           *DataHub;
-	UINT64                          MonotonicCount;
-	EFI_DATA_RECORD_HEADER          *Record;
-	EFI_SUBCLASS_TYPE1_HEADER       *DataHeader;
-	UINT8                           *SrcData;
-	EFI_STATUS                      Status;
+  UINT32                          SubIndex;
+  CPUID_CACHE_PARAMS_EAX          CacheParamsEax;
+  CPUID_CACHE_PARAMS_EBX          CacheParamsEbx;
+  UINT32                          RegisterEcx;
+  CPUID_CACHE_PARAMS_EDX          CacheParamsEdx;
+  UINT8                           SystemCacheType;
+  UINTN                           Size;
 
 	//
-	// Memory Device LOcator
+	// Memory Device Locator
 	//
-	DEBUG ((EFI_D_ERROR, "type 7\n"));
-
 	TokenToGet = STRING_TOKEN (STR_SOCKET_DESIGNATION);
 	SocketDesignation = SmbiosMiscGetString (TokenToGet);
 	SocketStrLen = StrLen(SocketDesignation);
 	if (SocketStrLen > SMBIOS_STRING_MAX_LENGTH) {
-	return EFI_UNSUPPORTED;
+	  return EFI_UNSUPPORTED;
 	}
 
-	SmbiosRecordL1 = AllocatePool(sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);
-	ASSERT (SmbiosRecordL1 != NULL);
-	ZeroMem(SmbiosRecordL1, sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);
-
-	SmbiosRecordL2 = AllocatePool(sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);
-	ASSERT (SmbiosRecordL2 != NULL);
-	ZeroMem(SmbiosRecordL2, sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);
-
-	//
-	// Get the Data Hub Protocol. Assume only one instance
-	//
-	Status = gBS->LocateProtocol (
-	                &gEfiDataHubProtocolGuid,
-	                NULL,
-	                (VOID **)&DataHub
-	                );
-	ASSERT_EFI_ERROR(Status);
-
-	MonotonicCount = 0;
-	Record = NULL;
-
-	do {
-	Status = DataHub->GetNextRecord (
-	                    DataHub,
-	                    &MonotonicCount,
-	                    NULL,
-	                    &Record
-	                    );
-		if (!EFI_ERROR(Status)) {
-			if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
-				DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);
-				SrcData     = (UINT8  *)(DataHeader + 1);
-				if (CompareGuid(&Record->DataRecordGuid, &gEfiCacheSubClassGuid) && (DataHeader->RecordType == CacheSizeRecordType)) {
-          			if (DataHeader->SubInstance == EFI_CACHE_L1) {
-						SmbiosRecordL1->InstalledSize += (UINT16) (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10);
-						SmbiosRecordL1->MaximumCacheSize = SmbiosRecordL1->InstalledSize;
-          			}
-         			 else if (DataHeader->SubInstance == EFI_CACHE_L2) {
-						SmbiosRecordL2->InstalledSize += (UINT16) (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10);
-						SmbiosRecordL2->MaximumCacheSize = SmbiosRecordL2->InstalledSize;
-          			} else {
-           				 continue;
-          			}
-		  		}
-	      	}
-    	}
-	} while (!EFI_ERROR(Status) && (MonotonicCount != 0));
-
-	//
-	//Filling SMBIOS type 7 information for different cache levels.
-	//
-
-	SmbiosRecordL1->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;
-	SmbiosRecordL1->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE7);
-	SmbiosRecordL1->Hdr.Handle = 0;
-
-	SmbiosRecordL1->Associativity = CacheAssociativity8Way;
-	SmbiosRecordL1->SystemCacheType = CacheTypeUnknown;
-	SmbiosRecordL1->SocketDesignation = 0x01;
-	SmbiosRecordL1->CacheSpeed = 0;
-	SmbiosRecordL1->CacheConfiguration = 0x0180;
-	ZeroMem (&CacheSramType, sizeof (EFI_CACHE_SRAM_TYPE_DATA));
-	CacheSramType.Synchronous = 1;
-	CopyMem(&SmbiosRecordL1->SupportedSRAMType, &CacheSramType, 2);
-	CopyMem(&SmbiosRecordL1->CurrentSRAMType, &CacheSramType, 2);
-	SmbiosRecordL1->ErrorCorrectionType = EfiCacheErrorSingleBit;
-
-
-	SmbiosRecordL2->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;
-	SmbiosRecordL2->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE7);
-	SmbiosRecordL2->Hdr.Handle = 0;
-
-	SmbiosRecordL2->Associativity = CacheAssociativity16Way;
-	SmbiosRecordL2->SystemCacheType = CacheTypeInstruction;
-	SmbiosRecordL2->SocketDesignation = 0x01;
-	SmbiosRecordL2->CacheSpeed = 0;
-	SmbiosRecordL2->CacheConfiguration = 0x0281;
-	ZeroMem (&CacheSramType, sizeof (EFI_CACHE_SRAM_TYPE_DATA));
-	CacheSramType.Synchronous = 1;
-	CopyMem(&SmbiosRecordL2->SupportedSRAMType, &CacheSramType, 2);
-	CopyMem(&SmbiosRecordL2->CurrentSRAMType, &CacheSramType, 2);
-	SmbiosRecordL2->ErrorCorrectionType = EfiCacheErrorSingleBit;
-
-
-
-	//
-	//Adding SMBIOS type 7 records to SMBIOS table.
-	//
-	SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
-	OptionalStrStart = (CHAR8 *)(SmbiosRecordL1 + 1);
-	UnicodeStrToAsciiStr(SocketDesignation, OptionalStrStart);
-
-	Smbios-> Add(
-	           Smbios,
-	           NULL,
-	           &SmbiosHandle,
-	           (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecordL1
-	           );
-
-	//
-	//VLV2 incorporates two SLM modules (quad cores) in the SoC. 2 cores share BIU/L2 cache
-	//
-	SmbiosRecordL2->InstalledSize = (SmbiosRecordL2->InstalledSize)/2;
-	SmbiosRecordL2->MaximumCacheSize = SmbiosRecordL2->InstalledSize;
-	SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
-
-	OptionalStrStart = (CHAR8 *)(SmbiosRecordL2 + 1);
-	UnicodeStrToAsciiStr(SocketDesignation, OptionalStrStart);
-
-	Smbios-> Add(
-	           Smbios,
-	           NULL,
-	           &SmbiosHandle,
-	           (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecordL2
-	           );
-
+  //
+  // Retrieve cache level information using CPUID
+  //
+  for (SubIndex = 0; ; SubIndex++) {
+    AsmCpuidEx (
+      CPUID_CACHE_PARAMS,
+      SubIndex,
+      &CacheParamsEax.Uint32,
+      &CacheParamsEbx.Uint32,
+      &RegisterEcx,
+      &CacheParamsEdx.Uint32
+      );
+    //
+    // Terminate loop when CacheType is CPUID_CACHE_PARAMS_CACHE_TYPE_NULL
+    //
+    if (CacheParamsEax.Bits.CacheType == CPUID_CACHE_PARAMS_CACHE_TYPE_NULL) {
+      break;
+    }
+
+    //
+    // Allocate and zero SMBIOS TYPE 7 Record
+    //
+	  SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);
+	  ASSERT (SmbiosRecord != NULL);
+
+    //
+    // Compute cache size in bytes
+    //
+    Size = (CacheParamsEbx.Bits.Ways + 1) *
+           (CacheParamsEbx.Bits.LinePartitions + 1) *
+           (CacheParamsEbx.Bits.LineSize + 1) *
+           (RegisterEcx + 1);
+    DEBUG ((DEBUG_INFO, "MiscProcessorCache(): Cache Type = %d  Cache Level = %d  Size = %x\n", CacheParamsEax.Bits.CacheType, CacheParamsEax.Bits.CacheLevel, Size));
+
+    //
+    // Determine SMBIOS SystemCacheType
+    //
+    switch (CacheParamsEax.Bits.CacheType) {
+    case 1:
+      SystemCacheType = CacheTypeData;
+      break;
+    case 2:
+      SystemCacheType = CacheTypeInstruction;
+      break;
+    case 3:
+      SystemCacheType = CacheTypeUnified;
+      break;
+    default:
+      SystemCacheType = CacheTypeUnknown;
+    }
+
+    //
+    // Update cache sizes in KB
+    //
+    switch (CacheParamsEax.Bits.CacheLevel) {
+    case 1:
+      SmbiosRecord->InstalledSize      = (UINT16)(Size >> 10);
+      SmbiosRecord->MaximumCacheSize   = SmbiosRecord->InstalledSize;
+      SmbiosRecord->SystemCacheType    = SystemCacheType;
+      SmbiosRecord->Associativity      = CacheAssociativity8Way;
+      SmbiosRecord->CacheConfiguration = 0x0180;
+      break;
+    case 2:
+      SmbiosRecord->InstalledSize      = (UINT16)(Size >> 10);
+      SmbiosRecord->MaximumCacheSize   = SmbiosRecord->InstalledSize;
+      SmbiosRecord->SystemCacheType    = SystemCacheType;
+      SmbiosRecord->Associativity      = CacheAssociativity16Way;
+      SmbiosRecord->CacheConfiguration = 0x0281;
+	    //
+	    //VLV2 incorporates two SLM modules (quad cores) in the SoC.
+      // 2 cores share BIU/L2 cache
+	    //
+	    SmbiosRecord->InstalledSize    = SmbiosRecord->InstalledSize / 2;
+	    SmbiosRecord->MaximumCacheSize = SmbiosRecord->InstalledSize;
+      break;
+    default:
+      DEBUG ((DEBUG_ERROR, "MiscProcessorCache(): Unexpected cache level %d\n", CacheParamsEax.Bits.CacheLevel));
+      break;
+    }
+
+	  //
+	  //Filling SMBIOS type 7 information for different cache levels.
+	  //
+	  SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;
+	  SmbiosRecord->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE7);
+	  SmbiosRecord->Hdr.Handle = 0;
+
+	  SmbiosRecord->SocketDesignation = 0x01;
+	  SmbiosRecord->CacheSpeed = 0;
+	  ZeroMem (&CacheSramType, sizeof (EFI_CACHE_SRAM_TYPE_DATA));
+	  CacheSramType.Synchronous = 1;
+	  CopyMem(&SmbiosRecord->SupportedSRAMType, &CacheSramType, 2);
+	  CopyMem(&SmbiosRecord->CurrentSRAMType, &CacheSramType, 2);
+	  SmbiosRecord->ErrorCorrectionType = EfiCacheErrorSingleBit;
+
+	  //
+	  // Adding SMBIOS type 7 records to SMBIOS table.
+	  //
+	  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+	  OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
+	  UnicodeStrToAsciiStr(SocketDesignation, OptionalStrStart);
+
+	  Smbios->Add(
+	            Smbios,
+	            NULL,
+	            &SmbiosHandle,
+	            (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord
+	            );
+  }
 	return EFI_SUCCESS;
 }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorInformationFunction.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorInformationFunction.c
index e01693ede7..e71a03ceac 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorInformationFunction.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorInformationFunction.c
@@ -1,12 +1,9 @@
 /*++
 
-Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2006  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscProcessorInformationFunction.c
@@ -23,9 +20,9 @@ Abstract:
 #include "MiscSubclassDriver.h"
 
 #include <Protocol/MpService.h>
-#include <Protocol/DataHub.h>
-#include <Guid/DataHubRecords.h>
 #include <Library/CpuIA32.h>
+#include <Library/TimerLib.h>
+#include <Register/Cpuid.h>
 
 #define EfiProcessorFamilyIntelAtomProcessor    0x2B
 
@@ -75,33 +72,6 @@ GetCacheHandle (
   *Handle = 0xFFFF;
 }
 
-
-/**
-  This function makes boot time changes to the contents of the
-  MiscProcessorInformation (Type 4).
-
-  @param  RecordData                 Pointer to copy of RecordData from the Data Table.
-
-  @retval EFI_SUCCESS                All parameters were valid.
-  @retval EFI_UNSUPPORTED            Unexpected RecordType value.
-  @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
-
-**/
-UINT32
-ConvertBase10ToRaw (
-  IN  EFI_EXP_BASE10_DATA             *Data)
-{
-  UINTN         Index;
-  UINT32        RawData;
-
-  RawData = Data->Value;
-  for (Index = 0; Index < (UINTN) Data->Exponent; Index++) {
-     RawData *= 10;
-  }
-
-  return  RawData;
-}
-
 #define BSEL_CR_OVERCLOCK_CONTROL	0xCD
 #define	FUSE_BSEL_MASK				0x03
 
@@ -137,6 +107,96 @@ DetermineiFsbFromMsr (
 
 }
 
+CHAR16 *
+CpuidSocVendorBrandString (
+  VOID
+  )
+{
+  UINT32  MaximumExtendedFunction;
+  //
+  // Array to store brand string from 3 brand string leafs with
+  // 4 32-bit brand string values per leaf and an extra value to
+  // null terminate the string.
+  //
+  UINT32  BrandString[3 * 4 + 1];
+  CHAR8   *AsciiBrandString;
+  CHAR16  *UnicodeBrandString;
+  UINTN   Length;
+
+  AsmCpuid (CPUID_EXTENDED_FUNCTION, &MaximumExtendedFunction, NULL, NULL, NULL);
+
+  ZeroMem (&BrandString, sizeof (BrandString));
+  if (CPUID_BRAND_STRING1 <= MaximumExtendedFunction) {
+    AsmCpuid (
+      CPUID_BRAND_STRING1,
+      &BrandString[0],
+      &BrandString[1],
+      &BrandString[2],
+      &BrandString[3]
+      );
+  }
+  if (CPUID_BRAND_STRING2 <= MaximumExtendedFunction) {
+    AsmCpuid (
+      CPUID_BRAND_STRING2,
+      &BrandString[4],
+      &BrandString[5],
+      &BrandString[6],
+      &BrandString[7]
+      );
+  }
+  if (CPUID_BRAND_STRING3 <= MaximumExtendedFunction) {
+    AsmCpuid (
+      CPUID_BRAND_STRING3,
+      &BrandString[8],
+      &BrandString[9],
+      &BrandString[10],
+      &BrandString[11]
+      );
+  }
+
+  //
+  // Skip spaces at the beginning of the brand string
+  //
+  for (AsciiBrandString = (CHAR8 *)BrandString; *AsciiBrandString == ' '; AsciiBrandString++);
+
+  DEBUG ((DEBUG_INFO, "Processor Brand String = %a\n", AsciiBrandString));
+
+  //
+  // Convert ASCII brand string to an allocated Unicode brand string
+  //
+  Length = AsciiStrLen (AsciiBrandString) + 1;
+  UnicodeBrandString = AllocatePool (Length * sizeof (CHAR16));
+  AsciiStrToUnicodeStrS (AsciiBrandString, UnicodeBrandString, Length);
+
+  DEBUG ((DEBUG_INFO, "Processor Unicode Brand String = %s\n", UnicodeBrandString));
+
+  return UnicodeBrandString;
+}
+
+UINT64
+MeasureTscFrequency (
+  VOID
+  )
+{
+  EFI_TPL  CurrentTpl;
+  UINT64   BeginValue;
+  UINT64   EndValue;
+  UINT64   Frequency;
+
+  //
+  // Wait for 10000us = 10ms for the calculation
+  // It needs a precise timer to calculate the ticks
+  //
+  CurrentTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);
+  BeginValue = AsmReadTsc ();
+  MicroSecondDelay (10000);
+  EndValue   = AsmReadTsc ();
+  gBS->RestoreTPL (CurrentTpl);
+  Frequency = MultU64x32 (EndValue - BeginValue, 1000);
+  Frequency = DivU64x32 (Frequency, 10);
+  return Frequency;
+}
+
 MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
 {
     CHAR8                           *OptionalStrStart;
@@ -152,7 +212,7 @@ MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
     UINTN                           SocketStrLen=0;
     UINTN                           AssetTagStrLen=0;
     UINTN                           PartNumberStrLen=0;
-    UINTN                           ProcessorVoltage=0xAE;
+    UINTN                           ProcessorVoltage=(BIT7 | 9);
     UINT32                          Eax01;
     UINT32                          Ebx01;
     UINT32                          Ecx01;
@@ -169,17 +229,8 @@ MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
     UINTN                           NumberOfProcessors=0;
     UINT64                          Frequency = 0;
     EFI_MP_SERVICES_PROTOCOL        *MpService;
-    EFI_DATA_HUB_PROTOCOL           *DataHub;
-    UINT64                          MonotonicCount;
-    EFI_DATA_RECORD_HEADER          *Record;
-    EFI_SUBCLASS_TYPE1_HEADER       *DataHeader;
-    UINT8                           *SrcData;
-    EFI_PROCESSOR_VERSION_DATA      *ProcessorVersion;
-    CHAR16                          *NewStringToken;
-    STRING_REF                      TokenToUpdate;
     PROCESSOR_ID_DATA               *ProcessorId = NULL;
 
-
     //
     // First check for invalid parameters.
     //
@@ -194,59 +245,6 @@ MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
       return EFI_INVALID_PARAMETER;
     }
 
-    //
-    // Get the Data Hub Protocol. Assume only one instance
-    //
-    Status = gBS->LocateProtocol (
-                    &gEfiDataHubProtocolGuid,
-                    NULL,
-                    (VOID **)&DataHub
-                    );
-    ASSERT_EFI_ERROR(Status);
-
-    MonotonicCount = 0;
-    Record = NULL;
-
-    do {
-      Status = DataHub->GetNextRecord (
-                          DataHub,
-                          &MonotonicCount,
-                          NULL,
-                          &Record
-                          );
-       if (!EFI_ERROR(Status)) {
-         if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
-
-            DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);
-            SrcData     = (UINT8  *)(DataHeader + 1);
-
-            //
-            // Processor
-            //
-            if (CompareGuid(&Record->DataRecordGuid, &gEfiProcessorSubClassGuid)) {
-              CopyMem (&mProcessorProducerGuid, &Record->ProducerName, sizeof(EFI_GUID));
-              switch (DataHeader->RecordType) {
-                case ProcessorVoltageRecordType:
-                  ProcessorVoltage = (((EFI_EXP_BASE10_DATA *)SrcData)->Value)/100 + 0x80;
-                  break;
-                case ProcessorCoreFrequencyRecordType:
-                  DEBUG ((EFI_D_ERROR, "ProcessorCoreFrequencyRecordType SrcData1 =%d\n", ConvertBase10ToRaw((EFI_EXP_BASE10_DATA *)SrcData)/1000000));
-                  Frequency = (ConvertBase10ToRaw((EFI_EXP_BASE10_DATA *)SrcData)/1000000);
-                  break;
-                case ProcessorVersionRecordType:
-                  ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *)SrcData;
-                  NewStringToken = HiiGetPackageString(&mProcessorProducerGuid, *ProcessorVersion, NULL);
-                  TokenToUpdate = (STRING_REF)STR_MISC_PROCESSOR_VERSION;
-                  HiiSetString(mHiiHandle, TokenToUpdate, NewStringToken, NULL);
-                  break;
-                default:
-                  break;
-              }
-            }
-          }
-        }
-    } while (!EFI_ERROR(Status) && (MonotonicCount != 0));
-
     //
     // Token to get for Socket Name
     //
@@ -270,8 +268,7 @@ MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
     //
     // Token to get for Processor Version
     //
-    TokenToGet = STRING_TOKEN (STR_MISC_PROCESSOR_VERSION);
-    Version = SmbiosMiscGetString (TokenToGet);
+    Version = CpuidSocVendorBrandString ();
     VersionStrLen = StrLen(Version);
     if (VersionStrLen > SMBIOS_STRING_MAX_LENGTH) {
         return EFI_UNSUPPORTED;
@@ -372,10 +369,12 @@ MISC_SMBIOS_TABLE_FUNCTION (MiscProcessorInformation)
     SmbiosRecord -> ProcessorFamily2 = ForType4InputData-> VariableRecord.ProcessorFamily;
 
     //
-    // Processor speed
+    // Processor speed in MHz
     //
-    SmbiosRecord-> CurrentSpeed = *(UINT16*) & Frequency;
-    SmbiosRecord-> MaxSpeed = *(UINT16*) & Frequency;
+    Frequency = MeasureTscFrequency ();
+    Frequency = DivU64x32 (Frequency, 1000000);
+    SmbiosRecord-> CurrentSpeed = (UINT16)Frequency;
+    SmbiosRecord-> MaxSpeed = (UINT16)Frequency;
 
     //
     // Processor Characteristics
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c
index 93347a1a04..4c8e00801f 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c
@@ -1,21 +1,17 @@
 /** @file
 
-Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscSubclassDriverDataTable.c
 
 Abstract:
 
-  Create the mMiscSubclassDataTable structure, and it is used to report
-  any generate data to the DataHub.
-
+  Create the mMiscSubclassDataTable structure used to produce
+  SMBIOS records.
 
 **/
 
@@ -31,7 +27,7 @@ MISC_SMBIOS_TABLE_EXTERNS(EFI_MISC_BIOS_VENDOR_DATA, MiscBiosVendor, MiscBiosVen
 MISC_SMBIOS_TABLE_EXTERNS(EFI_MISC_SYSTEM_MANUFACTURER_DATA, MiscSystemManufacturer, MiscSystemManufacturer);
 MISC_SMBIOS_TABLE_EXTERNS(EFI_MISC_BASE_BOARD_MANUFACTURER_DATA, MiscBaseBoardManufacturer, MiscBaseBoardManufacturer);
 MISC_SMBIOS_TABLE_EXTERNS(EFI_MISC_CHASSIS_MANUFACTURER_DATA, MiscChassisManufacturer, MiscChassisManufacturer);
-MISC_SMBIOS_TABLE_EXTERNS(EFI_CACHE_VARIABLE_RECORD, MiscProcessorCache, MiscProcessorCache); //type 7
+MISC_SMBIOS_TABLE_EXTERNS(UINTN, MiscProcessorCache, MiscProcessorCache); //type 7
 MISC_SMBIOS_TABLE_EXTERNS(EFI_CPU_DATA_RECORD, MiscProcessorInformation, MiscProcessorInformation); //type 4
 MISC_SMBIOS_TABLE_EXTERNS(EFI_MEMORY_ARRAY_LOCATION_DATA, MiscPhysicalMemoryArray,MiscPhysicalMemoryArray);
 MISC_SMBIOS_TABLE_EXTERNS(EFI_MEMORY_ARRAY_LINK_DATA, MiscMemoryDevice, MiscMemoryDevice);
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverEntryPoint.c b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverEntryPoint.c
index e70732f5c2..cb677a0aa6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverEntryPoint.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverEntryPoint.c
@@ -1,20 +1,17 @@
 /** @file
 
-Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 Module Name:
 
   MiscSubclassDriverEntryPoint.c
 
 Abstract:
 
-  This driver parses the mMiscSubclassDataTable structure and reports
-  any generated data to the DataHub.
+  This driver parses the mMiscSubclassDataTable structure to
+  produce SMBIOS records.
 
 
 **/
@@ -99,7 +96,7 @@ Error:
 
 /**
   Standard EFI driver point.  This driver parses the mMiscSubclassDataTable
-  structure and reports any generated data to the DataHub.
+  structure to produce SMBIOS records.
 
   @param ImageHandle   - Handle for the image of this driver
   @param SystemTable   - Pointer to the EFI System Table
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
index 99b1a18185..92b51b1743 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf
@@ -86,6 +86,7 @@ [Packages]
   MdePkg/MdePkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   NetworkPkg/NetworkPkg.dec
+  UefiCpuPkg/UefiCpuPkg.dec
 
 [LibraryClasses]
   HiiLib
@@ -105,6 +106,7 @@ [LibraryClasses]
   PchPlatformLib
   NetLib
   HobLib
+  TimerLib
   
 [Guids]
   gEfiNormalSetupGuid
@@ -114,7 +116,6 @@ [Guids]
 [Protocols]
   gEfiSmbiosProtocolGuid                        # PROTOCOL ALWAYS_CONSUMED
   gEfiDxeSmmReadyToLockProtocolGuid             # PROTOCOL ALWAYS_CONSUMED
-  gEfiDataHubProtocolGuid
   gEfiMpServiceProtocolGuid
   gMemInfoProtocolGuid
   gEfiTdtOperationProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
index 99db5490b6..dad27f130d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/IgdOpRegion.c
@@ -35,8 +35,6 @@ Abstract:
 #include <PiDxe.h>
 #include <PchRegs.h>
 
-#include <Guid/DataHubRecords.h>
-
 #include <Protocol/IgdOpRegion.h>
 #include <Protocol/FirmwareVolume2.h>
 #include <Protocol/PlatformGopPolicy.h>
@@ -66,7 +64,6 @@ extern DXE_VLV_PLATFORM_POLICY_PROTOCOL  *DxePlatformSaPolicy;
 //
 
 IGD_OPREGION_PROTOCOL mIgdOpRegion;
-EFI_GUID              mMiscSubClass = EFI_MISC_SUBCLASS_GUID;
 EFI_EVENT             mConOutEvent;
 EFI_EVENT             mSetGOPverEvent;
 VOID                  *mConOutReg;
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
index fe81a6e3bd..2aec0d1a9a 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInitDxe.inf
@@ -3,9 +3,8 @@
 #/*++
 #
 #  Copyright (c)  1999  - 2019, Intel Corporation. All rights reserved
-#                                                                        
-
-# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
 #
 #  Module Name:
 #
@@ -65,7 +64,6 @@ [Depex]
   gDxeVlvPlatformPolicyGuid              AND
   gEfiPciRootBridgeIoProtocolGuid     AND
   gEfiCpuIo2ProtocolGuid                  AND
-  gEfiDataHubProtocolGuid                 AND
   gEfiGlobalNvsAreaProtocolGuid       AND
   gEfiFirmwareVolume2ProtocolGuid   AND
   gEfiHiiDatabaseProtocolGuid
-- 
2.21.0.windows.1





^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-platforms Patch 09/14] Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI
  2019-07-01  2:55 ` [edk2-platforms Patch 09/14] Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI Michael D Kinney
@ 2019-07-01  4:08   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:08 UTC (permalink / raw)
  To: Kinney, Michael D, devel@edk2.groups.io; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: Kinney, Michael D 
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-platforms Patch 09/14] Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI

* Switch from Intel Framework SMBUS PPI to the PI Spec
  SMBUS2 PPI.
* Remove unused SmbusLib.  Use SmbusLibNull instead.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Include/Guid/PlatformInfo.h               |   9 +-
 .../BoardClkGens/BoardClkGens.c               |  23 +-
 .../BoardClkGens/BoardClkGens.h               |   8 +-
 .../MultiPlatformLib/BoardGpios/BoardGpios.c  |  12 +-
 .../MultiPlatformLib/BoardGpios/BoardGpios.h  |   7 +-
 .../MultiPlatformLib/MultiPlatformLib.h       |   4 -
 .../MultiPlatformLib/MultiPlatformLib.inf     |   2 +-
 .../Library/SmbusLib/CommonHeader.h           |  26 -
 .../Library/SmbusLib/SmbusLib.c               | 873 ------------------
 .../Library/SmbusLib/SmbusLib.inf             |  46 -
 .../Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c  | 319 -------
 .../PlatformInitPei/PlatformEarlyInit.h       |  10 +-
 .../PlatformPei/CommonHeader.h                |   1 -
 .../PlatformPei/PlatformPei.inf               |   1 -
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |   2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |   2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |   2 +-
 17 files changed, 24 insertions(+), 1323 deletions(-)
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/CommonHeader.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/PlatformInfo.h b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/PlatformInfo.h
index cac31e2a40..afd4b6f4f0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/PlatformInfo.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/PlatformInfo.h
@@ -1,13 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
-
 Module Name:
 
   PlatformInfo.h
@@ -27,7 +23,6 @@ Abstract:
 #include <Library/HobLib.h>
 #include <Library/IoLib.h>
 #include <Library/DebugLib.h>
-#include <Library/SmbusLib.h>
 #include <IndustryStandard/SmBus.h>
 #endif
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c
index 919032c2df..4356f7b366 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c
@@ -1,12 +1,10 @@
 /** @file
   Clock generator setting for multiplatform.
 
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 **/
 
 #include <BoardClkGens.h>
@@ -44,7 +42,7 @@ CLOCK_GENERATOR_DETAILS   mSupportedClockGeneratorTable[] =
 EFI_STATUS
 ConfigureClockGenerator (
   IN     EFI_PEI_SERVICES              **PeiServices,
-  IN     EFI_PEI_SMBUS_PPI                 *SmbusPpi,
+  IN     EFI_PEI_SMBUS2_PPI            *SmbusPpi,
   IN     CLOCK_GENERATOR_TYPE          ClockType,
   IN     UINT8                         ClockAddress,
   IN     UINTN                         ConfigurationTableLength,
@@ -76,7 +74,6 @@ ConfigureClockGenerator (
   Length = sizeof (Buffer);
   Command = 0;
   Status = SmbusPpi->Execute (
-    PeiServices,
     SmbusPpi,
     SlaveAddress,
     Command,
@@ -116,7 +113,6 @@ ConfigureClockGenerator (
   Buffer[30] = 0x00;
 
   Status = SmbusPpi->Execute (
-    PeiServices,
     SmbusPpi,
     SlaveAddress,
     Command,
@@ -127,7 +123,6 @@ ConfigureClockGenerator (
     );
 #else
   Status = SmbusPpi->Execute (
-    PeiServices,
     SmbusPpi,
     SlaveAddress,
     Command,
@@ -142,7 +137,6 @@ ConfigureClockGenerator (
     Command = 4;
     Length = 1;
   Status = SmbusPpi->Execute (
-    PeiServices,
     SmbusPpi,
     SlaveAddress,
     Command,
@@ -164,7 +158,6 @@ ConfigureClockGenerator (
     Length = sizeof (Buffer);
       Command = 0;
       Status =  SmbusPpi->Execute (
-        PeiServices,
         SmbusPpi,
         SlaveAddress,
         Command,
@@ -201,7 +194,7 @@ ConfigureClockGenerator (
 UINT8
 ReadClockGeneratorID (
   IN     EFI_PEI_SERVICES              **PeiServices,
-  IN     EFI_PEI_SMBUS_PPI                 *SmbusPpi,
+  IN     EFI_PEI_SMBUS2_PPI            *SmbusPpi,
   IN     UINT8                         ClockAddress
   )
 {
@@ -217,7 +210,6 @@ ReadClockGeneratorID (
   Length = sizeof (Buffer);
   Command = 0;
   SmbusPpi->Execute (
-    PeiServices,
     SmbusPpi,
     SlaveAddress,
     Command,
@@ -289,7 +281,7 @@ ConfigurePlatformClocks (
   //
   Status = (**PeiServices).LocatePpi (
                              (CONST EFI_PEI_SERVICES **) PeiServices,
-                             &gEfiPeiSmbusPpiGuid,
+                             &gEfiPeiSmbus2PpiGuid,
                              0,
                              NULL,
                              &SmbusPpi
@@ -300,8 +292,7 @@ ConfigurePlatformClocks (
   SlaveAddress.SmbusDeviceAddress = ClockAddress >> 1;
   Length = 1;
   Command = 0x87;   //Control Register 7 Vendor ID Check
-  Status = ((EFI_PEI_SMBUS_PPI *) SmbusPpi)->Execute (
-                                               PeiServices,
+  Status = ((EFI_PEI_SMBUS2_PPI *) SmbusPpi)->Execute (
                                                SmbusPpi,
                                                SlaveAddress,
                                                Command,
@@ -405,7 +396,7 @@ ConfigurePlatformClocks (
 static EFI_PEI_NOTIFY_DESCRIPTOR    mNotifyList[] = {
   {
     EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
-    &gEfiPeiSmbusPpiGuid,
+    &gEfiPeiSmbus2PpiGuid,
     ConfigurePlatformClocks
   }
 };
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h
index e153933d72..fe0ed24af7 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h
@@ -3,11 +3,10 @@
 
   This file includes package header files, library classes.
 
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

 **/
 
 #ifndef _BOARD_CLK_GEN_H_
@@ -17,8 +16,7 @@
 #include <Library/HobLib.h>
 #include <Library/IoLib.h>
 #include <Library/DebugLib.h>
-#include <Library/SmbusLib.h>
-#include <Ppi/Smbus.h>
+#include <Ppi/Smbus2.h>
 #include <IndustryStandard/SmBus.h>
 #include <Guid/PlatformInfo.h>
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c
index 5790d045fc..a9e2c8c060 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c
@@ -1,12 +1,10 @@
 /** @file
   Gpio setting for multiplatform..
 
-  Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 **/
 
 #include <BoardGpios.h>
@@ -25,8 +23,6 @@
 //AlpineValley platform code end
 //
 
-EFI_GUID  gPeiSmbusPpiGuid               = EFI_PEI_SMBUS_PPI_GUID;
-
 /**
   @param None
 
@@ -66,7 +62,7 @@ ConfigurePlatformSysCtrlGpio (
 
   Status = (**PeiServices).LocatePpi (
                             (const EFI_PEI_SERVICES **)PeiServices,
-                            &gPeiSmbusPpiGuid,
+                            &gEfiPeiSmbus2PpiGuid,
                             0,
                             NULL,
                             (void **)&SmbusPpi
@@ -92,7 +88,7 @@ ConfigurePlatformSysCtrlGpio (
 static EFI_PEI_NOTIFY_DESCRIPTOR    mNotifyList[] = {
   {
     EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
-    &gEfiPeiSmbusPpiGuid,
+    &gEfiPeiSmbus2PpiGuid,
     ConfigurePlatformSysCtrlGpio
   }
 };
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h
index 0e19819b22..594616d63a 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h
@@ -3,11 +3,10 @@
 
   This file includes package header files, library classes.
 
-  Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

 **/
 
 #ifndef _BOARDGPIOS_H_
@@ -20,7 +19,7 @@
 #include <Library/IoLib.h>
 #include <Library/HobLib.h>
 #include <Guid/PlatformInfo.h>
-#include <Ppi/Smbus.h>
+#include <Ppi/Smbus2.h>
 #include <Ppi/ReadOnlyVariable2.h>
 #include <Guid/SetupVariable.h>
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
index 3fa9f7b129..13097fbc74 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.h
@@ -26,7 +26,6 @@
 
 #include <PiDxe.h>
 #include <Library/BaseLib.h>
-#include <FrameworkPei.h>
 
 #include "PlatformBaseAddresses.h"
 #include "PchAccess.h"
@@ -37,7 +36,6 @@
 #include <Ppi/Stall.h>
 #include <Guid/SetupVariable.h>
 #include <Ppi/AtaController.h>
-#include <Ppi/FindFv.h>
 #include <Ppi/BootInRecoveryMode.h>
 #include <Ppi/ReadOnlyVariable2.h>
 #include <Ppi/Capsule.h>
@@ -50,7 +48,6 @@
 #include <Library/BaseLib.h>
 #include <IndustryStandard/Pci22.h>
 #include <Ppi/Speaker.h>
-#include <Guid/FirmwareFileSystem.h>
 #include <Guid/MemoryTypeInformation.h>
 #include <Ppi/Reset.h>
 #include <Ppi/EndOfPeiPhase.h>
@@ -58,7 +55,6 @@
 #include <Guid/GlobalVariable.h>
 #include <Ppi/RecoveryModule.h>
 #include <Ppi/DeviceRecoveryModule.h>
-#include <Guid/Capsule.h>
 #include <Guid/RecoveryDevice.h>
 #include <Ppi/MasterBootMode.h>
 #include <Guid/PlatformInfo.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
index a4942a097c..7a084bea3c 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
@@ -54,7 +54,6 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
 
 [LibraryClasses]
@@ -64,6 +63,7 @@ [LibraryClasses]
 
 [Ppis]
   gEfiPeiReadOnlyVariable2PpiGuid
+  gEfiPeiSmbus2PpiGuid
 
 [Pcd.common]
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/CommonHeader.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/CommonHeader.h
deleted file mode 100644
index d34dd942d3..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/CommonHeader.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/**@file
-  Common header file shared by all source files.
-
-  This file includes package header files, library classes.
-
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-**/
-
-#ifndef __COMMON_HEADER_H_
-#define __COMMON_HEADER_H_
-
-
-#include <Base.h>
-#include <PchAccess.h>
-
-#include <Library/SmbusLib.h>
-#include <Library/IoLib.h>
-#include <Library/PciLib.h>
-#include <Library/DebugLib.h>
-#include <Library/PcdLib.h>
-
-#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.c
deleted file mode 100644
index 4052724812..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.c
+++ /dev/null
@@ -1,873 +0,0 @@
-/** @file
-  Intel ICH9 SMBUS library implementation built upon I/O library.
-
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-**/
-
-#include "CommonHeader.h"
-
-/**
-  Gets Io port base address of Smbus Host Controller.
-
-  This internal function depends on a feature flag named PcdIchSmbusFixedIoPortBaseAddress
-  to retrieve Smbus Io port base. If that feature flag is true, it will get Smbus Io port base
-  address from a preset Pcd entry named PcdIchSmbusIoPortBaseAddress; otherwise, it will always
-  read Pci configuration space to get that value in each Smbus bus transaction.
-
-  @return The Io port base address of Smbus host controller.
-
-**/
-UINTN
-InternalGetSmbusIoPortBaseAddress (
-  VOID
-  )
-{
-  UINTN     IoPortBaseAddress;
-
-  IoPortBaseAddress = (UINTN) MmioRead32 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SMBUS, PCI_FUNCTION_NUMBER_PCH_SMBUS, R_PCH_SMBUS_BASE)) & B_PCH_SMBUS_BASE_BAR;
-
-  //
-  // Make sure that the IO port base address has been properly set.
-  //
-  ASSERT (IoPortBaseAddress != 0);
-
-  return IoPortBaseAddress;
-}
-
-/**
-  Acquires the ownership of SMBUS.
-
-  This internal function reads the host state register.
-  If the SMBUS is not available, RETURN_TIMEOUT is returned;
-  Otherwise, it performs some basic initializations and returns
-  RETURN_SUCCESS.
-
-  @param  IoPortBaseAddress The Io port base address of Smbus Host controller.
-
-  @retval RETURN_SUCCESS    The SMBUS command was executed successfully.
-  @retval RETURN_TIMEOUT    A timeout occurred while executing the SMBUS command.
-
-**/
-RETURN_STATUS
-InternalSmBusAcquire (
-  UINTN                     IoPortBaseAddress
-  )
-{
-  UINT8   HostStatus;
-
-  HostStatus = IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS);
-  if ((HostStatus & B_PCH_SMBUS_IUS) != 0) {
-    return RETURN_TIMEOUT;
-  } else if ((HostStatus & B_PCH_SMBUS_HBSY) != 0) {
-    //
-    // Clear host status register and exit.
-    //
-    IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS, B_PCH_SMBUS_HSTS_ALL);
-    return RETURN_TIMEOUT;
-  }
-  //
-  // Clear out any odd status information (Will Not Clear In Use).
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS, HostStatus);
-
-  return RETURN_SUCCESS;
-}
-
-/**
-  Starts the SMBUS transaction and waits until the end.
-
-  This internal function start the SMBUS transaction and waits until the transaction
-  of SMBUS is over by polling the INTR bit of Host status register.
-  If the SMBUS is not available, RETURN_TIMEOUT is returned;
-  Otherwise, it performs some basic initializations and returns
-  RETURN_SUCCESS.
-
-  @param  IoPortBaseAddress   The Io port base address of Smbus Host controller.
-  @param  HostControl         The Host control command to start SMBUS transaction.
-
-  @retval RETURN_SUCCESS      The SMBUS command was executed successfully.
-  @retval RETURN_CRC_ERROR    The checksum is not correct (PEC is incorrect).
-  @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected
-                              in the Host Status Register bit.  Device errors are
-                              a result of a transaction collision, illegal command field,
-                              unclaimed cycle (host initiated), or bus errors (collisions).
-
-**/
-RETURN_STATUS
-InternalSmBusStart (
-  IN  UINTN                   IoPortBaseAddress,
-  IN  UINT8                   HostControl
-  )
-{
-  UINT8   HostStatus;
-  UINT8   AuxiliaryStatus;
-
-  //
-  // Set Host Control Register (Initiate Operation, Interrupt disabled).
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HCTL, (UINT8)(HostControl + B_PCH_SMBUS_START));
-
-  do {
-    //
-    // Poll INTR bit of Host Status Register.
-    //
-    HostStatus = IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS);
-  } while ((HostStatus & (B_PCH_SMBUS_INTR | B_PCH_SMBUS_ERRORS | B_PCH_SMBUS_BYTE_DONE_STS)) == 0);
-
-  if ((HostStatus & B_PCH_SMBUS_ERRORS) == 0) {
-    return RETURN_SUCCESS;
-  }
-
-  //
-  // Clear error bits of Host Status Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS, B_PCH_SMBUS_ERRORS);
-
-  //
-  // Read Auxiliary Status Register to judge CRC error.
-  //
-  AuxiliaryStatus = IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_AUXS);
-  if ((AuxiliaryStatus & B_PCH_SMBUS_CRCE) != 0) {
-    return RETURN_CRC_ERROR;
-  }
-
-  return RETURN_DEVICE_ERROR;
-}
-
-/**
-  Executes an SMBUS quick, byte or word command.
-
-  This internal function executes an SMBUS quick, byte or word commond.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-
-  @param  HostControl     The value of Host Control Register to set.
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Value           The byte/word write to the SMBUS.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The byte/word read from the SMBUS.
-
-**/
-UINT16
-InternalSmBusNonBlock (
-  IN  UINT8                     HostControl,
-  IN  UINTN                     SmBusAddress,
-  IN  UINT16                    Value,
-  OUT RETURN_STATUS             *Status
-  )
-{
-  RETURN_STATUS                 ReturnStatus;
-  UINTN                         IoPortBaseAddress;
-  UINT8                         AuxiliaryControl;
-
-  IoPortBaseAddress = InternalGetSmbusIoPortBaseAddress ();
-
-  //
-  // Try to acquire the ownership of ICH SMBUS.
-  //
-  ReturnStatus = InternalSmBusAcquire (IoPortBaseAddress);
-  if (RETURN_ERROR (ReturnStatus)) {
-    goto Done;
-  }
-
-  //
-  // Set the appropriate Host Control Register and auxiliary Control Register.
-  //
-  AuxiliaryControl = 0;
-  if (SMBUS_LIB_PEC (SmBusAddress)) {
-    AuxiliaryControl |= B_PCH_SMBUS_AAC;
-    HostControl      |= B_PCH_SMBUS_PEC_EN;
-  }
-
-  //
-  // Set Host Command Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HCMD, (UINT8) SMBUS_LIB_COMMAND (SmBusAddress));
-
-  //
-  // Write value to Host Data 0 and Host Data 1 Registers.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HD0, (UINT8) Value);
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HD1, (UINT8) (Value >> 8));
-
-  //
-  // Set Auxiliary Control Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_AUXC, AuxiliaryControl);
-
-  //
-  // Set SMBUS slave address for the device to send/receive from.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_TSA, (UINT8) SmBusAddress);
-
-  //
-  // Start the SMBUS transaction and wait for the end.
-  //
-  ReturnStatus = InternalSmBusStart (IoPortBaseAddress, HostControl);
-
-  //
-  // Read value from Host Data 0 and Host Data 1 Registers.
-  //
-  Value = (UINT16)(IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HD1) << 8);
-  Value = (UINT16)(Value | IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HD0));
-
-  //
-  // Clear Host Status Register and Auxiliary Status Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS, B_PCH_SMBUS_HSTS_ALL);
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_AUXS, B_PCH_SMBUS_CRCE);
-
-Done:
-  if (Status != NULL) {
-    *Status = ReturnStatus;
-  }
-
-  return Value;
-}
-
-/**
-  Executes an SMBUS quick read command.
-
-  Executes an SMBUS quick read command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address field of SmBusAddress is required.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If PEC is set in SmBusAddress, then ASSERT().
-  If Command in SmBusAddress is not zero, then ASSERT().
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-**/
-VOID
-EFIAPI
-SmBusQuickRead (
-  IN  UINTN                     SmBusAddress,
-  OUT RETURN_STATUS             *Status       OPTIONAL
-  )
-{
-  ASSERT (!SMBUS_LIB_PEC (SmBusAddress));
-  ASSERT (SMBUS_LIB_COMMAND (SmBusAddress)   == 0);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress)  == 0);
-
-  InternalSmBusNonBlock (
-    V_PCH_SMBUS_SMB_CMD_QUICK,
-    SmBusAddress | B_PCH_SMBUS_RW_SEL_READ,
-    0,
-    Status
-    );
-}
-
-/**
-  Executes an SMBUS quick write command.
-
-  Executes an SMBUS quick write command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address field of SmBusAddress is required.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If PEC is set in SmBusAddress, then ASSERT().
-  If Command in SmBusAddress is not zero, then ASSERT().
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-**/
-VOID
-EFIAPI
-SmBusQuickWrite (
-  IN  UINTN                     SmBusAddress,
-  OUT RETURN_STATUS             *Status       OPTIONAL
-  )
-{
-  ASSERT (!SMBUS_LIB_PEC (SmBusAddress));
-  ASSERT (SMBUS_LIB_COMMAND (SmBusAddress)   == 0);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  InternalSmBusNonBlock (
-    V_PCH_SMBUS_SMB_CMD_QUICK,
-    SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-    0,
-    Status
-    );
-}
-
-/**
-  Executes an SMBUS receive byte command.
-
-  Executes an SMBUS receive byte command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address field of SmBusAddress is required.
-  The byte received from the SMBUS is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Command in SmBusAddress is not zero, then ASSERT().
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The byte received from the SMBUS.
-
-**/
-UINT8
-EFIAPI
-SmBusReceiveByte (
-  IN  UINTN          SmBusAddress,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT8 ValueReturn = 0;
-
-  ASSERT (SMBUS_LIB_COMMAND (SmBusAddress)   == 0);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = (UINT8) InternalSmBusNonBlock (
-                   V_PCH_SMBUS_SMB_CMD_BYTE,
-                   SmBusAddress | B_PCH_SMBUS_RW_SEL_READ,
-                   0,
-                   Status
-                   );
-  return ValueReturn;
-
-  }
-
-/**
-  Executes an SMBUS send byte command.
-
-  Executes an SMBUS send byte command on the SMBUS device specified by SmBusAddress.
-  The byte specified by Value is sent.
-  Only the SMBUS slave address field of SmBusAddress is required.  Value is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Command in SmBusAddress is not zero, then ASSERT().
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Value           The 8-bit value to send.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The parameter of Value.
-
-**/
-UINT8
-EFIAPI
-SmBusSendByte (
-  IN  UINTN          SmBusAddress,
-  IN  UINT8          Value,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT8 ValueReturn = 0;
-
-  ASSERT (SMBUS_LIB_COMMAND (SmBusAddress)   == 0);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = (UINT8) InternalSmBusNonBlock (
-                          V_PCH_SMBUS_SMB_CMD_BYTE,
-                          SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                          Value,
-                          Status
-                          );
-  return ValueReturn;
-
-  }
-
-/**
-  Executes an SMBUS read data byte command.
-
-  Executes an SMBUS read data byte command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  The 8-bit value read from the SMBUS is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The byte read from the SMBUS.
-
-**/
-UINT8
-EFIAPI
-SmBusReadDataByte (
-  IN  UINTN          SmBusAddress,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT8 ValueReturn = 0;
-
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-   ValueReturn = (UINT8) InternalSmBusNonBlock (
-                           V_PCH_SMBUS_SMB_CMD_BYTE_DATA,
-                           SmBusAddress | B_PCH_SMBUS_RW_SEL_READ,
-                           0,
-                           Status
-                           );
-  return ValueReturn;
-}
-
-/**
-  Executes an SMBUS write data byte command.
-
-  Executes an SMBUS write data byte command on the SMBUS device specified by SmBusAddress.
-  The 8-bit value specified by Value is written.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  Value is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Value           The 8-bit value to write.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The parameter of Value.
-
-**/
-UINT8
-EFIAPI
-SmBusWriteDataByte (
-  IN  UINTN          SmBusAddress,
-  IN  UINT8          Value,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT8 ValueReturn = 0;
-
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = (UINT8) InternalSmBusNonBlock (
-                          V_PCH_SMBUS_SMB_CMD_BYTE_DATA,
-                          SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                          Value,
-                          Status
-                          );
-  return ValueReturn;
-
-}
-
-/**
-  Executes an SMBUS read data word command.
-
-  Executes an SMBUS read data word command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  The 16-bit value read from the SMBUS is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The byte read from the SMBUS.
-
-**/
-UINT16
-EFIAPI
-SmBusReadDataWord (
-  IN  UINTN          SmBusAddress,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT16 ValueReturn = 0;
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = InternalSmBusNonBlock (
-                  V_PCH_SMBUS_SMB_CMD_WORD_DATA,
-                  SmBusAddress | B_PCH_SMBUS_RW_SEL_READ,
-                  0,
-                  Status
-                  );
-  return ValueReturn;
-
-}
-
-/**
-  Executes an SMBUS write data word command.
-
-  Executes an SMBUS write data word command on the SMBUS device specified by SmBusAddress.
-  The 16-bit value specified by Value is written.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  Value is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Value           The 16-bit value to write.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The parameter of Value.
-
-**/
-UINT16
-EFIAPI
-SmBusWriteDataWord (
-  IN  UINTN          SmBusAddress,
-  IN  UINT16         Value,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT16 ValueReturn = 0;
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = InternalSmBusNonBlock (
-                  V_PCH_SMBUS_SMB_CMD_WORD_DATA,
-                  SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                  Value,
-                  Status
-                  );
-  return ValueReturn;
-}
-
-/**
-  Executes an SMBUS process call command.
-
-  Executes an SMBUS process call command on the SMBUS device specified by SmBusAddress.
-  The 16-bit value specified by Value is written.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  The 16-bit value returned by the process call command is returned.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Value           The 16-bit value to write.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The 16-bit value returned by the process call command.
-
-**/
-UINT16
-EFIAPI
-SmBusProcessCall (
-  IN  UINTN          SmBusAddress,
-  IN  UINT16         Value,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINT16 ValueReturn = 0;
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress)    == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  ValueReturn = InternalSmBusNonBlock (
-                  V_PCH_SMBUS_SMB_CMD_PROCESS_CALL,
-                  SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                  Value,
-                  Status
-                  );
-  return ValueReturn;
-}
-
-/**
-  Executes an SMBUS block command.
-
-  Executes an SMBUS block read, block write and block write-block read command
-  on the SMBUS device specified by SmBusAddress.
-  Bytes are read from the SMBUS and stored in Buffer.
-  The number of bytes read is returned, and will never return a value larger than 32-bytes.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
-  SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes.
-
-  @param  HostControl     The value of Host Control Register to set.
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  WriteBuffer     Pointer to the buffer of bytes to write to the SMBUS.
-  @param  ReadBuffer      Pointer to the buffer of bytes to read from the SMBUS.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The number of bytes read from the SMBUS.
-
-**/
-UINTN
-InternalSmBusBlock (
-  IN  UINT8                     HostControl,
-  IN  UINTN                     SmBusAddress,
-  IN  UINT8                     *WriteBuffer,
-  OUT UINT8                     *ReadBuffer,
-  OUT RETURN_STATUS             *Status
-  )
-{
-  RETURN_STATUS                 ReturnStatus;
-  UINTN                         Index;
-  UINTN                         BytesCount;
-  UINTN                         IoPortBaseAddress;
-  UINT8                         AuxiliaryControl;
-
-  IoPortBaseAddress = InternalGetSmbusIoPortBaseAddress ();
-
-  BytesCount = SMBUS_LIB_LENGTH (SmBusAddress);
-
-  //
-  // Try to acquire the ownership of ICH SMBUS.
-  //
-  ReturnStatus = InternalSmBusAcquire (IoPortBaseAddress);
-  if (RETURN_ERROR (ReturnStatus)) {
-    goto Done;
-  }
-
-  //
-  // Set the appropriate Host Control Register and auxiliary Control Register.
-  //
-  AuxiliaryControl = B_PCH_SMBUS_E32B;
-  if (SMBUS_LIB_PEC (SmBusAddress)) {
-    AuxiliaryControl |= B_PCH_SMBUS_AAC;
-    HostControl      |= B_PCH_SMBUS_PEC_EN;
-  }
-
-  //
-  // Set Host Command Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HCMD, (UINT8) SMBUS_LIB_COMMAND (SmBusAddress));
-
-  //
-  // Set Auxiliary Control Regiester.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_AUXC, AuxiliaryControl);
-
-  //
-  // Clear byte pointer of 32-byte buffer.
-  //
-  IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HCTL);
-
-  if (WriteBuffer != NULL) {
-    //
-    // Write the number of block to Host Block Data Byte Register.
-    //
-    IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HD0, (UINT8) BytesCount);
-
-    //
-    // Write data block to Host Block Data Register.
-    //
-    for (Index = 0; Index < BytesCount; Index++) {
-      IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HBD, WriteBuffer[Index]);
-    }
-  }
-
-  //
-  // Set SMBUS slave address for the device to send/receive from.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_TSA, (UINT8) SmBusAddress);
-
-  //
-  // Start the SMBUS transaction and wait for the end.
-  //
-  ReturnStatus = InternalSmBusStart (IoPortBaseAddress, HostControl);
-  if (RETURN_ERROR (ReturnStatus)) {
-    goto Done;
-  }
-
-  if (ReadBuffer != NULL) {
-    //
-    // Read the number of block from host block data byte register.
-    //
-    BytesCount = IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HD0);
-
-    //
-    // Write data block from Host Block Data Register.
-    //
-    for (Index = 0; Index < BytesCount; Index++) {
-      ReadBuffer[Index] = IoRead8 (IoPortBaseAddress + R_PCH_SMBUS_HBD);
-    }
-  }
-
-Done:
-  //
-  // Clear Host Status Register and Auxiliary Status Register.
-  //
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_HSTS, B_PCH_SMBUS_HSTS_ALL);
-  IoWrite8 (IoPortBaseAddress + R_PCH_SMBUS_AUXS, B_PCH_SMBUS_CRCE);
-
-  if (Status != NULL) {
-    *Status = ReturnStatus;
-  }
-
-  return BytesCount;
-}
-
-/**
-  Executes an SMBUS read block command.
-
-  Executes an SMBUS read block command on the SMBUS device specified by SmBusAddress.
-  Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
-  Bytes are read from the SMBUS and stored in Buffer.
-  The number of bytes read is returned, and will never return a value larger than 32-bytes.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
-  SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes.
-  If Length in SmBusAddress is not zero, then ASSERT().
-  If Buffer is NULL, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Buffer          Pointer to the buffer to store the bytes read from the SMBUS.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The number of bytes read.
-
-**/
-UINTN
-EFIAPI
-SmBusReadBlock (
-  IN  UINTN          SmBusAddress,
-  OUT VOID           *Buffer,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINTN BytesCount = 0;
-
-  ASSERT (Buffer != NULL);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-
-  BytesCount = InternalSmBusBlock (
-                 V_PCH_SMBUS_SMB_CMD_BLOCK,
-                 SmBusAddress | B_PCH_SMBUS_RW_SEL_READ,
-                 NULL,
-                 Buffer,
-                 Status
-                 );
-  return BytesCount;
-
-}
-
-/**
-  Executes an SMBUS write block command.
-
-  Executes an SMBUS write block command on the SMBUS device specified by SmBusAddress.
-  The SMBUS slave address, SMBUS command, and SMBUS length fields of SmBusAddress are required.
-  Bytes are written to the SMBUS from Buffer.
-  The number of bytes written is returned, and will never return a value larger than 32-bytes.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  If Length in SmBusAddress is zero or greater than 32, then ASSERT().
-  If Buffer is NULL, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  Buffer          Pointer to the buffer to store the bytes read from the SMBUS.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The number of bytes written.
-
-**/
-UINTN
-EFIAPI
-SmBusWriteBlock (
-  IN  UINTN          SmBusAddress,
-  OUT VOID           *Buffer,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINTN	BytesCount = 0;
-
-  ASSERT (Buffer != NULL);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) >= 1);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) <= 32);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-
- BytesCount = InternalSmBusBlock (
-
-                V_PCH_SMBUS_SMB_CMD_BLOCK,
-                SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                Buffer,
-                NULL,
-                Status
-                );
-
-  return BytesCount;
-}
-
-/**
-  Executes an SMBUS block process call command.
-
-  Executes an SMBUS block process call command on the SMBUS device specified by SmBusAddress.
-  The SMBUS slave address, SMBUS command, and SMBUS length fields of SmBusAddress are required.
-  Bytes are written to the SMBUS from WriteBuffer.  Bytes are then read from the SMBUS into ReadBuffer.
-  If Status is not NULL, then the status of the executed command is returned in Status.
-  It is the caller's responsibility to make sure ReadBuffer is large enough for the total number of bytes read.
-  SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes.
-  If Length in SmBusAddress is zero or greater than 32, then ASSERT().
-  If WriteBuffer is NULL, then ASSERT().
-  If ReadBuffer is NULL, then ASSERT().
-  If any reserved bits of SmBusAddress are set, then ASSERT().
-
-  @param  SmBusAddress    Address that encodes the SMBUS Slave Address,
-                          SMBUS Command, SMBUS Data Length, and PEC.
-  @param  WriteBuffer     Pointer to the buffer of bytes to write to the SMBUS.
-  @param  ReadBuffer      Pointer to the buffer of bytes to read from the SMBUS.
-  @param  Status          Return status for the executed command.
-                          This is an optional parameter and may be NULL.
-
-  @return The number of bytes written.
-
-**/
-UINTN
-EFIAPI
-SmBusBlockProcessCall (
-  IN  UINTN          SmBusAddress,
-  IN  VOID           *WriteBuffer,
-  OUT VOID           *ReadBuffer,
-  OUT RETURN_STATUS  *Status        OPTIONAL
-  )
-{
-  UINTN BytesCount = 0;
-
-  ASSERT (WriteBuffer != NULL);
-  ASSERT (ReadBuffer  != NULL);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) >= 1);
-  ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) <= 32);
-  ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
-
-  BytesCount = InternalSmBusBlock (
-                 V_PCH_SMBUS_SMB_CMD_BLOCK_PROCESS,
-                 SmBusAddress | B_PCH_SMBUS_RW_SEL_WRITE,
-                 WriteBuffer,
-                 ReadBuffer,
-                 Status
-                 );
-  return BytesCount;
-
-  }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
deleted file mode 100644
index b13e3de0cc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+++ /dev/null
@@ -1,46 +0,0 @@
-## @file
-# Component description file for Intel Ich9 Smbus Library.
-#
-# SMBUS Library that layers on top of the I/O Library to directly
-#  access a standard SMBUS host controller.
-# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SmbusLib
-  FILE_GUID                      = 0558CAEA-FEF3-4b6d-915E-8742EFE6DEE1
-  MODULE_TYPE                    = BASE
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = SmbusLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  SmbusLib.c
-
-[Packages]
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  MdePkg/MdePkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-
-[LibraryClasses]
-  PcdLib
-  DebugLib
-  PciLib
-  IoLib
-
-[Pcd.common]
-  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c
deleted file mode 100644
index 3fda6313d0..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c
+++ /dev/null
@@ -1,319 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-
-  Dimm.c
-
-Abstract:
-
-  PPI for reading SPD modules on DIMMs.
-
---*/
-
-
-//
-// Header Files
-//
-#include "Platformearlyinit.h"
-
-#define DIMM_SOCKETS     4  // Total number of DIMM sockets allowed on
-                            //   the platform
-#define DIMM_SEGMENTS    1  // Total number of Segments Per DIMM.
-#define MEMORY_CHANNELS  2  // Total number of memory channels
-                            //   populated on the system board
-//
-// Prototypes
-//
-
-EFI_STATUS
-EFIAPI
-GetDimmState (
-  IN      EFI_PEI_SERVICES        **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI   *This,
-  IN      UINT8                   Dimm,
-  OUT     PEI_PLATFORM_DIMM_STATE *State
-  );
-
-EFI_STATUS
-EFIAPI
-SetDimmState (
-  IN      EFI_PEI_SERVICES        **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI   *This,
-  IN      UINT8                   Dimm,
-  IN      PEI_PLATFORM_DIMM_STATE *State
-  );
-
-EFI_STATUS
-EFIAPI
-ReadSpd (
-  IN      EFI_PEI_SERVICES      **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI *This,
-  IN      UINT8                 Dimm,
-  IN      UINT8                 Offset,
-  IN      UINTN                 Count,
-  IN OUT  UINT8                 *Buffer
-  );
-
-static PEI_PLATFORM_DIMM_PPI mGchDimmPpi = {
-  DIMM_SOCKETS,
-  DIMM_SEGMENTS,
-  MEMORY_CHANNELS,
-  GetDimmState,
-  SetDimmState,
-  ReadSpd
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiPlatformDimm = {
-  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
-  &gPeiPlatformDimmPpiGuid,
-  &mGchDimmPpi
-};
-
-
-//
-// Functions
-//
-
-/**
-  This function returns the current state of a single DIMM.  Present indicates
-  that the DIMM slot is physically populated.  Disabled indicates that the DIMM
-  should not be used.
-
-  @param PeiServices   PEI services table pointer
-  @param This          PPI pointer
-  @param Dimm          DIMM to read from
-  @param State         Pointer to a return buffer to be updated with the current state
-                       of the DIMM
-
-  @retval EFI_SUCCESS         The function completed successfully.
-
-**/
-EFI_STATUS
-EFIAPI
-GetDimmState (
-  IN      EFI_PEI_SERVICES        **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI   *This,
-  IN      UINT8                   Dimm,
-  OUT     PEI_PLATFORM_DIMM_STATE *State
-  )
-{
-  EFI_STATUS                    Status;
-  UINT8                         Buffer;
-
-  PEI_ASSERT (PeiServices, (Dimm < This->DimmSockets));
-
-  //
-  // A failure here does not necessarily mean that no DIMM is present.
-  // Read a single byte.  All we care about is the return status.
-  //
-  Status = ReadSpd (
-             PeiServices,
-             This,
-             Dimm,
-             0,
-             1,
-             &Buffer
-             );
-
-  if (EFI_ERROR (Status)) {
-    State->Present = 0;
-  } else {
-    State->Present = 1;
-  }
-
-  //
-  // BUGBUG: Update to check platform variable when it is available
-  //
-  State->Disabled = 0;
-  State->Reserved = 0;
-
-  return EFI_SUCCESS;
-}
-
-/**
-
-  This function updates the state of a single DIMM.
-
-  @param PeiServices          PEI services table pointer
-  @param This                 PPI pointer
-  @param Dimm                 DIMM to set state for
-  @param State                Pointer to the state information to set.
-
-  @retval EFI_SUCCESS         The function completed successfully.
-  @retval EFI_UNSUPPORTED     The function is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SetDimmState (
-  IN      EFI_PEI_SERVICES        **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI   *This,
-  IN      UINT8                   Dimm,
-  IN      PEI_PLATFORM_DIMM_STATE *State
-  )
-{
-  return EFI_UNSUPPORTED;
-}
-
-/**
-  This function reads SPD information from a DIMM.
-
-  PeiServices   PEI services table pointer
-  This          PPI pointer
-  Dimm          DIMM to read from
-  Offset        Offset in DIMM
-  Count         Number of bytes
-  Buffer        Return buffer
-
-  @param EFI_SUCCESS              The function completed successfully.
-  @param EFI_DEVICE_ERROR         The DIMM being accessed reported a device error,
-                                  does not have an SPD module, or is not installed in
-                                  the system.
-  @retval EFI_TIMEOUT             Time out trying to read the SPD module.
-  @retval EFI_INVALID_PARAMETER   A parameter was outside the legal limits.
-
-**/
-EFI_STATUS
-EFIAPI
-ReadSpd (
-  IN      EFI_PEI_SERVICES      **PeiServices,
-  IN      PEI_PLATFORM_DIMM_PPI *This,
-  IN      UINT8                 Dimm,
-  IN      UINT8                 Offset,
-  IN      UINTN                 Count,
-  IN OUT  UINT8                 *Buffer
-  )
-{
-  EFI_STATUS                Status;
-  PEI_SMBUS_PPI             *Smbus;
-  UINTN                     Index;
-  UINTN                     Index1;
-  EFI_SMBUS_DEVICE_ADDRESS  SlaveAddress;
-  EFI_SMBUS_DEVICE_COMMAND  Command;
-  UINTN                     Length;
-
-  Status = (**PeiServices).LocatePpi (
-                             PeiServices,
-                             &gPeiSmbusPpiGuid,   // GUID
-                             0,                   // INSTANCE
-                             NULL,                // EFI_PEI_PPI_DESCRIPTOR
-                             &Smbus               // PPI
-                             );
-  ASSERT_PEI_ERROR (PeiServices, Status);
-
-  switch (Dimm) {
-  case 0:
-    SlaveAddress.SmbusDeviceAddress = SMBUS_ADDR_CH_A_1 >> 1;
-    break;
-  case 1:
-    SlaveAddress.SmbusDeviceAddress = SMBUS_ADDR_CH_A_2 >> 1;
-    break;
-  case 2:
-    SlaveAddress.SmbusDeviceAddress = SMBUS_ADDR_CH_B_1 >> 1;
-    break;
-  case 3:
-    SlaveAddress.SmbusDeviceAddress = SMBUS_ADDR_CH_B_2 >> 1;
-    break;
-  default:
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Index = Count % 4;
-  if (Index != 0) {
-    //
-    // read the first serveral bytes to speed up following reading
-    //
-    for (Index1 = 0; Index1 < Index; Index1++) {
-      Length = 1;
-      Command = Offset + Index1;
-      Status = Smbus->Execute (
-                        PeiServices,
-                        Smbus,
-                        SlaveAddress,
-                        Command,
-                        EfiSmbusReadByte,
-                        FALSE,
-                        &Length,
-                        &Buffer[Index1]
-                        );
-      if (EFI_ERROR(Status)) {
-        return Status;
-      }
-    }
-  }
-
-  //
-  // Now collect all the remaining bytes on 4 bytes block
-  //
-  for (; Index < Count; Index += 2) {
-    Command = Index + Offset;
-    Length = 2;
-    Status = Smbus->Execute (
-                      PeiServices,
-                      Smbus,
-                      SlaveAddress,
-                      Command,
-                      EfiSmbusReadWord,
-                      FALSE,
-                      &Length,
-                      &Buffer[Index]
-                      );
-    if (EFI_ERROR(Status)) {
-      return Status;
-    }
-
-    Index += 2;
-    Command = Index + Offset;
-    Length = 2;
-    Status = Smbus->Execute (
-                      PeiServices,
-                      Smbus,
-                      SlaveAddress,
-                      Command,
-                      EfiSmbusReadWord,
-                      FALSE,
-                      &Length,
-                      &Buffer[Index]
-                      );
-    if (EFI_ERROR(Status)) {
-      return Status;
-    }
-  }
-  return EFI_SUCCESS;
-}
-
-/**
-  This function initializes the PEIM.  It simply installs the DIMM PPI.
-
-  @param FfsHeader       Not used by this function
-  @param PeiServices     Pointer to PEI services table
-
-  @retval EFI_SUCCESS    The function completed successfully.
-
-**/
-EFI_STATUS
-EFIAPI
-PeimInitializeDimm (
-  IN EFI_PEI_SERVICES           **PeiServices,
-  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
-  IN VOID                       *SmbusPpi
-  )
-{
-  EFI_STATUS                    Status;
-
-  Status = (**PeiServices).InstallPpi (
-                             PeiServices,
-                             &mPpiPlatformDimm
-                             );
-  ASSERT_PEI_ERROR (PeiServices, Status);
-
-  return EFI_SUCCESS;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
index 9631d49a84..6a2ecf8fb4 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.h
@@ -59,7 +59,7 @@ Abstract:
 #include <Ppi/Speaker.h>
 #include <Guid/MemoryTypeInformation.h>
 #include <Ppi/Cache.h>
-#include <Ppi/Smbus.h>
+#include <Ppi/Smbus2.h>
 #include <Library/PchPlatformLib.h>
 #include <Ppi/SmbusPolicy.h>
 #include <Ppi/Reset.h>
@@ -1454,14 +1454,6 @@ SetDxeCacheMode (
   IN  CONST EFI_PEI_SERVICES    **PeiServices
   );
 
-EFI_STATUS
-GPIO_initialization (
-  IN EFI_PEI_SERVICES                   **PeiServices,
-  IN EFI_PEI_NOTIFY_DESCRIPTOR          *NotifyDescriptor,
-  IN VOID                               *SmbusPpi
-  );
-
-
 BOOLEAN
 IsRtcUipAlwaysSet (
   IN CONST EFI_PEI_SERVICES       **PeiServices
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
index a533f3918c..c18cabb2f2 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/CommonHeader.h
@@ -42,7 +42,6 @@
 #include <Library/PciLib.h>
 #include <Library/ReportStatusCodeLib.h>
 #include <Library/PcdLib.h>
-#include <Library/SmbusLib.h>
 #include <Library/TimerLib.h>
 #include <Library/PrintLib.h>
 #include <Library/ResetSystemLib.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
index 28a5274c40..d3969f2344 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
@@ -72,7 +72,6 @@ [LibraryClasses]
   DebugLib
   HobLib
   IoLib
-  MultiPlatformLib
   MtrrLib
   PerformanceLib
   MonoStatusCodeLib
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index b16883e98c..3910281c49 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -171,7 +171,7 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmbusLib|MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf
   SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index c9335a98c8..2ae594e5be 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -169,7 +169,7 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmbusLib|MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf
   SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index fd9ddebfd9..5cdc9bebc8 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -171,7 +171,7 @@ [LibraryClasses.common]
   #
   # ICH
   #
-  SmbusLib|Vlv2TbltDevicePkg/Library/SmbusLib/SmbusLib.inf
+  SmbusLib|MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf
   SmmLib|Vlv2TbltDevicePkg/Library/PchSmmLib/PchSmmLib.inf
 
   #
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-platforms Patch 10/14] Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe
  2019-07-01  2:55 ` [edk2-platforms Patch 10/14] Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe Michael D Kinney
@ 2019-07-01  4:08   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:08 UTC (permalink / raw)
  To: Kinney, Michael D, devel@edk2.groups.io; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: Kinney, Michael D 
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-platforms Patch 10/14] Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe

Switch from Intel Framework BDS module and libraries to the
MdeModulePkg BdsDxe module and libraries.

Update FLASH map for full 8MB FLASH size

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Library/FmpDeviceLib/FmpDeviceLib.c       |   12 +-
 .../DxePlatformBootManagerLib/BdsPlatform.c   | 1409 ++++++
 .../DxePlatformBootManagerLib/BdsPlatform.h   |  253 +
 .../DxePlatformBootManagerLib.inf             |   95 +
 .../DxePlatformBootManagerLib/MemoryTest.c    |   83 +
 .../PlatformBootOption.c                      |  559 ++
 .../Library/PlatformBdsLib/BdsPlatform.c      | 3092 ------------
 .../Library/PlatformBdsLib/BdsPlatform.h      |  516 --
 .../Library/PlatformBdsLib/PlatformBdsLib.inf |  128 -
 .../PlatformBdsLib/PlatformBdsStrings.uni     |   30 -
 .../Library/PlatformBdsLib/PlatformData.c     |  306 --
 .../Library/GenericBdsLib/BdsBoot.c           | 4490 -----------------
 .../Library/GenericBdsLib/BdsConnect.c        |  429 --
 .../Library/GenericBdsLib/BdsConsole.c        | 1061 ----
 .../Library/GenericBdsLib/BdsMisc.c           | 1575 ------
 .../Library/GenericBdsLib/DevicePath.c        |   27 -
 .../Library/GenericBdsLib/GenericBdsLib.inf   |  143 -
 .../Library/GenericBdsLib/GenericBdsLib.uni   |   19 -
 .../GenericBdsLib/GenericBdsStrings.uni       |   30 -
 .../Library/GenericBdsLib/InternalBdsLib.h    |  173 -
 .../Library/GenericBdsLib/String.c            |   26 -
 .../Library/GenericBdsLib/String.h            |   42 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |   26 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |   53 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |   22 +-
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |   22 +-
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |   22 +-
 .../Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c |   33 -
 .../Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf   |   32 -
 29 files changed, 2477 insertions(+), 12231 deletions(-)
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.h
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/MemoryTest.c
 create mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/PlatformBootOption.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsStrings.uni
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformData.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/DevicePath.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.uni
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsStrings.uni
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.h
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c
 delete mode 100644 Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c
index a863d69381..57185d8d09 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c
@@ -32,11 +32,11 @@ typedef struct {
 } UPDATE_CONFIG_DATA;
 
 UPDATE_CONFIG_DATA mUpdateConfigData[] = {
-  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00000000, 0x00040000, 0x00000000 },
-  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x000C0000, 0x00050000, 0x000C0000 },
-  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00110000, 0x00210000, 0x00110000 },
-  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00320000, 0x00070000, 0x00320000 },
-  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00390000, 0x00070000, 0x00390000 }
+  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00400000, 0x00040000, 0x00400000 },
+  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x004C0000, 0x00050000, 0x004C0000 },
+  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00510000, 0x00210000, 0x00510000 },
+  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00720000, 0x00070000, 0x00720000 },
+  { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeRelativeAddress, 0x00790000, 0x00070000, 0x00790000 }
 };
 
 /**
@@ -95,7 +95,7 @@ FmpDeviceGetSize (
   if (Size == NULL) {
     return EFI_INVALID_PARAMETER;
   }
-  *Size = PcdGet32 (PcdBiosRomBase);
+  *Size = PcdGet32 (PcdBiosRomSize);
   return EFI_SUCCESS;
 }
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
new file mode 100644
index 0000000000..4dd3827a6e
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
@@ -0,0 +1,1409 @@
+/** @file
+  This file include all platform action which can be customized by IBV/OEM.
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "BdsPlatform.h"
+#include <Guid/EventGroup.h>
+#include <Protocol/DxeSmmReadyToLock.h>
+#include <Protocol/FirmwareVolume2.h>
+#include <Protocol/PciRootBridgeIo.h>
+
+#include <Protocol/BlockIo.h>
+#include <Protocol/PciIo.h>
+#include <Library/IoLib.h>
+#include <Library/PciLib.h>
+#include <Guid/EventGroup.h>
+
+#include <Library/Tcg2PhysicalPresenceLib.h>
+
+#include <Library/HobLib.h>
+#include <Protocol/UsbIo.h>
+#include <Library/BootLogoLib.h>
+
+#include <Library/UefiBootManagerLib.h>
+
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_BOOT_MODE                 gBootMode;
+
+BOOLEAN                      gPPRequireUIConfirm;
+
+extern UINTN                                      mBootMenuOptionNumber;
+
+GLOBAL_REMOVE_IF_UNREFERENCED USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboardDevicePath = {
+  {
+    {
+      MESSAGING_DEVICE_PATH,
+      MSG_USB_CLASS_DP,
+      {
+        (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)),
+        (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8)
+      }
+    },
+    0xffff,           // VendorId
+    0xffff,           // ProductId
+    CLASS_HID,        // DeviceClass
+    SUBCLASS_BOOT,    // DeviceSubClass
+    PROTOCOL_KEYBOARD // DeviceProtocol
+  },
+  gEndEntire
+};
+
+//
+// Platform specific ISA serial device path
+//
+GLOBAL_REMOVE_IF_UNREFERENCED PLATFORM_ISA_SERIAL_DEVICE_PATH gIsaSerialDevicePath = {
+  gPciRootBridge,
+  gPciIsaBridge,
+  gPnp16550ComPort,
+  gUart(115200, 8, 1, 1),
+  gPcAnsiTerminal,
+  gEndEntire
+};
+
+//
+// Internal shell mode
+//
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32         mShellModeColumn;
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32         mShellModeRow;
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32         mShellHorizontalResolution;
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32         mShellVerticalResolution;
+//
+// BDS Platform Functions
+//
+
+BOOLEAN
+IsMorBitSet (
+  VOID
+  )
+{
+  UINTN                     MorControl;
+  EFI_STATUS                Status;
+  UINTN                     DataSize;
+
+  //
+  // Check if the MOR bit is set.
+  //
+  DataSize = sizeof (MorControl);
+  Status = gRT->GetVariable (
+                  MEMORY_OVERWRITE_REQUEST_VARIABLE_NAME,
+                  &gEfiMemoryOverwriteControlDataGuid,
+                  NULL,
+                  &DataSize,
+                  &MorControl
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: gEfiMemoryOverwriteControlDataGuid doesn't exist!!***\n"));
+    MorControl = 0;
+  } else {
+    DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: Get the gEfiMemoryOverwriteControlDataGuid = %x!!***\n", MorControl));
+  }
+
+  return (BOOLEAN) (MorControl & 0x01);
+}
+
+VOID
+DumpDevicePath (
+  IN CHAR16           *Name,
+  IN EFI_DEVICE_PATH  *DevicePath
+  )
+{
+  CHAR16 *Str;
+
+  Str = ConvertDevicePathToText(DevicePath, TRUE, TRUE);
+  DEBUG ((DEBUG_INFO, "%s: %s\n", Name, Str));
+  if (Str != NULL) {
+    FreePool (Str);
+  }
+}
+
+/**
+  An empty function to pass error checking of CreateEventEx ().
+
+  This empty function ensures that EVT_NOTIFY_SIGNAL_ALL is error
+  checked correctly since it is now mapped into CreateEventEx() in UEFI 2.0.
+
+  @param  Event                 Event whose notification function is being invoked.
+  @param  Context               The pointer to the notification function's context,
+                                which is implementation-dependent.
+**/
+VOID
+EFIAPI
+InternalBdsEmptyCallbackFuntion (
+  IN EFI_EVENT                Event,
+  IN VOID                     *Context
+  )
+{
+  return;
+}
+
+VOID
+ExitPmAuth (
+  VOID
+  )
+{
+  EFI_HANDLE                 Handle;
+  EFI_STATUS                 Status;
+  EFI_EVENT                  EndOfDxeEvent;
+
+  DEBUG((DEBUG_INFO,"ExitPmAuth ()- Start\n"));
+  //
+  // Prepare S3 information, this MUST be done before ExitPmAuth/EndOfDxe
+  //
+  //
+  // Since PI1.2.1, we need signal EndOfDxe as ExitPmAuth
+  //
+  Status = gBS->CreateEventEx (
+                  EVT_NOTIFY_SIGNAL,
+                  TPL_CALLBACK,
+                  InternalBdsEmptyCallbackFuntion,
+                  NULL,
+                  &gEfiEndOfDxeEventGroupGuid,
+                  &EndOfDxeEvent
+                  );
+  ASSERT_EFI_ERROR (Status);
+  gBS->SignalEvent (EndOfDxeEvent);
+  gBS->CloseEvent (EndOfDxeEvent);
+  DEBUG((DEBUG_INFO,"All EndOfDxe callbacks have returned successfully\n"));
+
+  //
+  // NOTE: We need install DxeSmmReadyToLock directly here because many boot script is added via ExitPmAuth/EndOfDxe callback.
+  // If we install them at same callback, these boot script will be rejected because BootScript Driver runs first to lock them done.
+  // So we seperate them to be 2 different events, ExitPmAuth is last chance to let platform add boot script. DxeSmmReadyToLock will
+  // make boot script save driver lock down the interface.
+  //
+  Handle = NULL;
+  Status = gBS->InstallProtocolInterface (
+                  &Handle,
+                  &gEfiDxeSmmReadyToLockProtocolGuid,
+                  EFI_NATIVE_INTERFACE,
+                  NULL
+                  );
+  ASSERT_EFI_ERROR (Status);
+  DEBUG((DEBUG_INFO,"ExitPmAuth ()- End\n"));
+}
+
+VOID
+ConnectRootBridge (
+  BOOLEAN Recursive
+  )
+{
+  UINTN                            RootBridgeHandleCount;
+  EFI_HANDLE                       *RootBridgeHandleBuffer;
+  UINTN                            RootBridgeIndex;
+
+  RootBridgeHandleCount = 0;
+  gBS->LocateHandleBuffer (
+         ByProtocol,
+         &gEfiPciRootBridgeIoProtocolGuid,
+         NULL,
+         &RootBridgeHandleCount,
+         &RootBridgeHandleBuffer
+         );
+  for (RootBridgeIndex = 0; RootBridgeIndex < RootBridgeHandleCount; RootBridgeIndex++) {
+    gBS->ConnectController (RootBridgeHandleBuffer[RootBridgeIndex], NULL, NULL, Recursive);
+  }
+}
+
+
+/**
+  Return whether the device is trusted console.
+
+  @param Device  The device to be tested.
+
+  @retval TRUE   The device can be trusted.
+  @retval FALSE  The device cannot be trusted.
+**/
+BOOLEAN
+IsTrustedConsole (
+  IN CONSOLE_TYPE              ConsoleType,
+  IN EFI_DEVICE_PATH_PROTOCOL  *Device
+  )
+{
+  VOID                      *TrustedConsoleDevicepath;
+  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL  *Instance;
+  UINTN                     Size;
+  EFI_DEVICE_PATH_PROTOCOL  *ConsoleDevice;
+
+  if (Device == NULL) {
+    return FALSE;
+  }
+
+  ConsoleDevice = DuplicateDevicePath(Device);
+
+  TrustedConsoleDevicepath = NULL;
+
+  switch (ConsoleType) {
+  case ConIn:
+    TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleInputDevicePath);
+    break;
+  case ConOut:
+    //
+    // Check GOP and remove last node
+    //
+    TempDevicePath = ConsoleDevice;
+    while (!IsDevicePathEndType (TempDevicePath)) {
+      if (DevicePathType (TempDevicePath) == ACPI_DEVICE_PATH &&
+          DevicePathSubType (TempDevicePath) == ACPI_ADR_DP) {
+        SetDevicePathEndNode (TempDevicePath);
+        break;
+      }
+      TempDevicePath = NextDevicePathNode (TempDevicePath);
+    }
+
+    TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleOutputDevicePath);
+    break;
+  default:
+    ASSERT(FALSE);
+    break;
+  }
+
+  TempDevicePath = TrustedConsoleDevicepath;
+  do {
+    Instance = GetNextDevicePathInstance (&TempDevicePath, &Size);
+    if (Instance == NULL) {
+      break;
+    }
+
+    if (CompareMem (ConsoleDevice, Instance, Size - END_DEVICE_PATH_LENGTH) == 0) {
+      FreePool (Instance);
+      FreePool (ConsoleDevice);
+      return TRUE;
+    }
+
+    FreePool (Instance);
+  } while (TempDevicePath != NULL);
+
+  FreePool (ConsoleDevice);
+
+  return FALSE;
+}
+
+BOOLEAN
+IsUsbShortForm (
+  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
+  )
+{
+  if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) &&
+      ((DevicePathSubType (DevicePath) == MSG_USB_CLASS_DP) || (DevicePathSubType (DevicePath) == MSG_USB_WWID_DP)) ) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
+  Connect the USB short form device path.
+
+  @param DevicePath   USB short form device path
+
+  @retval EFI_SUCCESS           Successfully connected the USB device
+  @retval EFI_NOT_FOUND         Cannot connect the USB device
+  @retval EFI_INVALID_PARAMETER The device path is invalid.
+**/
+EFI_STATUS
+ConnectUsbShortFormDevicePath (
+  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath
+  )
+{
+  EFI_STATUS                            Status;
+  EFI_HANDLE                            *Handles;
+  UINTN                                 HandleCount;
+  UINTN                                 Index;
+  EFI_PCI_IO_PROTOCOL                   *PciIo;
+  UINT8                                 Class[3];
+  BOOLEAN                               AtLeastOneConnected;
+
+  //
+  // Check the passed in parameters
+  //
+  if (DevicePath == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (!IsUsbShortForm (DevicePath)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  // Find the usb host controller firstly, then connect with the remaining device path
+  //
+  AtLeastOneConnected = FALSE;
+  Status = gBS->LocateHandleBuffer (
+                  ByProtocol,
+                  &gEfiPciIoProtocolGuid,
+                  NULL,
+                  &HandleCount,
+                  &Handles
+                  );
+  for (Index = 0; Index < HandleCount; Index++) {
+    Status = gBS->HandleProtocol (
+                    Handles[Index],
+                    &gEfiPciIoProtocolGuid,
+                    (VOID **) &PciIo
+                    );
+    if (!EFI_ERROR (Status)) {
+      //
+      // Check whether the Pci device is the wanted usb host controller
+      //
+      Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class);
+      if (!EFI_ERROR (Status) &&
+          ((PCI_CLASS_SERIAL == Class[2]) && (PCI_CLASS_SERIAL_USB == Class[1]))
+         ) {
+        Status = gBS->ConnectController (
+                        Handles[Index],
+                        NULL,
+                        DevicePath,
+                        FALSE
+                        );
+        if (!EFI_ERROR(Status)) {
+          AtLeastOneConnected = TRUE;
+        }
+      }
+    }
+  }
+
+  return AtLeastOneConnected ? EFI_SUCCESS : EFI_NOT_FOUND;
+}
+
+/**
+  Update the ConIn/ConOut variable with ISA Serial device path,if its not already exists in ConIn/ConOut
+**/
+VOID
+EnumIsaSerial (
+  VOID
+  )
+{
+  DEBUG ((DEBUG_INFO, "[EnumIsaSerial]\n"));
+  EfiBootManagerUpdateConsoleVariable (ConIn, (EFI_DEVICE_PATH_PROTOCOL *) &gIsaSerialDevicePath, NULL);
+  EfiBootManagerUpdateConsoleVariable (ConOut, (EFI_DEVICE_PATH_PROTOCOL *) &gIsaSerialDevicePath, NULL);
+
+  //
+  // Append ISA Serial DevicePath to "ConInDev" and "ConOutDev"
+  //
+  EfiBootManagerUpdateConsoleVariable (ConInDev, (EFI_DEVICE_PATH_PROTOCOL *) &gIsaSerialDevicePath, NULL);
+  EfiBootManagerUpdateConsoleVariable (ConOutDev, (EFI_DEVICE_PATH_PROTOCOL *) &gIsaSerialDevicePath, NULL);
+}
+
+/**
+  Update the ConIn variable with USB Keyboard device path,if its not already exists in ConIn
+**/
+VOID
+EnumUsbKeyboard (
+  VOID
+  )
+{
+  DEBUG ((DEBUG_INFO, "[EnumUsbKeyboard]\n"));
+  EfiBootManagerUpdateConsoleVariable (ConIn, (EFI_DEVICE_PATH_PROTOCOL *) &gUsbClassKeyboardDevicePath, NULL);
+
+  //
+  // Append Usb Keyboard short form DevicePath into "ConInDev"
+  //
+  EfiBootManagerUpdateConsoleVariable (ConInDev, (EFI_DEVICE_PATH_PROTOCOL *) &gUsbClassKeyboardDevicePath, NULL);
+}
+
+BOOLEAN
+IsVgaHandle (
+  IN EFI_HANDLE Handle
+  )
+{
+  EFI_PCI_IO_PROTOCOL *PciIo;
+  PCI_TYPE00          Pci;
+  EFI_STATUS          Status;
+
+  Status = gBS->HandleProtocol (
+                  Handle,
+                  &gEfiPciIoProtocolGuid,
+                  (VOID **)&PciIo
+                  );
+  if (!EFI_ERROR (Status)) {
+    Status = PciIo->Pci.Read (
+                          PciIo,
+                          EfiPciIoWidthUint32,
+                          0,
+                          sizeof (Pci) / sizeof (UINT32),
+                          &Pci
+                          );
+    if (!EFI_ERROR (Status)) {
+      if (IS_PCI_VGA (&Pci) || IS_PCI_OLD_VGA (&Pci)) {
+        return TRUE;
+      }
+    }
+  }
+  return FALSE;
+}
+
+EFI_HANDLE
+IsVideoController (
+  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL  *DupDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
+  EFI_STATUS                Status;
+  EFI_HANDLE                DeviceHandle;
+
+  DupDevicePath = DuplicateDevicePath (DevicePath);
+  ASSERT (DupDevicePath != NULL);
+  if (DupDevicePath == NULL) {
+    return NULL;
+  }
+
+  TempDevicePath = DupDevicePath;
+  Status = gBS->LocateDevicePath (
+                  &gEfiDevicePathProtocolGuid,
+                  &TempDevicePath,
+                  &DeviceHandle
+                  );
+  FreePool (DupDevicePath);
+  if (EFI_ERROR (Status)) {
+    return NULL;
+  }
+
+  if (IsVgaHandle (DeviceHandle)) {
+    return DeviceHandle;
+  } else {
+    return NULL;
+  }
+}
+
+BOOLEAN
+IsGopDevicePath (
+  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
+  )
+{
+  while (!IsDevicePathEndType (DevicePath)) {
+    if (DevicePathType (DevicePath) == ACPI_DEVICE_PATH &&
+        DevicePathSubType (DevicePath) == ACPI_ADR_DP) {
+      return TRUE;
+    }
+    DevicePath = NextDevicePathNode (DevicePath);
+  }
+  return FALSE;
+}
+
+/**
+  Remove all GOP device path instance from DevicePath and add the Gop to the DevicePath.
+**/
+EFI_DEVICE_PATH_PROTOCOL *
+UpdateGopDevicePath (
+  EFI_DEVICE_PATH_PROTOCOL *DevicePath,
+  EFI_DEVICE_PATH_PROTOCOL *Gop
+  )
+{
+  UINTN                    Size;
+  UINTN                    GopSize;
+  EFI_DEVICE_PATH_PROTOCOL *Temp;
+  EFI_DEVICE_PATH_PROTOCOL *Return;
+  EFI_DEVICE_PATH_PROTOCOL *Instance;
+  BOOLEAN                  Exist;
+
+  Exist = FALSE;
+  Return = NULL;
+  GopSize = GetDevicePathSize (Gop);
+  do {
+    Instance = GetNextDevicePathInstance (&DevicePath, &Size);
+    if (Instance == NULL) {
+      break;
+    }
+    if (!IsGopDevicePath (Instance) ||
+        (Size == GopSize && CompareMem (Instance, Gop, GopSize) == 0)
+       ) {
+      if (Size == GopSize && CompareMem (Instance, Gop, GopSize) == 0) {
+        Exist = TRUE;
+      }
+      Temp = Return;
+      Return = AppendDevicePathInstance (Return, Instance);
+      if (Temp != NULL) {
+        FreePool (Temp);
+      }
+    }
+    FreePool (Instance);
+  } while (DevicePath != NULL);
+
+  if (!Exist) {
+    Temp = Return;
+    Return = AppendDevicePathInstance (Return, Gop);
+    if (Temp != NULL) {
+      FreePool (Temp);
+    }
+  }
+  return Return;
+}
+
+/**
+  Get Graphics Controller Handle.
+
+  @retval GraphicsController    Successfully located
+  @retval NULL                  Failed to locate
+**/
+EFI_HANDLE
+EFIAPI
+GetGraphicsController (
+  IN BOOLEAN    NeedTrustedConsole
+  )
+{
+  EFI_STATUS                Status;
+  UINTN                     Index;
+  EFI_HANDLE                *PciHandles;
+  UINTN                     PciHandlesSize;
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+
+  Status = gBS->LocateHandleBuffer (
+                  ByProtocol,
+                  &gEfiPciIoProtocolGuid,
+                  NULL,
+                  &PciHandlesSize,
+                  &PciHandles
+                  );
+  if (EFI_ERROR (Status)) {
+    return NULL;
+  }
+
+  for (Index = 0; Index < PciHandlesSize; Index++) {
+    Status = gBS->HandleProtocol (
+                    PciHandles[Index],
+                    &gEfiDevicePathProtocolGuid,
+                    (VOID **) &DevicePath
+                    );
+    if (EFI_ERROR(Status)) {
+      continue;
+    }
+    if (!IsVgaHandle (PciHandles[Index])) {
+      continue;
+    }
+    if ((NeedTrustedConsole && IsTrustedConsole (ConOut, DevicePath)) ||
+        ((!NeedTrustedConsole) && (!IsTrustedConsole (ConOut, DevicePath)))) {
+      return PciHandles[Index];
+    }
+  }
+
+  return NULL;
+}
+
+VOID
+UpdateGraphicConOut (
+  IN BOOLEAN    NeedTrustedConsole
+  )
+{
+  EFI_HANDLE                          GraphicsControllerHandle;
+  EFI_DEVICE_PATH_PROTOCOL            *GopDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL            *ConOutDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL            *UpdatedConOutDevicePath;
+
+  //
+  // Update ConOut variable
+  //
+  GraphicsControllerHandle = GetGraphicsController (NeedTrustedConsole);
+  if (GraphicsControllerHandle != NULL) {
+    //
+    // Connect the GOP driver
+    //
+    gBS->ConnectController (GraphicsControllerHandle, NULL, NULL, TRUE);
+
+    //
+    // Get the GOP device path
+    // NOTE: We may get a device path that contains Controller node in it.
+    //
+    GopDevicePath = EfiBootManagerGetGopDevicePath (GraphicsControllerHandle);
+    if (GopDevicePath != NULL) {
+      GetEfiGlobalVariable2 (L"ConOut", (VOID **)&ConOutDevicePath, NULL);
+      UpdatedConOutDevicePath = UpdateGopDevicePath (ConOutDevicePath, GopDevicePath);
+      if (ConOutDevicePath != NULL) {
+        FreePool (ConOutDevicePath);
+      }
+      FreePool (GopDevicePath);
+      gRT->SetVariable (
+                      L"ConOut",
+                      &gEfiGlobalVariableGuid,
+                      EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
+                      GetDevicePathSize (UpdatedConOutDevicePath),
+                      UpdatedConOutDevicePath
+                      );
+    }
+  }
+}
+
+VOID
+AddConsoleVariable (
+  IN CONSOLE_TYPE              ConsoleType,
+  IN EFI_DEVICE_PATH           *ConsoleDevicePath
+  )
+{
+  EFI_DEVICE_PATH           *TempDevicePath;
+  EFI_DEVICE_PATH           *Instance;
+  UINTN                     Size;
+  EFI_HANDLE                GraphicsControllerHandle;
+  EFI_DEVICE_PATH           *GopDevicePath;
+
+  TempDevicePath = ConsoleDevicePath;
+  do {
+    Instance = GetNextDevicePathInstance (&TempDevicePath, &Size);
+    if (Instance == NULL) {
+      break;
+    }
+
+    switch (ConsoleType) {
+    case ConIn:
+      if (IsUsbShortForm (Instance)) {
+        //
+        // Append Usb Keyboard short form DevicePath into "ConInDev"
+        //
+        EfiBootManagerUpdateConsoleVariable (ConInDev, Instance, NULL);
+      }
+      EfiBootManagerUpdateConsoleVariable (ConsoleType, Instance, NULL);
+      break;
+    case ConOut:
+      GraphicsControllerHandle = IsVideoController (Instance);
+      if (GraphicsControllerHandle == NULL) {
+        EfiBootManagerUpdateConsoleVariable (ConsoleType, Instance, NULL);
+      } else {
+        //
+        // Connect the GOP driver
+        //
+        gBS->ConnectController (GraphicsControllerHandle, NULL, NULL, TRUE);
+        //
+        // Get the GOP device path
+        // NOTE: We may get a device path that contains Controller node in it.
+        //
+        GopDevicePath = EfiBootManagerGetGopDevicePath (GraphicsControllerHandle);
+        if (GopDevicePath != NULL) {
+          EfiBootManagerUpdateConsoleVariable (ConsoleType, GopDevicePath, NULL);
+        }
+      }
+      break;
+    default:
+      ASSERT(FALSE);
+      break;
+    }
+
+    FreePool (Instance);
+  } while (TempDevicePath != NULL);
+}
+
+/**
+  The function connects the trusted consoles.
+**/
+VOID
+ConnectTrustedConsole (
+  VOID
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL     *Consoles;
+  EFI_DEVICE_PATH_PROTOCOL     *TempDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL     *Instance;
+  EFI_DEVICE_PATH_PROTOCOL     *Next;
+  UINTN                        Size;
+  UINTN                        Index;
+  EFI_HANDLE                   Handle;
+  EFI_STATUS                   Status;
+  CHAR16                       *ConsoleVar[] = {L"ConIn", L"ConOut"};
+  VOID                         *TrustedConsoleDevicepath;
+
+  TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleInputDevicePath);
+  DumpDevicePath (L"TrustedConsoleIn", TrustedConsoleDevicepath);
+  TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleOutputDevicePath);
+  DumpDevicePath (L"TrustedConsoleOut", TrustedConsoleDevicepath);
+
+  for (Index = 0; Index < sizeof (ConsoleVar) / sizeof (ConsoleVar[0]); Index++) {
+
+    GetEfiGlobalVariable2 (ConsoleVar[Index], (VOID **)&Consoles, NULL);
+
+    TempDevicePath = Consoles;
+    do {
+      Instance = GetNextDevicePathInstance (&TempDevicePath, &Size);
+      if (Instance == NULL) {
+        break;
+      }
+      if (IsTrustedConsole (Index, Instance)) {
+        if (IsUsbShortForm (Instance)) {
+          ConnectUsbShortFormDevicePath (Instance);
+        } else {
+          for (Next = Instance; !IsDevicePathEnd (Next); Next = NextDevicePathNode (Next)) {
+            if (DevicePathType (Next) == ACPI_DEVICE_PATH && DevicePathSubType (Next) == ACPI_ADR_DP) {
+              break;
+            } else if (DevicePathType (Next) == HARDWARE_DEVICE_PATH &&
+                       DevicePathSubType (Next) == HW_CONTROLLER_DP &&
+                       DevicePathType (NextDevicePathNode (Next)) == ACPI_DEVICE_PATH &&
+                       DevicePathSubType (NextDevicePathNode (Next)) == ACPI_ADR_DP
+                       ) {
+              break;
+            }
+          }
+          if (!IsDevicePathEnd (Next)) {
+            SetDevicePathEndNode (Next);
+            Status = EfiBootManagerConnectDevicePath (Instance, &Handle);
+            if (!EFI_ERROR (Status)) {
+              gBS->ConnectController (Handle, NULL, NULL, TRUE);
+            }
+          } else {
+            EfiBootManagerConnectDevicePath (Instance, NULL);
+          }
+        }
+      }
+      FreePool (Instance);
+    } while (TempDevicePath != NULL);
+
+    if (Consoles != NULL) {
+      FreePool (Consoles);
+    }
+  }
+}
+
+/**
+  The function connects the trusted Storages.
+**/
+VOID
+ConnectTrustedStorage (
+  VOID
+  )
+{
+  VOID                      *TrustedStorageDevicepath;
+  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL  *Instance;
+  UINTN                     Size;
+  EFI_DEVICE_PATH_PROTOCOL  *TempStorageDevicePath;
+  EFI_STATUS                Status;
+  EFI_HANDLE                DeviceHandle;
+
+  TrustedStorageDevicepath = PcdGetPtr (PcdTrustedStorageDevicePath);
+  DumpDevicePath (L"TrustedStorage", TrustedStorageDevicepath);
+
+  TempDevicePath = TrustedStorageDevicepath;
+  do {
+    Instance = GetNextDevicePathInstance (&TempDevicePath, &Size);
+    if (Instance == NULL) {
+      break;
+    }
+
+    EfiBootManagerConnectDevicePath (Instance, NULL);
+
+    TempStorageDevicePath = Instance;
+
+    Status = gBS->LocateDevicePath (
+                    &gEfiDevicePathProtocolGuid,
+                    &TempStorageDevicePath,
+                    &DeviceHandle
+                    );
+    if (!EFI_ERROR (Status)) {
+      gBS->ConnectController (DeviceHandle, NULL, NULL, FALSE);
+    }
+
+    FreePool (Instance);
+  } while (TempDevicePath != NULL);
+}
+
+/**
+  The function connects the trusted consoles and then call the PP processing library interface.
+**/
+VOID
+ProcessTcgPp (
+  VOID
+  )
+{
+  gPPRequireUIConfirm |= Tcg2PhysicalPresenceLibNeedUserConfirm();
+
+  if (gPPRequireUIConfirm) {
+    ConnectTrustedConsole ();
+  }
+
+  Tcg2PhysicalPresenceLibProcessRequest (NULL);
+}
+
+/**
+  The function connects the trusted storage to perform TPerReset.
+**/
+VOID
+ProcessTcgMor (
+  VOID
+  )
+{
+  if (IsMorBitSet ()) {
+    ConnectTrustedConsole();
+    ConnectTrustedStorage();
+  }
+}
+
+/**
+  Check if current BootCurrent variable is internal shell boot option.
+
+  @retval  TRUE         BootCurrent is internal shell.
+  @retval  FALSE        BootCurrent is not internal shell.
+**/
+BOOLEAN
+BootCurrentIsInternalShell (
+  VOID
+  )
+{
+  UINTN                         VarSize;
+  UINT16                        BootCurrent;
+  CHAR16                        BootOptionName[16];
+  UINT8                         *BootOption;
+  UINT8                         *Ptr;
+  BOOLEAN                       Result;
+  EFI_STATUS                    Status;
+  EFI_DEVICE_PATH_PROTOCOL      *TempDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL      *LastDeviceNode;
+  EFI_GUID                      *GuidPoint;
+
+  BootOption = NULL;
+  Result     = FALSE;
+
+  //
+  // Get BootCurrent variable
+  //
+  VarSize = sizeof (UINT16);
+  Status = gRT->GetVariable (
+                  L"BootCurrent",
+                  &gEfiGlobalVariableGuid,
+                  NULL,
+                  &VarSize,
+                  &BootCurrent
+                  );
+  if (EFI_ERROR (Status)) {
+    return FALSE;
+  }
+
+  //
+  // Create boot option Bootxxxx from BootCurrent
+  //
+  UnicodeSPrint (BootOptionName, sizeof(BootOptionName), L"Boot%04X", BootCurrent);
+
+  GetEfiGlobalVariable2 (BootOptionName, (VOID **) &BootOption, &VarSize);
+  if (BootOption == NULL || VarSize == 0) {
+    return FALSE;
+  }
+
+  Ptr = BootOption;
+  Ptr += sizeof (UINT32);
+  Ptr += sizeof (UINT16);
+  Ptr += StrSize ((CHAR16 *) Ptr);
+  TempDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
+  LastDeviceNode = TempDevicePath;
+  while (!IsDevicePathEnd (TempDevicePath)) {
+    LastDeviceNode = TempDevicePath;
+    TempDevicePath = NextDevicePathNode (TempDevicePath);
+  }
+  GuidPoint = EfiGetNameGuidFromFwVolDevicePathNode (
+                (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode
+                );
+  if ((GuidPoint != NULL) &&
+      ((CompareGuid (GuidPoint, &gUefiShellFileGuid)))
+    ) {
+    //
+    // if this option is internal shell, return TRUE
+    //
+    Result = TRUE;
+  }
+
+  if (BootOption != NULL) {
+    FreePool (BootOption);
+    BootOption = NULL;
+  }
+
+  return Result;
+}
+
+/**
+  This function will change video resolution and text mode
+  for internl shell when internal shell is launched.
+
+  @param   None.
+
+  @retval  EFI_SUCCESS  Mode is changed successfully.
+  @retval  Others       Mode failed to changed.
+**/
+EFI_STATUS
+EFIAPI
+ChangeModeForInternalShell (
+  VOID
+  )
+{
+  EFI_GRAPHICS_OUTPUT_PROTOCOL          *GraphicsOutput;
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL       *SimpleTextOut;
+  UINTN                                 SizeOfInfo;
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info;
+  UINT32                                MaxGopMode;
+  UINT32                                MaxTextMode;
+  UINT32                                ModeNumber;
+  UINTN                                 HandleCount;
+  EFI_HANDLE                            *HandleBuffer;
+  EFI_STATUS                            Status;
+  UINTN                                 Index;
+  UINTN                                 CurrentColumn;
+  UINTN                                 CurrentRow;
+
+  Status = gBS->HandleProtocol (
+                  gST->ConsoleOutHandle,
+                  &gEfiGraphicsOutputProtocolGuid,
+                  (VOID**)&GraphicsOutput
+                  );
+  if (EFI_ERROR (Status)) {
+    GraphicsOutput = NULL;
+  }
+
+  Status = gBS->HandleProtocol (
+                  gST->ConsoleOutHandle,
+                  &gEfiSimpleTextOutProtocolGuid,
+                  (VOID**)&SimpleTextOut
+                  );
+  if (EFI_ERROR (Status)) {
+    SimpleTextOut = NULL;
+  }
+
+  if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {
+    return EFI_UNSUPPORTED;
+  }
+
+  MaxGopMode  = GraphicsOutput->Mode->MaxMode;
+  MaxTextMode = SimpleTextOut->Mode->MaxMode;
+
+  //
+  // 1. If current video resolution is same with new video resolution,
+  //    video resolution need not be changed.
+  //    1.1. If current text mode is same with new text mode, text mode need not be change.
+  //    1.2. If current text mode is different with new text mode, text mode need be change to new text mode.
+  // 2. If current video resolution is different with new video resolution, we need restart whole console drivers.
+  //
+  for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {
+    Status = GraphicsOutput->QueryMode (
+                       GraphicsOutput,
+                       ModeNumber,
+                       &SizeOfInfo,
+                       &Info
+                       );
+    if (!EFI_ERROR (Status)) {
+      if ((Info->HorizontalResolution == mShellHorizontalResolution) &&
+          (Info->VerticalResolution == mShellVerticalResolution)) {
+        if ((GraphicsOutput->Mode->Info->HorizontalResolution == mShellHorizontalResolution) &&
+            (GraphicsOutput->Mode->Info->VerticalResolution == mShellVerticalResolution)) {
+          //
+          // If current video resolution is same with new resolution,
+          // then check if current text mode is same with new text mode.
+          //
+          Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);
+          ASSERT_EFI_ERROR (Status);
+          if (CurrentColumn == mShellModeColumn && CurrentRow == mShellModeRow) {
+            //
+            // Current text mode is same with new text mode, text mode need not be change.
+            //
+            FreePool (Info);
+            return EFI_SUCCESS;
+          } else {
+            //
+            // Current text mode is different with new text mode, text mode need be change to new text mode.
+            //
+            for (Index = 0; Index < MaxTextMode; Index++) {
+              Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);
+              if (!EFI_ERROR(Status)) {
+                if ((CurrentColumn == mShellModeColumn) && (CurrentRow == mShellModeRow)) {
+                  //
+                  // New text mode is supported, set it.
+                  //
+                  Status = SimpleTextOut->SetMode (SimpleTextOut, Index);
+                  ASSERT_EFI_ERROR (Status);
+                  //
+                  // Update text mode PCD.
+                  //
+                  Status = PcdSet32S (PcdConOutColumn, mShellModeColumn);
+                  ASSERT_EFI_ERROR (Status);
+
+                  Status = PcdSet32S (PcdConOutRow, mShellModeRow);
+                  ASSERT_EFI_ERROR (Status);
+
+                  FreePool (Info);
+                  return EFI_SUCCESS;
+                }
+              }
+            }
+            if (Index == MaxTextMode) {
+              //
+              // If new text mode is not supported, return error.
+              //
+              FreePool (Info);
+              return EFI_UNSUPPORTED;
+            }
+          }
+        } else {
+          FreePool (Info);
+          //
+          // If current video resolution is not same with the new one, set new video resolution.
+          // In this case, the driver which produces simple text out need be restarted.
+          //
+          Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);
+          if (!EFI_ERROR (Status)) {
+            //
+            // Set PCD to restart GraphicsConsole and Consplitter to change video resolution
+            // and produce new text mode based on new resolution.
+            //
+            Status = PcdSet32S (PcdVideoHorizontalResolution, mShellHorizontalResolution);
+            ASSERT_EFI_ERROR (Status);
+
+            Status = PcdSet32S (PcdVideoVerticalResolution, mShellVerticalResolution);
+            ASSERT_EFI_ERROR (Status);
+
+            Status = PcdSet32S (PcdConOutColumn, mShellModeColumn);
+            ASSERT_EFI_ERROR (Status);
+
+            Status = PcdSet32S (PcdConOutRow, mShellModeRow);
+            ASSERT_EFI_ERROR (Status);
+
+            Status = gBS->LocateHandleBuffer (
+                             ByProtocol,
+                             &gEfiSimpleTextOutProtocolGuid,
+                             NULL,
+                             &HandleCount,
+                             &HandleBuffer
+                             );
+            if (!EFI_ERROR (Status)) {
+              for (Index = 0; Index < HandleCount; Index++) {
+                gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);
+              }
+              for (Index = 0; Index < HandleCount; Index++) {
+                gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
+              }
+              if (HandleBuffer != NULL) {
+                FreePool (HandleBuffer);
+              }
+              break;
+            }
+          }
+        }
+      }
+      FreePool (Info);
+    }
+  }
+
+  if (ModeNumber == MaxGopMode) {
+    //
+    // If the new resolution is not supported, return error.
+    //
+    return EFI_UNSUPPORTED;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  ReadyToBoot callback to set video and text mode for internal shell boot.
+  That will not connect USB controller while CSM and FastBoot are disabled, we need to connect them
+  before booting to Shell for showing USB devices in Shell.
+
+  When FastBoot is enabled and Windows Console is the chosen Console behavior, input devices will not be connected
+  by default. Hence, when booting to EFI shell, connecting input consoles are required.
+
+  @param  Event   Pointer to this event
+  @param  Context Event hanlder private data
+
+  @retval None.
+**/
+VOID
+EFIAPI
+OnReadyToBootCallBack (
+  IN  EFI_EVENT                 Event,
+  IN  VOID                      *Context
+  )
+{
+  DEBUG ((DEBUG_INFO, "OnReadyToBootCallBack\n"));
+
+  if (BootCurrentIsInternalShell ()) {
+
+    ChangeModeForInternalShell ();
+    EfiBootManagerConnectAllDefaultConsoles();
+    gDS->Dispatch ();
+  }
+}
+
+/**
+  Platform Bds init. Incude the platform firmware vendor, revision
+  and so crc check.
+**/
+VOID
+EFIAPI
+PlatformBootManagerBeforeConsole (
+  VOID
+  )
+{
+  EFI_STATUS                          Status;
+  EFI_DEVICE_PATH_PROTOCOL            *VarConOut;
+  EFI_DEVICE_PATH_PROTOCOL            *VarConIn;
+  EFI_EVENT                           Event;
+
+  DEBUG ((DEBUG_INFO, "PlatformBootManagerBeforeConsole\n"));
+
+  Status = EFI_SUCCESS;
+
+  //
+  // Get user defined text mode for internal shell only once.
+  //
+  mShellHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);
+  mShellVerticalResolution   = PcdGet32 (PcdSetupVideoVerticalResolution);
+  mShellModeColumn           = PcdGet32 (PcdSetupConOutColumn);
+  mShellModeRow              = PcdGet32 (PcdSetupConOutRow);
+
+  //
+  // Create event to set proper video resolution and text mode for internal shell.
+  //
+  Status = EfiCreateEventReadyToBootEx (
+             TPL_CALLBACK,
+             OnReadyToBootCallBack,
+             NULL,
+             &Event
+             );
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Connect Root Bridge to make PCI BAR resource allocated and all PciIo created
+  //
+  ConnectRootBridge (FALSE);
+
+  //
+  // Fill ConIn/ConOut in Full Configuration boot mode
+  //
+  gBootMode = GetBootModeHob();
+  DEBUG ((DEBUG_INFO, "PlatformBootManagerInit - %x\n", gBootMode));
+
+  if (gBootMode == BOOT_WITH_FULL_CONFIGURATION ||
+      gBootMode == BOOT_WITH_DEFAULT_SETTINGS ||
+      gBootMode == BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS ||
+      gBootMode == BOOT_IN_RECOVERY_MODE) {
+
+    GetEfiGlobalVariable2 (L"ConOut", (VOID **)&VarConOut, NULL);   if (VarConOut != NULL) { FreePool (VarConOut); }
+    GetEfiGlobalVariable2 (L"ConIn", (VOID **)&VarConIn, NULL);    if (VarConIn  != NULL) { FreePool (VarConIn);  }
+
+    //
+    // Only fill ConIn/ConOut when ConIn/ConOut is empty because we may drop to Full Configuration boot mode in non-first boot
+    //
+    if (VarConOut == NULL || VarConIn == NULL) {
+      if (PcdGetSize (PcdTrustedConsoleOutputDevicePath) >= sizeof(EFI_DEVICE_PATH_PROTOCOL)) {
+        AddConsoleVariable (ConOut, PcdGetPtr (PcdTrustedConsoleOutputDevicePath));
+      }
+      if (PcdGetSize (PcdTrustedConsoleInputDevicePath) >= sizeof(EFI_DEVICE_PATH_PROTOCOL)) {
+        AddConsoleVariable (ConIn, PcdGetPtr (PcdTrustedConsoleInputDevicePath));
+      }
+    }
+  }
+
+  EnumIsaSerial ();
+
+  EnumUsbKeyboard ();
+  //
+  // For trusted console it must be handled here.
+  //
+  UpdateGraphicConOut (TRUE);
+
+  if (gBootMode == BOOT_ON_FLASH_UPDATE) {
+    //
+    // Logo show
+    //
+    BootLogoEnableLogo ();
+
+    DEBUG((DEBUG_INFO, "ProcessCapsules Before EndOfDxe......\n"));
+    ProcessCapsules ();
+    DEBUG((DEBUG_INFO, "ProcessCapsules Done\n"));
+  }
+
+  //
+  // Dynamically register hot key: F2/F7/Enter
+  //
+  RegisterDefaultBootOption ();
+  RegisterStaticHotkey ();
+
+  PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7010);
+  if (PcdGetBool (PcdTpm2Enable)) {
+    ProcessTcgPp ();
+    ProcessTcgMor ();
+  }
+  PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7011);
+
+  //
+  // We should make all UEFI memory and GCD information populated before ExitPmAuth.
+  // SMM may consume these information.
+  //
+  MemoryTest((EXTENDMEM_COVERAGE_LEVEL) PcdGet32 (PcdPlatformMemoryCheckLevel));
+
+  PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7020);
+  ExitPmAuth ();
+  PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7021);
+
+  //
+  // Dispatch the deferred 3rd party images.
+  //
+  EfiBootManagerDispatchDeferredImages ();
+
+  //
+  // For non-trusted console it must be handled here.
+  //
+  UpdateGraphicConOut (FALSE);
+
+  if (gBootMode == BOOT_ON_FLASH_UPDATE) {
+    //
+    // Logo show
+    //
+    BootLogoEnableLogo ();
+
+    DEBUG((DEBUG_INFO, "ProcessCapsules After ConnectAll......\n"));
+    ProcessCapsules();
+    DEBUG((DEBUG_INFO, "ProcessCapsules Done\n"));
+  }
+}
+
+
+/**
+  Connect with predeined platform connect sequence,
+  the OEM/IBV can customize with their own connect sequence.
+
+  @param[in] BootMode          Boot mode of this boot.
+**/
+VOID
+ConnectSequence (
+  IN EFI_BOOT_MODE         BootMode
+  )
+{
+  EfiBootManagerConnectAll ();
+}
+
+/**
+  The function is to consider the boot order which is not in our expectation.
+  In the case that we need to re-sort the boot option.
+
+  @retval  TRUE         Need to sort Boot Option.
+  @retval  FALSE        Don't need to sort Boot Option.
+**/
+BOOLEAN
+IsNeedSortBootOption (
+  VOID
+  )
+{
+  EFI_BOOT_MANAGER_LOAD_OPTION  *BootOptions;
+  UINTN                         BootOptionCount;
+
+  BootOptions = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
+
+  //
+  // If setup is the first priority in boot option, we need to sort boot option.
+  //
+  if ((BootOptionCount > 1) &&
+      (((StrnCmp (BootOptions->Description, L"Enter Setup", StrLen (L"Enter Setup"))) == 0) ||
+       ((StrnCmp (BootOptions->Description, L"BootManagerMenuApp", StrLen (L"BootManagerMenuApp"))) == 0))) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
+  The function will excute with as the platform policy, current policy
+  is driven by boot mode. IBV/OEM can customize this code for their specific
+  policy action.
+
+  @param DriverOptionList - The header of the driver option link list
+  @param BootOptionList   - The header of the boot option link list
+  @param ProcessCapsules  - A pointer to ProcessCapsules()
+  @param BaseMemoryTest   - A pointer to BaseMemoryTest()
+**/
+VOID
+EFIAPI
+PlatformBootManagerAfterConsole (
+  VOID
+  )
+{
+  EFI_BOOT_MODE                 LocalBootMode;
+
+  DEBUG ((DEBUG_INFO, "PlatformBootManagerAfterConsole\n"));
+
+  //
+  // Get current Boot Mode
+  //
+  LocalBootMode = gBootMode;
+  DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode));
+
+  //
+  // Logo show
+  //
+  BootLogoEnableLogo ();
+
+  //
+  // Go the different platform policy with different boot mode
+  // Notes: this part code can be change with the table policy
+  //
+  switch (LocalBootMode) {
+
+
+  case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
+  case BOOT_WITH_MINIMAL_CONFIGURATION:
+  case BOOT_ON_S4_RESUME:
+    //
+    // Perform some platform specific connect sequence
+    //
+    PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7050);
+    ConnectSequence (LocalBootMode);
+    PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7051);
+
+    break;
+
+  case BOOT_WITH_FULL_CONFIGURATION:
+  case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
+  case BOOT_WITH_DEFAULT_SETTINGS:
+  default:
+    //
+    // Perform some platform specific connect sequence
+    //
+    ConnectSequence (LocalBootMode);
+
+    //
+    // Only in Full Configuration boot mode we do the enumeration of boot device
+    //
+    //
+    // Dispatch all but Storage Oprom explicitly, because we assume Int13Thunk driver is there.
+    //
+    EfiBootManagerRefreshAllBootOption ();
+
+    if (IsNeedSortBootOption()) {
+      EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootOption);
+    }
+    //
+    // PXE boot option may appear after boot option enumeration
+    //
+
+    break;
+  }
+
+  Print (L"Press F7 for BootMenu!\n");
+
+  EfiBootManagerRefreshAllBootOption ();
+  EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootOption);
+}
+
+/**
+  The function is called when no boot option could be launched,
+  including platform recovery options and options pointing to applications
+  built into firmware volumes.
+
+  If this function returns, BDS attempts to enter an infinite loop.
+**/
+VOID
+EFIAPI
+PlatformBootManagerUnableToBoot (
+  VOID
+  )
+{
+  EFI_STATUS                   Status;
+  EFI_BOOT_MANAGER_LOAD_OPTION BootDeviceList;
+  CHAR16                       OptionName[sizeof ("Boot####")];
+
+  if (mBootMenuOptionNumber == LoadOptionNumberUnassigned) {
+    return;
+  }
+  UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", mBootMenuOptionNumber);
+  Status = EfiBootManagerVariableToLoadOption (OptionName, &BootDeviceList);
+  if (EFI_ERROR (Status)) {
+    return;
+  }
+  for (;;) {
+    EfiBootManagerBoot (&BootDeviceList);
+  }
+}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.h
new file mode 100644
index 0000000000..0bdc11bdd8
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.h
@@ -0,0 +1,253 @@
+/** @file
+  Header file for BDS Platform specific code
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _BDS_PLATFORM_H
+#define _BDS_PLATFORM_H
+
+#include <PiDxe.h>
+#include <Protocol/DevicePath.h>
+#include <Protocol/SimpleNetwork.h>
+#include <Protocol/PciRootBridgeIo.h>
+#include <Protocol/LoadFile.h>
+#include <Protocol/PciIo.h>
+#include <Protocol/CpuIo2.h>
+#include <Protocol/LoadedImage.h>
+#include <Protocol/DiskInfo.h>
+#include <Protocol/GraphicsOutput.h>
+#include <Protocol/UgaDraw.h>
+#include <Protocol/GenericMemoryTest.h>
+#include <Protocol/DevicePathToText.h>
+#include <Protocol/FirmwareVolume2.h>
+#include <Protocol/SimpleFileSystem.h>
+
+#include <Guid/CapsuleVendor.h>
+#include <Guid/MemoryTypeInformation.h>
+#include <Guid/GlobalVariable.h>
+#include <Guid/MemoryOverwriteControl.h>
+#include <Guid/FileInfo.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/BaseLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PlatformBootManagerLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/UefiLib.h>
+#include <Library/HobLib.h>
+#include <Library/DxeServicesLib.h>
+#include <Library/DxeServicesTableLib.h>
+#include <Library/PrintLib.h>
+#include <Library/HiiLib.h>
+#include <Library/CapsuleLib.h>
+#include <Library/PerformanceLib.h>
+
+#include <IndustryStandard/Pci30.h>
+#include <IndustryStandard/PciCodeId.h>
+
+///
+/// ConnectType
+///
+#define CONSOLE_OUT 0x00000001
+#define STD_ERROR   0x00000002
+#define CONSOLE_IN  0x00000004
+#define CONSOLE_ALL (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
+
+extern EFI_GUID                  gUefiShellFileGuid;
+extern EFI_BOOT_MODE             gBootMode;
+
+#define PCI_DEVICE_PATH_NODE(Func, Dev) \
+  { \
+    HARDWARE_DEVICE_PATH, \
+    HW_PCI_DP, \
+    { \
+      (UINT8) (sizeof (PCI_DEVICE_PATH)), \
+      (UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8) \
+    }, \
+    (Func), \
+    (Dev) \
+  }
+
+#define PNPID_DEVICE_PATH_NODE(PnpId) \
+  { \
+    { \
+      ACPI_DEVICE_PATH, \
+      ACPI_DP, \
+      { \
+        (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
+        (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
+      } \
+    }, \
+    EISA_PNP_ID((PnpId)), \
+    0 \
+  }
+
+#define gPciRootBridge \
+  { \
+    { \
+      ACPI_DEVICE_PATH, \
+      ACPI_DP, \
+      { \
+        (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
+        (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
+      }, \
+    }, \
+    EISA_PNP_ID (0x0A03), \
+    0 \
+  }
+
+#define gPciIsaBridge \
+  PCI_DEVICE_PATH_NODE(0, 0x1f)
+
+#define gPnp16550ComPort \
+  PNPID_DEVICE_PATH_NODE(0x0501)
+
+#define gUart(BaudRate, DataBits, Parity, StopBits) \
+  { \
+    { \
+      MESSAGING_DEVICE_PATH, \
+      MSG_UART_DP, \
+      { \
+        (UINT8) (sizeof (UART_DEVICE_PATH)), \
+        (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) \
+      } \
+    }, \
+    0, \
+    (BaudRate), \
+    (DataBits), \
+    (Parity), \
+    (StopBits) \
+  }
+
+#define gPcAnsiTerminal \
+  { \
+    { \
+      MESSAGING_DEVICE_PATH, \
+      MSG_VENDOR_DP, \
+      { \
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)), \
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) \
+      } \
+    }, \
+    DEVICE_PATH_MESSAGING_PC_ANSI \
+  }
+
+#define gEndEntire \
+  { \
+    END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { END_DEVICE_PATH_LENGTH, 0 } \
+  }
+
+typedef struct {
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+  UINTN                     ConnectType;
+} BDS_CONSOLE_CONNECT_ENTRY;
+
+//
+// Platform Root Bridge
+//
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_ROOT_BRIDGE_DEVICE_PATH;
+
+//
+// Below is the platform console device path
+//
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           IsaBridge;
+  ACPI_HID_DEVICE_PATH      Keyboard;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_KEYBOARD_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           PciDevice;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_ONBOARD_CONTROLLER_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           Pci0Device;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_PEG_ROOT_CONTROLLER_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           PciBridge;
+  PCI_DEVICE_PATH           PciDevice;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_PCI_CONTROLLER_DEVICE_PATH;
+
+//
+// Below is the boot option device path
+//
+
+#define CLASS_HID           3
+#define SUBCLASS_BOOT       1
+#define PROTOCOL_KEYBOARD   1
+
+typedef struct {
+  USB_CLASS_DEVICE_PATH           UsbClass;
+  EFI_DEVICE_PATH_PROTOCOL        End;
+} USB_CLASS_FORMAT_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           IsaBridge;
+  ACPI_HID_DEVICE_PATH      IsaSerial;
+  UART_DEVICE_PATH          Uart;
+  VENDOR_DEVICE_PATH        TerminalType;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_ISA_SERIAL_DEVICE_PATH;
+
+//
+// Platform BDS Functions
+//
+
+
+/**
+  Perform the memory test base on the memory test intensive level,
+  and update the memory resource.
+
+  @param  Level         The memory test intensive level.
+
+  @retval EFI_STATUS    Success test all the system memory and update
+                        the memory resource
+
+**/
+EFI_STATUS
+MemoryTest (
+  IN EXTENDMEM_COVERAGE_LEVEL Level
+  );
+
+VOID
+ConnectSequence (
+  IN EFI_BOOT_MODE                      BootMode
+  );
+
+
+INTN
+EFIAPI
+CompareBootOption (
+  CONST VOID  *Left,
+  CONST VOID  *Right
+  );
+
+
+VOID
+RegisterStaticHotkey (
+  VOID
+  );
+VOID
+RegisterDefaultBootOption (
+  VOID
+  );
+
+#endif
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
new file mode 100644
index 0000000000..b04169ad33
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
@@ -0,0 +1,95 @@
+### @file
+# Component name for module DxePlatformBootManagerLib
+#
+# Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+###
+
+[Defines]
+  INF_VERSION                    = 0x00010017
+  BASE_NAME                      = DxePlatformBootManagerLib
+  FILE_GUID                      = A6BC385D-59E5-4B77-87D7-200ABAA83C15
+  VERSION_STRING                 = 1.0
+  MODULE_TYPE                    = DXE_DRIVER
+  UEFI_SPECIFICATION_VERSION     = 2.10
+  LIBRARY_CLASS                  = PlatformBootManagerLib|DXE_DRIVER
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 EBC
+#
+
+[LibraryClasses]
+  BaseLib
+  MemoryAllocationLib
+  UefiBootServicesTableLib
+  UefiRuntimeServicesTableLib
+  BaseMemoryLib
+  DebugLib
+  PcdLib
+  PrintLib
+  DevicePathLib
+  UefiLib
+  HobLib
+  DxeServicesLib
+  DxeServicesTableLib
+  HiiLib
+  UefiBootManagerLib
+  PerformanceLib
+  TimerLib
+  Tcg2PhysicalPresenceLib
+  CapsuleLib
+  BootLogoLib
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  SecurityPkg/SecurityPkg.dec
+  MinPlatformPkg/MinPlatformPkg.dec
+
+[Pcd]
+  gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable                    ## CONSUMES
+  gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut                   ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution       ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution         ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow                       ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn                    ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn               ## CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow                  ## CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution  ## CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution    ## CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand            ## PRODUCES
+  gMinPlatformPkgTokenSpaceGuid.PcdPlatformMemoryCheckLevel      ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdBootToShellOnly               ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleInputDevicePath  ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleOutputDevicePath ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdTrustedStorageDevicePath       ## CONSUMES
+
+[Sources]
+  BdsPlatform.c
+  BdsPlatform.h
+  PlatformBootOption.c
+  MemoryTest.c
+
+[Protocols]
+  gEfiPciRootBridgeIoProtocolGuid               ## CONSUMES
+  gEfiPciIoProtocolGuid                         ## CONSUMES
+  gEfiCpuIo2ProtocolGuid                        ## CONSUMES
+  gEfiDxeSmmReadyToLockProtocolGuid             ## PRODUCES
+  gEfiGenericMemTestProtocolGuid                ## CONSUMES
+  gEfiDiskInfoProtocolGuid                      ## CONSUMES
+  gEfiDevicePathToTextProtocolGuid              ## CONSUMES
+  gEfiSimpleTextInputExProtocolGuid             ## CONSUMES
+  gEfiFirmwareVolume2ProtocolGuid               ## CONSUMES
+  gEfiFormBrowser2ProtocolGuid                  ## CONSUMES
+  gEfiGenericMemTestProtocolGuid                ## CONSUMES
+
+[Guids]
+  gEfiGlobalVariableGuid                        ## PRODUCES
+  gEfiMemoryOverwriteControlDataGuid            ## PRODUCES
+  gEfiEndOfDxeEventGroupGuid                    ## CONSUMES
+
+[Depex.common.DXE_DRIVER]
+  gEfiVariableArchProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/MemoryTest.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/MemoryTest.c
new file mode 100644
index 0000000000..654845349a
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/MemoryTest.c
@@ -0,0 +1,83 @@
+/** @file
+  Perform the platform memory test
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "BdsPlatform.h"
+#include <Protocol/GenericMemoryTest.h>
+
+/**
+  Perform the memory test base on the memory test intensive level,
+  and update the memory resource.
+
+  @param  Level         The memory test intensive level.
+
+  @retval EFI_STATUS    Success test all the system memory and update
+                        the memory resource
+
+**/
+EFI_STATUS
+MemoryTest (
+  IN EXTENDMEM_COVERAGE_LEVEL Level
+  )
+{
+  EFI_STATUS                        Status;
+  BOOLEAN                           RequireSoftECCInit;
+  EFI_GENERIC_MEMORY_TEST_PROTOCOL  *GenMemoryTest;
+  UINT64                            TestedMemorySize;
+  UINT64                            TotalMemorySize;
+  BOOLEAN                           ErrorOut;
+  BOOLEAN                           TestAbort;
+
+  TestedMemorySize  = 0;
+  TotalMemorySize   = 0;
+  ErrorOut          = FALSE;
+  TestAbort         = FALSE;
+
+  RequireSoftECCInit = FALSE;
+
+  Status = gBS->LocateProtocol (
+                  &gEfiGenericMemTestProtocolGuid,
+                  NULL,
+                  (VOID **) &GenMemoryTest
+                  );
+  if (EFI_ERROR (Status)) {
+    return EFI_SUCCESS;
+  }
+
+  Status = GenMemoryTest->MemoryTestInit (
+                                GenMemoryTest,
+                                Level,
+                                &RequireSoftECCInit
+                                );
+  if (Status == EFI_NO_MEDIA) {
+    //
+    // The PEI codes also have the relevant memory test code to check the memory,
+    // it can select to test some range of the memory or all of them. If PEI code
+    // checks all the memory, this BDS memory test will has no not-test memory to
+    // do the test, and then the status of EFI_NO_MEDIA will be returned by
+    // "MemoryTestInit". So it does not need to test memory again, just return.
+    //
+    return EFI_SUCCESS;
+  }
+
+  do {
+    Status = GenMemoryTest->PerformMemoryTest (
+                              GenMemoryTest,
+                              &TestedMemorySize,
+                              &TotalMemorySize,
+                              &ErrorOut,
+                              TestAbort
+                              );
+    if (ErrorOut && (Status == EFI_DEVICE_ERROR)) {
+      ASSERT (0);
+    }
+  } while (Status != EFI_NOT_FOUND);
+
+  Status = GenMemoryTest->Finished (GenMemoryTest);
+
+  return EFI_SUCCESS;
+}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/PlatformBootOption.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/PlatformBootOption.c
new file mode 100644
index 0000000000..84aa097d58
--- /dev/null
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/PlatformBootOption.c
@@ -0,0 +1,559 @@
+/** @file
+  Driver for Platform Boot Options support.
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "BdsPlatform.h"
+
+#include <Library/PcdLib.h>
+
+BOOLEAN    mContinueBoot  = FALSE;
+BOOLEAN    mBootMenuBoot  = FALSE;
+BOOLEAN    mPxeBoot       = FALSE;
+BOOLEAN    mHotKeypressed = FALSE;
+EFI_EVENT  HotKeyEvent    = NULL;
+
+UINTN      mBootMenuOptionNumber;
+
+EFI_DEVICE_PATH_PROTOCOL *
+BdsCreateShellDevicePath (
+  VOID
+  )
+/*++
+
+Routine Description:
+
+  This function will create a SHELL BootOption to boot.
+
+Arguments:
+
+  None.
+
+Returns:
+
+  Shell Device path for booting.
+
+--*/
+{
+  UINTN                             FvHandleCount;
+  EFI_HANDLE                        *FvHandleBuffer;
+  UINTN                             Index;
+  EFI_STATUS                        Status;
+  EFI_FIRMWARE_VOLUME2_PROTOCOL     *Fv;
+  UINTN                             Size;
+  UINT32                            AuthenticationStatus;
+  EFI_DEVICE_PATH_PROTOCOL          *DevicePath;
+  VOID                              *Buffer;
+
+  DevicePath  = NULL;
+  Status      = EFI_SUCCESS;
+
+  DEBUG ((DEBUG_INFO, "BdsCreateShellDevicePath\n"));
+  gBS->LocateHandleBuffer (
+        ByProtocol,
+        &gEfiFirmwareVolume2ProtocolGuid,
+        NULL,
+        &FvHandleCount,
+        &FvHandleBuffer
+        );
+
+  for (Index = 0; Index < FvHandleCount; Index++) {
+    gBS->HandleProtocol (
+          FvHandleBuffer[Index],
+          &gEfiFirmwareVolume2ProtocolGuid,
+          (VOID **) &Fv
+          );
+
+    Buffer  = NULL;
+    Size    = 0;
+    Status  = Fv->ReadSection (
+                    Fv,
+                    &gUefiShellFileGuid,
+                    EFI_SECTION_PE32,
+                    0,
+                    &Buffer,
+                    &Size,
+                    &AuthenticationStatus
+                    );
+    if (EFI_ERROR (Status)) {
+      //
+      // Skip if no shell file in the FV
+      //
+      continue;
+    } else {
+      //
+      // Found the shell
+      //
+      break;
+    }
+  }
+
+  if (EFI_ERROR (Status)) {
+    //
+    // No shell present
+    //
+    if (FvHandleCount) {
+      FreePool (FvHandleBuffer);
+    }
+    return NULL;
+  }
+  //
+  // Build the shell boot option
+  //
+  DevicePath = DevicePathFromHandle (FvHandleBuffer[Index]);
+
+  if (FvHandleCount) {
+    FreePool (FvHandleBuffer);
+  }
+
+  return DevicePath;
+}
+
+
+EFI_STATUS
+CreateFvBootOption (
+  EFI_GUID                     *FileGuid,
+  CHAR16                       *Description,
+  EFI_BOOT_MANAGER_LOAD_OPTION *BootOption,
+  UINT32                       Attributes,
+  UINT8                        *OptionalData,    OPTIONAL
+  UINT32                       OptionalDataSize
+  )
+{
+  EFI_STATUS                         Status;
+  EFI_DEVICE_PATH_PROTOCOL           *DevicePath;
+  EFI_LOADED_IMAGE_PROTOCOL          *LoadedImage;
+  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH  FileNode;
+  EFI_FIRMWARE_VOLUME2_PROTOCOL      *Fv;
+  UINT32                             AuthenticationStatus;
+  VOID                               *Buffer;
+  UINTN                              Size;
+
+  if ((BootOption == NULL) || (FileGuid == NULL) || (Description == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid);
+
+  if (!CompareGuid (&gUefiShellFileGuid, FileGuid)) {
+    Status = gBS->HandleProtocol (
+                    gImageHandle,
+                    &gEfiLoadedImageProtocolGuid,
+                    (VOID **) &LoadedImage
+                    );
+    if (!EFI_ERROR (Status)) {
+      Status = gBS->HandleProtocol (
+                      LoadedImage->DeviceHandle,
+                      &gEfiFirmwareVolume2ProtocolGuid,
+                      (VOID **) &Fv
+                      );
+      if (!EFI_ERROR (Status)) {
+        Buffer  = NULL;
+        Size    = 0;
+        Status  = Fv->ReadSection (
+                        Fv,
+                        FileGuid,
+                        EFI_SECTION_PE32,
+                        0,
+                        &Buffer,
+                        &Size,
+                        &AuthenticationStatus
+                        );
+        if (Buffer != NULL) {
+          FreePool (Buffer);
+        }
+      }
+    }
+    if (EFI_ERROR (Status)) {
+      return EFI_NOT_FOUND;
+    }
+
+    DevicePath = AppendDevicePathNode (
+                   DevicePathFromHandle (LoadedImage->DeviceHandle),
+                   (EFI_DEVICE_PATH_PROTOCOL *) &FileNode
+                   );
+  } else {
+    DevicePath = AppendDevicePathNode (
+                   BdsCreateShellDevicePath (),
+                   (EFI_DEVICE_PATH_PROTOCOL *) &FileNode
+                   );
+  }
+
+  Status = EfiBootManagerInitializeLoadOption (
+             BootOption,
+             LoadOptionNumberUnassigned,
+             LoadOptionTypeBoot,
+             Attributes,
+             Description,
+             DevicePath,
+             OptionalData,
+             OptionalDataSize
+             );
+  FreePool (DevicePath);
+  return Status;
+}
+
+EFI_GUID mUiFile = {
+  0x462CAA21, 0x7614, 0x4503, { 0x83, 0x6E, 0x8A, 0xB6, 0xF4, 0x66, 0x23, 0x31 }
+};
+EFI_GUID mBootMenuFile = {
+  0xEEC25BDC, 0x67F2, 0x4D95, { 0xB1, 0xD5, 0xF8, 0x1B, 0x20, 0x39, 0xD1, 0x1D }
+};
+
+
+/**
+  Return the index of the load option in the load option array.
+
+  The function consider two load options are equal when the
+  OptionType, Attributes, Description, FilePath and OptionalData are equal.
+
+  @param Key    Pointer to the load option to be found.
+  @param Array  Pointer to the array of load options to be found.
+  @param Count  Number of entries in the Array.
+
+  @retval -1          Key wasn't found in the Array.
+  @retval 0 ~ Count-1 The index of the Key in the Array.
+**/
+INTN
+PlatformFindLoadOption (
+  IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Key,
+  IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Array,
+  IN UINTN                              Count
+  )
+{
+  UINTN                             Index;
+
+  for (Index = 0; Index < Count; Index++) {
+    if ((Key->OptionType == Array[Index].OptionType) &&
+        (Key->Attributes == Array[Index].Attributes) &&
+        (StrCmp (Key->Description, Array[Index].Description) == 0) &&
+        (CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePathSize (Key->FilePath)) == 0) &&
+        (Key->OptionalDataSize == Array[Index].OptionalDataSize) &&
+        (CompareMem (Key->OptionalData, Array[Index].OptionalData, Key->OptionalDataSize) == 0)) {
+      return (INTN) Index;
+    }
+  }
+
+  return -1;
+}
+
+UINTN
+RegisterFvBootOption (
+  EFI_GUID                         *FileGuid,
+  CHAR16                           *Description,
+  UINTN                            Position,
+  UINT32                           Attributes,
+  UINT8                            *OptionalData,    OPTIONAL
+  UINT32                           OptionalDataSize
+  )
+{
+  EFI_STATUS                       Status;
+  UINTN                            OptionIndex;
+  EFI_BOOT_MANAGER_LOAD_OPTION     NewOption;
+  EFI_BOOT_MANAGER_LOAD_OPTION     *BootOptions;
+  UINTN                            BootOptionCount;
+
+  NewOption.OptionNumber = LoadOptionNumberUnassigned;
+  Status = CreateFvBootOption (FileGuid, Description, &NewOption, Attributes, OptionalData, OptionalDataSize);
+  if (!EFI_ERROR (Status)) {
+    BootOptions = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
+
+    OptionIndex = PlatformFindLoadOption (&NewOption, BootOptions, BootOptionCount);
+
+    if (OptionIndex == -1) {
+      Status = EfiBootManagerAddLoadOptionVariable (&NewOption, Position);
+      ASSERT_EFI_ERROR (Status);
+    } else {
+      NewOption.OptionNumber = BootOptions[OptionIndex].OptionNumber;
+    }
+    EfiBootManagerFreeLoadOption (&NewOption);
+    EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);
+  }
+
+  return NewOption.OptionNumber;
+}
+
+
+
+VOID
+EFIAPI
+PlatformBootManagerWaitCallback (
+  UINT16          TimeoutRemain
+  )
+{
+  EFI_STATUS                    Status;
+  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *TxtInEx;
+  EFI_KEY_DATA                  KeyData;
+  BOOLEAN                       PausePressed;
+
+  //
+  // Pause on PAUSE key
+  //
+  Status = gBS->HandleProtocol (gST->ConsoleInHandle, &gEfiSimpleTextInputExProtocolGuid, (VOID **) &TxtInEx);
+  ASSERT_EFI_ERROR (Status);
+
+  PausePressed = FALSE;
+
+  while (TRUE) {
+    Status = TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData);
+    if (EFI_ERROR (Status)) {
+      break;
+    }
+
+    if (KeyData.Key.ScanCode == SCAN_PAUSE) {
+      PausePressed = TRUE;
+      break;
+    }
+  }
+
+  //
+  // Loop until non-PAUSE key pressed
+  //
+  while (PausePressed) {
+    Status = TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData);
+    if (!EFI_ERROR (Status)) {
+      DEBUG ((
+        DEBUG_INFO, "[PauseCallback] %x/%x %x/%x\n",
+        KeyData.Key.ScanCode, KeyData.Key.UnicodeChar,
+        KeyData.KeyState.KeyShiftState, KeyData.KeyState.KeyToggleState
+        ));
+      PausePressed = (BOOLEAN) (KeyData.Key.ScanCode == SCAN_PAUSE);
+    }
+  }
+}
+
+
+EFI_GUID gUefiShellFileGuid = { 0x7C04A583, 0x9E3E, 0x4f1c, { 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 } };
+
+#define INTERNAL_UEFI_SHELL_NAME      L"Internal UEFI Shell 2.0"
+#define UEFI_HARD_DRIVE_NAME          L"UEFI Hard Drive"
+
+VOID
+RegisterDefaultBootOption (
+  VOID
+  )
+{
+#if 0
+  EFI_DEVICE_PATH_PROTOCOL           *DevicePath;
+  EFI_LOADED_IMAGE_PROTOCOL          *LoadedImage;
+  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH  FileNode;
+#endif
+  UINT16                             *ShellData;
+  UINT32                             ShellDataSize;
+
+    ShellData = NULL;
+    ShellDataSize = 0;
+    RegisterFvBootOption (&gUefiShellFileGuid,      INTERNAL_UEFI_SHELL_NAME, (UINTN) -1, LOAD_OPTION_ACTIVE, (UINT8 *)ShellData, ShellDataSize);
+
+  //
+  // Boot Menu
+  //
+  mBootMenuOptionNumber = RegisterFvBootOption (&mBootMenuFile, L"Boot Device List",   (UINTN) -1, LOAD_OPTION_CATEGORY_APP | LOAD_OPTION_ACTIVE | LOAD_OPTION_HIDDEN, NULL, 0);
+
+  if (mBootMenuOptionNumber == LoadOptionNumberUnassigned) {
+    DEBUG ((DEBUG_INFO, "BootMenuOptionNumber (%d) should not be same to LoadOptionNumberUnassigned(%d).\n", mBootMenuOptionNumber, LoadOptionNumberUnassigned));
+  }
+#if 0
+  //
+  // Boot Manager Menu
+  //
+  EfiInitializeFwVolDevicepathNode (&FileNode, &mUiFile);
+
+  gBS->HandleProtocol (
+         gImageHandle,
+         &gEfiLoadedImageProtocolGuid,
+         (VOID **) &LoadedImage
+         );
+  DevicePath = AppendDevicePathNode (DevicePathFromHandle (LoadedImage->DeviceHandle), (EFI_DEVICE_PATH_PROTOCOL *) &FileNode);
+#endif
+
+}
+
+VOID
+RegisterBootOptionHotkey (
+  UINT16                       OptionNumber,
+  EFI_INPUT_KEY                *Key,
+  BOOLEAN                      Add
+  )
+{
+  EFI_STATUS                   Status;
+
+  if (!Add) {
+    //
+    // No enter hotkey when force to setup or there is no boot option
+    //
+    Status = EfiBootManagerDeleteKeyOptionVariable (NULL, 0, Key, NULL);
+    ASSERT (Status == EFI_SUCCESS || Status == EFI_NOT_FOUND);
+  } else {
+    //
+    // Register enter hotkey for the first boot option
+    //
+    Status = EfiBootManagerAddKeyOptionVariable (NULL, OptionNumber, 0, Key,NULL);
+    ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
+  }
+}
+
+EFI_STATUS
+EFIAPI
+DetectKeypressCallback (
+  IN EFI_KEY_DATA     *KeyData
+)
+{
+  mHotKeypressed = TRUE;
+
+  if (HotKeyEvent != NULL) {
+    gBS->SignalEvent(HotKeyEvent);
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  This function is called after all the boot options are enumerated and ordered properly.
+**/
+VOID
+RegisterStaticHotkey (
+  VOID
+  )
+{
+
+  EFI_INPUT_KEY                 Enter;
+  EFI_KEY_DATA                  F2;
+  EFI_KEY_DATA                  F7;
+  BOOLEAN                       EnterSetup;
+  EFI_STATUS                    Status;
+  EFI_BOOT_MANAGER_LOAD_OPTION  BootOption;
+
+  EnterSetup = FALSE;
+
+  //
+  // [Enter]
+  //
+  mContinueBoot = !EnterSetup;
+  if (mContinueBoot) {
+    Enter.ScanCode    = SCAN_NULL;
+    Enter.UnicodeChar = CHAR_CARRIAGE_RETURN;
+    EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL);
+  }
+
+
+  //
+  // [F2]/[F7]
+  //
+  F2.Key.ScanCode    = SCAN_F2;
+  F2.Key.UnicodeChar = CHAR_NULL;
+  F2.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
+  F2.KeyState.KeyToggleState = 0;
+  Status = EfiBootManagerGetBootManagerMenu (&BootOption);
+  ASSERT_EFI_ERROR (Status);
+  RegisterBootOptionHotkey ((UINT16) BootOption.OptionNumber, &F2.Key, TRUE);
+  EfiBootManagerFreeLoadOption (&BootOption);
+
+  F7.Key.ScanCode    = SCAN_F7;
+  F7.Key.UnicodeChar = CHAR_NULL;
+  F7.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
+  F7.KeyState.KeyToggleState = 0;
+  mBootMenuBoot  = !EnterSetup;
+  RegisterBootOptionHotkey ((UINT16) mBootMenuOptionNumber, &F7.Key, mBootMenuBoot);
+
+}
+
+UINT8
+BootOptionType (
+  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL      *Node;
+  EFI_DEVICE_PATH_PROTOCOL      *NextNode;
+
+  for (Node = DevicePath; !IsDevicePathEndType (Node); Node = NextDevicePathNode (Node)) {
+    if (DevicePathType (Node) == MESSAGING_DEVICE_PATH) {
+      //
+      // Make sure the device path points to the driver device.
+      //
+      NextNode = NextDevicePathNode (Node);
+      if (DevicePathSubType(NextNode) == MSG_DEVICE_LOGICAL_UNIT_DP) {
+        //
+        // if the next node type is Device Logical Unit, which specify the Logical Unit Number (LUN),
+        // skip it
+        //
+        NextNode = NextDevicePathNode (NextNode);
+      }
+      if (IsDevicePathEndType (NextNode)) {
+        if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH)) {
+          return DevicePathSubType (Node);
+        } else {
+          return MSG_SATA_DP;
+        }
+      }
+    }
+  }
+
+  return (UINT8) -1;
+}
+
+/**
+  Returns the priority number.
+  OptionType                 EFI
+  ------------------------------------
+  PXE                         2
+  DVD                         4
+  USB                         6
+  NVME                        7
+  HDD                         8
+  EFI Shell                   9
+  Others                      100
+
+  @param BootOption
+**/
+UINTN
+BootOptionPriority (
+  CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
+  )
+{
+    //
+    // EFI boot options
+    //
+    switch (BootOptionType (BootOption->FilePath)) {
+    case MSG_MAC_ADDR_DP:
+    case MSG_VLAN_DP:
+    case MSG_IPv4_DP:
+    case MSG_IPv6_DP:
+      return 2;
+
+    case MSG_SATA_DP:
+    case MSG_ATAPI_DP:
+    case MSG_UFS_DP:
+    case MSG_NVME_NAMESPACE_DP:
+      return 4;
+
+    case MSG_USB_DP:
+      return 6;
+
+    }
+    if (StrCmp (BootOption->Description, INTERNAL_UEFI_SHELL_NAME) == 0) {
+      if (PcdGetBool (PcdBootToShellOnly)) {
+        return 0;
+      }
+      return 9;
+    }
+    if (StrCmp (BootOption->Description, UEFI_HARD_DRIVE_NAME) == 0) {
+      return 8;
+    }
+    return 100;
+}
+
+INTN
+EFIAPI
+CompareBootOption (
+  CONST VOID  *Left,
+  CONST VOID  *Right
+  )
+{
+  return BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Left) -
+         BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Right);
+}
+
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
deleted file mode 100644
index 4adca1b465..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
+++ /dev/null
@@ -1,3092 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2019, Intel Corporation. All rights reserved.<BR>
-                                                                                   
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-                                                                                   
-
-
-Module Name:
-
-  BdsPlatform.c
-
-Abstract:
-
-  This file include all platform action which can be customized
-  by IBV/OEM.
-
---*/
-
-#include "BdsPlatform.h"
-#include "SetupMode.h"
-#include <Guid/SetupVariable.h>
-#include <Library/TcgPhysicalPresenceLib.h>
-#include <Library/Tcg2PhysicalPresenceLib.h>
-#include <Protocol/I2cMasterMcg.h>
-#include <TianoApi.h>
-#include <PlatformBaseAddresses.h>
-#include <Protocol/GlobalNvsArea.h>
-#include <Library/DxeServicesTableLib.h>
-#include <Protocol/BlockIo.h>
-#include <PchRegs/PchRegsPcu.h>
-#include <Library/S3BootScriptLib.h>
-#include "PchAccess.h"
-#include "PchRegs/PchRegsSata.h"
-#include <Library/SerialPortLib.h>
-#include <Library/DebugLib.h>
-
-#include <Library/GenericBdsLib/InternalBdsLib.h>
-#include <Library/GenericBdsLib/String.h>
-#include <Library/NetLib.h>
-
-#include <Library/CapsuleLib.h>
-#include <Protocol/EsrtManagement.h>
-
-EFI_GUID *ConnectDriverTable[] = {
-  &gEfiMmioDeviceProtocolGuid,
-  &gEfiI2cMasterProtocolGuid,
-  &gEfiI2cHostProtocolGuid
-};
-
-#define SHELL_ENVIRONMENT_INTERFACE_PROTOCOL \
-  { \
-    0x47c7b221, 0xc42a, 0x11d2, 0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b \
-  }
-VOID               *mShellImageCallbackReg = NULL;
-
-
-
-EFI_USER_PROFILE_HANDLE                           mCurrentUser = NULL;
-EFI_EVENT                                         mHotKeyTimerEvent = NULL;
-EFI_EVENT                                         mHitHotkeyEvent = NULL;
-EFI_EVENT                                         mUsbKeyboardConnectEvent = NULL;
-BOOLEAN                                           mHotKeyPressed = FALSE;
-VOID                                              *mHitHotkeyRegistration;
-#define KEYBOARD_TIMER_INTERVAL                   20000 // 0.02s
-
-VOID
-ConnectUSBController (
-  VOID
-  );
-
-EFI_STATUS
-PlatformBdsConnectSimpleConsole (
-  IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
-);
-
-VOID 
-BootIntoFirmwareInterface(
-  VOID
-  );
-  
-VOID
-EFIAPI
-PlatformBdsInitHotKeyEvent (
-  VOID
-  );
-
-VOID
-EFIAPI
-DisableAhciCtlr (
-  IN EFI_EVENT                          Event,
-  IN VOID                               *Context
-  )
-{
-  UINT32                    PmcDisableAddress;
-  UINT8                     SataStorageAmount;
-  UINT32                    SataBase;
-  UINT16                    SataPortStatus;
-
-
-  DEBUG ((EFI_D_INFO, "Disable AHCI event is signalled\n"));
-  SataStorageAmount = 0;
-  SataBase = *(UINT32*) Context;
-
-  //
-  // BayTrail-M EDS chapter 16 ---- PCI IO Register Offset 92 (SATA Port Control and Status)
-  //
-  SataPortStatus = MmioRead16 (SataBase + R_PCH_SATA_PCS);
-
-  //
-  // Bit 8 EN: Port 0 Present
-  //
-  if ((SataPortStatus & 0x100) == 0x100) {
-    SataStorageAmount++;
-  }
-
-  //
-  // Bit 9 EN: Port 1 Present
-  //
-  if ((SataPortStatus & 0x200) == 0x200) {
-    SataStorageAmount++;
-  }
-
-  //
-  // Disable SATA controller when it sets to AHCI mode without carrying any devices
-  // in order to prevent AHCI yellow bang under Win device manager.
-  //
-  if (SataStorageAmount == 0) {
-    PmcDisableAddress = (MmioRead32 ((PCH_PCI_EXPRESS_BASE_ADDRESS + (UINT32) (31 << 15)) + R_PCH_LPC_PMC_BASE) & B_PCH_LPC_PMC_BASE_BAR) + R_PCH_PMC_FUNC_DIS;
-    MmioOr32 (PmcDisableAddress, B_PCH_PMC_FUNC_DIS_SATA);
-    S3BootScriptSaveMemWrite (
-      EfiBootScriptWidthUint32,
-      (UINTN) PmcDisableAddress,
-      1,
-      (VOID *) (UINTN) PmcDisableAddress
-      );
-  }
-}
-
-VOID
-InstallReadyToLock (
-  VOID
-  )
-{
-  EFI_STATUS                Status;
-  EFI_HANDLE                Handle;
-  EFI_SMM_ACCESS2_PROTOCOL  *SmmAccess;
-  EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save;
-
-  //
-  // Install DxeSmmReadyToLock protocol prior to the processing of boot options
-  //
-  Status = gBS->LocateProtocol (
-                  &gEfiSmmAccess2ProtocolGuid,
-                  NULL,
-                  (VOID **) &SmmAccess
-                  );
-  if (!EFI_ERROR (Status)) {
-
-    //
-    // Prepare S3 information, this MUST be done before DxeSmmReadyToLock
-    //
-    Status = gBS->LocateProtocol (
-                    &gEfiAcpiS3SaveProtocolGuid,
-                    NULL,
-                    (VOID **)&AcpiS3Save
-                    );
-    if (!EFI_ERROR (Status)) {
-      AcpiS3Save->S3Save (AcpiS3Save, NULL);
-    }
-
-    Handle = NULL;
-    Status = gBS->InstallProtocolInterface (
-                    &Handle,
-                    &gExitPmAuthProtocolGuid,
-                    EFI_NATIVE_INTERFACE,
-                    NULL
-                    );
-    ASSERT_EFI_ERROR (Status);
-
-    //
-    // Signal EndOfDxe PI Event
-    //
-    EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid);
-
-    Handle = NULL;
-    Status = gBS->InstallProtocolInterface (
-                    &Handle,
-                    &gEfiDxeSmmReadyToLockProtocolGuid,
-                    EFI_NATIVE_INTERFACE,
-                    NULL
-                    );
-    ASSERT_EFI_ERROR (Status);
-  }
-
-  return ;
-}
-
-VOID
-EFIAPI
-ShellImageCallback (
-  IN EFI_EVENT                          Event,
-  IN VOID                               *Context
-  )
-{
- BdsSetConsoleMode (TRUE);
- DEBUG ((EFI_D_INFO, "BdsEntry ShellImageCallback \n"));
-}
-
-//
-// BDS Platform Functions
-//
-/**
-  Platform Bds init. Include the platform firmware vendor, revision
-  and so crc check.
-
-  @param VOID
-
-  @retval  None.
-
-**/
-VOID
-EFIAPI
-PlatformBdsInit (
-  VOID
-  )
-{
-  EFI_STATUS  Status;
-  EFI_EVENT   ShellImageEvent;
-  EFI_GUID    ShellEnvProtocol = SHELL_ENVIRONMENT_INTERFACE_PROTOCOL;
-
-  #ifdef __GNUC__
-  SerialPortWrite((UINT8 *)">>>>BdsEntry[GCC]\r\n", 19);
-  #else
-  SerialPortWrite((UINT8 *)">>>>BdsEntry\r\n", 14);
-  #endif
-  BdsLibSaveMemoryTypeInformation ();
-
-  //
-  // Before user authentication, the user identification devices need be connected
-  // from the platform customized device paths
-  //
-  PlatformBdsConnectAuthDevice ();
-
-  //
-  // As console is not ready, the auto logon user will be identified.
-  //
-  BdsLibUserIdentify (&mCurrentUser);
-
-  //
-  // Change Gop mode when boot into Shell
-  //
-  if (mShellImageCallbackReg == NULL) {
-    Status = gBS->CreateEvent (
-                    EFI_EVENT_NOTIFY_SIGNAL,
-                    EFI_TPL_CALLBACK,
-                    ShellImageCallback,
-                    NULL,
-                    &ShellImageEvent
-                    );
-    if (!EFI_ERROR (Status)) {
-      Status = gBS->RegisterProtocolNotify (
-                      &ShellEnvProtocol,
-                      ShellImageEvent,
-                      &mShellImageCallbackReg
-                      );
-
-      DEBUG ((EFI_D_INFO, "BdsEntry ShellImageCallback \n"));
-    }
-  }
-}
-
-EFI_STATUS
-GetGopDevicePath (
-   IN  EFI_DEVICE_PATH_PROTOCOL *PciDevicePath,
-   OUT EFI_DEVICE_PATH_PROTOCOL **GopDevicePath
-   )
-{
-  UINTN                           Index;
-  EFI_STATUS                      Status;
-  EFI_HANDLE                      PciDeviceHandle;
-  EFI_DEVICE_PATH_PROTOCOL        *TempDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL        *TempPciDevicePath;
-  UINTN                           GopHandleCount;
-  EFI_HANDLE                      *GopHandleBuffer;
-
-  UINTN                                 VarSize;
-  SYSTEM_CONFIGURATION  mSystemConfiguration;
-
-  if (PciDevicePath == NULL || GopDevicePath == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Initialize the GopDevicePath to be PciDevicePath
-  //
-  *GopDevicePath    = PciDevicePath;
-  TempPciDevicePath = PciDevicePath;
-
-  Status = gBS->LocateDevicePath (
-                  &gEfiDevicePathProtocolGuid,
-                  &TempPciDevicePath,
-                  &PciDeviceHandle
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Try to connect this handle, so that GOP driver could start on this
-  // device and create child handles with GraphicsOutput Protocol installed
-  // on them, then we get device paths of these child handles and select
-  // them as possible console device.
-  //
-
-  //
-  // Select display devices
-  //
-  VarSize = sizeof(SYSTEM_CONFIGURATION);
-  Status = gRT->GetVariable(
-                  L"Setup",
-                  &gEfiNormalSetupGuid,
-                  NULL,
-                  &VarSize,
-                  &mSystemConfiguration
-                  );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
-    VarSize = sizeof(SYSTEM_CONFIGURATION);
-    Status = gRT->GetVariable(
-              L"SetupRecovery",
-              &gEfiNormalSetupGuid,
-              NULL,
-              &VarSize,
-              &mSystemConfiguration
-              );
-    ASSERT_EFI_ERROR (Status);
-  }    
-
-  if(mSystemConfiguration.BootDisplayDevice != 0x0)
-  {
-    ACPI_ADR_DEVICE_PATH         AcpiAdr;
-    EFI_DEVICE_PATH_PROTOCOL  *MyDevicePath = NULL;
-
-    AcpiAdr.Header.Type     = ACPI_DEVICE_PATH;
-    AcpiAdr.Header.SubType  = ACPI_ADR_DP;
-
-    switch (mSystemConfiguration.BootDisplayDevice) {
-    case 1:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, PORT_CRT, 0);    //CRT Device
-      break;
-    case 2:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL, PORT_B_HDMI, 0);  //HDMI Device Port B
-      break;
-    case 3:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL, PORT_B_DP, 0);    //DP PortB
-      break;
-    case 4:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL, PORT_C_DP, 0);    //DP PortC
-      break;
-    case 5:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL, PORT_C_DP, 0);    //eDP Port C
-      break;
-    case 6:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL, PORT_MIPI_A, 0);  //DSI Port A
-      break;
-    case 7:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL, PORT_MIPI_C, 0);  //DSI Port C
-      break;
-    default:
-      AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, PORT_CRT, 0);
-      break;
-    }
-
-    SetDevicePathNodeLength (&AcpiAdr.Header, sizeof (ACPI_ADR_DEVICE_PATH));
-
-    MyDevicePath = AppendDevicePathNode(MyDevicePath, (EFI_DEVICE_PATH_PROTOCOL*)&AcpiAdr);
-
-    gBS->ConnectController (
-           PciDeviceHandle,
-           NULL,
-           MyDevicePath,
-           FALSE
-           );
-
-    FreePool(MyDevicePath);
-  }
-  else
-  {
-    gBS->ConnectController (
-           PciDeviceHandle,
-           NULL,
-           NULL,
-           FALSE
-           );
-  }
-
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiGraphicsOutputProtocolGuid,
-                  NULL,
-                  &GopHandleCount,
-                  &GopHandleBuffer
-                  );
-  if (!EFI_ERROR (Status)) {
-    //
-    // Add all the child handles as possible Console Device
-    //
-    for (Index = 0; Index < GopHandleCount; Index++) {
-      Status = gBS->HandleProtocol (
-                      GopHandleBuffer[Index],
-                      &gEfiDevicePathProtocolGuid,
-                      (VOID**)&TempDevicePath
-                      );
-      if (EFI_ERROR (Status)) {
-        continue;
-      }
-      if (CompareMem (
-            PciDevicePath,
-            TempDevicePath,
-            GetDevicePathSize (PciDevicePath) - END_DEVICE_PATH_LENGTH
-            ) == 0) {
-        //
-        // In current implementation, we only enable one of the child handles
-        // as console device, i.e. sotre one of the child handle's device
-        // path to variable "ConOut"
-        // In future, we could select all child handles to be console device
-        //
-        *GopDevicePath = TempDevicePath;
-      }
-    }
-    gBS->FreePool (GopHandleBuffer);
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-
-  Search out all the platform pci or agp video device. The function may will
-  find multiple video device, and return all enabled device path.
-
-  @param PlugInPciVgaDevicePath    Return the platform plug in pci video device
-                                   path if the system have plug in pci video device.
-  @param OnboardPciVgaDevicePath   Return the platform active agp video device path
-                                   if the system have plug in agp video device or on
-                                   chip agp device.
-
-  @retval EFI_SUCCSS               Get all platform active video device path.
-  @retval EFI_STATUS               Return the status of gBS->LocateDevicePath (),
-                                   gBS->ConnectController (),
-                                   and gBS->LocateHandleBuffer ().
-
-**/
-EFI_STATUS
-GetPlugInPciVgaDevicePath (
-  IN OUT EFI_DEVICE_PATH_PROTOCOL     **PlugInPciVgaDevicePath,
-  IN OUT EFI_DEVICE_PATH_PROTOCOL     **OnboardPciVgaDevicePath
-  )
-{
-  EFI_STATUS                Status;
-  EFI_HANDLE                RootHandle;
-  UINTN                     HandleCount;
-  EFI_HANDLE                *HandleBuffer;
-  UINTN                     Index;
-  UINTN                     Index1;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  BOOLEAN                   PlugInPciVga;
-  EFI_PCI_IO_PROTOCOL       *PciIo;
-  PCI_TYPE00                Pci;
-
-  DevicePath = NULL;
-  PlugInPciVga = TRUE;
-  HandleCount = 0;
-  HandleBuffer = NULL;
-
-  //
-  // Make all the PCI_IO protocols on PCI Seg 0 show up
-  //
-  BdsLibConnectDevicePath (gPlatformRootBridges[0]);
-
-  Status = gBS->LocateDevicePath (
-                  &gEfiDevicePathProtocolGuid,
-                  &gPlatformRootBridges[0],
-                  &RootHandle
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = gBS->ConnectController (
-                  RootHandle,
-                  NULL,
-                  NULL,
-                  FALSE
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Start to check all the pci io to find all possible VGA device
-  //
-  HandleCount = 0;
-  HandleBuffer = NULL;
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiPciIoProtocolGuid,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuffer
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    Status = gBS->HandleProtocol (
-                    HandleBuffer[Index],
-                    &gEfiPciIoProtocolGuid,
-                    (VOID**)&PciIo
-                    );
-    if (!EFI_ERROR (Status)) {
-
-      //
-      // Check for all VGA device
-      //
-      Status = PciIo->Pci.Read (
-                        PciIo,
-                        EfiPciIoWidthUint32,
-                        0,
-                        sizeof (Pci) / sizeof (UINT32),
-                        &Pci
-                        );
-      if (EFI_ERROR (Status)) {
-        continue;
-      }
-
-      //
-      // Here we decide which VGA device to enable in PCI bus
-      //
-      // The first plugin PCI VGA card device will be present as PCI VGA
-      // The onchip AGP or AGP card will be present as AGP VGA
-      //
-      if (!IS_PCI_VGA (&Pci)) {
-        continue;
-      }
-
-      //
-      // Set the device as the possible console out device,
-      //
-      // Below code will make every VGA device to be one
-      // of the possibe console out device
-      //
-      PlugInPciVga = TRUE;
-      gBS->HandleProtocol (
-             HandleBuffer[Index],
-             &gEfiDevicePathProtocolGuid,
-             (VOID**)&DevicePath
-             );
-
-      Index1 = 0;
-
-      while (gPlatformAllPossiblePciVgaConsole[Index1] != NULL) {
-        if (CompareMem (
-              DevicePath,
-              gPlatformAllPossiblePciVgaConsole[Index1],
-              GetDevicePathSize (gPlatformAllPossiblePciVgaConsole[Index1])
-              ) == 0) {
-
-          //
-          // This device is an AGP device
-          //
-          *OnboardPciVgaDevicePath = DevicePath;
-          PlugInPciVga = FALSE;
-          break;
-        }
-
-        Index1 ++;
-      }
-
-      if (PlugInPciVga) {
-        *PlugInPciVgaDevicePath = DevicePath;
-      }
-    }
-  }
-
-  FreePool (HandleBuffer);
-
-  return EFI_SUCCESS;
-}
-
-/**
-
-  Find the platform  active vga, and base on the policy to enable the vga as
-  the console out device. The policy is driven by one setup variable "VBIOS".
-
-  None.
-
-  @param EFI_UNSUPPORTED         There is no active vga device
-
-  @retval EFI_STATUS             Return the status of BdsLibGetVariableAndSize ()
-
-**/
-EFI_STATUS
-PlatformBdsForceActiveVga (
-  VOID
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *PlugInPciVgaDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *OnboardPciVgaDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePathFirst;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePathSecond;
-  EFI_DEVICE_PATH_PROTOCOL  *GopDevicePath;
-  UINTN                VarSize;
-  SYSTEM_CONFIGURATION  mSystemConfiguration;
-
-  Status = EFI_SUCCESS;
-  PlugInPciVgaDevicePath = NULL;
-  OnboardPciVgaDevicePath = NULL;
-
-  //
-  // Check the policy which is the first enabled VGA
-  //
-  GetPlugInPciVgaDevicePath (&PlugInPciVgaDevicePath, &OnboardPciVgaDevicePath);
-
-  if (PlugInPciVgaDevicePath == NULL && OnboardPciVgaDevicePath == NULL) {
-    return EFI_UNSUPPORTED;
-  }
-
-  VarSize = sizeof(SYSTEM_CONFIGURATION);
-  Status = gRT->GetVariable(
-                  L"Setup",
-                  &gEfiNormalSetupGuid,
-                  NULL,
-                  &VarSize,
-                  &mSystemConfiguration
-                  );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
-    VarSize = sizeof(SYSTEM_CONFIGURATION);
-    Status = gRT->GetVariable(
-              L"SetupRecovery",
-              &gEfiNormalSetupGuid,
-              NULL,
-              &VarSize,
-              &mSystemConfiguration
-              );
-    ASSERT_EFI_ERROR (Status);
-  }    
-
-
-  if ((PlugInPciVgaDevicePath == NULL && OnboardPciVgaDevicePath != NULL) ) {
-    DEBUG ((EFI_D_ERROR,"Update onboard PCI VGA ...\n"));
-    DevicePathFirst  = OnboardPciVgaDevicePath;
-    DevicePathSecond = PlugInPciVgaDevicePath;
-    goto UpdateConOut;
-  }
-  if(OnboardPciVgaDevicePath != NULL && mSystemConfiguration.PrimaryVideoAdaptor == 0) {
-    DEBUG ((EFI_D_ERROR,"Update onboard PCI VGA When set primary!!!...\n"));
-    DevicePathFirst  = OnboardPciVgaDevicePath;
-    DevicePathSecond = PlugInPciVgaDevicePath;
-    goto UpdateConOut;
-  }
-
-  DEBUG ((EFI_D_ERROR,"Update plug in PCI VGA ...\n"));
-  DevicePathFirst  = PlugInPciVgaDevicePath;
-  DevicePathSecond = OnboardPciVgaDevicePath;
-
-UpdateConOut:
-  GetGopDevicePath (DevicePathFirst, &GopDevicePath);
-  DevicePathFirst = GopDevicePath;
-
-  Status = BdsLibUpdateConsoleVariable (
-             L"ConOut",
-             DevicePathFirst,
-             DevicePathSecond
-             );
-
-  return Status;
-}
-
-VOID
-UpdateConsoleResolution(
-  VOID
-  )
-{
-  UINT32                 HorizontalResolution;
-  UINT32                 VerticalResolution;
-  SYSTEM_CONFIGURATION   SystemConfiguration;
-  UINTN                  VarSize;
-  EFI_STATUS             Status;
-
-
-  HorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);
-  VerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution);
-
-  VarSize = sizeof(SYSTEM_CONFIGURATION);
-  Status = gRT->GetVariable(
-                  L"Setup",
-                  &gEfiNormalSetupGuid,
-                  NULL,
-                  &VarSize,
-                  &SystemConfiguration
-                  );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
-    VarSize = sizeof(SYSTEM_CONFIGURATION);
-    Status = gRT->GetVariable(
-              L"SetupRecovery",
-              &gEfiNormalSetupGuid,
-              NULL,
-              &VarSize,
-              &SystemConfiguration
-              );
-    ASSERT_EFI_ERROR (Status);
-  }  
-
-  switch (SystemConfiguration.IgdFlatPanel) {
-
-  case 0:
-    //
-    // Use the detault PCD values.
-    //
-    break;
-
-  case 1:
-    HorizontalResolution = 640;
-    VerticalResolution = 480;
-    break;
-
-  case 2:
-    HorizontalResolution = 800;
-    VerticalResolution = 600;
-    break;
-
-  case 3:
-    HorizontalResolution = 1024;
-    VerticalResolution = 768;
-    break;
-
-  case 4:
-  HorizontalResolution = 1280;
-  VerticalResolution = 1024;
-  break;
-
-  case 5:
-  HorizontalResolution = 1366;
-  VerticalResolution = 768;
-  break;
-
-  case 6:
-  HorizontalResolution = 1680;
-  VerticalResolution = 1050;
-  break;
-
-  case 7:
-  HorizontalResolution = 1920;
-  VerticalResolution = 1200;
-  break;
-
-  case 8:
-  HorizontalResolution = 1280;
-  VerticalResolution = 800;
-  break;
-  }
-
-  PcdSet32 (PcdSetupVideoHorizontalResolution, HorizontalResolution);
-  PcdSet32 (PcdSetupVideoVerticalResolution, VerticalResolution);
-  DEBUG ((EFI_D_ERROR, "HorizontalResolution = %x; VerticalResolution = %x", HorizontalResolution, VerticalResolution));
-
-  return;
-}
-
-/**
-  Connect the predefined platform default console device. Always try to find
-  and enable the vga device if have.
-
-  @param PlatformConsole    Predefined platform default console device array.
-
-  @retval EFI_SUCCESS       Success connect at least one ConIn and ConOut
-                            device, there must have one ConOut device is
-                            active vga device.
-
-  @retval EFI_STATUS        Return the status of
-                            BdsLibConnectAllDefaultConsoles ()
-
-**/
-EFI_STATUS
-PlatformBdsConnectConsole (
-  IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
-)
-{
-  EFI_STATUS                         Status;
-  UINTN                              Index;
-  EFI_DEVICE_PATH_PROTOCOL           *VarConout;
-  EFI_DEVICE_PATH_PROTOCOL           *VarConin;
-  UINTN                              DevicePathSize;
-
-  UpdateConsoleResolution();
-
-  Index = 0;
-  Status = EFI_SUCCESS;
-  DevicePathSize = 0;
-  VarConout = BdsLibGetVariableAndSize (
-                L"ConOut",
-                &gEfiGlobalVariableGuid,
-                &DevicePathSize
-                );
-  VarConin = BdsLibGetVariableAndSize (
-               L"ConIn",
-               &gEfiGlobalVariableGuid,
-               &DevicePathSize
-               );
-  if (VarConout == NULL || VarConin == NULL) {
-    //
-    // Have chance to connect the platform default console,
-    // the platform default console is the minimum device group
-    // the platform should support
-    //
-    while (PlatformConsole[Index].DevicePath != NULL) {
-
-      //
-      // Update the console variable with the connect type
-      //
-      if ((PlatformConsole[Index].ConnectType & CONSOLE_IN) == CONSOLE_IN) {
-        BdsLibUpdateConsoleVariable (L"ConIn", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      if ((PlatformConsole[Index].ConnectType & CONSOLE_OUT) == CONSOLE_OUT) {
-        BdsLibUpdateConsoleVariable (L"ConOut", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      if ((PlatformConsole[Index].ConnectType & STD_ERROR) == STD_ERROR) {
-        BdsLibUpdateConsoleVariable (L"ErrOut", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      Index ++;
-    }
-  }
-
-  //
-  // Make sure we have at least one active VGA, and have the right
-  // active VGA in console variable
-  //
-  Status = PlatformBdsForceActiveVga ();
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  DEBUG ((EFI_D_INFO, "DISPLAY INIT DONE\n"));
-
-  //
-  // Connect the all the default console with current console variable
-  //
-  Status = BdsLibConnectAllDefaultConsoles ();
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Connect with predefined platform connect sequence,
-  the OEM/IBV can customize with their own connect sequence.
-
-  @param None.
-
-  @retval None.
-
-**/
-VOID
-PlatformBdsConnectSequence (
-  VOID
-  )
-{
-  UINTN                     Index;
-
-  Index = 0;
-
-  //
-  // Here we can get the customized platform connect sequence
-  // Notes: we can connect with new variable which record the
-  // last time boots connect device path sequence
-  //
-  while (gPlatformConnectSequence[Index] != NULL) {
-
-    //
-    // Build the platform boot option
-    //
-    BdsLibConnectDevicePath (gPlatformConnectSequence[Index]);
-    Index ++;
-  }
-
-  //
-  // Just use the simple policy to connect all devices
-  // There should be no difference between debug tip and release tip, or it will be extremely hard to debug.
-  //
-  // There is case that IdeController driver will write boot script in driver model Start() function. It will be rejected by boot script save.
-  // It is only found when DEBUG disabled, because we are using BdsLibConnectAll() when DEBUG enabled.
-  //
-  // So we use BdsLibConnectAll() here to make sure IdeController.Start() is invoked before InstallReadyToLock().
-  // We may also consider to connect SataController only later if needed.
-  //
-  BdsLibConnectAll ();
-}
-
-/**
-
-  Load the predefined driver option, OEM/IBV can customize this
-  to load their own drivers
-
-  @param BdsDriverLists  The header of the driver option link list.
-
-  @retval None.
-
-**/
-VOID
-PlatformBdsGetDriverOption (
-  IN OUT LIST_ENTRY                  *BdsDriverLists
-  )
-{
-  UINTN                              Index;
-
-  Index = 0;
-
-  //
-  // Here we can get the customized platform driver option
-  //
-  while (gPlatformDriverOption[Index] != NULL) {
-
-    //
-    // Build the platform boot option
-    //
-    BdsLibRegisterNewOption (BdsDriverLists, gPlatformDriverOption[Index], NULL, L"DriverOrder");
-    Index ++;
-  }
-
-}
-
-/**
-  This function is used for some critical time if the the system
-  have no any boot option, and there is no time out for user to add
-  the new boot option. This can also treat as the platform default
-  boot option.
-
-  @param BdsBootOptionList   The header of the boot option link list.
-
-  @retval None.
-
-**/
-VOID
-PlatformBdsPredictBootOption (
-  IN OUT LIST_ENTRY                  *BdsBootOptionList
-  )
-{
-  UINTN                              Index;
-
-  Index = 0;
-
-  //
-  // Here give chance to get platform boot option data
-  //
-  while (gPlatformBootOption[Index] != NULL) {
-
-    //
-    // Build the platform boot option
-    //
-    BdsLibRegisterNewOption (BdsBootOptionList, gPlatformBootOption[Index], NULL, L"BootOrder");
-    Index ++;
-  }
-}
-
-/**
-  Perform the platform diagnostic, such like test memory. OEM/IBV also
-  can customize this fuction to support specific platform diagnostic.
-
-  @param MemoryTestLevel   The memory test intensive level
-  @param QuietBoot         Indicate if need to enable the quiet boot
-  @param BaseMemoryTest    A pointer to BdsMemoryTest()
-
-  @retval  None.
-
-**/
-VOID
-PlatformBdsDiagnostics (
-  IN EXTENDMEM_COVERAGE_LEVEL    MemoryTestLevel,
-  IN BOOLEAN                     QuietBoot,
-  IN BASEM_MEMORY_TEST           BaseMemoryTest
-  )
-{
-  EFI_STATUS                     Status;
-
-  //
-  // Here we can decide if we need to show
-  // the diagnostics screen
-  // Notes: this quiet boot code should be remove
-  // from the graphic lib
-  //
-  if (QuietBoot) {
-    EnableQuietBoot (PcdGetPtr(PcdLogoFile));
-
-    //
-    // Perform system diagnostic
-    //
-    Status = BaseMemoryTest (MemoryTestLevel);
-    if (EFI_ERROR (Status)) {
-      DisableQuietBoot ();
-    }
-
-    return;
-  }
-
-  //
-  // Perform system diagnostic
-  //
-  Status = BaseMemoryTest (MemoryTestLevel);
-}
-
-
-/**
-  For EFI boot option, BDS separate them as six types:
-  1. Network - The boot option points to the SimpleNetworkProtocol device.
-               Bds will try to automatically create this type boot option when enumerate.
-  2. Shell   - The boot option points to internal flash shell.
-               Bds will try to automatically create this type boot option when enumerate.
-  3. Removable BlockIo      - The boot option only points to the removable media
-                              device, like USB flash disk, DVD, Floppy etc.
-                              These device should contain a *removable* blockIo
-                              protocol in their device handle.
-                              Bds will try to automatically create this type boot option
-                              when enumerate.
-  4. Fixed BlockIo          - The boot option only points to a Fixed blockIo device,
-                              like HardDisk.
-                              These device should contain a *fixed* blockIo
-                              protocol in their device handle.
-                              BDS will skip fixed blockIo devices, and NOT
-                              automatically create boot option for them. But BDS
-                              will help to delete those fixed blockIo boot option,
-                              whose description rule conflict with other auto-created
-                              boot options.
-  5. Non-BlockIo Simplefile - The boot option points to a device whose handle
-                              has SimpleFileSystem Protocol, but has no blockio
-                              protocol. These devices do not offer blockIo
-                              protocol, but BDS still can get the
-                              \EFI\BOOT\boot{machinename}.EFI by SimpleFileSystem
-                              Protocol.
-  6. File    - The boot option points to a file. These boot options are usually
-               created by user manually or OS loader. BDS will not delete or modify
-               these boot options.
-
-  This function will enumerate all possible boot device in the system, and
-  automatically create boot options for Network, Shell, Removable BlockIo,
-  and Non-BlockIo Simplefile devices.
-  It will only execute once of every boot.
-
-  @param  BdsBootOptionList      The header of the link list which indexed all
-                                 current boot options
-
-  @retval EFI_SUCCESS            Finished all the boot device enumerate and create
-                                 the boot option base on that boot device
-
-  @retval EFI_OUT_OF_RESOURCES   Failed to enumerate the boot device and create the boot option list
-**/
-EFI_STATUS
-EFIAPI
-PlatformBdsLibEnumerateAllBootOption (
-  IN OUT LIST_ENTRY          *BdsBootOptionList
-  )
-{
-  EFI_STATUS                    Status;
-  UINT16                        FloppyNumber;
-  UINT16                        HarddriveNumber;
-  UINT16                        CdromNumber;
-  UINT16                        UsbNumber;
-  UINT16                        MiscNumber;
-  UINT16                        ScsiNumber;
-  UINT16                        NonBlockNumber;
-  UINTN                         NumberBlockIoHandles;
-  EFI_HANDLE                    *BlockIoHandles;
-  EFI_BLOCK_IO_PROTOCOL         *BlkIo;
-  BOOLEAN                       Removable[2];
-  UINTN                         RemovableIndex;
-  UINTN                         Index;
-  UINTN                         NumOfLoadFileHandles;
-  EFI_HANDLE                    *LoadFileHandles;
-  UINTN                         FvHandleCount;
-  EFI_HANDLE                    *FvHandleBuffer;
-  EFI_FV_FILETYPE               Type;
-  UINTN                         Size;
-  EFI_FV_FILE_ATTRIBUTES        Attributes;
-  UINT32                        AuthenticationStatus;
-  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
-  EFI_DEVICE_PATH_PROTOCOL      *DevicePath;
-  UINTN                         DevicePathType;
-  CHAR16                        Buffer[40];
-  EFI_HANDLE                    *FileSystemHandles;
-  UINTN                         NumberFileSystemHandles;
-  BOOLEAN                       NeedDelete;
-  EFI_IMAGE_DOS_HEADER          DosHeader;
-  CHAR8                         *PlatLang;
-  CHAR8                         *LastLang;
-  EFI_IMAGE_OPTIONAL_HEADER_UNION       HdrData;
-  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;
-  CHAR16                        *MacStr;
-  CHAR16                        *IPverStr;
-  EFI_HANDLE                    *NetworkHandles;
-  UINTN                         BufferSize;
-
-  FloppyNumber    = 0;
-  HarddriveNumber = 0;
-  CdromNumber     = 0;
-  UsbNumber       = 0;
-  MiscNumber      = 0;
-  ScsiNumber      = 0;
-  PlatLang        = NULL;
-  LastLang        = NULL;
-  ZeroMem (Buffer, sizeof (Buffer));
-
-  //
-  // If the boot device enumerate happened, just get the boot
-  // device from the boot order variable
-  //
-  if (mEnumBootDevice) {
-    GetVariable2 (LAST_ENUM_LANGUAGE_VARIABLE_NAME, &gLastEnumLangGuid, (VOID**)&LastLang, NULL);
-    GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&PlatLang, NULL);
-    ASSERT (PlatLang != NULL);
-    if ((LastLang != NULL) && (AsciiStrCmp (LastLang, PlatLang) == 0)) {
-      Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");
-      FreePool (LastLang);
-      FreePool (PlatLang);
-      return Status;
-    } else {
-      Status = gRT->SetVariable (
-        LAST_ENUM_LANGUAGE_VARIABLE_NAME,
-        &gLastEnumLangGuid,
-        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-        AsciiStrSize (PlatLang),
-        PlatLang
-        );
-      //
-      // Failure to set the variable only impacts the performance next time enumerating the boot options.
-      //
-
-      if (LastLang != NULL) {
-        FreePool (LastLang);
-      }
-      FreePool (PlatLang);
-    }
-  }
-
-  //
-  // Notes: this dirty code is to get the legacy boot option from the
-  // BBS table and create to variable as the EFI boot option, it should
-  // be removed after the CSM can provide legacy boot option directly
-  //
-  REFRESH_LEGACY_BOOT_OPTIONS;
-
-  //
-  // Delete invalid boot option
-  //
-  BdsDeleteAllInvalidEfiBootOption ();
-
-  //
-  // Parse removable media followed by fixed media.
-  // The Removable[] array is used by the for-loop below to create removable media boot options 
-  // at first, and then to create fixed media boot options.
-  //
-  Removable[0]  = FALSE;
-  Removable[1]  = TRUE;
-
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiBlockIoProtocolGuid,
-        NULL,
-        &NumberBlockIoHandles,
-        &BlockIoHandles
-        );
-
-  for (RemovableIndex = 0; RemovableIndex < 2; RemovableIndex++) {
-    for (Index = 0; Index < NumberBlockIoHandles; Index++) {
-      Status = gBS->HandleProtocol (
-                      BlockIoHandles[Index],
-                      &gEfiBlockIoProtocolGuid,
-                      (VOID **) &BlkIo
-                      );
-      //
-      // skip the logical partition
-      //
-      if (EFI_ERROR (Status) || BlkIo->Media->LogicalPartition) {
-        continue;
-      }
-
-      //
-      // firstly fixed block io then the removable block io
-      //
-      if (BlkIo->Media->RemovableMedia == Removable[RemovableIndex]) {
-        continue;
-      }
-      DevicePath  = DevicePathFromHandle (BlockIoHandles[Index]);
-      DevicePathType = BdsGetBootTypeFromDevicePath (DevicePath);
-
-      switch (DevicePathType) {
-      case BDS_EFI_ACPI_FLOPPY_BOOT:
-        if (FloppyNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)), FloppyNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        FloppyNumber++;
-        break;
-
-      //
-      // Assume a removable SATA device should be the DVD/CD device, a fixed SATA device should be the Hard Drive device.
-      //
-      case BDS_EFI_MESSAGE_ATAPI_BOOT:
-      case BDS_EFI_MESSAGE_SATA_BOOT:
-        if (BlkIo->Media->RemovableMedia) {
-          if (CdromNumber != 0) {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)), CdromNumber);
-          } else {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)));
-          }
-          CdromNumber++;
-        } else {
-          if (HarddriveNumber != 0) {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)), HarddriveNumber);
-          } else {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)));
-          }
-          HarddriveNumber++;
-        }
-        DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Buffer: %S\n", Buffer));
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        break;
-
-      case BDS_EFI_MESSAGE_USB_DEVICE_BOOT:
-        if (UsbNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)), UsbNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        UsbNumber++;
-        break;
-
-      case BDS_EFI_MESSAGE_SCSI_BOOT:
-        if (ScsiNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)), ScsiNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        ScsiNumber++;
-        break;
-
-      case BDS_EFI_MESSAGE_MISC_BOOT:
-      default:
-        if (MiscNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)), MiscNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        MiscNumber++;
-        break;
-      }
-    }
-  }
-
-  if (NumberBlockIoHandles != 0) {
-    FreePool (BlockIoHandles);
-  }
-
-  //
-  // If there is simple file protocol which does not consume block Io protocol, create a boot option for it here.
-  //
-  NonBlockNumber = 0;
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiSimpleFileSystemProtocolGuid,
-        NULL,
-        &NumberFileSystemHandles,
-        &FileSystemHandles
-        );
-  for (Index = 0; Index < NumberFileSystemHandles; Index++) {
-    Status = gBS->HandleProtocol (
-                    FileSystemHandles[Index],
-                    &gEfiBlockIoProtocolGuid,
-                    (VOID **) &BlkIo
-                    );
-     if (!EFI_ERROR (Status)) {
-      //
-      //  Skip if the file system handle supports a BlkIo protocol,
-      //
-      continue;
-    }
-
-    //
-    // Do the removable Media thing. \EFI\BOOT\boot{machinename}.EFI
-    //  machinename is ia32, ia64, x64, ...
-    //
-    Hdr.Union  = &HdrData;
-    NeedDelete = TRUE;
-    Status     = BdsLibGetImageHeader (
-                   FileSystemHandles[Index],
-                   EFI_REMOVABLE_MEDIA_FILE_NAME,
-                   &DosHeader,
-                   Hdr
-                   );
-    if (!EFI_ERROR (Status) &&
-        EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Hdr.Pe32->FileHeader.Machine) &&
-        Hdr.Pe32->OptionalHeader.Subsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {
-      NeedDelete = FALSE;
-    }
-
-    if (NeedDelete) {
-      //
-      // No such file or the file is not a EFI application, delete this boot option
-      //
-      BdsLibDeleteOptionFromHandle (FileSystemHandles[Index]);
-    } else {
-      if (NonBlockNumber != 0) {
-        UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)), NonBlockNumber);
-      } else {
-        UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)));
-      }
-      BdsLibBuildOptionFromHandle (FileSystemHandles[Index], BdsBootOptionList, Buffer);
-      NonBlockNumber++;
-    }
-  }
-
-  if (NumberFileSystemHandles != 0) {
-    FreePool (FileSystemHandles);
-  }
-
-  //
-  // Check if we have on flash shell
-  //
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiFirmwareVolume2ProtocolGuid,
-        NULL,
-        &FvHandleCount,
-        &FvHandleBuffer
-        );
-  for (Index = 0; Index < FvHandleCount; Index++) {
-    gBS->HandleProtocol (
-          FvHandleBuffer[Index],
-          &gEfiFirmwareVolume2ProtocolGuid,
-          (VOID **) &Fv
-          );
-
-    Status = Fv->ReadFile (
-                  Fv,
-                  &gUefiShellFileGuid,
-                  NULL,
-                  &Size,
-                  &Type,
-                  &Attributes,
-                  &AuthenticationStatus
-                  );
-    if (EFI_ERROR (Status)) {
-      //
-      // Skip if no shell file in the FV
-      //
-      continue;
-    }
-    //
-    // Build the shell boot option
-    //
-    BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList);
-  }
-
-  if (FvHandleCount != 0) {
-    FreePool (FvHandleBuffer);
-  }
-
-  //
-  // Parse Network Boot Device
-  //
-  NumOfLoadFileHandles = 0;
-  //
-  // Search Load File protocol for PXE boot option.
-  //
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiLoadFileProtocolGuid,
-        NULL,
-        &NumOfLoadFileHandles,
-        &LoadFileHandles
-        );
-
-  for (Index = 0; Index < NumOfLoadFileHandles; Index++) {
-
-//
-//Locate EFI_DEVICE_PATH_PROTOCOL to dynamically get IPv4/IPv6 protocol information.
-//
-
- Status = gBS->HandleProtocol (
-                  LoadFileHandles[Index],
-                  &gEfiDevicePathProtocolGuid,
-                  (VOID **) &DevicePath
-                  );
-  
- ASSERT_EFI_ERROR (Status);
-
-  while (!IsDevicePathEnd (DevicePath)) {
-    if ((DevicePath->Type == MESSAGING_DEVICE_PATH) &&
-        (DevicePath->SubType == MSG_IPv4_DP)) {
-
-  //
-  //Get handle infomation
-  //
-  BufferSize = 0;
-  NetworkHandles = NULL;
-  Status = gBS->LocateHandle (
-                  ByProtocol, 
-                  &gEfiSimpleNetworkProtocolGuid,
-                  NULL,
-                  &BufferSize,
-                  NetworkHandles
-                  );
-
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    NetworkHandles = AllocateZeroPool(BufferSize);
-    if (NetworkHandles == NULL) {
-      return (EFI_OUT_OF_RESOURCES);
-    }
-    Status = gBS->LocateHandle(
-                    ByProtocol,
-                    &gEfiSimpleNetworkProtocolGuid,
-                    NULL,
-                    &BufferSize,
-                    NetworkHandles
-                    );
- }
-               
-  //
-  //Get the MAC string
-  //
-  Status = NetLibGetMacString (
-             *NetworkHandles,
-             NULL,
-             &MacStr
-             );
-  if (EFI_ERROR (Status)) {	
-    return Status;
-  }
-  IPverStr = L" IPv4";
-  UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr);
-  break;
-  }
-    if((DevicePath->Type == MESSAGING_DEVICE_PATH) &&
-        (DevicePath->SubType == MSG_IPv6_DP)) {
-
-  //
-  //Get handle infomation
-  //
-  BufferSize = 0;
-  NetworkHandles = NULL;
-  Status = gBS->LocateHandle (
-                  ByProtocol, 
-                  &gEfiSimpleNetworkProtocolGuid,
-                  NULL,
-                  &BufferSize,
-                  NetworkHandles
-                  );
-
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    NetworkHandles = AllocateZeroPool(BufferSize);
-    if (NetworkHandles == NULL) {
-       return (EFI_OUT_OF_RESOURCES);
-    }
-    Status = gBS->LocateHandle(
-                    ByProtocol,
-                    &gEfiSimpleNetworkProtocolGuid,
-                    NULL,
-                    &BufferSize,
-                    NetworkHandles
-                    );
- }
-                    
-  //
-  //Get the MAC string
-  //
-  Status = NetLibGetMacString (
-             *NetworkHandles,
-             NULL,
-             &MacStr
-             );
-  if (EFI_ERROR (Status)) {	
-    return Status;
-  }
-      IPverStr = L" IPv6";
-      UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr);
-      break;
-    }
-    DevicePath = NextDevicePathNode (DevicePath);
-  }
-  
-    BdsLibBuildOptionFromHandle (LoadFileHandles[Index], BdsBootOptionList, Buffer);
-  }
-
-  if (NumOfLoadFileHandles != 0) {
-    FreePool (LoadFileHandles);
-  }
-
-  //
-  // Check if we have on flash shell
-  //
- /* gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiFirmwareVolume2ProtocolGuid,
-        NULL,
-        &FvHandleCount,
-        &FvHandleBuffer
-        );
-  for (Index = 0; Index < FvHandleCount; Index++) {
-    gBS->HandleProtocol (
-          FvHandleBuffer[Index],
-          &gEfiFirmwareVolume2ProtocolGuid,
-          (VOID **) &Fv
-          );
-
-    Status = Fv->ReadFile (
-                  Fv,
-                  &gUefiShellFileGuid,
-                  NULL,
-                  &Size,
-                  &Type,
-                  &Attributes,
-                  &AuthenticationStatus
-                  );
-    if (EFI_ERROR (Status)) {
-      //
-      // Skip if no shell file in the FV
-      //
-      continue;
-    }
-    //
-    // Build the shell boot option
-    //
-    BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList);
-  }
-
-  if (FvHandleCount != 0) {
-    FreePool (FvHandleBuffer);
-  } */
-  
-  //
-  // Make sure every boot only have one time
-  // boot device enumerate
-  //
-  Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");
-  mEnumBootDevice = TRUE;
-
-  return Status;
-} 
-
-
-
-/**
-
-  The function will execute with as the platform policy, current policy
-  is driven by boot mode. IBV/OEM can customize this code for their specific
-  policy action.
-
-  @param DriverOptionList - The header of the driver option link list
-  @param  BootOptionList   - The header of the boot option link list
-  @param ProcessCapsules  - A pointer to ProcessCapsules()
-  @param BaseMemoryTest   - A pointer to BaseMemoryTest()
-
-  @retval None.
-
-**/
-VOID
-EFIAPI
-PlatformBdsPolicyBehavior (
-  IN OUT LIST_ENTRY                  *DriverOptionList,
-  IN OUT LIST_ENTRY                  *BootOptionList,
-  IN PROCESS_CAPSULES                BdsProcessCapsules,
-  IN BASEM_MEMORY_TEST               BaseMemoryTest
-  )
-{
-  EFI_STATUS                         Status;
-  UINT16                             Timeout;
-  EFI_BOOT_MODE                      BootMode;
-  BOOLEAN                            DeferredImageExist;
-  UINTN                              Index;
-  SYSTEM_CONFIGURATION               SystemConfiguration;
-  UINTN                              VarSize;
-  PLATFORM_PCI_DEVICE_PATH           *EmmcBootDevPath;
-  EFI_GLOBAL_NVS_AREA_PROTOCOL       *GlobalNvsArea;
-  EFI_HANDLE                         FvProtocolHandle;
-  UINTN                              HandleCount;
-  EFI_HANDLE                         *HandleBuffer;
-  UINTN                              Index1;
-  UINTN                              SataPciRegBase = 0;
-  UINT16                             SataModeSelect = 0;
-  VOID                               *RegistrationExitPmAuth = NULL;
-  EFI_EVENT                          Event;
-  BOOLEAN                            IsFirstBoot;
-  UINT16                             *BootOrder;
-  UINTN                              BootOrderSize;
-  ESRT_MANAGEMENT_PROTOCOL           *EsrtManagement;
-
-  Timeout = PcdGet16 (PcdPlatformBootTimeOut);
-  if (Timeout > 10 ) {
-    //we think the Timeout variable is corrupted
-    Timeout = 10;
-  }
-
-  VarSize = sizeof(SYSTEM_CONFIGURATION);
-  Status = gRT->GetVariable(
-                  NORMAL_SETUP_NAME,
-                  &gEfiNormalSetupGuid,
-                  NULL,
-                  &VarSize,
-                  &SystemConfiguration
-                  );
-
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
-    VarSize = sizeof(SYSTEM_CONFIGURATION);
-    Status = gRT->GetVariable(
-              L"SetupRecovery",
-              &gEfiNormalSetupGuid,
-              NULL,
-              &VarSize,
-              &SystemConfiguration
-              );
-    ASSERT_EFI_ERROR (Status);
-  }
-
-  //
-  // Load the driver option as the driver option list
-  //
-  PlatformBdsGetDriverOption (DriverOptionList);
-
-  //
-  // Get current Boot Mode
-  //
-  BootMode = GetBootModeHob();
-
-  //
-  // No deferred images exist by default
-  //
-  DeferredImageExist = FALSE;
-  if ((BootMode != BOOT_WITH_MINIMAL_CONFIGURATION) && (PcdGet32(PcdFlashFvShellSize) > 0)){
-    gDS->ProcessFirmwareVolume (
-           (VOID *)(UINTN)PcdGet32(PcdFlashFvShellBase),
-           PcdGet32(PcdFlashFvShellSize),
-           &FvProtocolHandle
-           );
-  }
-
-  if (SystemConfiguration.FastBoot == 1) {
-    BootOrder = BdsLibGetVariableAndSize (
-                  L"BootOrder",
-                  &gEfiGlobalVariableGuid,
-                  &BootOrderSize
-                  );
-    if ((BootOrder != NULL) && (BootMode != BOOT_ON_FLASH_UPDATE)) {
-      //
-      // BootOrder exist, it means system has boot before. We can do fast boot.
-      //
-      BootMode = BOOT_WITH_MINIMAL_CONFIGURATION;
-    }
-  }
-
-
-  //
-  // Use eMMC to boot OS and turn on AHCI, when SATA HDD is diconnected,
-  // SATA AHCI CTLR device will show yellow bang, implement this solution to solve it.
-  //
-  SataPciRegBase  = MmPciAddress (0, 0, PCI_DEVICE_NUMBER_PCH_SATA, 0, 0);
-  SataModeSelect  = MmioRead16 (SataPciRegBase + R_PCH_SATA_MAP) & B_PCH_SATA_MAP_SMS_MASK;
-  Status          = EFI_SUCCESS;
-  if (SataModeSelect != V_PCH_SATA_MAP_SMS_IDE) {
-    Status = gBS->CreateEvent (
-                    EVT_NOTIFY_SIGNAL,
-                    TPL_CALLBACK,
-                    DisableAhciCtlr,
-                    &SataPciRegBase,
-                    &Event
-                     );
-    if (!EFI_ERROR (Status)) {
-      Status = gBS->RegisterProtocolNotify (
-                      &gExitPmAuthProtocolGuid,
-                      Event,
-                      &RegistrationExitPmAuth
-                      );
-    }
-  }
-
-  Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtManagement);
-  if (EFI_ERROR(Status)) {
-    EsrtManagement = NULL;
-  }
-
-  DEBUG ((DEBUG_INFO, "BDS: BootMode=%02x\n", BootMode));
-
-  switch (BootMode) {
-
-  case BOOT_WITH_MINIMAL_CONFIGURATION:
-    PlatformBdsInitHotKeyEvent ();
-    PlatformBdsConnectSimpleConsole (gPlatformSimpleConsole);
-
-
-    //
-    // Check to see if it's needed to dispatch more DXE drivers.
-    //
-    for (Index = 0; Index < sizeof(ConnectDriverTable)/sizeof(EFI_GUID *); Index++) {
-      Status = gBS->LocateHandleBuffer (
-                      ByProtocol,
-                      ConnectDriverTable[Index],
-                      NULL,
-                      &HandleCount,
-                      &HandleBuffer
-                      );
-      if (!EFI_ERROR (Status)) {
-        for (Index1 = 0; Index1 < HandleCount; Index1++) {
-          gBS->ConnectController (
-                 HandleBuffer[Index1],
-                 NULL,
-                 NULL,
-                 TRUE
-                 );
-        }
-      }
-
-      if (HandleBuffer != NULL) {
-        FreePool (HandleBuffer);
-      }
-
-      gDS->Dispatch ();
-    }
-
-    //
-    //  Locate the Global NVS Protocol.
-    //
-    Status = gBS->LocateProtocol (
-                    &gEfiGlobalNvsAreaProtocolGuid,
-                    NULL,
-                    (void **)&GlobalNvsArea
-                    );
-    if (GlobalNvsArea->Area->emmcVersion == 0){
-      EmmcBootDevPath = (PLATFORM_PCI_DEVICE_PATH *)gPlatformSimpleBootOption[0];
-      EmmcBootDevPath->PciDevice.Device = 0x10;
-    }
-
-    //
-    // Connect boot device here to give time to read keyboard.
-    //
-    BdsLibConnectDevicePath (gPlatformSimpleBootOption[0]);
-
-    //
-    // This is a workround for dectecting hotkey from USB keyboard.
-    //
-    gBS->Stall(KEYBOARD_TIMER_INTERVAL);
-
-    if (mHotKeyTimerEvent != NULL) {
-      gBS->SetTimer (
-             mHotKeyTimerEvent,
-             TimerCancel,
-             0
-             );
-      gBS->CloseEvent (mHotKeyTimerEvent);
-      mHotKeyTimerEvent = NULL;
-    }
-    if (mHotKeyPressed) {
-      //
-      // Skip show progress count down
-      //
-      Timeout = 0xFFFF;
-      goto FULL_CONFIGURATION;
-    }
-
-    EnableQuietBoot (PcdGetPtr(PcdLogoFile));
-    if (!SystemConfiguration.QuietBoot) {
-      PlatformBdsDiagnostics (IGNORE, FALSE, BaseMemoryTest);
-    }
-
-
-    #ifdef TPM_ENABLED
-    TcgPhysicalPresenceLibProcessRequest();
-    #endif
-
-    if (EsrtManagement != NULL) {
-      EsrtManagement->LockEsrtRepository();
-    }
-
-    //
-    // Close boot script and install ready to lock
-    //
-    InstallReadyToLock ();
-
-    //
-    // Give one chance to enter the setup if we
-    // select Gummiboot "Reboot Into Firmware Interface" and Fast Boot is enabled.
-    //
-    BootIntoFirmwareInterface();
-    break;
-
-  case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
-
-    //
-    // In no-configuration boot mode, we can connect the
-    // console directly.
-    //
-    BdsLibConnectAllDefaultConsoles ();
-    PlatformBdsDiagnostics (IGNORE, TRUE, BaseMemoryTest);
-
-    //
-    // Perform some platform specific connect sequence
-    //
-    PlatformBdsConnectSequence ();
-
-    //
-    // As console is ready, perform user identification again.
-    //
-    if (mCurrentUser == NULL) {
-      PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist);
-      if (DeferredImageExist) {
-        //
-        // After user authentication, the deferred drivers was loaded again.
-        // Here, need to ensure the deferred images are connected.
-        //
-        BdsLibConnectAllDefaultConsoles ();
-        PlatformBdsConnectSequence ();
-      }
-    }
-
-    if (EsrtManagement != NULL) {
-      EsrtManagement->LockEsrtRepository();
-    }
-
-    //
-    // Close boot script and install ready to lock
-    //
-    InstallReadyToLock ();
-
-    //
-    // Notes: current time out = 0 can not enter the
-    // front page
-    //
-    PlatformBdsEnterFrontPageWithHotKey (Timeout, FALSE);
-
-    //
-    // Check the boot option with the boot option list
-    //
-    BdsLibBuildOptionFromVar (BootOptionList, L"BootOrder");
-    break;
-
-  case BOOT_ON_FLASH_UPDATE:
-
-    //
-    // Boot with the specific configuration
-    //
-    PlatformBdsConnectConsole (gPlatformConsole);
-    PlatformBdsDiagnostics (EXTENSIVE, TRUE, BaseMemoryTest);
-
-    DEBUG((DEBUG_INFO, "ProcessCapsules Before EndOfDxe......\n"));
-    ProcessCapsules ();
-    DEBUG((DEBUG_INFO, "ProcessCapsules Done\n"));
-
-    //
-    // Close boot script and install ready to lock
-    //
-    InstallReadyToLock ();
-
-    BdsLibConnectAll ();
-
-    //
-    // Perform user identification
-    //
-    if (mCurrentUser == NULL) {
-      PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist);
-      if (DeferredImageExist) {
-        //
-        // After user authentication, the deferred drivers was loaded again.
-        // Here, need to ensure the deferred images are connected.
-        //
-        BdsLibConnectAll ();
-      }
-    }
-
-    if (EsrtManagement != NULL) {
-      EsrtManagement->SyncEsrtFmp();
-    }
-
-    DEBUG((DEBUG_INFO, "ProcessCapsules After ConnectAll......\n"));
-    ProcessCapsules();
-    DEBUG((DEBUG_INFO, "ProcessCapsules Done\n"));
-    break;
-
-  case BOOT_IN_RECOVERY_MODE:
-
-    //
-    // In recovery mode, just connect platform console
-    // and show up the front page
-    //
-    PlatformBdsConnectConsole (gPlatformConsole);
-    PlatformBdsDiagnostics (EXTENSIVE, FALSE, BaseMemoryTest);
-    BdsLibConnectAll ();
-
-    //
-    // Perform user identification
-    //
-    if (mCurrentUser == NULL) {
-      PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist);
-      if (DeferredImageExist) {
-        //
-        // After user authentication, the deferred drivers was loaded again.
-        // Here, need to ensure the deferred drivers are connected.
-        //
-        BdsLibConnectAll ();
-      }
-    }
-
-    //
-    // Close boot script and install ready to lock
-    //
-    InstallReadyToLock ();
-
-    //
-    // In recovery boot mode, we still enter to the
-    // frong page now
-    //
-    PlatformBdsEnterFrontPageWithHotKey (Timeout, FALSE);
-    break;
-
-FULL_CONFIGURATION:
-  case BOOT_WITH_FULL_CONFIGURATION:
-  case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
-  case BOOT_WITH_DEFAULT_SETTINGS:
-  default:
-
-    //
-    // Connect platform console
-    //
-    Status = PlatformBdsConnectConsole (gPlatformConsole);
-    if (EFI_ERROR (Status)) {
-
-      //
-      // Here OEM/IBV can customize with defined action
-      //
-      PlatformBdsNoConsoleAction ();
-    }
-
-    //
-    // Chenyunh[TODO]: This is Workgroud to show the fs for uSDcard,
-    // Need to root cause this issue.
-    //
-    DEBUG ((DEBUG_ERROR, "Start to reconnect all driver.\n"));
-    BdsLibDisconnectAllEfi();
-    BdsLibConnectAll ();
-    DEBUG ((DEBUG_ERROR, "End to reconnect all driver.\n"));
-
-    //
-    // Perform some platform specific connect sequence
-    //
-    PlatformBdsConnectSequence ();
-    EnableQuietBoot (PcdGetPtr(PcdLogoFile));
-    if (!SystemConfiguration.QuietBoot) {
-      PlatformBdsDiagnostics (IGNORE, FALSE, BaseMemoryTest);
-    }
-
-    //
-    // Do a pre-delay so Hard Disk can spin up and see more logo.
-    //
-    gBS->Stall(SystemConfiguration.HddPredelay * 1000000);
-
-    //
-    // Perform user identification
-    //
-    if (mCurrentUser == NULL) {
-      PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist);
-      if (DeferredImageExist) {
-        //
-        // After user authentication, the deferred drivers was loaded again.
-        // Here, need to ensure the deferred drivers are connected.
-        //
-        Status = PlatformBdsConnectConsole (gPlatformConsole);
-        if (EFI_ERROR (Status)) {
-          PlatformBdsNoConsoleAction ();
-        }
-        PlatformBdsConnectSequence ();
-      }
-    }
-   #ifdef TPM_ENABLED
-   TcgPhysicalPresenceLibProcessRequest();
-   #endif
-
-    if (EsrtManagement != NULL) {
-      EsrtManagement->SyncEsrtFmp();
-    }
-    //
-    // Close boot script and install ready to lock
-    //
-    InstallReadyToLock ();
-
-    //
-    // Here we have enough time to do the enumeration of boot device
-    //
-    PlatformBdsLibEnumerateAllBootOption (BootOptionList);
-
-    //
-    // Give one chance to enter the setup if we
-    // have the time out
-    //
-    PlatformBdsEnterFrontPageWithHotKey (Timeout, FALSE);
-
-	//
-	// Give one chance to enter the setup if we
-	// select Gummiboot "Reboot Into Firmware Interface"
-	//
-	BootIntoFirmwareInterface();
-
-    //
-    // In default boot mode, always find all boot
-    // option and do enumerate all the default boot option
-    //
-    if (Timeout == 0) {
-      BdsLibBuildOptionFromVar (BootOptionList, L"BootOrder");
-      if (IsListEmpty(BootOptionList)) {
-        PlatformBdsPredictBootOption (BootOptionList);
-      }
-
-      return;
-    }
-
-
-    break;
-  }
-
-
-  IsFirstBoot = PcdGetBool(PcdBootState);
-  if (IsFirstBoot) {
-    PcdSetBool(PcdBootState, FALSE);
-  }
-  return;
-
-}
-
-/**
-  Hook point after a boot attempt succeeds. We don't expect a boot option to
-  return, so the UEFI 2.0 specification defines that you will default to an
-  interactive mode and stop processing the BootOrder list in this case. This
-  is alos a platform implementation and can be customized by IBV/OEM.
-
-  @param Option  Pointer to Boot Option that succeeded to boot.
-
-  @retval None.
-
-**/
-VOID
-EFIAPI
-PlatformBdsBootSuccess (
-  IN  BDS_COMMON_OPTION *Option
-  )
-{
-  CHAR16  *TmpStr;
-
-  //
-  // If Boot returned with EFI_SUCCESS and there is not in the boot device
-  // select loop then we need to pop up a UI and wait for user input.
-  //
-  TmpStr =  Option->StatusString;
-  if (TmpStr != NULL) {
-    BdsLibOutputStrings (gST->ConOut, TmpStr, Option->Description, L"\n\r", NULL);
-    FreePool(TmpStr);
-  }
-}
-
-/**
-  Hook point after a boot attempt fails.
-
-  @param Option - Pointer to Boot Option that failed to boot.
-  @param Status - Status returned from failed boot.
-  @param ExitData - Exit data returned from failed boot.
-  @param ExitDataSize - Exit data size returned from failed boot.
-
-  @retval None.
-
-**/
-VOID
-EFIAPI
-PlatformBdsBootFail (
-  IN  BDS_COMMON_OPTION  *Option,
-  IN  EFI_STATUS         Status,
-  IN  CHAR16             *ExitData,
-  IN  UINTN              ExitDataSize
-  )
-{
-  CHAR16          *TmpStr;
-  EFI_HANDLE      FvProtocolHandle;
-
-  //
-  // If Boot returned with failed status then we need to pop up a UI and wait
-  // for user input.
-  //
-  TmpStr = Option->StatusString;
-  if (TmpStr != NULL) {
-    BdsLibOutputStrings (gST->ConOut, TmpStr, Option->Description, L"\n\r", NULL);
-    FreePool(TmpStr);
-  }
-  if (PcdGet32(PcdFlashFvShellSize) > 0){
-    gDS->ProcessFirmwareVolume (
-           (VOID *)(UINTN)PcdGet32(PcdFlashFvShellBase),
-           PcdGet32(PcdFlashFvShellSize),
-           &FvProtocolHandle
-           );
-  }
-  PlatformBdsConnectSequence ();
-}
-
-/**
-  This function is remained for IBV/OEM to do some platform action,
-  if there no console device can be connected.
-
-  @param  None.
-
-  @retval EFI_SUCCESS       Direct return success now.
-
-**/
-EFI_STATUS
-PlatformBdsNoConsoleAction (
-  VOID
-  )
-{
-  return EFI_SUCCESS;
-}
-
-/**
-  This function locks the block
-
-  @param Base            The base address flash region to be locked.
-
-**/
-VOID
-BdsLockFv (
-  IN EFI_PHYSICAL_ADDRESS  Base
-  )
-{
-  EFI_FV_BLOCK_MAP_ENTRY      *BlockMap;
-  EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;
-  EFI_PHYSICAL_ADDRESS        BaseAddress;
-  UINT32                      BlockLength;
-  UINTN                       Index;
-
-  BaseAddress = Base - 0x400000 + 2;
-  FvHeader    = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINTN) (Base));
-  BlockMap    = &(FvHeader->BlockMap[0]);
-
-  while ((BlockMap->NumBlocks != 0) && (BlockMap->Length != 0)) {
-    BlockLength = BlockMap->Length;
-    for (Index = 0; Index < BlockMap->NumBlocks; Index++) {
-      MmioOr8 ((UINTN) BaseAddress, 0x03);
-      BaseAddress += BlockLength;
-    }
-    BlockMap++;
-  }
-}
-
-VOID
-EFIAPI
-PlatformBdsLockNonUpdatableFlash (
-  VOID
-  )
-{
-  EFI_PHYSICAL_ADDRESS  Base;
-
-  Base = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashFvMainBase);
-  if (Base > 0) {
-    BdsLockFv (Base);
-  }
-
-  Base = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashFvRecoveryBase);
-  if (Base > 0) {
-    BdsLockFv (Base);
-  }
-}
-
-/**
-  Lock the ConsoleIn device in system table. All key
-  presses will be ignored until the Password is typed in. The only way to
-  disable the password is to type it in to a ConIn device.
-
-  @param  Password        Password used to lock ConIn device.
-
-  @retval EFI_SUCCESS     lock the Console In Spliter virtual handle successfully.
-  @retval EFI_UNSUPPORTED Password not found
-
-**/
-EFI_STATUS
-EFIAPI
-LockKeyboards (
-  IN  CHAR16    *Password
-  )
-{
-    return EFI_UNSUPPORTED;
-}
-
-/**
-  Connect the predefined platform default authentication devices.
-
-  This function connects the predefined device path for authentication device,
-  and if the predefined device path has child device path, the child handle will
-  be connected too. But the child handle of the child will not be connected.
-
-**/
-VOID
-EFIAPI
-PlatformBdsConnectAuthDevice (
-  VOID
-  )
-{
-  EFI_STATUS                   Status;
-  UINTN                        Index;
-  UINTN                        HandleIndex;
-  UINTN                        HandleCount;
-  EFI_HANDLE                   *HandleBuffer;
-  EFI_DEVICE_PATH_PROTOCOL     *ChildDevicePath;
-  EFI_USER_MANAGER_PROTOCOL    *Manager;
-
-  Status = gBS->LocateProtocol (
-                  &gEfiUserManagerProtocolGuid,
-                  NULL,
-                  (VOID **) &Manager
-                  );
-  if (EFI_ERROR (Status)) {
-    //
-    // As user manager protocol is not installed, the authentication devices
-    // should not be connected.
-    //
-    return ;
-  }
-
-  Index = 0;
-  while (gUserAuthenticationDevice[Index] != NULL) {
-    //
-    // Connect the platform customized device paths
-    //
-    BdsLibConnectDevicePath (gUserAuthenticationDevice[Index]);
-    Index++;
-  }
-
-  //
-  // Find and connect the child device paths of the platform customized device paths
-  //
-  HandleBuffer = NULL;
-  for (Index = 0; gUserAuthenticationDevice[Index] != NULL; Index++) {
-    HandleCount = 0;
-    Status = gBS->LocateHandleBuffer (
-                    AllHandles,
-                    NULL,
-                    NULL,
-                    &HandleCount,
-                    &HandleBuffer
-                    );
-    ASSERT (!EFI_ERROR (Status));
-
-    //
-    // Find and connect the child device paths of gUserIdentificationDevice[Index]
-    //
-    for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
-      ChildDevicePath = NULL;
-      Status = gBS->HandleProtocol (
-                      HandleBuffer[HandleIndex],
-                      &gEfiDevicePathProtocolGuid,
-                      (VOID **) &ChildDevicePath
-                      );
-      if (EFI_ERROR (Status) || ChildDevicePath == NULL) {
-        continue;
-      }
-
-      if (CompareMem (
-            ChildDevicePath,
-            gUserAuthenticationDevice[Index],
-            (GetDevicePathSize (gUserAuthenticationDevice[Index]) - sizeof (EFI_DEVICE_PATH_PROTOCOL))
-            ) != 0) {
-        continue;
-      }
-      gBS->ConnectController (
-             HandleBuffer[HandleIndex],
-             NULL,
-             NULL,
-             TRUE
-             );
-    }
-  }
-
-  if (HandleBuffer != NULL) {
-    FreePool (HandleBuffer);
-  }
-}
-
-/**
-  This function is to identify a user, and return whether deferred images exist.
-
-  @param[out]  User               Point to user profile handle.
-  @param[out]  DeferredImageExist On return, points to TRUE if the deferred image
-                                  exist or FALSE if it did not exist.
-
-**/
-VOID
-EFIAPI
-PlatformBdsUserIdentify (
-  OUT EFI_USER_PROFILE_HANDLE        *User,
-  OUT BOOLEAN                        *DeferredImageExist
-  )
-{
-  EFI_STATUS                         Status;
-  EFI_DEFERRED_IMAGE_LOAD_PROTOCOL   *DeferredImage;
-  UINTN                              HandleCount;
-  EFI_HANDLE                         *HandleBuf;
-  UINTN                              Index;
-  UINTN                              DriverIndex;
-  EFI_DEVICE_PATH_PROTOCOL           *ImageDevicePath;
-  VOID                               *DriverImage;
-  UINTN                              ImageSize;
-  BOOLEAN                            BootOption;
-
-  //
-  // Perform user identification
-  //
-  do {
-    Status = BdsLibUserIdentify (User);
-  } while (EFI_ERROR (Status));
-
-  //
-  // After user authentication now, try to find whether deferred image exists
-  //
-  HandleCount = 0;
-  HandleBuf   = NULL;
-  *DeferredImageExist = FALSE;
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiDeferredImageLoadProtocolGuid,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuf
-                  );
-  if (EFI_ERROR (Status)) {
-    return ;
-  }
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    Status = gBS->HandleProtocol (
-                    HandleBuf[Index],
-                    &gEfiDeferredImageLoadProtocolGuid,
-                    (VOID **) &DeferredImage
-                    );
-    if (!EFI_ERROR (Status)) {
-      //
-      // Find whether deferred image exists in this instance.
-      //
-      DriverIndex = 0;
-      Status = DeferredImage->GetImageInfo(
-                                DeferredImage,
-                                DriverIndex,
-                                &ImageDevicePath,
-                                (VOID **) &DriverImage,
-                                &ImageSize,
-                                &BootOption
-                                );
-      if (!EFI_ERROR (Status)) {
-        //
-        // The deferred image is found.
-        //
-        FreePool (HandleBuf);
-        *DeferredImageExist = TRUE;
-        return ;
-      }
-    }
-  }
-
-  FreePool (HandleBuf);
-}
-
-UINTN gHotKey = 0;
-
-
-EFI_STATUS
-ShowProgressHotKey (
-  IN UINT16                       TimeoutDefault
-  )
-{
-  CHAR16                        *TmpStr;
-  UINT16                        TimeoutRemain;
-  EFI_STATUS                    Status;
-  EFI_INPUT_KEY                 Key;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;
-  UINT32                        GpioValue;
-  CHAR16                        *TmpStr1;
-  CHAR16                        *TmpStr2;
-  CHAR16                        *TmpStr3;
-  UINTN                         TmpStrSize;
-  VOID                          *Buffer;
-  UINTN                         Size;
-
-  if (TimeoutDefault == 0) {
-    return EFI_TIMEOUT;
-  }
-
-  gST->ConOut->SetAttribute(gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
-    
-  if (DebugAssertEnabled())
-  {
-    DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it, or press <F2> or <DEL> to enter setup page! ...Zzz....\n"));
-  }
-  else
-  {  
-    #ifdef __GNUC__
-    SerialPortWrite((UINT8 *)"\n\n>>>>Start boot option, Press <F2> or <DEL> to enter setup page(5 Sec)[GCC]", 76);
-    #else
-    SerialPortWrite((UINT8 *)"\n\n>>>>Start boot option, Press <F2> or <DEL> to enter setup page(5 Sec)", 71);
-    #endif
-  } 
-  SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);
-  SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);
-  SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);
-
-  TmpStr2 = NULL;
-  TmpStr3 = NULL;
-
-  //
-  // Check if the platform is using test key.
-  //
-  Status = GetSectionFromAnyFv(
-             PcdGetPtr(PcdEdkiiRsa2048Sha256TestPublicKeyFileGuid),
-             EFI_SECTION_RAW,
-             0,
-             &Buffer,
-             &Size
-             );
-  if (!EFI_ERROR(Status)) {
-    if ((Size == PcdGetSize(PcdRsa2048Sha256PublicKeyBuffer)) &&
-        (CompareMem(Buffer, PcdGetPtr(PcdRsa2048Sha256PublicKeyBuffer), Size) == 0)) {
-      TmpStr2 = L"WARNING: Recovery Test Key is used.\r\n";
-      if (DebugAssertEnabled()) {
-        DEBUG ((DEBUG_INFO, "\n\nWARNING: Recovery Test Key is used.\n"));
-      } else {
-        SerialPortWrite((UINT8 *)"\n\nWARNING: Recovery Test Key is used.", sizeof("\n\nWARNING: Recovery Test Key is used."));
-      }
-      PcdSetBoolS(PcdTestKeyUsed, TRUE);
-    }
-    FreePool(Buffer);
-  }
-  Status = GetSectionFromAnyFv(
-             PcdGetPtr(PcdEdkiiPkcs7TestPublicKeyFileGuid),
-             EFI_SECTION_RAW,
-             0,
-             &Buffer,
-             &Size
-             );
-  if (!EFI_ERROR(Status)) {
-    if ((Size == PcdGetSize(PcdPkcs7CertBuffer)) &&
-        (CompareMem(Buffer, PcdGetPtr(PcdPkcs7CertBuffer), Size) == 0)) {
-      TmpStr3 = L"WARNING: Capsule Test Key is used.\r\n";
-      if (DebugAssertEnabled()) {
-        DEBUG ((DEBUG_INFO, "\n\nWARNING: Capsule Test Key is used.\r\n"));
-      } else {
-        SerialPortWrite((UINT8 *)"\n\nWARNING: Capsule Test Key is used.", sizeof("\n\nWARNING: Capsule Test Key is used."));
-      }
-      PcdSetBoolS(PcdTestKeyUsed, TRUE);
-    }
-    FreePool(Buffer);
-  }
-
-  //
-  // Clear the progress status bar first
-  //
-  TmpStr1 = L"Start boot option, Press <F2> or <DEL> to enter setup page.\r\n";
-  TmpStrSize = StrSize(TmpStr1);
-  if (TmpStr2 != NULL) {
-    TmpStrSize += StrSize(TmpStr2);
-  }
-  if (TmpStr3 != NULL) {
-    TmpStrSize += StrSize(TmpStr3);
-  }
-  TmpStr = AllocatePool (TmpStrSize);
-  if (TmpStr == NULL) {
-    TmpStr = TmpStr1;
-  } else {
-    StrCpyS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr1);
-    if (TmpStr2 != NULL) {
-      StrCatS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr2);
-    }
-    if (TmpStr3 != NULL) {
-      StrCatS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr3);
-    }
-  }
-  PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0);
-
-  TimeoutRemain = TimeoutDefault;
-  while (TimeoutRemain != 0) {
-    if (DebugAssertEnabled())
-    {
-    DEBUG ((EFI_D_INFO, "Showing progress bar...Remaining %d second!\n", TimeoutRemain));
-    }
-    else
-    {	
-    SerialPortWrite ((UINT8 *)".", 1);
-    }
-    Status = WaitForSingleEvent (gST->ConIn->WaitForKey, ONE_SECOND);
-    if (Status != EFI_TIMEOUT) {
-      break;
-    }
-    TimeoutRemain--;
-
-    //
-    // Show progress
-    //
-    if (TmpStr != NULL) {
-      PlatformBdsShowProgress (
-        Foreground,
-        Background,
-        TmpStr,
-        Color,
-        ((TimeoutDefault - TimeoutRemain) * 100 / TimeoutDefault),
-        0
-        );
-    }
-  }
-
-  //
-  // Timeout expired
-  //
-  if (TimeoutRemain == 0) {
-    if (DebugAssertEnabled())
-	{
-	}
-    else
-    {	
-    SerialPortWrite ((UINT8 *)"\r\n", 2);
-    }
-    return EFI_TIMEOUT;
-  }
-
-  //
-  // User pressed some key
-  //
-  Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Check Volume Up Key to enter Setup
-  //
-  GpioValue = MmioRead32 (IO_BASE_ADDRESS + 0x0668);  // The value of GPIOC_5
-  if (((GpioValue & BIT0) == 0) && (Key.ScanCode == SCAN_UP)) {
-    gHotKey = 0;
-    return EFI_SUCCESS;
-  }
-
-  if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
-    //
-    // User pressed enter, equivalent to select "continue"
-    //
-    return EFI_TIMEOUT;
-  }
-
-  //
-  //F2 --  Front Page
-  //F5 --  Device Manager
-  //F7 --  Boot Manager
-  // do not use F8. generally people assume it is windows safe mode key.
-  //F9 --  Boot order
-  //
-  DEBUG ((EFI_D_INFO, "[Key Pressed]: ScanCode 0x%x\n", Key.ScanCode));
-  switch(Key.ScanCode) {
-      case SCAN_F2:
-          gHotKey = 0;
-          break;
-
-      case SCAN_DELETE:
-          gHotKey = 0;
-          break;
-
-      case SCAN_F5:
-          gHotKey = FRONT_PAGE_KEY_DEVICE_MANAGER;
-          break;
-
-      case SCAN_F7:
-          gHotKey = FRONT_PAGE_KEY_BOOT_MANAGER;
-          break;
-
-      case SCAN_F9:
-          gHotKey = FRONT_PAGE_KEY_BOOT_MAINTAIN;
-          break;
-
-      default:
-          //set gHotKey to continue so that flow will not go into CallFrontPage
-          gHotKey = FRONT_PAGE_KEY_CONTINUE;
-          return EFI_TIMEOUT;
-          break;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-
-/**
-  This function is the main entry of the platform setup entry.
-  The function will present the main menu of the system setup,
-  this is the platform reference part and can be customize.
-
-
-  @param TimeoutDefault     The fault time out value before the system
-                            continue to boot.
-  @param ConnectAllHappened The indicater to check if the connect all have
-                            already happened.
-
-**/
-VOID
-PlatformBdsEnterFrontPageWithHotKey (
-  IN UINT16                       TimeoutDefault,
-  IN BOOLEAN                      ConnectAllHappened
-  )
-{
-  EFI_STATUS                    Status;
-
-  EFI_STATUS                         LogoStatus;
-  EFI_BOOT_LOGO_PROTOCOL             *BootLogo;
-  EFI_GRAPHICS_OUTPUT_PROTOCOL       *GraphicsOutput;
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *SimpleTextOut;
-  UINTN                              BootTextColumn;
-  UINTN                              BootTextRow;
-
-  GraphicsOutput = NULL;
-  SimpleTextOut = NULL;
-
-  PERF_START (NULL, "BdsTimeOut", "BDS", 0);
-
-  //
-  // Indicate if we need connect all in the platform setup
-  //
-  if (ConnectAllHappened) {
-    gConnectAllHappened = TRUE;
-  }
-
-  if (!mModeInitialized) {
-    //
-    // After the console is ready, get current video resolution
-    // and text mode before launching setup at first time.
-    //
-    Status = gBS->HandleProtocol (
-                    gST->ConsoleOutHandle,
-                    &gEfiGraphicsOutputProtocolGuid,
-                    (VOID**)&GraphicsOutput
-                    );
-    if (EFI_ERROR (Status)) {
-      GraphicsOutput = NULL;
-    }
-
-    Status = gBS->HandleProtocol (
-                    gST->ConsoleOutHandle,
-                    &gEfiSimpleTextOutProtocolGuid,
-                    (VOID**)&SimpleTextOut
-                    );
-    if (EFI_ERROR (Status)) {
-      SimpleTextOut = NULL;
-    }
-
-    if (GraphicsOutput != NULL) {
-      //
-      // Get current video resolution and text mode.
-      //
-      mBootHorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution;
-      mBootVerticalResolution   = GraphicsOutput->Mode->Info->VerticalResolution;
-    }
-
-    if (SimpleTextOut != NULL) {
-      Status = SimpleTextOut->QueryMode (
-                                SimpleTextOut,
-                                SimpleTextOut->Mode->Mode,
-                                &BootTextColumn,
-                                &BootTextRow
-                                );
-      mBootTextModeColumn = (UINT32)BootTextColumn;
-      mBootTextModeRow    = (UINT32)BootTextRow;
-    }
-
-    //
-    // Get user defined text mode for setup.
-    //
-    mSetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);
-    mSetupVerticalResolution   = PcdGet32 (PcdSetupVideoVerticalResolution);
-    mSetupTextModeColumn       = PcdGet32 (PcdSetupConOutColumn);
-    mSetupTextModeRow          = PcdGet32 (PcdSetupConOutRow);
-
-    mModeInitialized           = TRUE;
-  }
-
-  if (TimeoutDefault != 0xffff) {
-    Status = ShowProgressHotKey (TimeoutDefault);
-
-    //
-    // Ensure screen is clear when switch Console from Graphics mode to Text mode
-    //
-    gST->ConOut->EnableCursor (gST->ConOut, TRUE);
-    gST->ConOut->ClearScreen (gST->ConOut);
-
-    //
-    // Boot Logo is corrupted, report it using Boot Logo protocol.
-    //
-    LogoStatus = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);
-    if (!EFI_ERROR (LogoStatus) && (BootLogo != NULL)) {
-      BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);
-    }
-
-    if (EFI_ERROR (Status)) {
-      //
-      // Timeout or user press enter to continue
-      //
-      goto Exit;
-    }
-  }
-
-  //
-  // Install BM HiiPackages. 
-  // Keep BootMaint HiiPackage, so that it can be covered by global setting. 
-  //
-	InitBMPackage ();
-  do {
-
-    BdsSetConsoleMode (TRUE);
-
-    InitializeFrontPage (FALSE);
-
-    //
-    // Update Front Page strings
-    //
-    UpdateFrontPageStrings ();
-
-    Status = EFI_SUCCESS;
-    gCallbackKey = 0;
-    if (gHotKey == 0) {
-      Status = CallFrontPage ();
-    } else {
-      gCallbackKey = gHotKey;
-      gHotKey = 0;
-    }
-
-    //
-    // If gCallbackKey is greater than 1 and less or equal to 5,
-    // it will launch configuration utilities.
-    // 2 = set language
-    // 3 = boot manager
-    // 4 = device manager
-    // 5 = boot maintenance manager
-    //
-    if (gCallbackKey != 0) {
-      REPORT_STATUS_CODE (
-        EFI_PROGRESS_CODE,
-        (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_USER_SETUP)
-        );
-    }
-
-    //
-    // Based on the key that was set, we can determine what to do
-    //
-    switch (gCallbackKey) {
-    //
-    // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can
-    // describe to their customers in documentation how to find their setup information (namely
-    // under the device manager and specific buckets)
-    //
-    // These entries consist of the Continue, Select language, Boot Manager, and Device Manager
-    //
-    case FRONT_PAGE_KEY_CONTINUE:
-
-      //
-      // User hit continue
-      //
-      break;
-
-    case FRONT_PAGE_KEY_LANGUAGE:
-
-      //
-      // User made a language setting change - display front page again
-      //
-      break;
-
-    case FRONT_PAGE_KEY_BOOT_MANAGER:
-      //
-	  // Remove the installed BootMaint HiiPackages when exit.
-      //
-      FreeBMPackage ();
-
-      //
-      // User chose to run the Boot Manager
-      //
-      CallBootManager ();
-	  
-	  //
-      // Reinstall BootMaint HiiPackages after exiting from Boot Manager.
-      //
-      InitBMPackage ();
-      break;
-
-    case FRONT_PAGE_KEY_DEVICE_MANAGER:
-
-      //
-      // Display the Device Manager
-      //
-      do {
-        CallDeviceManager ();
-      } while (gCallbackKey == FRONT_PAGE_KEY_DEVICE_MANAGER);
-      break;
-
-    case FRONT_PAGE_KEY_BOOT_MAINTAIN:
-
-      //
-      // Display the Boot Maintenance Manager
-      //
-      BdsStartBootMaint ();
-      break;
-    }
-
-  } while (((UINTN)gCallbackKey) != FRONT_PAGE_KEY_CONTINUE);
-
-  //
-  //Will leave browser, check any reset required change is applied? if yes, reset system
-  //
-  SetupResetReminder ();
-  //
-  // Remove the installed BootMaint HiiPackages when exit.
-  //
-  FreeBMPackage ();
-
-Exit:
-  //
-  // Automatically load current entry
-  // Note: The following lines of code only execute when Auto boot
-  // takes affect
-  //
-  PERF_END (NULL, "BdsTimeOut", "BDS", 0);
-}
-
-
-VOID 
-BootIntoFirmwareInterface(
-VOID
-)
-{
-  EFI_STATUS        Status;
-  UINTN             DataSize;
-  UINT16            Timeout;    
-  UINT64            OsIndication;
-
-  
-  OsIndication = 0;
-  DataSize = sizeof(UINT64);
-  Status = gRT->GetVariable (
-                  L"OsIndications",
-                  &gEfiGlobalVariableGuid,
-                  NULL,
-                  &DataSize,
-                  &OsIndication
-                  );
-				  
-  DEBUG ((EFI_D_INFO, "OSIndication Variable Value %d\n", OsIndication));
-  //
-  //Goto FrontPage directly when bit EFI_OS_INDICATIONS_BOOT_TO_FW_UI in OSIndication Variable is setted.
-  //  
-  if (!EFI_ERROR(Status) && (OsIndication != 0)) {				  
-   Timeout = 0xffff;
-   PlatformBdsEnterFrontPage (Timeout, FALSE);
-   }
-}
-
-
-EFI_STATUS
-PlatformBdsConnectSimpleConsole (
-  IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
-)
-{
-  EFI_STATUS                         Status;
-  UINTN                              Index;
-  EFI_DEVICE_PATH_PROTOCOL           *VarConout;
-  EFI_DEVICE_PATH_PROTOCOL           *VarConin;
-  UINTN                              DevicePathSize;
-
-
-  Index = 0;
-  Status = EFI_SUCCESS;
-  DevicePathSize = 0;
-  VarConout = BdsLibGetVariableAndSize (
-                L"ConOut",
-                &gEfiGlobalVariableGuid,
-                &DevicePathSize
-                );
-  VarConin = BdsLibGetVariableAndSize (
-               L"ConIn",
-               &gEfiGlobalVariableGuid,
-               &DevicePathSize
-               );
-  if (VarConout == NULL || VarConin == NULL) {
-    //
-    // Have chance to connect the platform default console,
-    // the platform default console is the minimum device group
-    // the platform should support
-    //
-    while (PlatformConsole[Index].DevicePath != NULL) {
-
-      //
-      // Update the console variable with the connect type
-      //
-      if ((PlatformConsole[Index].ConnectType & CONSOLE_IN) == CONSOLE_IN) {
-        BdsLibUpdateConsoleVariable (L"ConIn", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      if ((PlatformConsole[Index].ConnectType & CONSOLE_OUT) == CONSOLE_OUT) {
-        BdsLibUpdateConsoleVariable (L"ConOut", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      if ((PlatformConsole[Index].ConnectType & STD_ERROR) == STD_ERROR) {
-        BdsLibUpdateConsoleVariable (L"ErrOut", PlatformConsole[Index].DevicePath, NULL);
-      }
-
-      Index ++;
-    }
-  }
-
-  //
-  // Connect ConIn first to give keyboard time to parse hot key event.
-  //
-  Status = BdsLibConnectConsoleVariable (L"ConIn");
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Make sure we have at least one active VGA, and have the right
-  // active VGA in console variable
-  //
-  Status = PlatformBdsForceActiveVga ();
-
-  //
-  // It seems impossible not to have any ConOut device on platform,
-  // so we check the status here.
-  //
-  Status = BdsLibConnectConsoleVariable (L"ConOut");
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Timer handler to convert the key from USB.
-
-  @param  Event                    Indicates the event that invoke this function.
-  @param  Context                  Indicates the calling context.
-**/
-VOID
-EFIAPI
-HotKeyTimerHandler (
-  IN  EFI_EVENT                 Event,
-  IN  VOID                      *Context
-  )
-{
-  EFI_STATUS                    Status;
-  EFI_INPUT_KEY                 Key;
-
-  Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
-  if (EFI_ERROR (Status)) {
-    return;
-  }
-
-  switch(Key.ScanCode) {
-  case SCAN_F2:
-    gHotKey = 0;
-    mHotKeyPressed = TRUE;
-    break;
-
-  case SCAN_F5:
-    gHotKey = FRONT_PAGE_KEY_DEVICE_MANAGER;
-    mHotKeyPressed = TRUE;
-    break;
-
-  case SCAN_F7:
-    gHotKey = FRONT_PAGE_KEY_BOOT_MANAGER;
-    mHotKeyPressed = TRUE;
-    break;
-
-  case SCAN_F9:
-    gHotKey = FRONT_PAGE_KEY_BOOT_MAINTAIN;
-    mHotKeyPressed = TRUE;
-    break;
-  }
-
-  if (mHotKeyPressed) {
-    gBS->SetTimer (
-           mHotKeyTimerEvent,
-           TimerCancel,
-           0
-           );
-    gBS->CloseEvent (mHotKeyTimerEvent);
-    mHotKeyTimerEvent = NULL;
-  }
-
-  return;
-}
-
-
-/**
-  Callback function for SimpleTextInEx protocol install events
-
-  @param Event           the event that is signaled.
-  @param Context         not used here.
-
-**/
-VOID
-EFIAPI
-HitHotkeyEvent (
-  IN EFI_EVENT    Event,
-  IN VOID         *Context
-  )
-{
-  EFI_STATUS                         Status;
-
-  Status = gBS->CloseEvent(mHitHotkeyEvent);
-  if (EFI_ERROR (Status)) {
-    return;
-  }
-  Status = gBS->CreateEvent (
-                  EVT_TIMER | EVT_NOTIFY_SIGNAL,
-                  TPL_NOTIFY,
-                  HotKeyTimerHandler,
-                  NULL,
-                  &mHotKeyTimerEvent
-                  );
-  if (EFI_ERROR (Status)) {
-    return;
-  }
-  Status = gBS->SetTimer (
-                  mHotKeyTimerEvent,
-                  TimerPeriodic,
-                  KEYBOARD_TIMER_INTERVAL
-                  );
-  if (EFI_ERROR (Status)) {
-    return;
-  }
-
-  return;
-}
-
-
-VOID
-EFIAPI
-PlatformBdsInitHotKeyEvent (
-  VOID
-  )
-{
-  EFI_STATUS      Status;
-
-  //
-  // Register Protocol notify for Hotkey service
-  //
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_CALLBACK,
-                  HitHotkeyEvent,
-                  NULL,
-                  &mHitHotkeyEvent
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // Register for protocol notifications on this event
-  //
-  Status = gBS->RegisterProtocolNotify (
-                  &gEfiSimpleTextInputExProtocolGuid,
-                  mHitHotkeyEvent,
-                  &mHitHotkeyRegistration
-                  );
-  ASSERT_EFI_ERROR (Status);
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.h
deleted file mode 100644
index b5bb519747..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.h
+++ /dev/null
@@ -1,516 +0,0 @@
-/*++
-
-  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-Module Name:
-
-  BdsPlatform.h
-
-Abstract:
-
-  Head file for BDS Platform specific code
-
---*/
-
-#ifndef _BDS_PLATFORM_H
-#define _BDS_PLATFORM_H
-
-#include <FrameworkDxe.h>
-
-#include <Protocol/FirmwareVolume2.h>
-#include <Protocol/DevicePath.h>
-#include <Protocol/SimpleNetwork.h>
-#include <Protocol/PciRootBridgeIo.h>
-#include <Protocol/LoadFile.h>
-#include <Protocol/LegacyBios.h>
-#include <Protocol/PciIo.h>
-#include <Protocol/SmmAccess2.h>
-#include <Protocol/DxeSmmReadyToLock.h>
-#include <Protocol/UserManager.h>
-#include <Protocol/DeferredImageLoad.h>
-#include <Protocol/AcpiS3Save.h>
-#include <Protocol/ExitPmAuth.h>
-#include <Protocol/MmioDevice.h>
-#include <Protocol/I2cBusMcg.h>
-#include <Protocol/I2cHostMcg.h>
-#include <Guid/CapsuleVendor.h>
-#include <Guid/MemoryTypeInformation.h>
-#include <Guid/GlobalVariable.h>
-#include <Guid/DebugAgentGuid.h>
-
-
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/BaseLib.h>
-#include <Library/PcdLib.h>
-#include <Library/IoLib.h>
-#include <Library/GenericBdsLib.h>
-#include <Library/PlatformBdsLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/UefiLib.h>
-#include <Library/HobLib.h>
-#include <Library/PrintLib.h>
-#include <Library/PerformanceLib.h>
-#include <Library/ReportStatusCodeLib.h>
-
-#include <IndustryStandard/Pci.h>
-
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformRootBridges [];
-extern BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformAllPossiblePciVgaConsole [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformConnectSequence [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformDriverOption [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformBootOption [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gUserAuthenticationDevice[];
-extern BDS_CONSOLE_CONNECT_ENTRY gPlatformSimpleConsole [];
-extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformSimpleBootOption [];
-
-extern BOOLEAN mEnumBootDevice;
-
-
-//
-// the short form device path for Usb keyboard
-//
-#define CLASS_HID           3
-#define SUBCLASS_BOOT       1
-#define PROTOCOL_KEYBOARD   1
-
-#define PCI_DEVICE_PATH_NODE(Func, Dev) \
-  { \
-    HARDWARE_DEVICE_PATH, \
-    HW_PCI_DP, \
-    { \
-      (UINT8) (sizeof (PCI_DEVICE_PATH)), \
-      (UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8) \
-    }, \
-    (Func), \
-    (Dev) \
-  }
-
-#define PNPID_DEVICE_PATH_NODE(PnpId) \
-  { \
-    { \
-      ACPI_DEVICE_PATH, \
-      ACPI_DP, \
-      { \
-        (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
-        (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
-      } \
-    }, \
-    EISA_PNP_ID((PnpId)), \
-    0 \
-  }
-
-#define gUart(BaudRate, DataBits, Parity, StopBits) \
-  { \
-    { \
-      MESSAGING_DEVICE_PATH, \
-      MSG_UART_DP, \
-      { \
-        (UINT8) (sizeof (UART_DEVICE_PATH)), \
-        (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) \
-      } \
-    }, \
-    0, \
-    (BaudRate), \
-    (DataBits), \
-    (Parity), \
-    (StopBits) \
-  }
-
-#define gPcAnsiTerminal \
-  { \
-    { \
-      MESSAGING_DEVICE_PATH, \
-      MSG_VENDOR_DP, \
-      { \
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)), \
-        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) \
-      } \
-    }, \
-    DEVICE_PATH_MESSAGING_PC_ANSI \
-  }
-
-#define gUsbKeyboardMouse \
-  { \
-    { \
-      MESSAGING_DEVICE_PATH, \
-      MSG_USB_CLASS_DP, \
-      (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)), \
-      (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8) \
-    }, \
-    0xffff, \
-    0xffff, \
-    CLASS_HID, \
-    SUBCLASS_BOOT, \
-    PROTOCOL_KEYBOARD \
-  }
-
-#define gEndEntire \
-  { \
-    END_DEVICE_PATH_TYPE, \
-    END_ENTIRE_DEVICE_PATH_SUBTYPE, \
-    { \
-      END_DEVICE_PATH_LENGTH, \
-      0 \
-    } \
-  }
-
-#define gPciRootBridge \
-  PNPID_DEVICE_PATH_NODE(0x0A03)
-
-#define gPnpPs2Keyboard \
-  PNPID_DEVICE_PATH_NODE(0x0303)
-
-#define gPnp16550ComPort \
-  PNPID_DEVICE_PATH_NODE(0x0501)
-
-#define gPciePort0Bridge \
-  PCI_DEVICE_PATH_NODE(0, 0x1C)
-
-#define gPciePort1Bridge \
-  PCI_DEVICE_PATH_NODE(1, 0x1C)
-
-#define gPciePort2Bridge \
-  PCI_DEVICE_PATH_NODE(2, 0x1C)
-
-#define gPciePort3Bridge \
-  PCI_DEVICE_PATH_NODE(3, 0x1C)
-
-#define gPciIsaBridge \
-  PCI_DEVICE_PATH_NODE(0, 0x1f)
-
-//
-// Platform Root Bridge
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_ROOT_BRIDGE_DEVICE_PATH;
-
-//
-// Below is the platform console device path
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           IsaBridge;
-  ACPI_HID_DEVICE_PATH      Keyboard;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_ISA_KEYBOARD_DEVICE_PATH;
-
-typedef struct {
-  VENDOR_DEVICE_PATH             VendorDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL       End;
-} HII_VENDOR_DEVICE_PATH;
-
-typedef struct {
-  USB_CLASS_DEVICE_PATH           UsbClass;
-  EFI_DEVICE_PATH_PROTOCOL        End;
-} USB_CLASS_FORMAT_DEVICE_PATH;
-
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           OnboardVga;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_ONBOARD_VGA_DEVICE_PATH;
-
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           AgpBridge;
-  PCI_DEVICE_PATH           AgpDevice;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_OFFBOARD_VGA_DEVICE_PATH;
-
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           IsaBridge;
-  ACPI_HID_DEVICE_PATH      IsaSerial;
-  UART_DEVICE_PATH          Uart;
-  VENDOR_DEVICE_PATH        TerminalType;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_ISA_SERIAL_DEVICE_PATH;
-
-//
-// Below is the boot option device path
-//
-typedef struct {
-  BBS_BBS_DEVICE_PATH             LegacyHD;
-  EFI_DEVICE_PATH_PROTOCOL        End;
-} LEGACY_HD_DEVICE_PATH;
-
-//
-// Below is the platform IDE device path
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           IsaBridge;
-  ATAPI_DEVICE_PATH         Ide;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_IDE_DEVICE_PATH;
-
-//
-// Floppy device path definition
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           IsaBridge;
-  ACPI_HID_DEVICE_PATH      Floppy;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_FLOPPY_DEVICE_PATH;
-
-//
-// Below is the platform USB controller device path for
-// USB disk as user authentication device.
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           PciDevice;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_USB_DEVICE_PATH;
-
-//
-// Debug Agent UART Console device path definition
-//
-typedef struct {
-  VENDOR_DEVICE_PATH        VendorHardware;
-  UART_DEVICE_PATH          Uart;
-  VENDOR_DEVICE_PATH        TerminalType;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} VENDOR_UART_DEVICE_PATH;
-
-//
-// Below is the platform PCI device path
-//
-typedef struct {
-  ACPI_HID_DEVICE_PATH      PciRootBridge;
-  PCI_DEVICE_PATH           PciDevice;
-  EFI_DEVICE_PATH_PROTOCOL  End;
-} PLATFORM_PCI_DEVICE_PATH;
-
-typedef enum {
-  PMIC_Equal         = 0, // =		0
-  PMIC_Greater_Than,	  // >		1
-  PMIC_Smaller_Than,	  // <		2
-  PMIC_Greater_Equal,	  // >=		3
-  PMIC_Smaller_Equal,	  // <=		4
-  PMIC_Any				  // don't care 5
-} PMIC_Condition_list;
-
-typedef enum {
-  PMIC_White_List	= 0,  //White list
-  PMIC_Black_List	= 1   //Black list
-} PMIC_Compliance_mode;
-
-typedef struct {
-  UINT8		Cond_Choice;	// PMIC_Condition_list
-  UINT8		Cond_Number;		// the number
-}PMIC_Condition_Item;
-
-typedef struct {
-  PMIC_Condition_Item   					PMIC_BoardID;
-  PMIC_Condition_Item   					PMIC_FabID;
-  PMIC_Condition_Item   					Soc_Stepping;//define PMIC type, 1:Dialog , 2:Rohm
-  PMIC_Condition_Item   					PMIC_VendID;
-  PMIC_Condition_Item   					PMIC_RevID;
-  PMIC_Compliance_mode 				        mode;        //if 1, blacklist; if 0, white list.
-} PMIC_Compliance_Item;
-
-//
-// Platform BDS Functions
-//
-VOID
-PlatformBdsGetDriverOption (
-  IN LIST_ENTRY                   *BdsDriverLists
-  );
-
-VOID
-PlatformBdsPredictBootOption (
-  IN  LIST_ENTRY                     *BdsBootOptionList
-  );
-
-EFI_STATUS
-PlatformBdsShowProgress (
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground,
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground,
-  CHAR16                        *Title,
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor,
-  UINTN                         Progress,
-  UINTN                         PreviousValue
-  );
-
-VOID
-PlatformBdsConnectSequence (
-  VOID
-  );
-
-EFI_STATUS
-PlatformBdsConnectConsole (
-  IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
-  );
-
-EFI_STATUS
-PlatformBdsNoConsoleAction (
-  VOID
-  );
-
-VOID
-PlatformBdsEnterFrontPage (
-  IN UINT16                 TimeoutDefault,
-  IN BOOLEAN                ConnectAllHappened
-  );
-
-VOID
-EFIAPI
-PlatformBdsUserIdentify (
-  OUT EFI_USER_PROFILE_HANDLE        *User,
-  OUT BOOLEAN                        *DeferredImage
-  );
-
-VOID
-EFIAPI
-PlatformBdsConnectAuthDevice (
-  VOID
-  );
-
-VOID
-PlatformBdsEnterFrontPageWithHotKey (
-  IN UINT16                       TimeoutDefault,
-  IN BOOLEAN                      ConnectAllHappened
-  );
-
- EFI_STATUS
- ShowProgress (
-   IN UINT16					   TimeoutDefault
-   );
-
- EFI_STATUS
- InitializeFrontPage (
-   IN BOOLEAN						  InitializeHiiData
-   );
-
- VOID
- UpdateFrontPageStrings (
-   VOID
-   );
-   
-   
- EFI_STATUS
- InitBMPackage  (
-   VOID
-   );
-   
-      
- VOID
- FreeBMPackage  (
-   VOID
-   );
-   
-   
- EFI_STATUS
- CallFrontPage (
-   VOID
-   );
-
-
- VOID
- CallBootManager (
-   VOID
-   );
-
-VOID
-CallDeviceManager (
-  VOID
-  );
-
-VOID
-BdsStartBootMaint (
-  VOID
-  );
-
-CHAR16 *
-GetStringById (
-  IN  EFI_STRING_ID   Id
-  );
-
-EFI_STATUS
-WaitForSingleEvent (
-  IN EFI_EVENT                  Event,
-  IN UINT64                     Timeout OPTIONAL
-  );
-
-EFI_STATUS
-BdsLibDeleteOptionFromHandle (
-  IN  EFI_HANDLE                 Handle
-  );
-
-EFI_STATUS
-BdsDeleteAllInvalidEfiBootOption (
-  VOID
-  );
-
-
-#define ONE_SECOND  10000000
-#define FRONT_PAGE_KEY_CONTINUE        0x1000
-#define FRONT_PAGE_KEY_LANGUAGE        0x1234
-#define FRONT_PAGE_KEY_BOOT_MANAGER    0x1064
-#define FRONT_PAGE_KEY_DEVICE_MANAGER  0x8567
-#define FRONT_PAGE_KEY_BOOT_MAINTAIN   0x9876
-
-#define PORT_A_DVO                     0           // ; DVO A
-#define PORT_B_DVO                     1           // ; DVO B
-#define PORT_C_DVO                     2           // ; DVO C
-#define PORT_D_DVO                     3           // ; DVO D
-#define PORT_LVDS                      4           // ; Integrated LVDS port
-#define PORT_ANALOG_TV                 5           // ; Integrated TV port
-#define PORT_CRT                       6           // ; integrated Analog port
-#define PORT_B_DP                      7           // ; DisplayPort B
-#define PORT_C_DP                      8           // ; DisplayPort C
-#define PORT_D_DP                      9           // ; DisplayPort D
-#define PORT_A_DP                      10          // ; DisplayPort A (for eDP on ILK)
-#define PORT_B_HDMI                    11          // ; HDMI B
-#define PORT_C_HDMI                    12          // ; HDMI C
-#define PORT_D_HDMI                    13          // ; HDMI D
-#define PORT_B_DVI                     14          // ; DVI B
-#define PORT_C_DVI                     15          // ; DVI C
-#define PORT_D_DVI                     16          // ; DVI D
-#define PORT_MIPI_A                    21          // ; MIPI
-#define PORT_MIPI_B                    22
-#define PORT_MIPI_C                    23
-
-
-extern BOOLEAN gConnectAllHappened;
-extern UINTN gCallbackKey;
-
-VOID
-BdsBootDeviceSelect (
-  VOID
-);
-VOID FastBoot(VOID);
-
-extern BOOLEAN    mModeInitialized;
-
-//
-// Boot video resolution and text mode.
-//
-extern UINT32     mBootHorizontalResolution    ;
-extern UINT32     mBootVerticalResolution      ;
-extern UINT32     mBootTextModeColumn          ;
-extern UINT32     mBootTextModeRow             ;
-
-//
-// BIOS setup video resolution and text mode.
-//
-extern UINT32     mSetupTextModeColumn         ;
-extern UINT32     mSetupTextModeRow            ;
-extern UINT32     mSetupHorizontalResolution   ;
-extern UINT32     mSetupVerticalResolution     ;
-extern EFI_STATUS BdsSetConsoleMode (BOOLEAN);
-#endif // _BDS_PLATFORM_H
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
deleted file mode 100644
index 66d11c6cda..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
+++ /dev/null
@@ -1,128 +0,0 @@
-#/** @file
-# Component name for module PlatformBootManagerLib
-#
-# Copyright (c) 2008  - 2019, Intel Corporation. All rights reserved.<BR>
-#
-
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#
-
-#
-#
-#
-#**/
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = PlatformBdsLib
-  FILE_GUID                      = A6BC385D-59E5-4b77-87D7-200ABAA83C15
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = PlatformBootManagerLib|DXE_DRIVER
-  EDK_RELEASE_VERSION            = 0x00020000
-  EFI_SPECIFICATION_VERSION      = 0x0002000A
-
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  BdsPlatform.c
-  BdsPlatform.h
-  PlatformData.c
-  PlatformBdsStrings.uni
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
-  Vlv2TbltDevicePkg/PlatformPkg.dec
-  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
-  ShellPkg/ShellPkg.dec
-  CryptoPkg/CryptoPkg.dec
-  SecurityPkg/SecurityPkg.dec
-  SignedCapsulePkg/SignedCapsulePkg.dec
-  SourceLevelDebugPkg/SourceLevelDebugPkg.dec
-  NetworkPkg/NetworkPkg.dec
-
-[LibraryClasses]
-  DxeServicesTableLib
-  BaseLib
-  MemoryAllocationLib
-  UefiBootServicesTableLib
-  UefiRuntimeServicesTableLib
-  BaseMemoryLib
-  DebugLib
-  PcdLib
-  GenericBdsLib
-  DevicePathLib
-  NetLib
-  UefiLib
-  HobLib
-  PciLib
-  PrintLib
-  BaseCryptLib
-#  TcgPhysicalPresenceLib
-  Tcg2PhysicalPresenceLib  
-  FileHandleLib
-  S3BootScriptLib
-  SerialPortLib
-  CapsuleLib
-
-[Protocols]
-  gEfiFirmwareVolume2ProtocolGuid
-  gEfiSimpleNetworkProtocolGuid
-  gEfiLoadFileProtocolGuid
-  gEfiPciIoProtocolGuid
-  gEfiSmmAccess2ProtocolGuid
-  gEfiDxeSmmReadyToLockProtocolGuid
-  gEfiUserManagerProtocolGuid
-  gEfiDeferredImageLoadProtocolGuid
-  gEfiAcpiS3SaveProtocolGuid
-  gEfiSpiProtocolGuid                           ## PROTOCOL CONSUMES
-  gExitPmAuthProtocolGuid
-  gEfiTdtOperationProtocolGuid
-  gEfiGlobalNvsAreaProtocolGuid
-  gEfiMmioDeviceProtocolGuid
-  gEfiI2cMasterProtocolGuid
-  gEfiI2cHostProtocolGuid
-  gEsrtManagementProtocolGuid
-
-[Guids]
-  gEfiMemoryTypeInformationGuid
-  gEfiCapsuleVendorGuid
-  gEfiGlobalVariableGuid
-  gEfiNormalSetupGuid
-  gEfiPartTypeSystemPartGuid
-  gEfiEndOfDxeEventGroupGuid
-  gUefiShellFileGuid
-
-[Pcd]
-  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiRsa2048Sha256TestPublicKeyFileGuid
-  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiPkcs7TestPublicKeyFileGuid
-  gEfiSecurityPkgTokenSpaceGuid.PcdRsa2048Sha256PublicKeyBuffer
-  gEfiSecurityPkgTokenSpaceGuid.PcdPkcs7CertBuffer
-  gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed
-  gPlatformModuleTokenSpaceGuid.PcdFlashFvRecovery2Base
-  gPlatformModuleTokenSpaceGuid.PcdFlashFvMainBase
-  gPlatformModuleTokenSpaceGuid.PcdFlashFvRecoveryBase
-  gPlatformModuleTokenSpaceGuid.PcdFlashFvShellBase
-  gPlatformModuleTokenSpaceGuid.PcdFlashFvShellSize
-  gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile
-  gPlatformModuleTokenSpaceGuid.PcdIFWISigBaseAddress
-  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow
-  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn
-  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution
-  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution
-  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootState
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsStrings.uni b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsStrings.uni
deleted file mode 100644
index 101106f9f4..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsStrings.uni
+++ /dev/null
@@ -1,30 +0,0 @@
-///** @file
-//  
-//  String definitions for Boot Option description.
-//  
-//  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
-//  SPDX-License-Identifier: BSD-2-Clause-Patent
-//  
-//**/
-
-/=#
-
-#langdef   en-US "English"
-#langdef   fr-FR "Français"
-
-#string STR_DESCRIPTION_FLOPPY         #language en-US  "EFI Floppy"
-                                       #language fr-FR  "fr-FR: EFI Floppy"
-#string STR_DESCRIPTION_CD_DVD         #language en-US  "EFI DVD/CDROM"
-                                       #language fr-FR  "fr-FR: EFI DVD/CDROM"
-#string STR_DESCRIPTION_HARDDRIVE      #language en-US  "EFI Hard Drive"
-                                       #language fr-FR  "fr-FR: EFI Hard Drive"
-#string STR_DESCRIPTION_USB            #language en-US  "EFI USB Device"
-                                       #language fr-FR  "fr-FR: EFI USB Device"
-#string STR_DESCRIPTION_SCSI           #language en-US  "EFI SCSI Device"
-                                       #language fr-FR  "fr-FR: EFI SCSI Device"
-#string STR_DESCRIPTION_MISC           #language en-US  "EFI Misc Device"
-                                       #language fr-FR  "fr-FR: EFI Misc Device"
-#string STR_DESCRIPTION_NETWORK        #language en-US  "EFI Network"
-                                       #language fr-FR  "fr-FR: EFI Network"
-#string STR_DESCRIPTION_NON_BLOCK      #language en-US  "EFI Non-Block Boot Device"
-                                       #language fr-FR  "fr-FR: EFI Non-Block Boot Device"
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformData.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformData.c
deleted file mode 100644
index 9dff93f52b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformData.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-Module Name:
-
-  PlatformData.c
-
-Abstract:
-
-  Defined the platform specific device path which will be used by
-  platform Bbd to perform the platform policy connect.
-
---*/
-
-#include "BdsPlatform.h"
-
-//
-// Predefined platform default time out value
-//
-UINT16  gPlatformBootTimeOutDefault = 10;
-
-//
-// Predefined platform root bridge
-//
-PLATFORM_ROOT_BRIDGE_DEVICE_PATH gPlatformRootBridge0 = {
-  gPciRootBridge,
-  gEndEntire
-};
-
-EFI_DEVICE_PATH_PROTOCOL* gPlatformRootBridges [] = {
-  (EFI_DEVICE_PATH_PROTOCOL*)&gPlatformRootBridge0,
-  NULL
-};
-
-//
-// Platform specific ISA keyboard device path
-//
-PLATFORM_ISA_KEYBOARD_DEVICE_PATH gIsaKeyboardDevicePath = {
-  gPciRootBridge,
-  gPciIsaBridge,
-  gPnpPs2Keyboard,
-  gEndEntire
-};
-
-//
-// Platform specific on chip PCI VGA device path
-//
-PLATFORM_ONBOARD_VGA_DEVICE_PATH gOnChipPciVgaDevicePath = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(0, 0x2),
-  gEndEntire
-};
-
-//
-// Platform specific plug in PCI VGA device path
-//
-PLATFORM_OFFBOARD_VGA_DEVICE_PATH gPlugInPciVgaDevicePath = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(0, 0x1),
-  PCI_DEVICE_PATH_NODE(0, 0x0),
-  gEndEntire
-};
-
-//
-// Platform specific ISA serial device path
-//
-PLATFORM_ISA_SERIAL_DEVICE_PATH gIsaSerialDevicePath = {
-  gPciRootBridge,
-  gPciIsaBridge,
-  gPnp16550ComPort,
-  gUart(115200, 8, 1, 1),
-  gPcAnsiTerminal,
-  gEndEntire
-};
-
-
-//
-// Platform specific Button Array device path
-//
-HII_VENDOR_DEVICE_PATH  gHiiVendorDevicePath0 = {
-  {
-    {
-      HARDWARE_DEVICE_PATH,
-      HW_VENDOR_DP,
-      {
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
-        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
-      }
-    },
-
-    //
-    // {C8752FDE-B5C8-4528-897D-6920FE771E38}
-    //
-    { 0xC8752FDE, 0xB5C8, 0x4528, { 0x89, 0x7D, 0x69, 0x20, 0xFE, 0x77, 0x1E, 0x38 } }
-  },
-  {
-    END_DEVICE_PATH_TYPE,
-    END_ENTIRE_DEVICE_PATH_SUBTYPE,
-    {
-      (UINT8) (END_DEVICE_PATH_LENGTH),
-      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
-    }
-  }
-};
-
-USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboardDevicePath = {
-  gUsbKeyboardMouse,
-  gEndEntire
-};
-
-//
-// Debug Agent UART Console device path 
-//
-VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
-  {
-    {
-      HARDWARE_DEVICE_PATH,
-      HW_VENDOR_DP,
-      {
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
-        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
-      }
-    },
-    EFI_DEBUG_AGENT_GUID,
-  },
-  {
-    {
-      MESSAGING_DEVICE_PATH,
-      MSG_UART_DP,
-      {
-        (UINT8) (sizeof (UART_DEVICE_PATH)),
-        (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)
-      }
-    },
-    0,  // Reserved
-    0,  // BaudRate - Default
-    0,  // DataBits - Default
-    0,  // Parity   - Default
-    0,  // StopBits - Default
-  },
-  {
-    {
-      MESSAGING_DEVICE_PATH,
-      MSG_VENDOR_DP,
-      {
-        (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
-        (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
-      }
-    },
-    DEVICE_PATH_MESSAGING_PC_ANSI
-  },
-  gEndEntire
-};
-
-//
-// Predefined platform default console device path
-//
-BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole [] = {
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gIsaSerialDevicePath, CONSOLE_ALL},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gHiiVendorDevicePath0, CONSOLE_IN},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gIsaKeyboardDevicePath, CONSOLE_IN},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gDebugAgentUartDevicePath, CONSOLE_ALL},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gUsbClassKeyboardDevicePath, CONSOLE_IN},
-  {NULL, 0}
-};
-
-//
-// All the possible platform PCI VGA device path
-//
-EFI_DEVICE_PATH_PROTOCOL* gPlatformAllPossiblePciVgaConsole [] = {
-  (EFI_DEVICE_PATH_PROTOCOL*)&gOnChipPciVgaDevicePath,
-  (EFI_DEVICE_PATH_PROTOCOL*)&gPlugInPciVgaDevicePath,
-  NULL
-};
-
-//
-// Legacy hard disk boot option
-//
-LEGACY_HD_DEVICE_PATH gLegacyHd = {
-  {
-    BBS_DEVICE_PATH,
-    BBS_BBS_DP,
-    (UINT8)(sizeof(BBS_BBS_DEVICE_PATH)),
-    (UINT8)((sizeof(BBS_BBS_DEVICE_PATH)) >> 8),
-    BBS_TYPE_HARDDRIVE,
-    0,
-    0
-  },
-  gEndEntire
-};
-
-//
-// Legacy cdrom boot option
-//
-LEGACY_HD_DEVICE_PATH gLegacyCdrom = {
-  {
-    BBS_DEVICE_PATH,
-    BBS_BBS_DP,
-    (UINT8)(sizeof(BBS_BBS_DEVICE_PATH)),
-    (UINT8)((sizeof(BBS_BBS_DEVICE_PATH)) >> 8),
-    BBS_TYPE_CDROM,
-    0,
-    0
-  },
-  gEndEntire
-};
-
-//
-// Predefined platform specific perdict boot option
-//
-EFI_DEVICE_PATH_PROTOCOL* gPlatformBootOption [] = {
-  (EFI_DEVICE_PATH_PROTOCOL*)&gLegacyHd,
-  (EFI_DEVICE_PATH_PROTOCOL*)&gLegacyCdrom,
-  NULL
-};
-
-//
-// Predefined platform specific driver option
-//
-EFI_DEVICE_PATH_PROTOCOL* gPlatformDriverOption [] = {
-  NULL
-};
-
-//
-// Predefined platform connect sequence
-//
-EFI_DEVICE_PATH_PROTOCOL* gPlatformConnectSequence [] = {
-  (EFI_DEVICE_PATH_PROTOCOL *)&gPlatformRootBridge0,  // Force PCI enumer before Legacy OpROM shadow
-  NULL
-};
-
-//
-// Platform specific USB controller device path
-//
-PLATFORM_USB_DEVICE_PATH gUsbDevicePath0 = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(0, 0x1D),
-  gEndEntire
-};
-
-PLATFORM_USB_DEVICE_PATH gUsbDevicePath1 = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(1, 0x1D),
-  gEndEntire
-};
-
-PLATFORM_USB_DEVICE_PATH gUsbDevicePath2 = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(2, 0x1D),
-  gEndEntire
-};
-
-PLATFORM_USB_DEVICE_PATH gUsbDevicePath3 = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE(3, 0x1D),
-  gEndEntire
-};
-
-//
-// Predefined platform device path for user authtication
-//
-EFI_DEVICE_PATH_PROTOCOL* gUserAuthenticationDevice[] = {
-  //
-  // Predefined device path for secure card (USB disk).
-  //
-  (EFI_DEVICE_PATH_PROTOCOL*)&gUsbDevicePath0,
-  (EFI_DEVICE_PATH_PROTOCOL*)&gUsbDevicePath1,
-  (EFI_DEVICE_PATH_PROTOCOL*)&gUsbDevicePath2,
-  (EFI_DEVICE_PATH_PROTOCOL*)&gUsbDevicePath3,
-  NULL
-};
-
-//
-// Predefined platform console device path
-//
-BDS_CONSOLE_CONNECT_ENTRY gPlatformSimpleConsole [] = {
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gOnChipPciVgaDevicePath, CONSOLE_OUT},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gIsaSerialDevicePath, CONSOLE_ALL},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gHiiVendorDevicePath0, CONSOLE_IN},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gDebugAgentUartDevicePath, CONSOLE_ALL},
-  {(EFI_DEVICE_PATH_PROTOCOL*)&gUsbClassKeyboardDevicePath, CONSOLE_IN},
-  {NULL, 0}
-};
-
-//
-// eMMC device at BDF(0x0, 0x17, 0x0)
-//
-PLATFORM_PCI_DEVICE_PATH gEmmcBootDevPath0 = {
-  gPciRootBridge,
-  PCI_DEVICE_PATH_NODE (0x00, 0x10),
-  gEndEntire
-};
-
-//
-// Predefined platform specific perdict boot option
-//
-EFI_DEVICE_PATH_PROTOCOL* gPlatformSimpleBootOption [] = {
-  (EFI_DEVICE_PATH_PROTOCOL*)&gEmmcBootDevPath0,
-  NULL
-};
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
deleted file mode 100644
index 3034853695..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
+++ /dev/null
@@ -1,4490 +0,0 @@
-/** @file
-  BDS Lib functions which relate with create or process the boot option.
-
-Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "InternalBdsLib.h"
-#include "String.h"
-#include <Library/NetLib.h>
-#include "Library/DebugLib.h"
-
-BOOLEAN mEnumBootDevice = FALSE;
-EFI_HII_HANDLE gBdsLibStringPackHandle = NULL;
-
-/**
-
-  End Perf entry of BDS
-
-  @param  Event                 The triggered event.
-  @param  Context               Context for this event.
-
-**/
-VOID
-EFIAPI
-BmEndOfBdsPerfCode (
-  IN EFI_EVENT  Event,
-  IN VOID       *Context
-  )
-{
-  //
-  // Record the performance data for End of BDS
-  //
-  PERF_END(NULL, "BDS", NULL, 0);
-
-  return ;
-}
-
-/**
-  The constructor function register UNI strings into imageHandle.
-  
-  It will ASSERT() if that operation fails and it will always return EFI_SUCCESS. 
-
-  @param  ImageHandle   The firmware allocated handle for the EFI image.
-  @param  SystemTable   A pointer to the EFI System Table.
-  
-  @retval EFI_SUCCESS   The constructor successfully added string package.
-  @retval Other value   The constructor can't add string package.
-
-**/
-EFI_STATUS
-EFIAPI
-GenericBdsLibConstructor (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-
-  gBdsLibStringPackHandle = HiiAddPackages (
-                              &gBdsLibStringPackageGuid,
-                              ImageHandle,
-                              GenericBdsLibStrings,
-                              NULL
-                              );
-
-  ASSERT (gBdsLibStringPackHandle != NULL);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Deletete the Boot Option from EFI Variable. The Boot Order Arrray
-  is also updated.
-
-  @param OptionNumber    The number of Boot option want to be deleted.
-  @param BootOrder       The Boot Order array.
-  @param BootOrderSize   The size of the Boot Order Array.
-
-  @retval  EFI_SUCCESS           The Boot Option Variable was found and removed
-  @retval  EFI_UNSUPPORTED       The Boot Option Variable store was inaccessible
-  @retval  EFI_NOT_FOUND         The Boot Option Variable was not found
-**/
-EFI_STATUS
-EFIAPI
-BdsDeleteBootOption (
-  IN UINTN                       OptionNumber,
-  IN OUT UINT16                  *BootOrder,
-  IN OUT UINTN                   *BootOrderSize
-  )
-{
-  CHAR16      BootOption[9];
-  UINTN       Index;
-  EFI_STATUS  Status;
-
-  UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", OptionNumber);
-  Status = gRT->SetVariable (
-                  BootOption,
-                  &gEfiGlobalVariableGuid,
-                  0,
-                  0,
-                  NULL
-                  );
-  //
-  // Deleting variable with existing variable implementation shouldn't fail.
-  //
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // adjust boot order array
-  //
-  for (Index = 0; Index < *BootOrderSize / sizeof (UINT16); Index++) {
-    if (BootOrder[Index] == OptionNumber) {
-      CopyMem (&BootOrder[Index], &BootOrder[Index+1], *BootOrderSize - (Index+1) * sizeof (UINT16));
-      *BootOrderSize -= sizeof (UINT16);
-      break;
-    }
-  }
-
-  return Status;
-}
-/**
-
-  Translate the first n characters of an Ascii string to
-  Unicode characters. The count n is indicated by parameter
-  Size. If Size is greater than the length of string, then
-  the entire string is translated.
-
-
-  @param AStr               Pointer to input Ascii string.
-  @param Size               The number of characters to translate.
-  @param UStr               Pointer to output Unicode string buffer.
-
-**/
-VOID
-AsciiToUnicodeSize (
-  IN UINT8              *AStr,
-  IN UINTN              Size,
-  OUT UINT16            *UStr
-  )
-{
-  UINTN Idx;
-
-  Idx = 0;
-  while (AStr[Idx] != 0) {
-    UStr[Idx] = (CHAR16) AStr[Idx];
-    if (Idx == Size) {
-      break;
-    }
-
-    Idx++;
-  }
-  UStr[Idx] = 0;
-}
-
-/**
-  Build Legacy Device Name String according.
-
-  @param CurBBSEntry     BBS Table.
-  @param Index           Index.
-  @param BufSize         The buffer size.
-  @param BootString      The output string.
-
-**/
-VOID
-BdsBuildLegacyDevNameString (
-  IN  BBS_TABLE                 *CurBBSEntry,
-  IN  UINTN                     Index,
-  IN  UINTN                     BufSize,
-  OUT CHAR16                    *BootString
-  )
-{
-  CHAR16  *Fmt;
-  CHAR16  *Type;
-  UINT8   *StringDesc;
-  CHAR16  Temp[80];
-
-  switch (Index) {
-  //
-  // Primary Master
-  //
-  case 1:
-    Fmt = L"Primary Master %s";
-    break;
-
- //
- // Primary Slave
- //
-  case 2:
-    Fmt = L"Primary Slave %s";
-    break;
-
-  //
-  // Secondary Master
-  //
-  case 3:
-    Fmt = L"Secondary Master %s";
-    break;
-
-  //
-  // Secondary Slave
-  //
-  case 4:
-    Fmt = L"Secondary Slave %s";
-    break;
-
-  default:
-    Fmt = L"%s";
-    break;
-  }
-
-  switch (CurBBSEntry->DeviceType) {
-  case BBS_FLOPPY:
-    Type = L"Floppy";
-    break;
-
-  case BBS_HARDDISK:
-    Type = L"Harddisk";
-    break;
-
-  case BBS_CDROM:
-    Type = L"CDROM";
-    break;
-
-  case BBS_PCMCIA:
-    Type = L"PCMCIAe";
-    break;
-
-  case BBS_USB:
-    Type = L"USB";
-    break;
-
-  case BBS_EMBED_NETWORK:
-    Type = L"Network";
-    break;
-
-  case BBS_BEV_DEVICE:
-    Type = L"BEVe";
-    break;
-
-  case BBS_UNKNOWN:
-  default:
-    Type = L"Unknown";
-    break;
-  }
-  //
-  // If current BBS entry has its description then use it.
-  //
-  StringDesc = (UINT8 *) (UINTN) ((CurBBSEntry->DescStringSegment << 4) + CurBBSEntry->DescStringOffset);
-  if (NULL != StringDesc) {
-    //
-    // Only get fisrt 32 characters, this is suggested by BBS spec
-    //
-    AsciiToUnicodeSize (StringDesc, 32, Temp);
-    Fmt   = L"%s";
-    Type  = Temp;
-  }
-
-  //
-  // BbsTable 16 entries are for onboard IDE.
-  // Set description string for SATA harddisks, Harddisk 0 ~ Harddisk 11
-  //
-  if (Index >= 5 && Index <= 16 && (CurBBSEntry->DeviceType == BBS_HARDDISK || CurBBSEntry->DeviceType == BBS_CDROM)) {
-    Fmt = L"%s %d";
-    UnicodeSPrint (BootString, BufSize, Fmt, Type, Index - 5);
-  } else {
-    UnicodeSPrint (BootString, BufSize, Fmt, Type);
-  }
-}
-
-/**
-
-  Create a legacy boot option for the specified entry of
-  BBS table, save it as variable, and append it to the boot
-  order list.
-
-
-  @param CurrentBbsEntry    Pointer to current BBS table.
-  @param CurrentBbsDevPath  Pointer to the Device Path Protocol instance of BBS
-  @param Index              Index of the specified entry in BBS table.
-  @param BootOrderList      On input, the original boot order list.
-                            On output, the new boot order list attached with the
-                            created node.
-  @param BootOrderListSize  On input, the original size of boot order list.
-                            On output, the size of new boot order list.
-
-  @retval  EFI_SUCCESS             Boot Option successfully created.
-  @retval  EFI_OUT_OF_RESOURCES    Fail to allocate necessary memory.
-  @retval  Other                   Error occurs while setting variable.
-
-**/
-EFI_STATUS
-BdsCreateLegacyBootOption (
-  IN BBS_TABLE                        *CurrentBbsEntry,
-  IN EFI_DEVICE_PATH_PROTOCOL         *CurrentBbsDevPath,
-  IN UINTN                            Index,
-  IN OUT UINT16                       **BootOrderList,
-  IN OUT UINTN                        *BootOrderListSize
-  )
-{
-  EFI_STATUS           Status;
-  UINT16               CurrentBootOptionNo;
-  UINT16               BootString[10];
-  CHAR16               BootDesc[100];
-  CHAR8                HelpString[100];
-  UINT16               *NewBootOrderList;
-  UINTN                BufferSize;
-  UINTN                StringLen;
-  VOID                 *Buffer;
-  UINT8                *Ptr;
-  UINT16               CurrentBbsDevPathSize;
-  UINTN                BootOrderIndex;
-  UINTN                BootOrderLastIndex;
-  UINTN                ArrayIndex;
-  BOOLEAN              IndexNotFound;
-  BBS_BBS_DEVICE_PATH  *NewBbsDevPathNode;
-
-  if ((*BootOrderList) == NULL) {
-    CurrentBootOptionNo = 0;
-  } else {
-    for (ArrayIndex = 0; ArrayIndex < (UINTN) (*BootOrderListSize / sizeof (UINT16)); ArrayIndex++) {
-      IndexNotFound = TRUE;
-      for (BootOrderIndex = 0; BootOrderIndex < (UINTN) (*BootOrderListSize / sizeof (UINT16)); BootOrderIndex++) {
-        if ((*BootOrderList)[BootOrderIndex] == ArrayIndex) {
-          IndexNotFound = FALSE;
-          break;
-        }
-      }
-
-      if (!IndexNotFound) {
-        continue;
-      } else {
-        break;
-      }
-    }
-
-    CurrentBootOptionNo = (UINT16) ArrayIndex;
-  }
-
-  UnicodeSPrint (
-    BootString,
-    sizeof (BootString),
-    L"Boot%04x",
-    CurrentBootOptionNo
-    );
-
-  BdsBuildLegacyDevNameString (CurrentBbsEntry, Index, sizeof (BootDesc), BootDesc);
-
-  //
-  // Create new BBS device path node with description string
-  //
-  UnicodeStrToAsciiStr (BootDesc, HelpString);
-
-  StringLen = AsciiStrLen (HelpString);
-  NewBbsDevPathNode = AllocateZeroPool (sizeof (BBS_BBS_DEVICE_PATH) + StringLen);
-  if (NewBbsDevPathNode == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  CopyMem (NewBbsDevPathNode, CurrentBbsDevPath, sizeof (BBS_BBS_DEVICE_PATH));
-  CopyMem (NewBbsDevPathNode->String, HelpString, StringLen + 1);
-  SetDevicePathNodeLength (&(NewBbsDevPathNode->Header), sizeof (BBS_BBS_DEVICE_PATH) + StringLen);
-
-  //
-  // Create entire new CurrentBbsDevPath with end node
-  //
-  CurrentBbsDevPath = AppendDevicePathNode (
-                        NULL,
-                        (EFI_DEVICE_PATH_PROTOCOL *) NewBbsDevPathNode
-                        );
-   if (CurrentBbsDevPath == NULL) {
-    FreePool (NewBbsDevPathNode);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  CurrentBbsDevPathSize = (UINT16) (GetDevicePathSize (CurrentBbsDevPath));
-
-  BufferSize = sizeof (UINT32) +
-    sizeof (UINT16) +
-    StrSize (BootDesc) +
-    CurrentBbsDevPathSize +
-    sizeof (BBS_TABLE) +
-    sizeof (UINT16);
-
-  Buffer = AllocateZeroPool (BufferSize);
-  if (Buffer == NULL) {
-    FreePool (NewBbsDevPathNode);
-    FreePool (CurrentBbsDevPath);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Ptr               = (UINT8 *) Buffer;
-
-  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;
-  Ptr += sizeof (UINT32);
-
-  *((UINT16 *) Ptr) = CurrentBbsDevPathSize;
-  Ptr += sizeof (UINT16);
-
-  CopyMem (
-    Ptr,
-    BootDesc,
-    StrSize (BootDesc)
-    );
-  Ptr += StrSize (BootDesc);
-
-  CopyMem (
-    Ptr,
-    CurrentBbsDevPath,
-    CurrentBbsDevPathSize
-    );
-  Ptr += CurrentBbsDevPathSize;
-
-  CopyMem (
-    Ptr,
-    CurrentBbsEntry,
-    sizeof (BBS_TABLE)
-    );
-
-  Ptr += sizeof (BBS_TABLE);
-  *((UINT16 *) Ptr) = (UINT16) Index;
-
-  Status = gRT->SetVariable (
-                  BootString,
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  BufferSize,
-                  Buffer
-                  );
-
-  FreePool (Buffer);
-  
-  Buffer = NULL;
-
-  NewBootOrderList = AllocateZeroPool (*BootOrderListSize + sizeof (UINT16));
-  if (NULL == NewBootOrderList) {
-    FreePool (NewBbsDevPathNode);
-    FreePool (CurrentBbsDevPath);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  if (*BootOrderList != NULL) {
-    CopyMem (NewBootOrderList, *BootOrderList, *BootOrderListSize);
-    FreePool (*BootOrderList);
-  }
-
-  BootOrderLastIndex                    = (UINTN) (*BootOrderListSize / sizeof (UINT16));
-  NewBootOrderList[BootOrderLastIndex]  = CurrentBootOptionNo;
-  *BootOrderListSize += sizeof (UINT16);
-  *BootOrderList = NewBootOrderList;
-
-  FreePool (NewBbsDevPathNode);
-  FreePool (CurrentBbsDevPath);
-  return Status;
-}
-
-/**
-  Check if the boot option is a legacy one.
-
-  @param BootOptionVar   The boot option data payload.
-  @param BbsEntry        The BBS Table.
-  @param BbsIndex        The table index.
-
-  @retval TRUE           It is a legacy boot option.
-  @retval FALSE          It is not a legacy boot option.
-
-**/
-BOOLEAN
-BdsIsLegacyBootOption (
-  IN UINT8                 *BootOptionVar,
-  OUT BBS_TABLE            **BbsEntry,
-  OUT UINT16               *BbsIndex
-  )
-{
-  UINT8                     *Ptr;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  BOOLEAN                   Ret;
-  UINT16                    DevPathLen;
-
-  Ptr = BootOptionVar;
-  Ptr += sizeof (UINT32);
-  DevPathLen = *(UINT16 *) Ptr;
-  Ptr += sizeof (UINT16);
-  Ptr += StrSize ((UINT16 *) Ptr);
-  DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
-  if ((BBS_DEVICE_PATH == DevicePath->Type) && (BBS_BBS_DP == DevicePath->SubType)) {
-    Ptr += DevPathLen;
-    *BbsEntry = (BBS_TABLE *) Ptr;
-    Ptr += sizeof (BBS_TABLE);
-    *BbsIndex = *(UINT16 *) Ptr;
-    Ret       = TRUE;
-  } else {
-    *BbsEntry = NULL;
-    Ret       = FALSE;
-  }
-
-  return Ret;
-}
-
-/**
-  Delete all the invalid legacy boot options.
-
-  @retval EFI_SUCCESS             All invalide legacy boot options are deleted.
-  @retval EFI_OUT_OF_RESOURCES    Fail to allocate necessary memory.
-  @retval EFI_NOT_FOUND           Fail to retrive variable of boot order.
-**/
-EFI_STATUS
-EFIAPI
-BdsDeleteAllInvalidLegacyBootOptions (
-  VOID
-  )
-{
-  UINT16                    *BootOrder;
-  UINT8                     *BootOptionVar;
-  UINTN                     BootOrderSize;
-  UINTN                     BootOptionSize;
-  EFI_STATUS                Status;
-  UINT16                    HddCount;
-  UINT16                    BbsCount;
-  HDD_INFO                  *LocalHddInfo;
-  BBS_TABLE                 *LocalBbsTable;
-  BBS_TABLE                 *BbsEntry;
-  UINT16                    BbsIndex;
-  EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
-  UINTN                     Index;
-  UINT16                    BootOption[10];
-  UINT16                    BootDesc[100];
-  BOOLEAN                   DescStringMatch;
-
-  Status        = EFI_SUCCESS;
-  BootOrder     = NULL;
-  BootOrderSize = 0;
-  HddCount      = 0;
-  BbsCount      = 0;
-  LocalHddInfo  = NULL;
-  LocalBbsTable = NULL;
-  BbsEntry      = NULL;
-
-  Status        = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  BootOrder = BdsLibGetVariableAndSize (
-                L"BootOrder",
-                &gEfiGlobalVariableGuid,
-                &BootOrderSize
-                );
-  if (BootOrder == NULL) {
-    return EFI_NOT_FOUND;
-  }
-
-  LegacyBios->GetBbsInfo (
-                LegacyBios,
-                &HddCount,
-                &LocalHddInfo,
-                &BbsCount,
-                &LocalBbsTable
-                );
-
-  Index = 0;
-  while (Index < BootOrderSize / sizeof (UINT16)) {
-    UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);
-    BootOptionVar = BdsLibGetVariableAndSize (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      &BootOptionSize
-                      );
-    if (NULL == BootOptionVar) {
-      BootOptionSize = 0;
-      Status = gRT->GetVariable (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      NULL,
-                      &BootOptionSize,
-                      BootOptionVar
-                      );
-      if (Status == EFI_NOT_FOUND) {
-        //
-        // Update BootOrder
-        //
-        BdsDeleteBootOption (
-          BootOrder[Index],
-          BootOrder,
-          &BootOrderSize
-          );
-        continue;
-      } else {
-        FreePool (BootOrder);
-        return EFI_OUT_OF_RESOURCES;
-      }
-    }
-  
-    //
-    // Skip Non-Legacy boot option
-    // 
-    if (!BdsIsLegacyBootOption (BootOptionVar, &BbsEntry, &BbsIndex)) {
-      if (BootOptionVar!= NULL) {
-        FreePool (BootOptionVar);
-      }
-      Index++;
-      continue;
-    }
-
-    if (BbsIndex < BbsCount) {
-      //
-      // Check if BBS Description String is changed
-      //
-      DescStringMatch = FALSE;
-      BdsBuildLegacyDevNameString (
-        &LocalBbsTable[BbsIndex],
-        BbsIndex,
-        sizeof (BootDesc),
-        BootDesc
-        );
-
-      if (StrCmp (BootDesc, (UINT16*)(BootOptionVar + sizeof (UINT32) + sizeof (UINT16))) == 0) {
-        DescStringMatch = TRUE;
-      }
-
-      if (!((LocalBbsTable[BbsIndex].BootPriority == BBS_IGNORE_ENTRY) ||
-            (LocalBbsTable[BbsIndex].BootPriority == BBS_DO_NOT_BOOT_FROM)) &&
-          (LocalBbsTable[BbsIndex].DeviceType == BbsEntry->DeviceType) &&
-          DescStringMatch) {
-        Index++;
-        continue;
-      }
-    }
-
-    if (BootOptionVar != NULL) {
-      FreePool (BootOptionVar);
-    }
-    //
-    // should delete
-    //
-    BdsDeleteBootOption (
-      BootOrder[Index],
-      BootOrder,
-      &BootOrderSize
-      );
-  }
-
-  //
-  // Adjust the number of boot options.
-  //
-  Status = gRT->SetVariable (
-                  L"BootOrder",
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  BootOrderSize,
-                  BootOrder
-                  );
-  //
-  // Shrinking variable with existing variable implementation shouldn't fail.
-  //
-  ASSERT_EFI_ERROR (Status);
-  FreePool (BootOrder);
-
-  return Status;
-}
-
-/**
-  Find all legacy boot option by device type.
-
-  @param BootOrder       The boot order array.
-  @param BootOptionNum   The number of boot option.
-  @param DevType         Device type.
-  @param DevName         Device name.
-  @param Attribute       The boot option attribute.
-  @param BbsIndex        The BBS table index.
-  @param OptionNumber    The boot option index.
-
-  @retval TRUE           The Legacy boot option is found.
-  @retval FALSE          The legacy boot option is not found.
-
-**/
-BOOLEAN
-BdsFindLegacyBootOptionByDevTypeAndName (
-  IN UINT16                 *BootOrder,
-  IN UINTN                  BootOptionNum,
-  IN UINT16                 DevType,
-  IN CHAR16                 *DevName,
-  OUT UINT32                *Attribute,
-  OUT UINT16                *BbsIndex,
-  OUT UINT16                *OptionNumber
-  )
-{
-  UINTN     Index;
-  CHAR16    BootOption[9];
-  UINTN     BootOptionSize;
-  UINT8     *BootOptionVar;
-  BBS_TABLE *BbsEntry;
-  BOOLEAN   Found;
-
-  BbsEntry  = NULL;
-  Found     = FALSE;
-
-  if (NULL == BootOrder) {
-    return Found;
-  }
-
-  //
-  // Loop all boot option from variable
-  //
-  for (Index = 0; Index < BootOptionNum; Index++) {
-    UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", (UINTN) BootOrder[Index]);
-    BootOptionVar = BdsLibGetVariableAndSize (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      &BootOptionSize
-                      );
-    if (NULL == BootOptionVar) {
-      continue;
-    }
-
-    //
-    // Skip Non-legacy boot option
-    //
-    if (!BdsIsLegacyBootOption (BootOptionVar, &BbsEntry, BbsIndex)) {
-      FreePool (BootOptionVar);
-      continue;
-    }
-
-    if (
-        (BbsEntry->DeviceType != DevType) ||
-        (StrCmp (DevName, (CHAR16*)(BootOptionVar + sizeof (UINT32) + sizeof (UINT16))) != 0)
-       ) {
-      FreePool (BootOptionVar);
-      continue;
-    }
-
-    *Attribute    = *(UINT32 *) BootOptionVar;
-    *OptionNumber = BootOrder[Index];
-    Found         = TRUE;
-    FreePool (BootOptionVar);
-    break;
-  }
-
-  return Found;
-}
-
-/**
-  Create a legacy boot option.
-
-  @param BbsItem         The BBS Table entry.
-  @param Index           Index of the specified entry in BBS table.
-  @param BootOrderList   The boot order list.
-  @param BootOrderListSize The size of boot order list.
-
-  @retval EFI_OUT_OF_RESOURCE  No enough memory.
-  @retval EFI_SUCCESS          The function complete successfully.
-  @return Other value if the legacy boot option is not created.
-
-**/
-EFI_STATUS
-BdsCreateOneLegacyBootOption (
-  IN BBS_TABLE              *BbsItem,
-  IN UINTN                  Index,
-  IN OUT UINT16             **BootOrderList,
-  IN OUT UINTN              *BootOrderListSize
-  )
-{
-  BBS_BBS_DEVICE_PATH       BbsDevPathNode;
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *DevPath;
-
-  DevPath                       = NULL;
-
-  //
-  // Create device path node.
-  //
-  BbsDevPathNode.Header.Type    = BBS_DEVICE_PATH;
-  BbsDevPathNode.Header.SubType = BBS_BBS_DP;
-  SetDevicePathNodeLength (&BbsDevPathNode.Header, sizeof (BBS_BBS_DEVICE_PATH));
-  BbsDevPathNode.DeviceType = BbsItem->DeviceType;
-  CopyMem (&BbsDevPathNode.StatusFlag, &BbsItem->StatusFlags, sizeof (UINT16));
-
-  DevPath = AppendDevicePathNode (
-              NULL,
-              (EFI_DEVICE_PATH_PROTOCOL *) &BbsDevPathNode
-              );
-  if (NULL == DevPath) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Status = BdsCreateLegacyBootOption (
-            BbsItem,
-            DevPath,
-            Index,
-            BootOrderList,
-            BootOrderListSize
-            );
-  BbsItem->BootPriority = 0x00;
-
-  FreePool (DevPath);
-
-  return Status;
-}
-
-/**
-  Add the legacy boot options from BBS table if they do not exist.
-
-  @retval EFI_SUCCESS          The boot options are added successfully 
-                               or they are already in boot options.
-  @retval EFI_NOT_FOUND        No legacy boot options is found.
-  @retval EFI_OUT_OF_RESOURCE  No enough memory.
-  @return Other value          LegacyBoot options are not added.
-**/
-EFI_STATUS
-EFIAPI
-BdsAddNonExistingLegacyBootOptions (
-  VOID
-  )
-{
-  UINT16                    *BootOrder;
-  UINTN                     BootOrderSize;
-  EFI_STATUS                Status;
-  CHAR16                    Desc[100];
-  UINT16                    HddCount;
-  UINT16                    BbsCount;
-  HDD_INFO                  *LocalHddInfo;
-  BBS_TABLE                 *LocalBbsTable;
-  UINT16                    BbsIndex;
-  EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
-  UINT16                    Index;
-  UINT32                    Attribute;
-  UINT16                    OptionNumber;
-  BOOLEAN                   Exist;
-
-  HddCount      = 0;
-  BbsCount      = 0;
-  LocalHddInfo  = NULL;
-  LocalBbsTable = NULL;
-
-  Status        = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  LegacyBios->GetBbsInfo (
-                LegacyBios,
-                &HddCount,
-                &LocalHddInfo,
-                &BbsCount,
-                &LocalBbsTable
-                );
-
-  BootOrder = BdsLibGetVariableAndSize (
-                L"BootOrder",
-                &gEfiGlobalVariableGuid,
-                &BootOrderSize
-                );
-  if (BootOrder == NULL) {
-    BootOrderSize = 0;
-  }
-
-  for (Index = 0; Index < BbsCount; Index++) {
-    if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||
-        (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM)
-        ) {
-      continue;
-    }
-
-    BdsBuildLegacyDevNameString (&LocalBbsTable[Index], Index, sizeof (Desc), Desc);
-
-    Exist = BdsFindLegacyBootOptionByDevTypeAndName (
-              BootOrder,
-              BootOrderSize / sizeof (UINT16),
-              LocalBbsTable[Index].DeviceType,
-              Desc,
-              &Attribute,
-              &BbsIndex,
-              &OptionNumber
-              );
-    if (!Exist) {
-      //
-      // Not found such type of legacy device in boot options or we found but it's disabled
-      // so we have to create one and put it to the tail of boot order list
-      //
-      Status = BdsCreateOneLegacyBootOption (
-                &LocalBbsTable[Index],
-                Index,
-                &BootOrder,
-                &BootOrderSize
-                );
-      if (!EFI_ERROR (Status)) {
-        ASSERT (BootOrder != NULL);
-        BbsIndex     = Index;
-        OptionNumber = BootOrder[BootOrderSize / sizeof (UINT16) - 1];
-      }
-    }
-
-    ASSERT (BbsIndex == Index);
-  }
-
-  Status = gRT->SetVariable (
-                  L"BootOrder",
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  BootOrderSize,
-                  BootOrder
-                  );
-  if (BootOrder != NULL) {
-    FreePool (BootOrder);
-  }
-
-  return Status;
-}
-
-/**
-  Fill the device order buffer.
-
-  @param BbsTable        The BBS table.
-  @param BbsType         The BBS Type.
-  @param BbsCount        The BBS Count.
-  @param Buf             device order buffer.
-
-  @return The device order buffer.
-
-**/
-UINT16 *
-BdsFillDevOrderBuf (
-  IN BBS_TABLE                    *BbsTable,
-  IN BBS_TYPE                     BbsType,
-  IN UINTN                        BbsCount,
-  OUT UINT16                      *Buf
-  )
-{
-  UINTN Index;
-
-  for (Index = 0; Index < BbsCount; Index++) {
-    if (BbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) {
-      continue;
-    }
-
-    if (BbsTable[Index].DeviceType != BbsType) {
-      continue;
-    }
-
-    *Buf = (UINT16) (Index & 0xFF);
-    Buf++;
-  }
-
-  return Buf;
-}
-
-/**
-  Create the device order buffer.
-
-  @param BbsTable        The BBS table.
-  @param BbsCount        The BBS Count.
-
-  @retval EFI_SUCCES             The buffer is created and the EFI variable named 
-                                 VAR_LEGACY_DEV_ORDER and gEfiLegacyDevOrderVariableGuid is
-                                 set correctly.
-  @retval EFI_OUT_OF_RESOURCES   Memmory or storage is not enough.
-  @retval EFI_DEVICE_ERROR       Fail to add the device order into EFI variable fail
-                                 because of hardware error.
-**/
-EFI_STATUS
-BdsCreateDevOrder (
-  IN BBS_TABLE                  *BbsTable,
-  IN UINT16                     BbsCount
-  )
-{
-  UINTN                       Index;
-  UINTN                       FDCount;
-  UINTN                       HDCount;
-  UINTN                       CDCount;
-  UINTN                       NETCount;
-  UINTN                       BEVCount;
-  UINTN                       TotalSize;
-  UINTN                       HeaderSize;
-  LEGACY_DEV_ORDER_ENTRY      *DevOrder;
-  LEGACY_DEV_ORDER_ENTRY      *DevOrderPtr;
-  EFI_STATUS                  Status;
-
-  FDCount     = 0;
-  HDCount     = 0;
-  CDCount     = 0;
-  NETCount    = 0;
-  BEVCount    = 0;
-  TotalSize   = 0;
-  HeaderSize  = sizeof (BBS_TYPE) + sizeof (UINT16);
-  DevOrder    = NULL;
-  Status      = EFI_SUCCESS;
-
-  //
-  // Count all boot devices
-  //
-  for (Index = 0; Index < BbsCount; Index++) {
-    if (BbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) {
-      continue;
-    }
-
-    switch (BbsTable[Index].DeviceType) {
-    case BBS_FLOPPY:
-      FDCount++;
-      break;
-
-    case BBS_HARDDISK:
-      HDCount++;
-      break;
-
-    case BBS_CDROM:
-      CDCount++;
-      break;
-
-    case BBS_EMBED_NETWORK:
-      NETCount++;
-      break;
-
-    case BBS_BEV_DEVICE:
-      BEVCount++;
-      break;
-
-    default:
-      break;
-    }
-  }
-
-  TotalSize += (HeaderSize + sizeof (UINT16) * FDCount);
-  TotalSize += (HeaderSize + sizeof (UINT16) * HDCount);
-  TotalSize += (HeaderSize + sizeof (UINT16) * CDCount);
-  TotalSize += (HeaderSize + sizeof (UINT16) * NETCount);
-  TotalSize += (HeaderSize + sizeof (UINT16) * BEVCount);
-
-  //
-  // Create buffer to hold all boot device order
-  //
-  DevOrder = AllocateZeroPool (TotalSize);
-  if (NULL == DevOrder) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  DevOrderPtr          = DevOrder;
-
-  DevOrderPtr->BbsType = BBS_FLOPPY;
-  DevOrderPtr->Length  = (UINT16) (sizeof (DevOrderPtr->Length) + FDCount * sizeof (UINT16));
-  DevOrderPtr          = (LEGACY_DEV_ORDER_ENTRY *) BdsFillDevOrderBuf (BbsTable, BBS_FLOPPY, BbsCount, DevOrderPtr->Data);
-
-  DevOrderPtr->BbsType = BBS_HARDDISK;
-  DevOrderPtr->Length  = (UINT16) (sizeof (UINT16) + HDCount * sizeof (UINT16));
-  DevOrderPtr          = (LEGACY_DEV_ORDER_ENTRY *) BdsFillDevOrderBuf (BbsTable, BBS_HARDDISK, BbsCount, DevOrderPtr->Data);
-  
-  DevOrderPtr->BbsType = BBS_CDROM;
-  DevOrderPtr->Length  = (UINT16) (sizeof (UINT16) + CDCount * sizeof (UINT16));
-  DevOrderPtr          = (LEGACY_DEV_ORDER_ENTRY *) BdsFillDevOrderBuf (BbsTable, BBS_CDROM, BbsCount, DevOrderPtr->Data);
-  
-  DevOrderPtr->BbsType = BBS_EMBED_NETWORK;
-  DevOrderPtr->Length  = (UINT16) (sizeof (UINT16) + NETCount * sizeof (UINT16));
-  DevOrderPtr          = (LEGACY_DEV_ORDER_ENTRY *) BdsFillDevOrderBuf (BbsTable, BBS_EMBED_NETWORK, BbsCount, DevOrderPtr->Data);
-
-  DevOrderPtr->BbsType = BBS_BEV_DEVICE;
-  DevOrderPtr->Length  = (UINT16) (sizeof (UINT16) + BEVCount * sizeof (UINT16));
-  DevOrderPtr          = (LEGACY_DEV_ORDER_ENTRY *) BdsFillDevOrderBuf (BbsTable, BBS_BEV_DEVICE, BbsCount, DevOrderPtr->Data);
-
-  ASSERT (TotalSize == (UINTN) ((UINT8 *) DevOrderPtr - (UINT8 *) DevOrder));
-
-  //
-  // Save device order for legacy boot device to variable.
-  //
-  Status = gRT->SetVariable (
-                  VAR_LEGACY_DEV_ORDER,
-                  &gEfiLegacyDevOrderVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  TotalSize,
-                  DevOrder
-                  );
-  FreePool (DevOrder);
-
-  return Status;
-}
-
-/**
-  Add the legacy boot devices from BBS table into 
-  the legacy device boot order.
-
-  @retval EFI_SUCCESS           The boot devices are added successfully.
-  @retval EFI_NOT_FOUND         The legacy boot devices are not found.
-  @retval EFI_OUT_OF_RESOURCES  Memmory or storage is not enough.
-  @retval EFI_DEVICE_ERROR      Fail to add the legacy device boot order into EFI variable
-                                because of hardware error.
-**/
-EFI_STATUS
-EFIAPI
-BdsUpdateLegacyDevOrder (
-  VOID
-  )
-{
-  LEGACY_DEV_ORDER_ENTRY      *DevOrder;
-  LEGACY_DEV_ORDER_ENTRY      *NewDevOrder;
-  LEGACY_DEV_ORDER_ENTRY      *Ptr;
-  LEGACY_DEV_ORDER_ENTRY      *NewPtr;
-  UINTN                       DevOrderSize;
-  EFI_LEGACY_BIOS_PROTOCOL    *LegacyBios;
-  EFI_STATUS                  Status;
-  UINT16                      HddCount;
-  UINT16                      BbsCount;
-  HDD_INFO                    *LocalHddInfo;
-  BBS_TABLE                   *LocalBbsTable;
-  UINTN                       Index;
-  UINTN                       Index2;
-  UINTN                       *Idx;
-  UINTN                       FDCount;
-  UINTN                       HDCount;
-  UINTN                       CDCount;
-  UINTN                       NETCount;
-  UINTN                       BEVCount;
-  UINTN                       TotalSize;
-  UINTN                       HeaderSize;
-  UINT16                      *NewFDPtr;
-  UINT16                      *NewHDPtr;
-  UINT16                      *NewCDPtr;
-  UINT16                      *NewNETPtr;
-  UINT16                      *NewBEVPtr;
-  UINT16                      *NewDevPtr;
-  UINTN                       FDIndex;
-  UINTN                       HDIndex;
-  UINTN                       CDIndex;
-  UINTN                       NETIndex;
-  UINTN                       BEVIndex;
-
-  Idx           = NULL;
-  FDCount       = 0;
-  HDCount       = 0;
-  CDCount       = 0;
-  NETCount      = 0;
-  BEVCount      = 0;
-  TotalSize     = 0;
-  HeaderSize    = sizeof (BBS_TYPE) + sizeof (UINT16);
-  FDIndex       = 0;
-  HDIndex       = 0;
-  CDIndex       = 0;
-  NETIndex      = 0;
-  BEVIndex      = 0;
-  NewDevPtr     = NULL;
-
-  Status        = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = LegacyBios->GetBbsInfo (
-                         LegacyBios,
-                         &HddCount,
-                         &LocalHddInfo,
-                         &BbsCount,
-                         &LocalBbsTable
-                         );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  DevOrder = BdsLibGetVariableAndSize (
-               VAR_LEGACY_DEV_ORDER,
-               &gEfiLegacyDevOrderVariableGuid,
-               &DevOrderSize
-               );
-  if (NULL == DevOrder) {
-    return BdsCreateDevOrder (LocalBbsTable, BbsCount);
-  }
-  //
-  // First we figure out how many boot devices with same device type respectively
-  //
-  for (Index = 0; Index < BbsCount; Index++) {
-    if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||
-        (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM)
-        ) {
-      continue;
-    }
-
-    switch (LocalBbsTable[Index].DeviceType) {
-    case BBS_FLOPPY:
-      FDCount++;
-      break;
-
-    case BBS_HARDDISK:
-      HDCount++;
-      break;
-
-    case BBS_CDROM:
-      CDCount++;
-      break;
-
-    case BBS_EMBED_NETWORK:
-      NETCount++;
-      break;
-
-    case BBS_BEV_DEVICE:
-      BEVCount++;
-      break;
-
-    default:
-      break;
-    }
-  }
-
-  TotalSize += (HeaderSize + FDCount * sizeof (UINT16));
-  TotalSize += (HeaderSize + HDCount * sizeof (UINT16));
-  TotalSize += (HeaderSize + CDCount * sizeof (UINT16));
-  TotalSize += (HeaderSize + NETCount * sizeof (UINT16));
-  TotalSize += (HeaderSize + BEVCount * sizeof (UINT16));
-
-  NewDevOrder = AllocateZeroPool (TotalSize);
-  if (NULL == NewDevOrder) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-
-
-  //
-  // copy FD
-  //
-  Ptr             = DevOrder;
-  NewPtr          = NewDevOrder;
-  NewPtr->BbsType = Ptr->BbsType;
-  NewPtr->Length  = (UINT16) (sizeof (UINT16) + FDCount * sizeof (UINT16));
-  for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-    if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_FLOPPY
-        ) {
-      continue;
-    }
-
-    NewPtr->Data[FDIndex] = Ptr->Data[Index];
-    FDIndex++;
-  }
-  NewFDPtr = NewPtr->Data;
-
-  //
-  // copy HD
-  //
-  Ptr             = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-  NewPtr          = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-  NewPtr->BbsType = Ptr->BbsType;
-  NewPtr->Length  = (UINT16) (sizeof (UINT16) + HDCount * sizeof (UINT16));
-  for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-    if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_HARDDISK
-        ) {
-      continue;
-    }
-
-    NewPtr->Data[HDIndex] = Ptr->Data[Index];
-    HDIndex++;
-  }
-  NewHDPtr = NewPtr->Data;
-
-  //
-  // copy CD
-  //
-  Ptr    = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-  NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-  NewPtr->BbsType = Ptr->BbsType;
-  NewPtr->Length  = (UINT16) (sizeof (UINT16) + CDCount * sizeof (UINT16));
-  for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-    if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_CDROM
-        ) {
-      continue;
-    }
-
-    NewPtr->Data[CDIndex] = Ptr->Data[Index];
-    CDIndex++;
-  }
-  NewCDPtr = NewPtr->Data;
-
-  //
-  // copy NET
-  //
-  Ptr    = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-  NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-  NewPtr->BbsType = Ptr->BbsType;
-  NewPtr->Length  = (UINT16) (sizeof (UINT16) + NETCount * sizeof (UINT16));
-  for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-    if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_EMBED_NETWORK
-        ) {
-      continue;
-    }
-
-    NewPtr->Data[NETIndex] = Ptr->Data[Index];
-    NETIndex++;
-  }
-  NewNETPtr = NewPtr->Data;
-  
-  //
-  // copy BEV
-  //
-  Ptr    = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-  NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-  NewPtr->BbsType = Ptr->BbsType;
-  NewPtr->Length  = (UINT16) (sizeof (UINT16) + BEVCount * sizeof (UINT16));
-  for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-    if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-        LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_BEV_DEVICE
-        ) {
-      continue;
-    }
-
-    NewPtr->Data[BEVIndex] = Ptr->Data[Index];
-    BEVIndex++;
-  }
-  NewBEVPtr = NewPtr->Data;
-
-  for (Index = 0; Index < BbsCount; Index++) {
-    if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||
-        (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM)
-        ) {
-      continue;
-    }
-
-    switch (LocalBbsTable[Index].DeviceType) {
-    case BBS_FLOPPY:
-      Idx       = &FDIndex;
-      NewDevPtr = NewFDPtr;
-      break;
-
-    case BBS_HARDDISK:
-      Idx       = &HDIndex;
-      NewDevPtr = NewHDPtr;
-      break;
-
-    case BBS_CDROM:
-      Idx       = &CDIndex;
-      NewDevPtr = NewCDPtr;
-      break;
-
-    case BBS_EMBED_NETWORK:
-      Idx       = &NETIndex;
-      NewDevPtr = NewNETPtr;
-      break;
-
-    case BBS_BEV_DEVICE:
-      Idx       = &BEVIndex;
-      NewDevPtr = NewBEVPtr;
-      break;
-
-    default:
-      Idx = NULL;
-      break;
-    }
-    //
-    // at this point we have copied those valid indexes to new buffer
-    // and we should check if there is any new appeared boot device
-    //
-    if (Idx != NULL) {
-      for (Index2 = 0; Index2 < *Idx; Index2++) {
-        if ((NewDevPtr[Index2] & 0xFF) == (UINT16) Index) {
-          break;
-        }
-      }
-
-      if (Index2 == *Idx) {
-        //
-        // Index2 == *Idx means we didn't find Index
-        // so Index is a new appeared device's index in BBS table
-        // insert it before disabled indexes.
-        //
-        for (Index2 = 0; Index2 < *Idx; Index2++) {
-          if ((NewDevPtr[Index2] & 0xFF00) == 0xFF00) {
-            break;
-          }
-        }
-        CopyMem (&NewDevPtr[Index2 + 1], &NewDevPtr[Index2], (*Idx - Index2) * sizeof (UINT16));
-        NewDevPtr[Index2] = (UINT16) (Index & 0xFF);
-        (*Idx)++;
-      }
-    }
-  }
-
-  FreePool (DevOrder);
-
-  Status = gRT->SetVariable (
-                  VAR_LEGACY_DEV_ORDER,
-                  &gEfiLegacyDevOrderVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  TotalSize,
-                  NewDevOrder
-                  );
-  FreePool (NewDevOrder);
-
-  return Status;
-}
-
-/**
-  Set Boot Priority for specified device type.
-
-  @param DeviceType      The device type.
-  @param BbsIndex        The BBS index to set the highest priority. Ignore when -1.
-  @param LocalBbsTable   The BBS table.
-  @param Priority        The prority table.
-
-  @retval EFI_SUCCESS           The function completes successfully.
-  @retval EFI_NOT_FOUND         Failed to find device.
-  @retval EFI_OUT_OF_RESOURCES  Failed to get the efi variable of device order.
-
-**/
-EFI_STATUS
-BdsSetBootPriority4SameTypeDev (
-  IN UINT16                                              DeviceType,
-  IN UINTN                                               BbsIndex,
-  IN OUT BBS_TABLE                                       *LocalBbsTable,
-  IN OUT UINT16                                          *Priority
-  )
-{
-  LEGACY_DEV_ORDER_ENTRY      *DevOrder;
-  LEGACY_DEV_ORDER_ENTRY      *DevOrderPtr;
-  UINTN                       DevOrderSize;
-  UINTN                       Index;
-
-  DevOrder = BdsLibGetVariableAndSize (
-               VAR_LEGACY_DEV_ORDER,
-               &gEfiLegacyDevOrderVariableGuid,
-               &DevOrderSize
-               );
-  if (NULL == DevOrder) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  DevOrderPtr = DevOrder;
-  while ((UINT8 *) DevOrderPtr < (UINT8 *) DevOrder + DevOrderSize) {
-    if (DevOrderPtr->BbsType == DeviceType) {
-      break;
-    }
-
-    DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *) ((UINTN) DevOrderPtr + sizeof (BBS_TYPE) + DevOrderPtr->Length);
-  }
-
-  if ((UINT8 *) DevOrderPtr >= (UINT8 *) DevOrder + DevOrderSize) {
-    FreePool (DevOrder);
-    return EFI_NOT_FOUND;
-  }
-
-  if (BbsIndex != (UINTN) -1) {
-    LocalBbsTable[BbsIndex].BootPriority = *Priority;
-    (*Priority)++;
-  }
-  //
-  // If the high byte of the DevIndex is 0xFF, it indicates that this device has been disabled.
-  //
-  for (Index = 0; Index < DevOrderPtr->Length / sizeof (UINT16) - 1; Index++) {
-    if ((DevOrderPtr->Data[Index] & 0xFF00) == 0xFF00) {
-      //
-      // LocalBbsTable[DevIndex[Index] & 0xFF].BootPriority = BBS_DISABLED_ENTRY;
-      //
-    } else if (DevOrderPtr->Data[Index] != BbsIndex) {
-      LocalBbsTable[DevOrderPtr->Data[Index]].BootPriority = *Priority;
-      (*Priority)++;
-    }
-  }
-
-  FreePool (DevOrder);
-  return EFI_SUCCESS;
-}
-
-/**
-  Print the BBS Table.
-
-  @param LocalBbsTable   The BBS table.
-  @param BbsCount        The count of entry in BBS table.
-**/
-VOID
-PrintBbsTable (
-  IN BBS_TABLE  *LocalBbsTable,
-  IN UINT16     BbsCount
-  )
-{
-  UINT16  Idx;
-
-  DEBUG ((DEBUG_ERROR, "\n"));
-  DEBUG ((DEBUG_ERROR, " NO  Prio bb/dd/ff cl/sc Type Stat segm:offs\n"));
-  DEBUG ((DEBUG_ERROR, "=============================================\n"));
-  for (Idx = 0; Idx < BbsCount; Idx++) {
-    if ((LocalBbsTable[Idx].BootPriority == BBS_IGNORE_ENTRY) ||
-        (LocalBbsTable[Idx].BootPriority == BBS_DO_NOT_BOOT_FROM) ||
-        (LocalBbsTable[Idx].BootPriority == BBS_LOWEST_PRIORITY)
-        ) {
-      continue;
-    }
-
-    DEBUG (
-      (DEBUG_ERROR,
-      " %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x %04x:%04x\n",
-      (UINTN) Idx,
-      (UINTN) LocalBbsTable[Idx].BootPriority,
-      (UINTN) LocalBbsTable[Idx].Bus,
-      (UINTN) LocalBbsTable[Idx].Device,
-      (UINTN) LocalBbsTable[Idx].Function,
-      (UINTN) LocalBbsTable[Idx].Class,
-      (UINTN) LocalBbsTable[Idx].SubClass,
-      (UINTN) LocalBbsTable[Idx].DeviceType,
-      (UINTN) * (UINT16 *) &LocalBbsTable[Idx].StatusFlags,
-      (UINTN) LocalBbsTable[Idx].BootHandlerSegment,
-      (UINTN) LocalBbsTable[Idx].BootHandlerOffset,
-      (UINTN) ((LocalBbsTable[Idx].MfgStringSegment << 4) + LocalBbsTable[Idx].MfgStringOffset),
-      (UINTN) ((LocalBbsTable[Idx].DescStringSegment << 4) + LocalBbsTable[Idx].DescStringOffset))
-      );
-  }
-
-  DEBUG ((DEBUG_ERROR, "\n"));
-}
-
-/**
-  Set the boot priority for BBS entries based on boot option entry and boot order.
-
-  @param  Entry             The boot option is to be checked for refresh BBS table.
-  
-  @retval EFI_SUCCESS           The boot priority for BBS entries is refreshed successfully.
-  @retval EFI_NOT_FOUND         BBS entries can't be found.
-  @retval EFI_OUT_OF_RESOURCES  Failed to get the legacy device boot order.
-**/
-EFI_STATUS
-EFIAPI
-BdsRefreshBbsTableForBoot (
-  IN BDS_COMMON_OPTION        *Entry
-  )
-{
-  EFI_STATUS                Status;
-  UINT16                    BbsIndex;
-  UINT16                    HddCount;
-  UINT16                    BbsCount;
-  HDD_INFO                  *LocalHddInfo;
-  BBS_TABLE                 *LocalBbsTable;
-  UINT16                    DevType;
-  EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
-  UINTN                     Index;
-  UINT16                    Priority;
-  UINT16                    *BootOrder;
-  UINTN                     BootOrderSize;
-  UINT8                     *BootOptionVar;
-  UINTN                     BootOptionSize;
-  CHAR16                    BootOption[9];
-  UINT8                     *Ptr;
-  UINT16                    DevPathLen;
-  EFI_DEVICE_PATH_PROTOCOL  *DevPath;
-  UINT16                    *DeviceType;
-  UINTN                     DeviceTypeCount;
-  UINTN                     DeviceTypeIndex;
-
-  HddCount      = 0;
-  BbsCount      = 0;
-  LocalHddInfo  = NULL;
-  LocalBbsTable = NULL;
-  DevType       = BBS_UNKNOWN;
-
-  Status        = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  LegacyBios->GetBbsInfo (
-                LegacyBios,
-                &HddCount,
-                &LocalHddInfo,
-                &BbsCount,
-                &LocalBbsTable
-                );
-  //
-  // First, set all the present devices' boot priority to BBS_UNPRIORITIZED_ENTRY
-  // We will set them according to the settings setup by user
-  //
-  for (Index = 0; Index < BbsCount; Index++) {
-    if (!((BBS_IGNORE_ENTRY == LocalBbsTable[Index].BootPriority) ||
-        (BBS_DO_NOT_BOOT_FROM == LocalBbsTable[Index].BootPriority) ||
-         (BBS_LOWEST_PRIORITY == LocalBbsTable[Index].BootPriority))) {
-      LocalBbsTable[Index].BootPriority = BBS_UNPRIORITIZED_ENTRY;
-    }
-  }
-  //
-  // boot priority always starts at 0
-  //
-  Priority = 0;
-  if (Entry->LoadOptionsSize == sizeof (BBS_TABLE) + sizeof (UINT16)) {
-    //
-    // If Entry stands for a legacy boot option, we prioritize the devices with the same type first.
-    //
-    DevType  = ((BBS_TABLE *) Entry->LoadOptions)->DeviceType;
-    BbsIndex = *(UINT16 *) ((BBS_TABLE *) Entry->LoadOptions + 1);
-    Status = BdsSetBootPriority4SameTypeDev (
-              DevType,
-              BbsIndex,
-              LocalBbsTable,
-              &Priority
-              );
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  }
-  //
-  // we have to set the boot priority for other BBS entries with different device types
-  //
-  BootOrder = BdsLibGetVariableAndSize (
-                L"BootOrder",
-                &gEfiGlobalVariableGuid,
-                &BootOrderSize
-                );
-  DeviceType = AllocatePool (BootOrderSize + sizeof (UINT16));
-  ASSERT (DeviceType != NULL);
-
-  DeviceType[0]   = DevType;
-  DeviceTypeCount = 1;
-  for (Index = 0; ((BootOrder != NULL) && (Index < BootOrderSize / sizeof (UINT16))); Index++) {
-    UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);
-    BootOptionVar = BdsLibGetVariableAndSize (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      &BootOptionSize
-                      );
-    if (NULL == BootOptionVar) {
-      continue;
-    }
-
-    Ptr = BootOptionVar;
-
-    Ptr += sizeof (UINT32);
-    DevPathLen = *(UINT16 *) Ptr;
-    Ptr += sizeof (UINT16);
-    Ptr += StrSize ((UINT16 *) Ptr);
-    DevPath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
-    if (BBS_DEVICE_PATH != DevPath->Type || BBS_BBS_DP != DevPath->SubType) {
-      FreePool (BootOptionVar);
-      continue;
-    }
-
-    Ptr += DevPathLen;
-    DevType = ((BBS_TABLE *) Ptr)->DeviceType;
-    for (DeviceTypeIndex = 0; DeviceTypeIndex < DeviceTypeCount; DeviceTypeIndex++) {
-      if (DeviceType[DeviceTypeIndex] == DevType) {
-        break;
-      }
-    }
-    if (DeviceTypeIndex < DeviceTypeCount) {
-      //
-      // We don't want to process twice for a device type
-      //
-      FreePool (BootOptionVar);
-      continue;
-    }
-
-    DeviceType[DeviceTypeCount] = DevType;
-    DeviceTypeCount++;
-
-    Status = BdsSetBootPriority4SameTypeDev (
-              DevType,
-              (UINTN) -1,
-              LocalBbsTable,
-              &Priority
-              );
-    FreePool (BootOptionVar);
-    if (EFI_ERROR (Status)) {
-      break;
-    }
-  }
-
-  FreePool (DeviceType);
-
-  if (BootOrder != NULL) {
-    FreePool (BootOrder);
-  }
-
-  DEBUG_CODE_BEGIN();
-    PrintBbsTable (LocalBbsTable, BbsCount);
-  DEBUG_CODE_END();
-
-  return Status;
-}
-
-/**
-  Boot the legacy system with the boot option
-
-  @param  Option                 The legacy boot option which have BBS device path
-
-  @retval EFI_UNSUPPORTED        There is no legacybios protocol, do not support
-                                 legacy boot.
-  @retval EFI_STATUS             Return the status of LegacyBios->LegacyBoot ().
-
-**/
-EFI_STATUS
-BdsLibDoLegacyBoot (
-  IN  BDS_COMMON_OPTION           *Option
-  )
-{
-  EFI_STATUS                Status;
-  EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
-  EFI_EVENT                 LegacyBootEvent;
-
-  Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
-  if (EFI_ERROR (Status)) {
-    //
-    // If no LegacyBios protocol we do not support legacy boot
-    //
-    return EFI_UNSUPPORTED;
-  }
-  //
-  // Notes: if we separate the int 19, then we don't need to refresh BBS
-  //
-  BdsRefreshBbsTableForBoot (Option);
-
-  //
-  // Write boot to OS performance data for legacy boot.
-  //
-  PERF_CODE (
-    //
-    // Create an event to be signalled when Legacy Boot occurs to write performance data.
-    //
-    Status = EfiCreateEventLegacyBootEx(
-               TPL_NOTIFY,
-               BmEndOfBdsPerfCode,
-               NULL, 
-               &LegacyBootEvent
-               );
-    ASSERT_EFI_ERROR (Status);
-  );
-
-  DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Legacy Boot: %S\n", Option->Description));
-  return LegacyBios->LegacyBoot (
-                      LegacyBios,
-                      (BBS_BBS_DEVICE_PATH *) Option->DevicePath,
-                      Option->LoadOptionsSize,
-                      Option->LoadOptions
-                      );
-}
-
-/**
-  Internal function to check if the input boot option is a valid EFI NV Boot####.
-
-  @param OptionToCheck  Boot option to be checked.
-
-  @retval TRUE      This boot option matches a valid EFI NV Boot####.
-  @retval FALSE     If not.
-
-**/
-BOOLEAN
-IsBootOptionValidNVVarialbe (
-  IN  BDS_COMMON_OPTION             *OptionToCheck
-  )
-{
-  LIST_ENTRY        TempList;
-  BDS_COMMON_OPTION *BootOption;
-  BOOLEAN           Valid;
-  CHAR16            OptionName[20];
-
-  Valid = FALSE;
-
-  InitializeListHead (&TempList);
-  UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", OptionToCheck->BootCurrent);
-
-  BootOption = BdsLibVariableToOption (&TempList, OptionName);
-  if (BootOption == NULL) {
-    return FALSE;
-  }
-
-  //
-  // If the Boot Option Number and Device Path matches, OptionToCheck matches a
-  // valid EFI NV Boot####.
-  //
-  if ((OptionToCheck->BootCurrent == BootOption->BootCurrent) &&
-      (CompareMem (OptionToCheck->DevicePath, BootOption->DevicePath, GetDevicePathSize (OptionToCheck->DevicePath)) == 0))
-      {
-    Valid = TRUE;
-  }
-
-  FreePool (BootOption);
-
-  return Valid;
-}
-
-/**
-  Check whether a USB device match the specified USB Class device path. This
-  function follows "Load Option Processing" behavior in UEFI specification.
-
-  @param UsbIo       USB I/O protocol associated with the USB device.
-  @param UsbClass    The USB Class device path to match.
-
-  @retval TRUE       The USB device match the USB Class device path.
-  @retval FALSE      The USB device does not match the USB Class device path.
-
-**/
-BOOLEAN
-BdsMatchUsbClass (
-  IN EFI_USB_IO_PROTOCOL        *UsbIo,
-  IN USB_CLASS_DEVICE_PATH      *UsbClass
-  )
-{
-  EFI_STATUS                    Status;
-  EFI_USB_DEVICE_DESCRIPTOR     DevDesc;
-  EFI_USB_INTERFACE_DESCRIPTOR  IfDesc;
-  UINT8                         DeviceClass;
-  UINT8                         DeviceSubClass;
-  UINT8                         DeviceProtocol;
-
-  if ((DevicePathType (UsbClass) != MESSAGING_DEVICE_PATH) ||
-      (DevicePathSubType (UsbClass) != MSG_USB_CLASS_DP)){
-    return FALSE;
-  }
-
-  //
-  // Check Vendor Id and Product Id.
-  //
-  Status = UsbIo->UsbGetDeviceDescriptor (UsbIo, &DevDesc);
-  if (EFI_ERROR (Status)) {
-    return FALSE;
-  }
-
-  if ((UsbClass->VendorId != 0xffff) &&
-      (UsbClass->VendorId != DevDesc.IdVendor)) {
-    return FALSE;
-  }
-
-  if ((UsbClass->ProductId != 0xffff) &&
-      (UsbClass->ProductId != DevDesc.IdProduct)) {
-    return FALSE;
-  }
-
-  DeviceClass    = DevDesc.DeviceClass;
-  DeviceSubClass = DevDesc.DeviceSubClass;
-  DeviceProtocol = DevDesc.DeviceProtocol;
-  if (DeviceClass == 0) {
-    //
-    // If Class in Device Descriptor is set to 0, use the Class, SubClass and
-    // Protocol in Interface Descriptor instead.
-    //
-    Status = UsbIo->UsbGetInterfaceDescriptor (UsbIo, &IfDesc);
-    if (EFI_ERROR (Status)) {
-      return FALSE;
-    }
-
-    DeviceClass    = IfDesc.InterfaceClass;
-    DeviceSubClass = IfDesc.InterfaceSubClass;
-    DeviceProtocol = IfDesc.InterfaceProtocol;
-  }
-
-  //
-  // Check Class, SubClass and Protocol.
-  //
-  if ((UsbClass->DeviceClass != 0xff) &&
-      (UsbClass->DeviceClass != DeviceClass)) {
-    return FALSE;
-  }
-
-  if ((UsbClass->DeviceSubClass != 0xff) &&
-      (UsbClass->DeviceSubClass != DeviceSubClass)) {
-    return FALSE;
-  }
-
-  if ((UsbClass->DeviceProtocol != 0xff) &&
-      (UsbClass->DeviceProtocol != DeviceProtocol)) {
-    return FALSE;
-  }
-
-  return TRUE;
-}
-
-/**
-  Check whether a USB device match the specified USB WWID device path. This
-  function follows "Load Option Processing" behavior in UEFI specification.
-
-  @param UsbIo       USB I/O protocol associated with the USB device.
-  @param UsbWwid     The USB WWID device path to match.
-
-  @retval TRUE       The USB device match the USB WWID device path.
-  @retval FALSE      The USB device does not match the USB WWID device path.
-
-**/
-BOOLEAN
-BdsMatchUsbWwid (
-  IN EFI_USB_IO_PROTOCOL        *UsbIo,
-  IN USB_WWID_DEVICE_PATH       *UsbWwid
-  )
-{
-  EFI_STATUS                   Status;
-  EFI_USB_DEVICE_DESCRIPTOR    DevDesc;
-  EFI_USB_INTERFACE_DESCRIPTOR IfDesc;
-  UINT16                       *LangIdTable;
-  UINT16                       TableSize;
-  UINT16                       Index;
-  CHAR16                       *CompareStr;
-  UINTN                        CompareLen;
-  CHAR16                       *SerialNumberStr;
-  UINTN                        Length;
-
-  if ((DevicePathType (UsbWwid) != MESSAGING_DEVICE_PATH) ||
-      (DevicePathSubType (UsbWwid) != MSG_USB_WWID_DP )){
-    return FALSE;
-  }
-
-  //
-  // Check Vendor Id and Product Id.
-  //
-  Status = UsbIo->UsbGetDeviceDescriptor (UsbIo, &DevDesc);
-  if (EFI_ERROR (Status)) {
-    return FALSE;
-  }
-  if ((DevDesc.IdVendor != UsbWwid->VendorId) ||
-      (DevDesc.IdProduct != UsbWwid->ProductId)) {
-    return FALSE;
-  }
-
-  //
-  // Check Interface Number.
-  //
-  Status = UsbIo->UsbGetInterfaceDescriptor (UsbIo, &IfDesc);
-  if (EFI_ERROR (Status)) {
-    return FALSE;
-  }
-  if (IfDesc.InterfaceNumber != UsbWwid->InterfaceNumber) {
-    return FALSE;
-  }
-
-  //
-  // Check Serial Number.
-  //
-  if (DevDesc.StrSerialNumber == 0) {
-    return FALSE;
-  }
-
-  //
-  // Get all supported languages.
-  //
-  TableSize = 0;
-  LangIdTable = NULL;
-  Status = UsbIo->UsbGetSupportedLanguages (UsbIo, &LangIdTable, &TableSize);
-  if (EFI_ERROR (Status) || (TableSize == 0) || (LangIdTable == NULL)) {
-    return FALSE;
-  }
-
-  //
-  // Serial number in USB WWID device path is the last 64-or-less UTF-16 characters.
-  //
-  CompareStr = (CHAR16 *) (UINTN) (UsbWwid + 1);
-  CompareLen = (DevicePathNodeLength (UsbWwid) - sizeof (USB_WWID_DEVICE_PATH)) / sizeof (CHAR16);
-  if (CompareStr[CompareLen - 1] == L'\0') {
-    CompareLen--;
-  }
-
-  //
-  // Compare serial number in each supported language.
-  //
-  for (Index = 0; Index < TableSize / sizeof (UINT16); Index++) {
-    SerialNumberStr = NULL;
-    Status = UsbIo->UsbGetStringDescriptor (
-                      UsbIo,
-                      LangIdTable[Index],
-                      DevDesc.StrSerialNumber,
-                      &SerialNumberStr
-                      );
-    if (EFI_ERROR (Status) || (SerialNumberStr == NULL)) {
-      continue;
-    }
-
-    Length = StrLen (SerialNumberStr);
-    if ((Length >= CompareLen) &&
-        (CompareMem (SerialNumberStr + Length - CompareLen, CompareStr, CompareLen * sizeof (CHAR16)) == 0)) {
-      FreePool (SerialNumberStr);
-      return TRUE;
-    }
-
-    FreePool (SerialNumberStr);
-  }
-
-  return FALSE;
-}
-
-/**
-  Find a USB device path which match the specified short-form device path start
-  with USB Class or USB WWID device path and load the boot file then return the 
-  image handle. If ParentDevicePath is NULL, this function will search in all USB
-  devices of the platform. If ParentDevicePath is not NULL,this function will only
-  search in its child devices.
-
-  @param ParentDevicePath      The device path of the parent.
-  @param ShortFormDevicePath   The USB Class or USB WWID device path to match.
-
-  @return  The image Handle if find load file from specified short-form device path
-           or NULL if not found.
-
-**/
-EFI_HANDLE *
-BdsFindUsbDevice (
-  IN EFI_DEVICE_PATH_PROTOCOL   *ParentDevicePath,
-  IN EFI_DEVICE_PATH_PROTOCOL   *ShortFormDevicePath
-  )
-{
-  EFI_STATUS                Status;
-  UINTN                     UsbIoHandleCount;
-  EFI_HANDLE                *UsbIoHandleBuffer;
-  EFI_DEVICE_PATH_PROTOCOL  *UsbIoDevicePath;
-  EFI_USB_IO_PROTOCOL       *UsbIo;
-  UINTN                     Index;
-  UINTN                     ParentSize;
-  UINTN                     Size;
-  EFI_HANDLE                ImageHandle;
-  EFI_HANDLE                Handle;
-  EFI_DEVICE_PATH_PROTOCOL  *FullDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *NextDevicePath;
-
-  FullDevicePath = NULL;
-  ImageHandle    = NULL;
-
-  //
-  // Get all UsbIo Handles.
-  //
-  UsbIoHandleCount = 0;
-  UsbIoHandleBuffer = NULL;
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiUsbIoProtocolGuid,
-                  NULL,
-                  &UsbIoHandleCount,
-                  &UsbIoHandleBuffer
-                  );
-  if (EFI_ERROR (Status) || (UsbIoHandleCount == 0) || (UsbIoHandleBuffer == NULL)) {
-    return NULL;
-  }
-
-  ParentSize = (ParentDevicePath == NULL) ? 0 : GetDevicePathSize (ParentDevicePath);
-  for (Index = 0; Index < UsbIoHandleCount; Index++) {
-    //
-    // Get the Usb IO interface.
-    //
-    Status = gBS->HandleProtocol(
-                    UsbIoHandleBuffer[Index],
-                    &gEfiUsbIoProtocolGuid,
-                    (VOID **) &UsbIo
-                    );
-    if (EFI_ERROR (Status)) {
-      continue;
-    }
-
-    UsbIoDevicePath = DevicePathFromHandle (UsbIoHandleBuffer[Index]);
-    if (UsbIoDevicePath == NULL) {
-      continue;
-    }
-
-    if (ParentDevicePath != NULL) {
-      //
-      // Compare starting part of UsbIoHandle's device path with ParentDevicePath.
-      //
-      Size = GetDevicePathSize (UsbIoDevicePath);
-      if ((Size < ParentSize) ||
-          (CompareMem (UsbIoDevicePath, ParentDevicePath, ParentSize - END_DEVICE_PATH_LENGTH) != 0)) {
-        continue;
-      }
-    }
-
-    if (BdsMatchUsbClass (UsbIo, (USB_CLASS_DEVICE_PATH *) ShortFormDevicePath) ||
-        BdsMatchUsbWwid (UsbIo, (USB_WWID_DEVICE_PATH *) ShortFormDevicePath)) {
-      //
-      // Try to find if there is the boot file in this DevicePath
-      //
-      NextDevicePath = NextDevicePathNode (ShortFormDevicePath);
-      if (!IsDevicePathEnd (NextDevicePath)) {
-        FullDevicePath = AppendDevicePath (UsbIoDevicePath, NextDevicePath);
-        //
-        // Connect the full device path, so that Simple File System protocol
-        // could be installed for this USB device.
-        //
-        BdsLibConnectDevicePath (FullDevicePath);
-        REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
-        Status = gBS->LoadImage (
-                       TRUE,
-                       gImageHandle,
-                       FullDevicePath,
-                       NULL,
-                       0,
-                       &ImageHandle
-                       );
-        FreePool (FullDevicePath);
-      } else {
-        FullDevicePath = UsbIoDevicePath;
-        Status = EFI_NOT_FOUND;
-      }
-
-      //
-      // If we didn't find an image directly, we need to try as if it is a removable device boot option
-      // and load the image according to the default boot behavior for removable device.
-      //
-      if (EFI_ERROR (Status)) {
-        //
-        // check if there is a bootable removable media could be found in this device path ,
-        // and get the bootable media handle
-        //
-        Handle = BdsLibGetBootableHandle(UsbIoDevicePath);
-        if (Handle == NULL) {
-          continue;
-        }
-        //
-        // Load the default boot file \EFI\BOOT\boot{machinename}.EFI from removable Media
-        //  machinename is ia32, ia64, x64, ...
-        //
-        FullDevicePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
-        if (FullDevicePath != NULL) {
-          REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
-          Status = gBS->LoadImage (
-                          TRUE,
-                          gImageHandle,
-                          FullDevicePath,
-                          NULL,
-                          0,
-                          &ImageHandle
-                          );
-          if (EFI_ERROR (Status)) {
-            //
-            // The DevicePath failed, and it's not a valid
-            // removable media device.
-            //
-            continue;
-          }
-        } else {
-          continue;
-        }
-      }
-      break;
-    }
-  }
-
-  FreePool (UsbIoHandleBuffer);
-  return ImageHandle;
-}
-
-/**
-  Expand USB Class or USB WWID device path node to be full device path of a USB
-  device in platform then load the boot file on this full device path and return the 
-  image handle.
-
-  This function support following 4 cases:
-  1) Boot Option device path starts with a USB Class or USB WWID device path,
-     and there is no Media FilePath device path in the end.
-     In this case, it will follow Removable Media Boot Behavior.
-  2) Boot Option device path starts with a USB Class or USB WWID device path,
-     and ended with Media FilePath device path.
-  3) Boot Option device path starts with a full device path to a USB Host Controller,
-     contains a USB Class or USB WWID device path node, while not ended with Media
-     FilePath device path. In this case, it will follow Removable Media Boot Behavior.
-  4) Boot Option device path starts with a full device path to a USB Host Controller,
-     contains a USB Class or USB WWID device path node, and ended with Media
-     FilePath device path.
-
-  @param  DevicePath    The Boot Option device path.
-
-  @return  The image handle of boot file, or NULL if there is no boot file found in
-           the specified USB Class or USB WWID device path.
-
-**/
-EFI_HANDLE *
-BdsExpandUsbShortFormDevicePath (
-  IN EFI_DEVICE_PATH_PROTOCOL       *DevicePath
-  )
-{
-  EFI_HANDLE                *ImageHandle;
-  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *ShortFormDevicePath;
-
-  //
-  // Search for USB Class or USB WWID device path node.
-  //
-  ShortFormDevicePath = NULL;
-  ImageHandle         = NULL;
-  TempDevicePath      = DevicePath;
-  while (!IsDevicePathEnd (TempDevicePath)) {
-    if ((DevicePathType (TempDevicePath) == MESSAGING_DEVICE_PATH) &&
-        ((DevicePathSubType (TempDevicePath) == MSG_USB_CLASS_DP) ||
-         (DevicePathSubType (TempDevicePath) == MSG_USB_WWID_DP))) {
-      ShortFormDevicePath = TempDevicePath;
-      break;
-    }
-    TempDevicePath = NextDevicePathNode (TempDevicePath);
-  }
-
-  if (ShortFormDevicePath == NULL) {
-    //
-    // No USB Class or USB WWID device path node found, do nothing.
-    //
-    return NULL;
-  }
-
-  if (ShortFormDevicePath == DevicePath) {
-    //
-    // Boot Option device path starts with USB Class or USB WWID device path.
-    //
-    ImageHandle = BdsFindUsbDevice (NULL, ShortFormDevicePath);
-    if (ImageHandle == NULL) {
-      //
-      // Failed to find a match in existing devices, connect the short form USB
-      // device path and try again.
-      //
-      BdsLibConnectUsbDevByShortFormDP (0xff, ShortFormDevicePath);
-      ImageHandle = BdsFindUsbDevice (NULL, ShortFormDevicePath);
-    }
-  } else {
-    //
-    // Boot Option device path contains USB Class or USB WWID device path node.
-    //
-
-    //
-    // Prepare the parent device path for search.
-    //
-    TempDevicePath = DuplicateDevicePath (DevicePath);
-    ASSERT (TempDevicePath != NULL);
-    SetDevicePathEndNode (((UINT8 *) TempDevicePath) + ((UINTN) ShortFormDevicePath - (UINTN) DevicePath));
-
-    //
-    // The USB Host Controller device path is already in Boot Option device path
-    // and USB Bus driver already support RemainingDevicePath starts with USB
-    // Class or USB WWID device path, so just search in existing USB devices and
-    // doesn't perform ConnectController here.
-    //
-    ImageHandle = BdsFindUsbDevice (TempDevicePath, ShortFormDevicePath);
-    FreePool (TempDevicePath);
-  }
-
-  return ImageHandle;
-}
-
-/**
-  Process the boot option follow the UEFI specification and
-  special treat the legacy boot option with BBS_DEVICE_PATH.
-
-  @param  Option                 The boot option need to be processed
-  @param  DevicePath             The device path which describe where to load the
-                                 boot image or the legacy BBS device path to boot
-                                 the legacy OS
-  @param  ExitDataSize           The size of exit data.
-  @param  ExitData               Data returned when Boot image failed.
-
-  @retval EFI_SUCCESS            Boot from the input boot option successfully.
-  @retval EFI_NOT_FOUND          If the Device Path is not found in the system
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibBootViaBootOption (
-  IN  BDS_COMMON_OPTION             *Option,
-  IN  EFI_DEVICE_PATH_PROTOCOL      *DevicePath,
-  OUT UINTN                         *ExitDataSize,
-  OUT CHAR16                        **ExitData OPTIONAL
-  )
-{
-  EFI_STATUS                Status;
-  EFI_STATUS                StatusLogo;
-  EFI_HANDLE                Handle;
-  EFI_HANDLE                ImageHandle;
-  EFI_DEVICE_PATH_PROTOCOL  *FilePath;
-  EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;
-  EFI_DEVICE_PATH_PROTOCOL  *WorkingDevicePath;
-  EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save;
-  LIST_ENTRY                TempBootLists;
-  EFI_BOOT_LOGO_PROTOCOL    *BootLogo;
-
-  *ExitDataSize = 0;
-  *ExitData     = NULL;
-
-  //
-  // Notes: this code can be remove after the s3 script table
-  // hook on the event EVT_SIGNAL_READY_TO_BOOT or
-  // EVT_SIGNAL_LEGACY_BOOT
-  //
-  Status = gBS->LocateProtocol (&gEfiAcpiS3SaveProtocolGuid, NULL, (VOID **) &AcpiS3Save);
-  if (!EFI_ERROR (Status)) {
-    AcpiS3Save->S3Save (AcpiS3Save, NULL);
-  }
-  //
-  // If it's Device Path that starts with a hard drive path, append it with the front part to compose a
-  // full device path
-  //
-  WorkingDevicePath = NULL;
-  if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) &&
-      (DevicePathSubType (DevicePath) == MEDIA_HARDDRIVE_DP)) {
-    WorkingDevicePath = BdsExpandPartitionPartialDevicePathToFull (
-                          (HARDDRIVE_DEVICE_PATH *)DevicePath
-                          );
-    if (WorkingDevicePath != NULL) {
-      DevicePath = WorkingDevicePath;
-    }
-  }
-
-  //
-  // Set Boot Current
-  //
-  if (IsBootOptionValidNVVarialbe (Option)) {
-    //
-    // For a temporary boot (i.e. a boot by selected a EFI Shell using "Boot From File"), Boot Current is actually not valid.
-    // In this case, "BootCurrent" is not created.
-    // Only create the BootCurrent variable when it points to a valid Boot#### variable.
-    //
-    SetVariableAndReportStatusCodeOnError (
-          L"BootCurrent",
-          &gEfiGlobalVariableGuid,
-          EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
-          sizeof (UINT16),
-          &Option->BootCurrent
-          );
-  }
-
-  //
-  // Report Status Code to indicate ReadyToBoot event will be signalled
-  //
-  REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT));
-
-  //
-  // Signal the EVT_SIGNAL_READY_TO_BOOT event
-  //
-  EfiSignalEventReadyToBoot();
-
-  //
-  // Expand USB Class or USB WWID device path node to be full device path of a USB
-  // device in platform then load the boot file on this full device path and get the
-  // image handle.
-  //
-  ImageHandle = BdsExpandUsbShortFormDevicePath (DevicePath);
-
-  //
-  // Adjust the different type memory page number just before booting
-  // and save the updated info into the variable for next boot to use
-  //
-  BdsSetMemoryTypeInformationVariable ();
-
-  //
-  // By expanding the USB Class or WWID device path, the ImageHandle has returnned.
-  // Here get the ImageHandle for the non USB class or WWID device path.
-  //
-  if (ImageHandle == NULL) {
-    ASSERT (Option->DevicePath != NULL);
-    if ((DevicePathType (Option->DevicePath) == BBS_DEVICE_PATH) &&
-        (DevicePathSubType (Option->DevicePath) == BBS_BBS_DP)
-       ) {
-      //
-      // Check to see if we should legacy BOOT. If yes then do the legacy boot
-      //
-      return BdsLibDoLegacyBoot (Option);
-    }
-
-    //
-    // If the boot option point to Internal FV shell, make sure it is valid
-    //
-    Status = BdsLibUpdateFvFileDevicePath (&DevicePath, &gUefiShellFileGuid);
-    if (!EFI_ERROR(Status)) {
-      if (Option->DevicePath != NULL) {
-        FreePool(Option->DevicePath);
-      }
-      Option->DevicePath  = AllocateZeroPool (GetDevicePathSize (DevicePath));
-      ASSERT(Option->DevicePath != NULL);
-      CopyMem (Option->DevicePath, DevicePath, GetDevicePathSize (DevicePath));
-      //
-      // Update the shell boot option
-      //
-      InitializeListHead (&TempBootLists);
-      BdsLibRegisterNewOption (&TempBootLists, DevicePath, L"EFI Internal Shell", L"BootOrder");
-
-      //
-      // free the temporary device path created by BdsLibUpdateFvFileDevicePath()
-      //
-      FreePool (DevicePath);
-      DevicePath = Option->DevicePath;
-    }
-
-    DEBUG_CODE_BEGIN();
-
-    if (Option->Description == NULL) {
-      DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Booting from unknown device path\n"));
-    } else {
-      DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Booting %S\n", Option->Description));
-    }
-        
-    DEBUG_CODE_END();
-  
-    //
-    // Report status code for OS Loader LoadImage.
-    //
-    REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
-    Status = gBS->LoadImage (
-                    TRUE,
-                    gImageHandle,
-                    DevicePath,
-                    NULL,
-                    0,
-                    &ImageHandle
-                    );
-
-    //
-    // If we didn't find an image directly, we need to try as if it is a removable device boot option
-    // and load the image according to the default boot behavior for removable device.
-    //
-    if (EFI_ERROR (Status)) {
-      //
-      // check if there is a bootable removable media could be found in this device path ,
-      // and get the bootable media handle
-      //
-      Handle = BdsLibGetBootableHandle(DevicePath);
-      if (Handle != NULL) {
-        //
-        // Load the default boot file \EFI\BOOT\boot{machinename}.EFI from removable Media
-        //  machinename is ia32, ia64, x64, ...
-        //
-        FilePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
-        if (FilePath != NULL) {
-          REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
-          Status = gBS->LoadImage (
-                          TRUE,
-                          gImageHandle,
-                          FilePath,
-                          NULL,
-                          0,
-                          &ImageHandle
-                          );
-        }
-      }
-    }
-  }
-  //
-  // Provide the image with it's load options
-  //
-  if ((ImageHandle == NULL) || (EFI_ERROR(Status))) {
-    //
-    // Report Status Code to indicate that the failure to load boot option
-    //
-    REPORT_STATUS_CODE (
-      EFI_ERROR_CODE | EFI_ERROR_MINOR,
-      (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR)
-      );    
-    goto Done;
-  }
-
-  Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &ImageInfo);
-  ASSERT_EFI_ERROR (Status);
-
-  if (Option->LoadOptionsSize != 0) {
-    ImageInfo->LoadOptionsSize  = Option->LoadOptionsSize;
-    ImageInfo->LoadOptions      = Option->LoadOptions;
-  }
-
-  //
-  // Clean to NULL because the image is loaded directly from the firmwares boot manager.
-  //
-  ImageInfo->ParentHandle = NULL;
-
-  //
-  // Before calling the image, enable the Watchdog Timer for
-  // the 5 Minute period
-  //
-  gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);
-
-  //
-  // Write boot to OS performance data for UEFI boot
-  //
-  PERF_CODE (
-    BmEndOfBdsPerfCode (NULL, NULL);
-  );
-
-  //
-  // Report status code for OS Loader StartImage.
-  //
-  REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderStart));
-
-  Status = gBS->StartImage (ImageHandle, ExitDataSize, ExitData);
-  DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Image Return Status = %r\n", Status));
-  if (EFI_ERROR (Status)) {
-    //
-    // Report Status Code to indicate that boot failure
-    //
-    REPORT_STATUS_CODE (
-      EFI_ERROR_CODE | EFI_ERROR_MINOR,
-      (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED)
-      );
-  }
-
-  //
-  // Clear the Watchdog Timer after the image returns
-  //
-  gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);
-
-Done:
-  //
-  // Set Logo status invalid after trying one boot option
-  //
-  BootLogo = NULL;
-  StatusLogo = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);
-  if (!EFI_ERROR (StatusLogo) && (BootLogo != NULL)) {
-    BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);
-  }
-
-  //
-  // Clear Boot Current
-  // Deleting variable with current implementation shouldn't fail.
-  //
-  gRT->SetVariable (
-        L"BootCurrent",
-        &gEfiGlobalVariableGuid,
-        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
-        0,
-        NULL
-        );
-
-  return Status;
-}
-
-
-/**
-  Expand a device path that starts with a hard drive media device path node to be a
-  full device path that includes the full hardware path to the device. We need
-  to do this so it can be booted. As an optimization the front match (the part point
-  to the partition node. E.g. ACPI() /PCI()/ATA()/Partition() ) is saved in a variable
-  so a connect all is not required on every boot. All successful history device path
-  which point to partition node (the front part) will be saved.
-
-  @param  HardDriveDevicePath    EFI Device Path to boot, if it starts with a hard
-                                 drive media device path.
-  @return A Pointer to the full device path or NULL if a valid Hard Drive devic path
-          cannot be found.
-
-**/
-EFI_DEVICE_PATH_PROTOCOL *
-EFIAPI
-BdsExpandPartitionPartialDevicePathToFull (
-  IN  HARDDRIVE_DEVICE_PATH      *HardDriveDevicePath
-  )
-{
-  EFI_STATUS                Status;
-  UINTN                     BlockIoHandleCount;
-  EFI_HANDLE                *BlockIoBuffer;
-  EFI_DEVICE_PATH_PROTOCOL  *FullDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *BlockIoDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  UINTN                     Index;
-  UINTN                     InstanceNum;
-  EFI_DEVICE_PATH_PROTOCOL  *CachedDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *TempNewDevicePath;
-  UINTN                     CachedDevicePathSize;
-  BOOLEAN                   DeviceExist;
-  BOOLEAN                   NeedAdjust;
-  EFI_DEVICE_PATH_PROTOCOL  *Instance;
-  UINTN                     Size;
-
-  FullDevicePath = NULL;
-  //
-  // Check if there is prestore HD_BOOT_DEVICE_PATH_VARIABLE_NAME variable.
-  // If exist, search the front path which point to partition node in the variable instants.
-  // If fail to find or HD_BOOT_DEVICE_PATH_VARIABLE_NAME not exist, reconnect all and search in all system
-  //
-  GetVariable2 (
-    HD_BOOT_DEVICE_PATH_VARIABLE_NAME,
-    &gHdBootDevicePathVariablGuid,
-    (VOID **) &CachedDevicePath,
-    &CachedDevicePathSize
-    );
-
-  //
-  // Delete the invalid HD_BOOT_DEVICE_PATH_VARIABLE_NAME variable.
-  //
-  if ((CachedDevicePath != NULL) && !IsDevicePathValid (CachedDevicePath, CachedDevicePathSize)) {
-    FreePool (CachedDevicePath);
-    CachedDevicePath = NULL;
-    Status = gRT->SetVariable (
-                    HD_BOOT_DEVICE_PATH_VARIABLE_NAME,
-                    &gHdBootDevicePathVariablGuid,
-                    0,
-                    0,
-                    NULL
-                    );
-    ASSERT_EFI_ERROR (Status);
-  }
-
-  if (CachedDevicePath != NULL) {
-    TempNewDevicePath = CachedDevicePath;
-    DeviceExist = FALSE;
-    NeedAdjust = FALSE;
-    do {
-      //
-      // Check every instance of the variable
-      // First, check whether the instance contain the partition node, which is needed for distinguishing  multi
-      // partial partition boot option. Second, check whether the instance could be connected.
-      //
-      Instance  = GetNextDevicePathInstance (&TempNewDevicePath, &Size);
-      if (MatchPartitionDevicePathNode (Instance, HardDriveDevicePath)) {
-        //
-        // Connect the device path instance, the device path point to hard drive media device path node
-        // e.g. ACPI() /PCI()/ATA()/Partition()
-        //
-        Status = BdsLibConnectDevicePath (Instance);
-        if (!EFI_ERROR (Status)) {
-          DeviceExist = TRUE;
-          break;
-        }
-      }
-      //
-      // Come here means the first instance is not matched
-      //
-      NeedAdjust = TRUE;
-      FreePool(Instance);
-    } while (TempNewDevicePath != NULL);
-
-    if (DeviceExist) {
-      //
-      // Find the matched device path.
-      // Append the file path information from the boot option and return the fully expanded device path.
-      //
-      DevicePath     = NextDevicePathNode ((EFI_DEVICE_PATH_PROTOCOL *) HardDriveDevicePath);
-      FullDevicePath = AppendDevicePath (Instance, DevicePath);
-
-      //
-      // Adjust the HD_BOOT_DEVICE_PATH_VARIABLE_NAME instances sequence if the matched one is not first one.
-      //
-      if (NeedAdjust) {
-        //
-        // First delete the matched instance.
-        //
-        TempNewDevicePath = CachedDevicePath;
-        CachedDevicePath  = BdsLibDelPartMatchInstance (CachedDevicePath, Instance );
-        FreePool (TempNewDevicePath);
-
-        //
-        // Second, append the remaining path after the matched instance
-        //
-        TempNewDevicePath = CachedDevicePath;
-        CachedDevicePath = AppendDevicePathInstance (Instance, CachedDevicePath );
-        FreePool (TempNewDevicePath);
-        //
-        // Save the matching Device Path so we don't need to do a connect all next time
-        // Failure to set the variable only impacts the performance when next time expanding the short-form device path.
-        //
-        Status = gRT->SetVariable (
-                        HD_BOOT_DEVICE_PATH_VARIABLE_NAME,
-                        &gHdBootDevicePathVariablGuid,
-                        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                        GetDevicePathSize (CachedDevicePath),
-                        CachedDevicePath
-                        );
-      }
-
-      FreePool (Instance);
-      FreePool (CachedDevicePath);
-      return FullDevicePath;
-    }
-  }
-
-  //
-  // If we get here we fail to find or HD_BOOT_DEVICE_PATH_VARIABLE_NAME not exist, and now we need
-  // to search all devices in the system for a matched partition
-  //
-  BdsLibConnectAllDriversToAllControllers ();
-  Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &BlockIoHandleCount, &BlockIoBuffer);
-  if (EFI_ERROR (Status) || BlockIoHandleCount == 0 || BlockIoBuffer == NULL) {
-    //
-    // If there was an error or there are no device handles that support
-    // the BLOCK_IO Protocol, then return.
-    //
-    return NULL;
-  }
-  //
-  // Loop through all the device handles that support the BLOCK_IO Protocol
-  //
-  for (Index = 0; Index < BlockIoHandleCount; Index++) {
-
-    Status = gBS->HandleProtocol (BlockIoBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID *) &BlockIoDevicePath);
-    if (EFI_ERROR (Status) || BlockIoDevicePath == NULL) {
-      continue;
-    }
-
-    if (MatchPartitionDevicePathNode (BlockIoDevicePath, HardDriveDevicePath)) {
-      //
-      // Find the matched partition device path
-      //
-      DevicePath    = NextDevicePathNode ((EFI_DEVICE_PATH_PROTOCOL *) HardDriveDevicePath);
-      FullDevicePath = AppendDevicePath (BlockIoDevicePath, DevicePath);
-
-      //
-      // Save the matched partition device path in HD_BOOT_DEVICE_PATH_VARIABLE_NAME variable
-      //
-      if (CachedDevicePath != NULL) {
-        //
-        // Save the matched partition device path as first instance of HD_BOOT_DEVICE_PATH_VARIABLE_NAME variable
-        //
-        if (BdsLibMatchDevicePaths (CachedDevicePath, BlockIoDevicePath)) {
-          TempNewDevicePath = CachedDevicePath;
-          CachedDevicePath = BdsLibDelPartMatchInstance (CachedDevicePath, BlockIoDevicePath);
-          FreePool(TempNewDevicePath);
-        }
-
-        if (CachedDevicePath != NULL) {
-          TempNewDevicePath = CachedDevicePath;
-          CachedDevicePath = AppendDevicePathInstance (BlockIoDevicePath, CachedDevicePath);
-          FreePool(TempNewDevicePath);
-        } else {
-          CachedDevicePath = DuplicateDevicePath (BlockIoDevicePath);
-        }
-
-        //
-        // Here limit the device path instance number to 12, which is max number for a system support 3 IDE controller
-        // If the user try to boot many OS in different HDs or partitions, in theory, 
-        // the HD_BOOT_DEVICE_PATH_VARIABLE_NAME variable maybe become larger and larger.
-        //
-        InstanceNum = 0;
-        ASSERT (CachedDevicePath != NULL);
-        TempNewDevicePath = CachedDevicePath;
-        while (!IsDevicePathEnd (TempNewDevicePath)) {
-          TempNewDevicePath = NextDevicePathNode (TempNewDevicePath);
-          //
-          // Parse one instance
-          //
-          while (!IsDevicePathEndType (TempNewDevicePath)) {
-            TempNewDevicePath = NextDevicePathNode (TempNewDevicePath);
-          }
-          InstanceNum++;
-          //
-          // If the CachedDevicePath variable contain too much instance, only remain 12 instances.
-          //
-          if (InstanceNum >= 12) {
-            SetDevicePathEndNode (TempNewDevicePath);
-            break;
-          }
-        }
-      } else {
-        CachedDevicePath = DuplicateDevicePath (BlockIoDevicePath);
-      }
-
-      //
-      // Save the matching Device Path so we don't need to do a connect all next time
-      // Failure to set the variable only impacts the performance when next time expanding the short-form device path.
-      //
-      Status = gRT->SetVariable (
-                      HD_BOOT_DEVICE_PATH_VARIABLE_NAME,
-                      &gHdBootDevicePathVariablGuid,
-                      EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                      GetDevicePathSize (CachedDevicePath),
-                      CachedDevicePath
-                      );
-
-      break;
-    }
-  }
-
-  if (CachedDevicePath != NULL) {
-    FreePool (CachedDevicePath);
-  }
-  if (BlockIoBuffer != NULL) {
-    FreePool (BlockIoBuffer);
-  }
-  return FullDevicePath;
-}
-
-/**
-  Check whether there is a instance in BlockIoDevicePath, which contain multi device path
-  instances, has the same partition node with HardDriveDevicePath device path
-
-  @param  BlockIoDevicePath      Multi device path instances which need to check
-  @param  HardDriveDevicePath    A device path which starts with a hard drive media
-                                 device path.
-
-  @retval TRUE                   There is a matched device path instance.
-  @retval FALSE                  There is no matched device path instance.
-
-**/
-BOOLEAN
-EFIAPI
-MatchPartitionDevicePathNode (
-  IN  EFI_DEVICE_PATH_PROTOCOL   *BlockIoDevicePath,
-  IN  HARDDRIVE_DEVICE_PATH      *HardDriveDevicePath
-  )
-{
-  HARDDRIVE_DEVICE_PATH     *TmpHdPath;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  BOOLEAN                   Match;
-  EFI_DEVICE_PATH_PROTOCOL  *BlockIoHdDevicePathNode;
-
-  if ((BlockIoDevicePath == NULL) || (HardDriveDevicePath == NULL)) {
-    return FALSE;
-  }
-
-  //
-  // Make PreviousDevicePath == the device path node before the end node
-  //
-  DevicePath              = BlockIoDevicePath;
-  BlockIoHdDevicePathNode = NULL;
-
-  //
-  // find the partition device path node
-  //
-  while (!IsDevicePathEnd (DevicePath)) {
-    if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) &&
-        (DevicePathSubType (DevicePath) == MEDIA_HARDDRIVE_DP)
-        ) {
-      BlockIoHdDevicePathNode = DevicePath;
-      break;
-    }
-
-    DevicePath = NextDevicePathNode (DevicePath);
-  }
-
-  if (BlockIoHdDevicePathNode == NULL) {
-    return FALSE;
-  }
-  //
-  // See if the harddrive device path in blockio matches the orig Hard Drive Node
-  //
-  TmpHdPath = (HARDDRIVE_DEVICE_PATH *) BlockIoHdDevicePathNode;
-  Match = FALSE;
-
-  //
-  // Check for the match
-  //
-  if ((TmpHdPath->MBRType == HardDriveDevicePath->MBRType) &&
-      (TmpHdPath->SignatureType == HardDriveDevicePath->SignatureType)) {
-    switch (TmpHdPath->SignatureType) {
-    case SIGNATURE_TYPE_GUID:
-      Match = CompareGuid ((EFI_GUID *)TmpHdPath->Signature, (EFI_GUID *)HardDriveDevicePath->Signature);
-      break;
-    case SIGNATURE_TYPE_MBR:
-      Match = (BOOLEAN)(*((UINT32 *)(&(TmpHdPath->Signature[0]))) == ReadUnaligned32((UINT32 *)(&(HardDriveDevicePath->Signature[0]))));
-      break;
-    default:
-      Match = FALSE;
-      break;
-    }
-  }
-
-  return Match;
-}
-
-/**
-  Delete the boot option associated with the handle passed in.
-
-  @param  Handle                 The handle which present the device path to create
-                                 boot option
-
-  @retval EFI_SUCCESS            Delete the boot option success
-  @retval EFI_NOT_FOUND          If the Device Path is not found in the system
-  @retval EFI_OUT_OF_RESOURCES   Lack of memory resource
-  @retval Other                  Error return value from SetVariable()
-
-**/
-EFI_STATUS
-BdsLibDeleteOptionFromHandle (
-  IN  EFI_HANDLE                 Handle
-  )
-{
-  UINT16                    *BootOrder;
-  UINT8                     *BootOptionVar;
-  UINTN                     BootOrderSize;
-  UINTN                     BootOptionSize;
-  EFI_STATUS                Status;
-  UINTN                     Index;
-  UINT16                    BootOption[BOOT_OPTION_MAX_CHAR];
-  UINTN                     DevicePathSize;
-  UINTN                     OptionDevicePathSize;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *OptionDevicePath;
-  UINT8                     *TempPtr;
-
-  Status        = EFI_SUCCESS;
-  BootOrder     = NULL;
-  BootOrderSize = 0;
-
-  //
-  // Check "BootOrder" variable, if no, means there is no any boot order.
-  //
-  BootOrder = BdsLibGetVariableAndSize (
-                L"BootOrder",
-                &gEfiGlobalVariableGuid,
-                &BootOrderSize
-                );
-  if (BootOrder == NULL) {
-    return EFI_NOT_FOUND;
-  }
-
-  //
-  // Convert device handle to device path protocol instance
-  //
-  DevicePath = DevicePathFromHandle (Handle);
-  if (DevicePath == NULL) {
-    return EFI_NOT_FOUND;
-  }
-  DevicePathSize = GetDevicePathSize (DevicePath);
-
-  //
-  // Loop all boot order variable and find the matching device path
-  //
-  Index = 0;
-  while (Index < BootOrderSize / sizeof (UINT16)) {
-    UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);
-    BootOptionVar = BdsLibGetVariableAndSize (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      &BootOptionSize
-                      );
-
-    if (BootOptionVar == NULL) {
-      FreePool (BootOrder);
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    if (!ValidateOption(BootOptionVar, BootOptionSize)) {
-      BdsDeleteBootOption (BootOrder[Index], BootOrder, &BootOrderSize);
-      FreePool (BootOptionVar);
-      Index++;
-      continue;
-    }
-
-    TempPtr = BootOptionVar;
-    TempPtr += sizeof (UINT32) + sizeof (UINT16);
-    TempPtr += StrSize ((CHAR16 *) TempPtr);
-    OptionDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;
-    OptionDevicePathSize = GetDevicePathSize (OptionDevicePath);
-
-    //
-    // Check whether the device path match
-    //
-    if ((OptionDevicePathSize == DevicePathSize) &&
-        (CompareMem (DevicePath, OptionDevicePath, DevicePathSize) == 0)) {
-      BdsDeleteBootOption (BootOrder[Index], BootOrder, &BootOrderSize);
-      FreePool (BootOptionVar);
-      break;
-    }
-
-    FreePool (BootOptionVar);
-    Index++;
-  }
-
-  //
-  // Adjust number of boot option for "BootOrder" variable.
-  //
-  Status = gRT->SetVariable (
-                  L"BootOrder",
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  BootOrderSize,
-                  BootOrder
-                  );
-  //
-  // Shrinking variable with existing variable implementation shouldn't fail.
-  //
-  ASSERT_EFI_ERROR (Status);
-
-  FreePool (BootOrder);
-
-  return Status;
-}
-
-
-/**
-  Delete all invalid EFI boot options.
-
-  @retval EFI_SUCCESS            Delete all invalid boot option success
-  @retval EFI_NOT_FOUND          Variable "BootOrder" is not found
-  @retval EFI_OUT_OF_RESOURCES   Lack of memory resource
-  @retval Other                  Error return value from SetVariable()
-
-**/
-EFI_STATUS
-BdsDeleteAllInvalidEfiBootOption (
-  VOID
-  )
-{
-  UINT16                    *BootOrder;
-  UINT8                     *BootOptionVar;
-  UINTN                     BootOrderSize;
-  UINTN                     BootOptionSize;
-  EFI_STATUS                Status;
-  UINTN                     Index;
-  UINTN                     Index2;
-  UINT16                    BootOption[BOOT_OPTION_MAX_CHAR];
-  EFI_DEVICE_PATH_PROTOCOL  *OptionDevicePath;
-  UINT8                     *TempPtr;
-  CHAR16                    *Description;
-  BOOLEAN                   Corrupted;
-
-  Status           = EFI_SUCCESS;
-  BootOrder        = NULL;
-  Description      = NULL;
-  OptionDevicePath = NULL;
-  BootOrderSize    = 0;
-  Corrupted        = FALSE;
-
-  //
-  // Check "BootOrder" variable firstly, this variable hold the number of boot options
-  //
-  BootOrder = BdsLibGetVariableAndSize (
-                L"BootOrder",
-                &gEfiGlobalVariableGuid,
-                &BootOrderSize
-                );
-  if (NULL == BootOrder) {
-    return EFI_NOT_FOUND;
-  }
-
-  Index = 0;
-  while (Index < BootOrderSize / sizeof (UINT16)) {
-    UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);
-    BootOptionVar = BdsLibGetVariableAndSize (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      &BootOptionSize
-                      );
-    if (NULL == BootOptionVar) {
-      FreePool (BootOrder);
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    if (!ValidateOption(BootOptionVar, BootOptionSize)) {
-      Corrupted = TRUE;
-    } else {
-      TempPtr = BootOptionVar;
-      TempPtr += sizeof (UINT32) + sizeof (UINT16);
-      Description = (CHAR16 *) TempPtr;
-      TempPtr += StrSize ((CHAR16 *) TempPtr);
-      OptionDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;
-
-      //
-      // Skip legacy boot option (BBS boot device)
-      //
-      if ((DevicePathType (OptionDevicePath) == BBS_DEVICE_PATH) &&
-          (DevicePathSubType (OptionDevicePath) == BBS_BBS_DP)) {
-        FreePool (BootOptionVar);
-        Index++;
-        continue;
-      }
-    }
-
-    if (Corrupted || !BdsLibIsValidEFIBootOptDevicePathExt (OptionDevicePath, FALSE, Description)) {
-      //
-      // Delete this invalid boot option "Boot####"
-      //
-      Status = gRT->SetVariable (
-                      BootOption,
-                      &gEfiGlobalVariableGuid,
-                      EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                      0,
-                      NULL
-                      );
-      //
-      // Deleting variable with current variable implementation shouldn't fail.
-      //
-      ASSERT_EFI_ERROR (Status);
-      //
-      // Mark this boot option in boot order as deleted
-      //
-      BootOrder[Index] = 0xffff;
-      Corrupted        = FALSE;
-    }
-
-    FreePool (BootOptionVar);
-    Index++;
-  }
-
-  //
-  // Adjust boot order array
-  //
-  Index2 = 0;
-  for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {
-    if (BootOrder[Index] != 0xffff) {
-      BootOrder[Index2] = BootOrder[Index];
-      Index2 ++;
-    }
-  }
-  Status = gRT->SetVariable (
-                  L"BootOrder",
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  Index2 * sizeof (UINT16),
-                  BootOrder
-                  );
-  //
-  // Shrinking variable with current variable implementation shouldn't fail.
-  //
-  ASSERT_EFI_ERROR (Status);
-
-  FreePool (BootOrder);
-
-  return Status;
-}
-
-
-/**
-  For EFI boot option, BDS separate them as six types:
-  1. Network - The boot option points to the SimpleNetworkProtocol device.
-               Bds will try to automatically create this type boot option when enumerate.
-  2. Shell   - The boot option points to internal flash shell.
-               Bds will try to automatically create this type boot option when enumerate.
-  3. Removable BlockIo      - The boot option only points to the removable media
-                              device, like USB flash disk, DVD, Floppy etc.
-                              These device should contain a *removable* blockIo
-                              protocol in their device handle.
-                              Bds will try to automatically create this type boot option
-                              when enumerate.
-  4. Fixed BlockIo          - The boot option only points to a Fixed blockIo device,
-                              like HardDisk.
-                              These device should contain a *fixed* blockIo
-                              protocol in their device handle.
-                              BDS will skip fixed blockIo devices, and NOT
-                              automatically create boot option for them. But BDS
-                              will help to delete those fixed blockIo boot option,
-                              whose description rule conflict with other auto-created
-                              boot options.
-  5. Non-BlockIo Simplefile - The boot option points to a device whose handle
-                              has SimpleFileSystem Protocol, but has no blockio
-                              protocol. These devices do not offer blockIo
-                              protocol, but BDS still can get the
-                              \EFI\BOOT\boot{machinename}.EFI by SimpleFileSystem
-                              Protocol.
-  6. File    - The boot option points to a file. These boot options are usually
-               created by user manually or OS loader. BDS will not delete or modify
-               these boot options.
-
-  This function will enumerate all possible boot device in the system, and
-  automatically create boot options for Network, Shell, Removable BlockIo,
-  and Non-BlockIo Simplefile devices.
-  It will only execute once of every boot.
-
-  @param  BdsBootOptionList      The header of the link list which indexed all
-                                 current boot options
-
-  @retval EFI_SUCCESS            Finished all the boot device enumerate and create
-                                 the boot option base on that boot device
-
-  @retval EFI_OUT_OF_RESOURCES   Failed to enumerate the boot device and create the boot option list
-**/
-EFI_STATUS
-EFIAPI
-BdsLibEnumerateAllBootOption (
-  IN OUT LIST_ENTRY          *BdsBootOptionList
-  )
-{
-  EFI_STATUS                    Status;
-  UINT16                        FloppyNumber;
-  UINT16                        HarddriveNumber;
-  UINT16                        CdromNumber;
-  UINT16                        UsbNumber;
-  UINT16                        MiscNumber;
-  UINT16                        ScsiNumber;
-  UINT16                        NonBlockNumber;
-  UINTN                         NumberBlockIoHandles;
-  EFI_HANDLE                    *BlockIoHandles;
-  EFI_BLOCK_IO_PROTOCOL         *BlkIo;
-  BOOLEAN                       Removable[2];
-  UINTN                         RemovableIndex;
-  UINTN                         Index;
-  UINTN                         NumOfLoadFileHandles;
-  EFI_HANDLE                    *LoadFileHandles;
-  UINTN                         FvHandleCount;
-  EFI_HANDLE                    *FvHandleBuffer;
-  EFI_FV_FILETYPE               Type;
-  UINTN                         Size;
-  EFI_FV_FILE_ATTRIBUTES        Attributes;
-  UINT32                        AuthenticationStatus;
-  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
-  EFI_DEVICE_PATH_PROTOCOL      *DevicePath;
-  UINTN                         DevicePathType;
-  CHAR16                        Buffer[40];
-  EFI_HANDLE                    *FileSystemHandles;
-  UINTN                         NumberFileSystemHandles;
-  BOOLEAN                       NeedDelete;
-  EFI_IMAGE_DOS_HEADER          DosHeader;
-  CHAR8                         *PlatLang;
-  CHAR8                         *LastLang;
-  EFI_IMAGE_OPTIONAL_HEADER_UNION       HdrData;
-  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;
-  CHAR16                        *MacStr;
-  CHAR16                        *IPverStr;
-  EFI_HANDLE                    *NetworkHandles;
-  UINTN                         BufferSize;
-
-  FloppyNumber    = 0;
-  HarddriveNumber = 0;
-  CdromNumber     = 0;
-  UsbNumber       = 0;
-  MiscNumber      = 0;
-  ScsiNumber      = 0;
-  PlatLang        = NULL;
-  LastLang        = NULL;
-  ZeroMem (Buffer, sizeof (Buffer));
-
-  //
-  // If the boot device enumerate happened, just get the boot
-  // device from the boot order variable
-  //
-  if (mEnumBootDevice) {
-    GetVariable2 (LAST_ENUM_LANGUAGE_VARIABLE_NAME, &gLastEnumLangGuid, (VOID**)&LastLang, NULL);
-    GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&PlatLang, NULL);
-    ASSERT (PlatLang != NULL);
-    if ((LastLang != NULL) && (AsciiStrCmp (LastLang, PlatLang) == 0)) {
-      Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");
-      FreePool (LastLang);
-      FreePool (PlatLang);
-      return Status;
-    } else {
-      Status = gRT->SetVariable (
-        LAST_ENUM_LANGUAGE_VARIABLE_NAME,
-        &gLastEnumLangGuid,
-        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-        AsciiStrSize (PlatLang),
-        PlatLang
-        );
-      //
-      // Failure to set the variable only impacts the performance next time enumerating the boot options.
-      //
-
-      if (LastLang != NULL) {
-        FreePool (LastLang);
-      }
-      FreePool (PlatLang);
-    }
-  }
-
-  //
-  // Notes: this dirty code is to get the legacy boot option from the
-  // BBS table and create to variable as the EFI boot option, it should
-  // be removed after the CSM can provide legacy boot option directly
-  //
-  REFRESH_LEGACY_BOOT_OPTIONS;
-
-  //
-  // Delete invalid boot option
-  //
-  BdsDeleteAllInvalidEfiBootOption ();
-
-  //
-  // Parse removable media followed by fixed media.
-  // The Removable[] array is used by the for-loop below to create removable media boot options 
-  // at first, and then to create fixed media boot options.
-  //
-  Removable[0]  = FALSE;
-  Removable[1]  = TRUE;
-
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiBlockIoProtocolGuid,
-        NULL,
-        &NumberBlockIoHandles,
-        &BlockIoHandles
-        );
-
-  for (RemovableIndex = 0; RemovableIndex < 2; RemovableIndex++) {
-    for (Index = 0; Index < NumberBlockIoHandles; Index++) {
-      Status = gBS->HandleProtocol (
-                      BlockIoHandles[Index],
-                      &gEfiBlockIoProtocolGuid,
-                      (VOID **) &BlkIo
-                      );
-      //
-      // skip the logical partition
-      //
-      if (EFI_ERROR (Status) || BlkIo->Media->LogicalPartition) {
-        continue;
-      }
-
-      //
-      // firstly fixed block io then the removable block io
-      //
-      if (BlkIo->Media->RemovableMedia == Removable[RemovableIndex]) {
-        continue;
-      }
-      DevicePath  = DevicePathFromHandle (BlockIoHandles[Index]);
-      DevicePathType = BdsGetBootTypeFromDevicePath (DevicePath);
-
-      switch (DevicePathType) {
-      case BDS_EFI_ACPI_FLOPPY_BOOT:
-        if (FloppyNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)), FloppyNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        FloppyNumber++;
-        break;
-
-      //
-      // Assume a removable SATA device should be the DVD/CD device, a fixed SATA device should be the Hard Drive device.
-      //
-      case BDS_EFI_MESSAGE_ATAPI_BOOT:
-      case BDS_EFI_MESSAGE_SATA_BOOT:
-        if (BlkIo->Media->RemovableMedia) {
-          if (CdromNumber != 0) {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)), CdromNumber);
-          } else {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)));
-          }
-          CdromNumber++;
-        } else {
-          if (HarddriveNumber != 0) {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)), HarddriveNumber);
-          } else {
-            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)));
-          }
-          HarddriveNumber++;
-        }
-        DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Buffer: %S\n", Buffer));
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        break;
-
-      case BDS_EFI_MESSAGE_USB_DEVICE_BOOT:
-        if (UsbNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)), UsbNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        UsbNumber++;
-        break;
-
-      case BDS_EFI_MESSAGE_SCSI_BOOT:
-        if (ScsiNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)), ScsiNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        ScsiNumber++;
-        break;
-
-      case BDS_EFI_MESSAGE_MISC_BOOT:
-      default:
-        if (MiscNumber != 0) {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)), MiscNumber);
-        } else {
-          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)));
-        }
-        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);
-        MiscNumber++;
-        break;
-      }
-    }
-  }
-
-  if (NumberBlockIoHandles != 0) {
-    FreePool (BlockIoHandles);
-  }
-
-  //
-  // If there is simple file protocol which does not consume block Io protocol, create a boot option for it here.
-  //
-  NonBlockNumber = 0;
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiSimpleFileSystemProtocolGuid,
-        NULL,
-        &NumberFileSystemHandles,
-        &FileSystemHandles
-        );
-  for (Index = 0; Index < NumberFileSystemHandles; Index++) {
-    Status = gBS->HandleProtocol (
-                    FileSystemHandles[Index],
-                    &gEfiBlockIoProtocolGuid,
-                    (VOID **) &BlkIo
-                    );
-     if (!EFI_ERROR (Status)) {
-      //
-      //  Skip if the file system handle supports a BlkIo protocol,
-      //
-      continue;
-    }
-
-    //
-    // Do the removable Media thing. \EFI\BOOT\boot{machinename}.EFI
-    //  machinename is ia32, ia64, x64, ...
-    //
-    Hdr.Union  = &HdrData;
-    NeedDelete = TRUE;
-    Status     = BdsLibGetImageHeader (
-                   FileSystemHandles[Index],
-                   EFI_REMOVABLE_MEDIA_FILE_NAME,
-                   &DosHeader,
-                   Hdr
-                   );
-    if (!EFI_ERROR (Status) &&
-        EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Hdr.Pe32->FileHeader.Machine) &&
-        Hdr.Pe32->OptionalHeader.Subsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {
-      NeedDelete = FALSE;
-    }
-
-    if (NeedDelete) {
-      //
-      // No such file or the file is not a EFI application, delete this boot option
-      //
-      BdsLibDeleteOptionFromHandle (FileSystemHandles[Index]);
-    } else {
-      if (NonBlockNumber != 0) {
-        UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)), NonBlockNumber);
-      } else {
-        UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)));
-      }
-      BdsLibBuildOptionFromHandle (FileSystemHandles[Index], BdsBootOptionList, Buffer);
-      NonBlockNumber++;
-    }
-  }
-
-  if (NumberFileSystemHandles != 0) {
-    FreePool (FileSystemHandles);
-  }
-
-  //
-  // Parse Network Boot Device
-  //
-  NumOfLoadFileHandles = 0;
-  //
-  // Search Load File protocol for PXE boot option.
-  //
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiLoadFileProtocolGuid,
-        NULL,
-        &NumOfLoadFileHandles,
-        &LoadFileHandles
-        );
-
-  for (Index = 0; Index < NumOfLoadFileHandles; Index++) {
-
-//
-//Locate EFI_DEVICE_PATH_PROTOCOL to dynamically get IPv4/IPv6 protocol information.
-//
-
- Status = gBS->HandleProtocol (
-                  LoadFileHandles[Index],
-                  &gEfiDevicePathProtocolGuid,
-                  (VOID **) &DevicePath
-                  );
-  
- ASSERT_EFI_ERROR (Status);
-
-  while (!IsDevicePathEnd (DevicePath)) {
-    if ((DevicePath->Type == MESSAGING_DEVICE_PATH) &&
-        (DevicePath->SubType == MSG_IPv4_DP)) {
-
-  //
-  //Get handle infomation
-  //
-  BufferSize = 0;
-  NetworkHandles = NULL;
-  Status = gBS->LocateHandle (
-                  ByProtocol, 
-                  &gEfiSimpleNetworkProtocolGuid,
-                  NULL,
-                  &BufferSize,
-                  NetworkHandles
-                  );
-
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    NetworkHandles = AllocateZeroPool(BufferSize);
-    if (NetworkHandles == NULL) {
-      return (EFI_OUT_OF_RESOURCES);
-    }
-    Status = gBS->LocateHandle(
-                    ByProtocol,
-                    &gEfiSimpleNetworkProtocolGuid,
-                    NULL,
-                    &BufferSize,
-                    NetworkHandles
-                    );
- }
-               
-  //
-  //Get the MAC string
-  //
-  Status = NetLibGetMacString (
-             *NetworkHandles,
-             NULL,
-             &MacStr
-             );
-  if (EFI_ERROR (Status)) {	
-    return Status;
-  }
-  IPverStr = L" IPv4";
-  UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr);
-  break;
-  }
-    if((DevicePath->Type == MESSAGING_DEVICE_PATH) &&
-        (DevicePath->SubType == MSG_IPv6_DP)) {
-
-  //
-  //Get handle infomation
-  //
-  BufferSize = 0;
-  NetworkHandles = NULL;
-  Status = gBS->LocateHandle (
-                  ByProtocol, 
-                  &gEfiSimpleNetworkProtocolGuid,
-                  NULL,
-                  &BufferSize,
-                  NetworkHandles
-                  );
-
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    NetworkHandles = AllocateZeroPool(BufferSize);
-    if (NetworkHandles == NULL) {
-       return (EFI_OUT_OF_RESOURCES);
-    }
-    Status = gBS->LocateHandle(
-                    ByProtocol,
-                    &gEfiSimpleNetworkProtocolGuid,
-                    NULL,
-                    &BufferSize,
-                    NetworkHandles
-                    );
- }
-                    
-  //
-  //Get the MAC string
-  //
-  Status = NetLibGetMacString (
-             *NetworkHandles,
-             NULL,
-             &MacStr
-             );
-  if (EFI_ERROR (Status)) {	
-    return Status;
-  }
-      IPverStr = L" IPv6";
-      UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr);
-      break;
-    }
-    DevicePath = NextDevicePathNode (DevicePath);
-  }
-  
-    BdsLibBuildOptionFromHandle (LoadFileHandles[Index], BdsBootOptionList, Buffer);
-  }
-
-  if (NumOfLoadFileHandles != 0) {
-    FreePool (LoadFileHandles);
-  }
-
-  //
-  // Check if we have on flash shell
-  //
-  gBS->LocateHandleBuffer (
-        ByProtocol,
-        &gEfiFirmwareVolume2ProtocolGuid,
-        NULL,
-        &FvHandleCount,
-        &FvHandleBuffer
-        );
-  for (Index = 0; Index < FvHandleCount; Index++) {
-    gBS->HandleProtocol (
-          FvHandleBuffer[Index],
-          &gEfiFirmwareVolume2ProtocolGuid,
-          (VOID **) &Fv
-          );
-
-    Status = Fv->ReadFile (
-                  Fv,
-                  &gUefiShellFileGuid,
-                  NULL,
-                  &Size,
-                  &Type,
-                  &Attributes,
-                  &AuthenticationStatus
-                  );
-    if (EFI_ERROR (Status)) {
-      //
-      // Skip if no shell file in the FV
-      //
-      continue;
-    }
-    //
-    // Build the shell boot option
-    //
-    BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList);
-  }
-
-  if (FvHandleCount != 0) {
-    FreePool (FvHandleBuffer);
-  }
-  //
-  // Make sure every boot only have one time
-  // boot device enumerate
-  //
-  Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");
-  mEnumBootDevice = TRUE;
-
-  return Status;
-}
-
-/**
-  Build the boot option with the handle parsed in
-
-  @param  Handle                 The handle which present the device path to create
-                                 boot option
-  @param  BdsBootOptionList      The header of the link list which indexed all
-                                 current boot options
-  @param  String                 The description of the boot option.
-
-**/
-VOID
-EFIAPI
-BdsLibBuildOptionFromHandle (
-  IN  EFI_HANDLE                 Handle,
-  IN  LIST_ENTRY                 *BdsBootOptionList,
-  IN  CHAR16                     *String
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-
-  DevicePath = DevicePathFromHandle (Handle);
-
-  //
-  // Create and register new boot option
-  //
-  BdsLibRegisterNewOption (BdsBootOptionList, DevicePath, String, L"BootOrder");
-}
-
-
-/**
-  Build the on flash shell boot option with the handle parsed in.
-
-  @param  Handle                 The handle which present the device path to create
-                                 on flash shell boot option
-  @param  BdsBootOptionList      The header of the link list which indexed all
-                                 current boot options
-
-**/
-VOID
-EFIAPI
-BdsLibBuildOptionFromShell (
-  IN EFI_HANDLE                  Handle,
-  IN OUT LIST_ENTRY              *BdsBootOptionList
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL          *DevicePath;
-  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH ShellNode;
-
-  DevicePath = DevicePathFromHandle (Handle);
-
-  //
-  // Build the shell device path
-  //
-  EfiInitializeFwVolDevicepathNode (&ShellNode, &gUefiShellFileGuid);
-
-  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *) &ShellNode);
-
-  //
-  // Create and register the shell boot option
-  //
-  BdsLibRegisterNewOption (BdsBootOptionList, DevicePath, L"EFI Internal Shell", L"BootOrder");
-
-}
-
-/**
-  Boot from the UEFI spec defined "BootNext" variable.
-
-**/
-VOID
-EFIAPI
-BdsLibBootNext (
-  VOID
-  )
-{
-  EFI_STATUS        Status;
-  UINT16            *BootNext;
-  UINTN             BootNextSize;
-  CHAR16            Buffer[20];
-  BDS_COMMON_OPTION *BootOption;
-  LIST_ENTRY        TempList;
-  UINTN             ExitDataSize;
-  CHAR16            *ExitData;
-
-  //
-  // Init the boot option name buffer and temp link list
-  //
-  InitializeListHead (&TempList);
-  ZeroMem (Buffer, sizeof (Buffer));
-
-  BootNext = BdsLibGetVariableAndSize (
-              L"BootNext",
-              &gEfiGlobalVariableGuid,
-              &BootNextSize
-              );
-
-  //
-  // Clear the boot next variable first
-  //
-  if (BootNext != NULL) {
-    Status = gRT->SetVariable (
-                    L"BootNext",
-                    &gEfiGlobalVariableGuid,
-                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                    0,
-                    NULL
-                    );
-    //
-    // Deleting variable with current variable implementation shouldn't fail.
-    //
-    ASSERT_EFI_ERROR (Status);
-
-    //
-    // Start to build the boot option and try to boot
-    //
-    UnicodeSPrint (Buffer, sizeof (Buffer), L"Boot%04x", *BootNext);
-    BootOption = BdsLibVariableToOption (&TempList, Buffer);
-    ASSERT (BootOption != NULL);
-    BdsLibConnectDevicePath (BootOption->DevicePath);
-    BdsLibBootViaBootOption (BootOption, BootOption->DevicePath, &ExitDataSize, &ExitData);
-    FreePool(BootOption);
-    FreePool(BootNext);
-  }
-
-}
-
-/**
-  Return the bootable media handle.
-  First, check the device is connected
-  Second, check whether the device path point to a device which support SimpleFileSystemProtocol,
-  Third, detect the the default boot file in the Media, and return the removable Media handle.
-
-  @param  DevicePath  Device Path to a  bootable device
-
-  @return  The bootable media handle. If the media on the DevicePath is not bootable, NULL will return.
-
-**/
-EFI_HANDLE
-EFIAPI
-BdsLibGetBootableHandle (
-  IN  EFI_DEVICE_PATH_PROTOCOL      *DevicePath
-  )
-{
-  EFI_STATUS                      Status;
-  EFI_TPL                         OldTpl;
-  EFI_DEVICE_PATH_PROTOCOL        *UpdatedDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL        *DupDevicePath;
-  EFI_HANDLE                      Handle;
-  EFI_BLOCK_IO_PROTOCOL           *BlockIo;
-  VOID                            *Buffer;
-  EFI_DEVICE_PATH_PROTOCOL        *TempDevicePath;
-  UINTN                           Size;
-  UINTN                           TempSize;
-  EFI_HANDLE                      ReturnHandle;
-  EFI_HANDLE                      *SimpleFileSystemHandles;
-
-  UINTN                           NumberSimpleFileSystemHandles;
-  UINTN                           Index;
-  EFI_IMAGE_DOS_HEADER            DosHeader;
-  EFI_IMAGE_OPTIONAL_HEADER_UNION       HdrData;
-  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;
-
-  UpdatedDevicePath = DevicePath;
-
-  //
-  // Enter to critical section to protect the acquired BlockIo instance 
-  // from getting released due to the USB mass storage hotplug event
-  //
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
-
-  //
-  // Check whether the device is connected
-  //
-  Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &UpdatedDevicePath, &Handle);
-  if (EFI_ERROR (Status)) {
-    //
-    // Skip the case that the boot option point to a simple file protocol which does not consume block Io protocol,
-    //
-    Status = gBS->LocateDevicePath (&gEfiSimpleFileSystemProtocolGuid, &UpdatedDevicePath, &Handle);
-    if (EFI_ERROR (Status)) {
-      //
-      // Fail to find the proper BlockIo and simple file protocol, maybe because device not present,  we need to connect it firstly
-      //
-      UpdatedDevicePath = DevicePath;
-      Status            = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &UpdatedDevicePath, &Handle);
-      gBS->ConnectController (Handle, NULL, NULL, TRUE);
-    }
-  } else {
-    //
-    // For removable device boot option, its contained device path only point to the removable device handle, 
-    // should make sure all its children handles (its child partion or media handles) are created and connected. 
-    //
-    gBS->ConnectController (Handle, NULL, NULL, TRUE); 
-    //
-    // Get BlockIo protocol and check removable attribute
-    //
-    Status = gBS->HandleProtocol (Handle, &gEfiBlockIoProtocolGuid, (VOID **)&BlockIo);
-    ASSERT_EFI_ERROR (Status);
-
-    //
-    // Issue a dummy read to the device to check for media change.
-    // When the removable media is changed, any Block IO read/write will
-    // cause the BlockIo protocol be reinstalled and EFI_MEDIA_CHANGED is
-    // returned. After the Block IO protocol is reinstalled, subsequent
-    // Block IO read/write will success.
-    //
-    Buffer = AllocatePool (BlockIo->Media->BlockSize);
-    if (Buffer != NULL) {
-      BlockIo->ReadBlocks (
-               BlockIo,
-               BlockIo->Media->MediaId,
-               0,
-               BlockIo->Media->BlockSize,
-               Buffer
-               );
-      FreePool(Buffer);
-    }
-  }
-
-  //
-  // Detect the the default boot file from removable Media
-  //
-
-  //
-  // If fail to get bootable handle specified by a USB boot option, the BDS should try to find other bootable device in the same USB bus
-  // Try to locate the USB node device path first, if fail then use its previous PCI node to search
-  //
-  DupDevicePath = DuplicateDevicePath (DevicePath);
-  ASSERT (DupDevicePath != NULL);
-
-  UpdatedDevicePath = DupDevicePath;
-  Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &UpdatedDevicePath, &Handle);
-  //
-  // if the resulting device path point to a usb node, and the usb node is a dummy node, should only let device path only point to the previous Pci node
-  // Acpi()/Pci()/Usb() --> Acpi()/Pci()
-  //
-  if ((DevicePathType (UpdatedDevicePath) == MESSAGING_DEVICE_PATH) &&
-      (DevicePathSubType (UpdatedDevicePath) == MSG_USB_DP)) {
-    //
-    // Remove the usb node, let the device path only point to PCI node
-    //
-    SetDevicePathEndNode (UpdatedDevicePath);
-    UpdatedDevicePath = DupDevicePath;
-  } else {
-    UpdatedDevicePath = DevicePath;
-  }
-
-  //
-  // Get the device path size of boot option
-  //
-  Size = GetDevicePathSize(UpdatedDevicePath) - sizeof (EFI_DEVICE_PATH_PROTOCOL); // minus the end node
-  ReturnHandle = NULL;
-  gBS->LocateHandleBuffer (
-      ByProtocol,
-      &gEfiSimpleFileSystemProtocolGuid,
-      NULL,
-      &NumberSimpleFileSystemHandles,
-      &SimpleFileSystemHandles
-      );
-  for (Index = 0; Index < NumberSimpleFileSystemHandles; Index++) {
-    //
-    // Get the device path size of SimpleFileSystem handle
-    //
-    TempDevicePath = DevicePathFromHandle (SimpleFileSystemHandles[Index]);
-    TempSize = GetDevicePathSize (TempDevicePath)- sizeof (EFI_DEVICE_PATH_PROTOCOL); // minus the end node
-    //
-    // Check whether the device path of boot option is part of the  SimpleFileSystem handle's device path
-    //
-    if (Size <= TempSize && CompareMem (TempDevicePath, UpdatedDevicePath, Size)==0) {
-      //
-      // Load the default boot file \EFI\BOOT\boot{machinename}.EFI from removable Media
-      //  machinename is ia32, ia64, x64, ...
-      //
-      Hdr.Union = &HdrData;
-      Status = BdsLibGetImageHeader (
-                 SimpleFileSystemHandles[Index],
-                 EFI_REMOVABLE_MEDIA_FILE_NAME,
-                 &DosHeader,
-                 Hdr
-                 );
-      if (!EFI_ERROR (Status) &&
-        EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Hdr.Pe32->FileHeader.Machine) &&
-        Hdr.Pe32->OptionalHeader.Subsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {
-        ReturnHandle = SimpleFileSystemHandles[Index];
-        break;
-      }
-    }
-  }
-
-  FreePool(DupDevicePath);
-
-  if (SimpleFileSystemHandles != NULL) {
-    FreePool(SimpleFileSystemHandles);
-  }
-
-  gBS->RestoreTPL (OldTpl);
-
-  return ReturnHandle;
-}
-
-/**
-  Check to see if the network cable is plugged in. If the DevicePath is not
-  connected it will be connected.
-
-  @param  DevicePath             Device Path to check
-
-  @retval TRUE                   DevicePath points to an Network that is connected
-  @retval FALSE                  DevicePath does not point to a bootable network
-
-**/
-BOOLEAN
-BdsLibNetworkBootWithMediaPresent (
-  IN  EFI_DEVICE_PATH_PROTOCOL      *DevicePath
-  )
-{
-  EFI_STATUS                      Status;
-  EFI_DEVICE_PATH_PROTOCOL        *UpdatedDevicePath;
-  EFI_HANDLE                      Handle;
-  EFI_SIMPLE_NETWORK_PROTOCOL     *Snp;
-  BOOLEAN                         MediaPresent;
-  UINT32                          InterruptStatus;
-
-  MediaPresent = FALSE;
-
-  UpdatedDevicePath = DevicePath;
-  //
-  // Locate Load File Protocol for PXE boot option first
-  //
-  Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &UpdatedDevicePath, &Handle);
-  if (EFI_ERROR (Status)) {
-    //
-    // Device not present so see if we need to connect it
-    //
-    Status = BdsLibConnectDevicePath (DevicePath);
-    if (!EFI_ERROR (Status)) {
-      //
-      // This one should work after we did the connect
-      //
-      Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &UpdatedDevicePath, &Handle);
-    }
-  }
-
-  if (!EFI_ERROR (Status)) {
-    Status = gBS->HandleProtocol (Handle, &gEfiSimpleNetworkProtocolGuid, (VOID **)&Snp);
-    if (EFI_ERROR (Status)) {
-      //
-      // Failed to open SNP from this handle, try to get SNP from parent handle
-      //
-      UpdatedDevicePath = DevicePathFromHandle (Handle);
-      if (UpdatedDevicePath != NULL) {
-        Status = gBS->LocateDevicePath (&gEfiSimpleNetworkProtocolGuid, &UpdatedDevicePath, &Handle);
-        if (!EFI_ERROR (Status)) {
-          //
-          // SNP handle found, get SNP from it
-          //
-          Status = gBS->HandleProtocol (Handle, &gEfiSimpleNetworkProtocolGuid, (VOID **) &Snp);
-        }
-      }
-    }
-
-    if (!EFI_ERROR (Status)) {
-      if (Snp->Mode->MediaPresentSupported) {
-        if (Snp->Mode->State == EfiSimpleNetworkInitialized) {
-          //
-          // Invoke Snp->GetStatus() to refresh the media status
-          //
-          Snp->GetStatus (Snp, &InterruptStatus, NULL);
-
-          //
-          // In case some one else is using the SNP check to see if it's connected
-          //
-          MediaPresent = Snp->Mode->MediaPresent;
-        } else {
-          //
-          // No one is using SNP so we need to Start and Initialize so
-          // MediaPresent will be valid.
-          //
-          Status = Snp->Start (Snp);
-          if (!EFI_ERROR (Status)) {
-            Status = Snp->Initialize (Snp, 0, 0);
-            if (!EFI_ERROR (Status)) {
-              MediaPresent = Snp->Mode->MediaPresent;
-              Snp->Shutdown (Snp);
-            }
-            Snp->Stop (Snp);
-          }
-        }
-      } else {
-        MediaPresent = TRUE;
-      }
-    }
-  }
-
-  return MediaPresent;
-}
-
-/**
-  For a bootable Device path, return its boot type.
-
-  @param  DevicePath                      The bootable device Path to check
-
-  @retval BDS_EFI_MEDIA_HD_BOOT           If given device path contains MEDIA_DEVICE_PATH type device path node
-                                          which subtype is MEDIA_HARDDRIVE_DP
-  @retval BDS_EFI_MEDIA_CDROM_BOOT        If given device path contains MEDIA_DEVICE_PATH type device path node
-                                          which subtype is MEDIA_CDROM_DP
-  @retval BDS_EFI_ACPI_FLOPPY_BOOT        If given device path contains ACPI_DEVICE_PATH type device path node
-                                          which HID is floppy device.
-  @retval BDS_EFI_MESSAGE_ATAPI_BOOT      If given device path contains MESSAGING_DEVICE_PATH type device path node
-                                          and its last device path node's subtype is MSG_ATAPI_DP.
-  @retval BDS_EFI_MESSAGE_SCSI_BOOT       If given device path contains MESSAGING_DEVICE_PATH type device path node
-                                          and its last device path node's subtype is MSG_SCSI_DP.
-  @retval BDS_EFI_MESSAGE_USB_DEVICE_BOOT If given device path contains MESSAGING_DEVICE_PATH type device path node
-                                          and its last device path node's subtype is MSG_USB_DP.
-  @retval BDS_EFI_MESSAGE_MISC_BOOT       If the device path not contains any media device path node,  and
-                                          its last device path node point to a message device path node.
-  @retval BDS_LEGACY_BBS_BOOT             If given device path contains BBS_DEVICE_PATH type device path node.
-  @retval BDS_EFI_UNSUPPORT               An EFI Removable BlockIO device path not point to a media and message device,
-
-**/
-UINT32
-EFIAPI
-BdsGetBootTypeFromDevicePath (
-  IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath
-  )
-{
-  ACPI_HID_DEVICE_PATH          *Acpi;
-  EFI_DEVICE_PATH_PROTOCOL      *TempDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL      *LastDeviceNode;
-  UINT32                        BootType;
-
-  if (NULL == DevicePath) {
-    return BDS_EFI_UNSUPPORT;
-  }
-
-  TempDevicePath = DevicePath;
-
-  while (!IsDevicePathEndType (TempDevicePath)) {
-    switch (DevicePathType (TempDevicePath)) {
-      case BBS_DEVICE_PATH:
-         return BDS_LEGACY_BBS_BOOT;
-      case MEDIA_DEVICE_PATH:
-        if (DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP) {
-          return BDS_EFI_MEDIA_HD_BOOT;
-        } else if (DevicePathSubType (TempDevicePath) == MEDIA_CDROM_DP) {
-          return BDS_EFI_MEDIA_CDROM_BOOT;
-        }
-        break;
-      case ACPI_DEVICE_PATH:
-        Acpi = (ACPI_HID_DEVICE_PATH *) TempDevicePath;
-        if (EISA_ID_TO_NUM (Acpi->HID) == 0x0604) {
-          return BDS_EFI_ACPI_FLOPPY_BOOT;
-        }
-        break;
-      case MESSAGING_DEVICE_PATH:
-        //
-        // Get the last device path node
-        //
-        LastDeviceNode = NextDevicePathNode (TempDevicePath);
-        if (DevicePathSubType(LastDeviceNode) == MSG_DEVICE_LOGICAL_UNIT_DP) {
-          //
-          // if the next node type is Device Logical Unit, which specify the Logical Unit Number (LUN),
-          // skip it
-          //
-          LastDeviceNode = NextDevicePathNode (LastDeviceNode);
-        }
-        //
-        // if the device path not only point to driver device, it is not a messaging device path,
-        //
-        if (!IsDevicePathEndType (LastDeviceNode)) {
-          break;
-        }
-
-        switch (DevicePathSubType (TempDevicePath)) {
-        case MSG_ATAPI_DP:
-          BootType = BDS_EFI_MESSAGE_ATAPI_BOOT;
-          break;
-
-        case MSG_USB_DP:
-          BootType = BDS_EFI_MESSAGE_USB_DEVICE_BOOT;
-          break;
-
-        case MSG_SCSI_DP:
-          BootType = BDS_EFI_MESSAGE_SCSI_BOOT;
-          break;
-
-        case MSG_SATA_DP:
-          BootType = BDS_EFI_MESSAGE_SATA_BOOT;
-          break;
-
-        case MSG_MAC_ADDR_DP:
-        case MSG_VLAN_DP:
-        case MSG_IPv4_DP:
-        case MSG_IPv6_DP:
-          BootType = BDS_EFI_MESSAGE_MAC_BOOT;
-          break;
-
-        default:
-          BootType = BDS_EFI_MESSAGE_MISC_BOOT;
-          break;
-        }
-        return BootType;
-
-      default:
-        break;
-    }
-    TempDevicePath = NextDevicePathNode (TempDevicePath);
-  }
-
-  return BDS_EFI_UNSUPPORT;
-}
-
-/**
-  Check whether the Device path in a boot option point to a valid bootable device,
-  And if CheckMedia is true, check the device is ready to boot now.
-
-  @param  DevPath     the Device path in a boot option
-  @param  CheckMedia  if true, check the device is ready to boot now.
-
-  @retval TRUE        the Device path  is valid
-  @retval FALSE       the Device path  is invalid .
-
-**/
-BOOLEAN
-EFIAPI
-BdsLibIsValidEFIBootOptDevicePath (
-  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath,
-  IN BOOLEAN                      CheckMedia
-  )
-{
-  return BdsLibIsValidEFIBootOptDevicePathExt (DevPath, CheckMedia, NULL);
-}
-
-/**
-  Check whether the Device path in a boot option point to a valid bootable device,
-  And if CheckMedia is true, check the device is ready to boot now.
-  If Description is not NULL and the device path point to a fixed BlockIo
-  device, check the description whether conflict with other auto-created
-  boot options.
-
-  @param  DevPath     the Device path in a boot option
-  @param  CheckMedia  if true, check the device is ready to boot now.
-  @param  Description the description in a boot option
-
-  @retval TRUE        the Device path  is valid
-  @retval FALSE       the Device path  is invalid .
-
-**/
-BOOLEAN
-EFIAPI
-BdsLibIsValidEFIBootOptDevicePathExt (
-  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath,
-  IN BOOLEAN                      CheckMedia,
-  IN CHAR16                       *Description
-  )
-{
-  EFI_STATUS                Status;
-  EFI_HANDLE                Handle;
-  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *LastDeviceNode;
-  EFI_BLOCK_IO_PROTOCOL     *BlockIo;
-
-  TempDevicePath = DevPath;
-  LastDeviceNode = DevPath;
-
-  //
-  // Check if it's a valid boot option for network boot device.
-  // Check if there is EfiLoadFileProtocol installed. 
-  // If yes, that means there is a boot option for network.
-  //
-  Status = gBS->LocateDevicePath (
-                  &gEfiLoadFileProtocolGuid,
-                  &TempDevicePath,
-                  &Handle
-                  );
-  if (EFI_ERROR (Status)) {
-    //
-    // Device not present so see if we need to connect it
-    //
-    TempDevicePath = DevPath;
-    BdsLibConnectDevicePath (TempDevicePath);
-    Status = gBS->LocateDevicePath (
-                    &gEfiLoadFileProtocolGuid,
-                    &TempDevicePath,
-                    &Handle
-                    );
-  }
-
-  if (!EFI_ERROR (Status)) {
-    if (!IsDevicePathEnd (TempDevicePath)) {
-      //
-      // LoadFile protocol is not installed on handle with exactly the same DevPath
-      //
-      return FALSE;
-    }
-
-    if (CheckMedia) {
-      //
-      // Test if it is ready to boot now
-      //
-      if (BdsLibNetworkBootWithMediaPresent(DevPath)) {
-        return TRUE;
-      }
-    } else {
-      return TRUE;
-    }    
-  }
-
-  //
-  // If the boot option point to a file, it is a valid EFI boot option,
-  // and assume it is ready to boot now
-  //
-  while (!IsDevicePathEnd (TempDevicePath)) {
-    //
-    // If there is USB Class or USB WWID device path node, treat it as valid EFI
-    // Boot Option. BdsExpandUsbShortFormDevicePath () will be used to expand it
-    // to full device path.
-    //
-    if ((DevicePathType (TempDevicePath) == MESSAGING_DEVICE_PATH) &&
-        ((DevicePathSubType (TempDevicePath) == MSG_USB_CLASS_DP) ||
-         (DevicePathSubType (TempDevicePath) == MSG_USB_WWID_DP))) {
-      return TRUE;
-    }
-
-    LastDeviceNode = TempDevicePath;
-    TempDevicePath = NextDevicePathNode (TempDevicePath);
-  }
-  if ((DevicePathType (LastDeviceNode) == MEDIA_DEVICE_PATH) &&
-    (DevicePathSubType (LastDeviceNode) == MEDIA_FILEPATH_DP)) {
-    return TRUE;
-  }
-
-  //
-  // Check if it's a valid boot option for internal FV application
-  //
-  if (EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode) != NULL) {
-    //
-    // If the boot option point to internal FV application, make sure it is valid
-    //
-    TempDevicePath = DevPath;
-    Status = BdsLibUpdateFvFileDevicePath (
-               &TempDevicePath,
-               EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode)
-               );
-    if (Status == EFI_ALREADY_STARTED) {
-      return TRUE;
-    } else {
-      if (Status == EFI_SUCCESS) {
-        FreePool (TempDevicePath);
-      }
-      return FALSE;
-    }
-  }
-
-  //
-  // If the boot option point to a blockIO device:
-  //    if it is a removable blockIo device, it is valid.
-  //    if it is a fixed blockIo device, check its description confliction.
-  //
-  TempDevicePath = DevPath;
-  Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &TempDevicePath, &Handle);
-  if (EFI_ERROR (Status)) {
-    //
-    // Device not present so see if we need to connect it
-    //
-    Status = BdsLibConnectDevicePath (DevPath);
-    if (!EFI_ERROR (Status)) {
-      //
-      // Try again to get the Block Io protocol after we did the connect
-      //
-      TempDevicePath = DevPath;
-      Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &TempDevicePath, &Handle);
-    }
-  }
-
-  if (!EFI_ERROR (Status)) {
-    Status = gBS->HandleProtocol (Handle, &gEfiBlockIoProtocolGuid, (VOID **)&BlockIo);
-    if (!EFI_ERROR (Status)) {
-      if (CheckMedia) {
-        //
-        // Test if it is ready to boot now
-        //
-        if (BdsLibGetBootableHandle (DevPath) != NULL) {
-          return TRUE;
-        }
-      } else {
-        return TRUE;
-      }
-    }
-  } else {
-    //
-    // if the boot option point to a simple file protocol which does not consume block Io protocol, it is also a valid EFI boot option,
-    //
-    Status = gBS->LocateDevicePath (&gEfiSimpleFileSystemProtocolGuid, &TempDevicePath, &Handle);
-    if (!EFI_ERROR (Status)) {
-      if (CheckMedia) {
-        //
-        // Test if it is ready to boot now
-        //
-        if (BdsLibGetBootableHandle (DevPath) != NULL) {
-          return TRUE;
-        }
-      } else {
-        return TRUE;
-      }
-    }
-  }
-
-  return FALSE;
-}
-
-
-/**
-  According to a file guild, check a Fv file device path is valid. If it is invalid,
-  try to return the valid device path.
-  FV address maybe changes for memory layout adjust from time to time, use this function
-  could promise the Fv file device path is right.
-
-  @param  DevicePath             on input, the Fv file device path need to check on
-                                 output, the updated valid Fv file device path
-  @param  FileGuid               the Fv file guild
-
-  @retval EFI_INVALID_PARAMETER  the input DevicePath or FileGuid is invalid
-                                 parameter
-  @retval EFI_UNSUPPORTED        the input DevicePath does not contain Fv file
-                                 guild at all
-  @retval EFI_ALREADY_STARTED    the input DevicePath has pointed to Fv file, it is
-                                 valid
-  @retval EFI_SUCCESS            has successfully updated the invalid DevicePath,
-                                 and return the updated device path in DevicePath
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibUpdateFvFileDevicePath (
-  IN  OUT EFI_DEVICE_PATH_PROTOCOL      ** DevicePath,
-  IN  EFI_GUID                          *FileGuid
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL      *TempDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL      *LastDeviceNode;
-  EFI_STATUS                    Status;
-  EFI_GUID                      *GuidPoint;
-  UINTN                         Index;
-  UINTN                         FvHandleCount;
-  EFI_HANDLE                    *FvHandleBuffer;
-  EFI_FV_FILETYPE               Type;
-  UINTN                         Size;
-  EFI_FV_FILE_ATTRIBUTES        Attributes;
-  UINT32                        AuthenticationStatus;
-  BOOLEAN                       FindFvFile;
-  EFI_LOADED_IMAGE_PROTOCOL     *LoadedImage;
-  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
-  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FvFileNode;
-  EFI_HANDLE                    FoundFvHandle;
-  EFI_DEVICE_PATH_PROTOCOL      *NewDevicePath;
-
-  if ((DevicePath == NULL) || (*DevicePath == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-  if (FileGuid == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Check whether the device path point to the default the input Fv file
-  //
-  TempDevicePath = *DevicePath;
-  LastDeviceNode = TempDevicePath;
-  while (!IsDevicePathEnd (TempDevicePath)) {
-     LastDeviceNode = TempDevicePath;
-     TempDevicePath = NextDevicePathNode (TempDevicePath);
-  }
-  GuidPoint = EfiGetNameGuidFromFwVolDevicePathNode (
-                (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode
-                );
-  if (GuidPoint == NULL) {
-    //
-    // if this option does not points to a Fv file, just return EFI_UNSUPPORTED
-    //
-    return EFI_UNSUPPORTED;
-  }
-  if (!CompareGuid (GuidPoint, FileGuid)) {
-    //
-    // If the Fv file is not the input file guid, just return EFI_UNSUPPORTED
-    //
-    return EFI_UNSUPPORTED;
-  }
-
-  //
-  // Check whether the input Fv file device path is valid
-  //
-  TempDevicePath = *DevicePath;
-  FoundFvHandle = NULL;
-  Status = gBS->LocateDevicePath (
-                  &gEfiFirmwareVolume2ProtocolGuid,
-                  &TempDevicePath,
-                  &FoundFvHandle
-                  );
-  if (!EFI_ERROR (Status)) {
-    Status = gBS->HandleProtocol (
-                    FoundFvHandle,
-                    &gEfiFirmwareVolume2ProtocolGuid,
-                    (VOID **) &Fv
-                    );
-    if (!EFI_ERROR (Status)) {
-      //
-      // Set FV ReadFile Buffer as NULL, only need to check whether input Fv file exist there
-      //
-      Status = Fv->ReadFile (
-                    Fv,
-                    FileGuid,
-                    NULL,
-                    &Size,
-                    &Type,
-                    &Attributes,
-                    &AuthenticationStatus
-                    );
-      if (!EFI_ERROR (Status)) {
-        return EFI_ALREADY_STARTED;
-      }
-    }
-  }
-
-  //
-  // Look for the input wanted FV file in current FV
-  // First, try to look for in Bds own FV. Bds and input wanted FV file usually are in the same FV
-  //
-  FindFvFile = FALSE;
-  FoundFvHandle = NULL;
-  Status = gBS->HandleProtocol (
-             gImageHandle,
-             &gEfiLoadedImageProtocolGuid,
-             (VOID **) &LoadedImage
-             );
-  if (!EFI_ERROR (Status)) {
-    Status = gBS->HandleProtocol (
-                    LoadedImage->DeviceHandle,
-                    &gEfiFirmwareVolume2ProtocolGuid,
-                    (VOID **) &Fv
-                    );
-    if (!EFI_ERROR (Status)) {
-      Status = Fv->ReadFile (
-                    Fv,
-                    FileGuid,
-                    NULL,
-                    &Size,
-                    &Type,
-                    &Attributes,
-                    &AuthenticationStatus
-                    );
-      if (!EFI_ERROR (Status)) {
-        FindFvFile = TRUE;
-        FoundFvHandle = LoadedImage->DeviceHandle;
-      }
-    }
-  }
-  //
-  // Second, if fail to find, try to enumerate all FV
-  //
-  if (!FindFvFile) {
-    FvHandleBuffer = NULL;
-    gBS->LocateHandleBuffer (
-          ByProtocol,
-          &gEfiFirmwareVolume2ProtocolGuid,
-          NULL,
-          &FvHandleCount,
-          &FvHandleBuffer
-          );
-    for (Index = 0; Index < FvHandleCount; Index++) {
-      gBS->HandleProtocol (
-            FvHandleBuffer[Index],
-            &gEfiFirmwareVolume2ProtocolGuid,
-            (VOID **) &Fv
-            );
-
-      Status = Fv->ReadFile (
-                    Fv,
-                    FileGuid,
-                    NULL,
-                    &Size,
-                    &Type,
-                    &Attributes,
-                    &AuthenticationStatus
-                    );
-      if (EFI_ERROR (Status)) {
-        //
-        // Skip if input Fv file not in the FV
-        //
-        continue;
-      }
-      FindFvFile = TRUE;
-      FoundFvHandle = FvHandleBuffer[Index];
-      break;
-    }
-
-    if (FvHandleBuffer != NULL) {
-      FreePool (FvHandleBuffer);
-    }
-  }
-
-  if (FindFvFile) {
-    //
-    // Build the shell device path
-    //
-    NewDevicePath = DevicePathFromHandle (FoundFvHandle);
-    EfiInitializeFwVolDevicepathNode (&FvFileNode, FileGuid);
-    NewDevicePath = AppendDevicePathNode (NewDevicePath, (EFI_DEVICE_PATH_PROTOCOL *) &FvFileNode);
-    ASSERT (NewDevicePath != NULL);
-    *DevicePath = NewDevicePath;
-    return EFI_SUCCESS;
-  }
-  return EFI_NOT_FOUND;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c
deleted file mode 100644
index dfeefc01b8..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/** @file
-  BDS Lib functions which relate with connect the device
-
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "InternalBdsLib.h"
-
-
-/**
-  This function will connect all the system driver to controller
-  first, and then special connect the default console, this make
-  sure all the system controller available and the platform default
-  console connected.
-
-**/
-VOID
-EFIAPI
-BdsLibConnectAll (
-  VOID
-  )
-{
-  //
-  // Connect the platform console first
-  //
-  BdsLibConnectAllDefaultConsoles ();
-
-  //
-  // Generic way to connect all the drivers
-  //
-  BdsLibConnectAllDriversToAllControllers ();
-
-  //
-  // Here we have the assumption that we have already had
-  // platform default console
-  //
-  BdsLibConnectAllDefaultConsoles ();
-}
-
-
-/**
-  This function will connect all the system drivers to all controllers
-  first, and then connect all the console devices the system current
-  have. After this we should get all the device work and console available
-  if the system have console device.
-
-**/
-VOID
-BdsLibGenericConnectAll (
-  VOID
-  )
-{
-  //
-  // Most generic way to connect all the drivers
-  //
-  BdsLibConnectAllDriversToAllControllers ();
-  BdsLibConnectAllConsoles ();
-}
-
-/**
-  This function will create all handles associate with every device
-  path node. If the handle associate with one device path node can not
-  be created successfully, then still give chance to do the dispatch,
-  which load the missing drivers if possible.
-
-  @param  DevicePathToConnect   The device path which will be connected, it can be
-                                a multi-instance device path
-
-  @retval EFI_SUCCESS           All handles associate with every device path  node
-                                have been created
-  @retval EFI_OUT_OF_RESOURCES  There is no resource to create new handles
-  @retval EFI_NOT_FOUND         Create the handle associate with one device  path
-                                node failed
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectDevicePath (
-  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePathToConnect
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *CopyOfDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *Instance;
-  EFI_DEVICE_PATH_PROTOCOL  *RemainingDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *Next;
-  EFI_HANDLE                Handle;
-  EFI_HANDLE                PreviousHandle;
-  UINTN                     Size;
-  EFI_TPL                   CurrentTpl;
-
-  if (DevicePathToConnect == NULL) {
-    return EFI_SUCCESS;
-  }
-
-  CurrentTpl  = EfiGetCurrentTpl ();
-
-  DevicePath        = DuplicateDevicePath (DevicePathToConnect);
-  if (DevicePath == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  CopyOfDevicePath  = DevicePath;
-  
-  do {
-    //
-    // The outer loop handles multi instance device paths.
-    // Only console variables contain multiple instance device paths.
-    //
-    // After this call DevicePath points to the next Instance
-    //
-    Instance  = GetNextDevicePathInstance (&DevicePath, &Size);
-    if (Instance == NULL) {
-      FreePool (CopyOfDevicePath);
-      return EFI_OUT_OF_RESOURCES;
-    }
-    
-    Next      = Instance;
-    while (!IsDevicePathEndType (Next)) {
-      Next = NextDevicePathNode (Next);
-    }
-
-    SetDevicePathEndNode (Next);
-
-    //
-    // Start the real work of connect with RemainingDevicePath
-    //
-    PreviousHandle = NULL;
-    do {
-      //
-      // Find the handle that best matches the Device Path. If it is only a
-      // partial match the remaining part of the device path is returned in
-      // RemainingDevicePath.
-      //
-      RemainingDevicePath = Instance;
-      Status              = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &Handle);
-
-      if (!EFI_ERROR (Status)) {
-        if (Handle == PreviousHandle) {
-          //
-          // If no forward progress is made try invoking the Dispatcher.
-          // A new FV may have been added to the system an new drivers
-          // may now be found.
-          // Status == EFI_SUCCESS means a driver was dispatched
-          // Status == EFI_NOT_FOUND means no new drivers were dispatched
-          //
-          if (CurrentTpl == TPL_APPLICATION) {
-            //
-            // Dispatch calls LoadImage/StartImage which cannot run at TPL > TPL_APPLICATION
-            //
-            Status = gDS->Dispatch ();
-          } else {
-            //
-            // Always return EFI_NOT_FOUND here
-            // to prevent dead loop when control handle is found but connection failded case
-            //
-            Status = EFI_NOT_FOUND;
-          }
-        }
-
-        if (!EFI_ERROR (Status)) {
-          PreviousHandle = Handle;
-          //
-          // Connect all drivers that apply to Handle and RemainingDevicePath,
-          // the Recursive flag is FALSE so only one level will be expanded.
-          //
-          // Do not check the connect status here, if the connect controller fail,
-          // then still give the chance to do dispatch, because partial
-          // RemainingDevicepath may be in the new FV
-          //
-          // 1. If the connect fail, RemainingDevicepath and handle will not
-          //    change, so next time will do the dispatch, then dispatch's status
-          //    will take effect
-          // 2. If the connect success, the RemainingDevicepath and handle will
-          //    change, then avoid the dispatch, we have chance to continue the
-          //    next connection
-          //
-          gBS->ConnectController (Handle, NULL, RemainingDevicePath, FALSE);
-        }
-      }
-      //
-      // Loop until RemainingDevicePath is an empty device path
-      //
-    } while (!EFI_ERROR (Status) && !IsDevicePathEnd (RemainingDevicePath));
-
-  } while (DevicePath != NULL);
-
-  if (CopyOfDevicePath != NULL) {
-    FreePool (CopyOfDevicePath);
-  }
-  //
-  // All handle with DevicePath exists in the handle database
-  //
-  return Status;
-}
-
-/**
-  This function will connect all current system handles recursively. 
-  
-  gBS->ConnectController() service is invoked for each handle exist in system handler buffer.
-  If the handle is bus type handler, all childrens also will be connected recursively
-  by gBS->ConnectController().
-
-  @retval EFI_SUCCESS           All handles and it's child handle have been connected
-  @retval EFI_STATUS            Error status returned by of gBS->LocateHandleBuffer().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectAllEfi (
-  VOID
-  )
-{
-  EFI_STATUS  Status;
-  UINTN       HandleCount;
-  EFI_HANDLE  *HandleBuffer;
-  UINTN       Index;
-
-  Status = gBS->LocateHandleBuffer (
-                  AllHandles,
-                  NULL,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuffer
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
-  }
-
-  if (HandleBuffer != NULL) {
-    FreePool (HandleBuffer);
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  This function will disconnect all current system handles. 
-  
-  gBS->DisconnectController() is invoked for each handle exists in system handle buffer.
-  If handle is a bus type handle, all childrens also are disconnected recursively by
-  gBS->DisconnectController().
-
-  @retval EFI_SUCCESS           All handles have been disconnected
-  @retval EFI_STATUS            Error status returned by of gBS->LocateHandleBuffer().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibDisconnectAllEfi (
-  VOID
-  )
-{
-  EFI_STATUS  Status;
-  UINTN       HandleCount;
-  EFI_HANDLE  *HandleBuffer;
-  UINTN       Index;
-
-  //
-  // Disconnect all
-  //
-  Status = gBS->LocateHandleBuffer (
-                  AllHandles,
-                  NULL,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuffer
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    Status = gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);
-  }
-
-  if (HandleBuffer != NULL) {
-    FreePool (HandleBuffer);
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Connects all drivers to all controllers.
-  This function make sure all the current system driver will manage
-  the correspoinding controllers if have. And at the same time, make
-  sure all the system controllers have driver to manage it if have.
-
-**/
-VOID
-EFIAPI
-BdsLibConnectAllDriversToAllControllers (
-  VOID
-  )
-{
-  EFI_STATUS  Status;
-
-  do {
-    //
-    // Connect All EFI 1.10 drivers following EFI 1.10 algorithm
-    //
-    BdsLibConnectAllEfi ();
-
-    //
-    // Check to see if it's possible to dispatch an more DXE drivers.
-    // The BdsLibConnectAllEfi () may have made new DXE drivers show up.
-    // If anything is Dispatched Status == EFI_SUCCESS and we will try
-    // the connect again.
-    //
-    Status = gDS->Dispatch ();
-
-  } while (!EFI_ERROR (Status));
-
-}
-
-
-/**
-  Connect the specific Usb device which match the short form device path,
-  and whose bus is determined by Host Controller (Uhci or Ehci).
-
-  @param  HostControllerPI      Uhci (0x00) or Ehci (0x20) or Both uhci and ehci
-                                (0xFF)
-  @param  RemainingDevicePath   a short-form device path that starts with the first
-                                element  being a USB WWID or a USB Class device
-                                path
-
-  @return EFI_INVALID_PARAMETER  RemainingDevicePath is NULL pointer.
-                                 RemainingDevicePath is not a USB device path.
-                                 Invalid HostControllerPI type.
-  @return EFI_SUCCESS            Success to connect USB device
-  @return EFI_NOT_FOUND          Fail to find handle for USB controller to connect.
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectUsbDevByShortFormDP(
-  IN UINT8                      HostControllerPI,
-  IN EFI_DEVICE_PATH_PROTOCOL   *RemainingDevicePath
-  )
-{
-  EFI_STATUS                            Status;
-  EFI_HANDLE                            *HandleArray;
-  UINTN                                 HandleArrayCount;
-  UINTN                                 Index;
-  EFI_PCI_IO_PROTOCOL                   *PciIo;
-  UINT8                                 Class[3];
-  BOOLEAN                               AtLeastOneConnected;
-
-  //
-  // Check the passed in parameters
-  //
-  if (RemainingDevicePath == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if ((DevicePathType (RemainingDevicePath) != MESSAGING_DEVICE_PATH) ||
-      ((DevicePathSubType (RemainingDevicePath) != MSG_USB_CLASS_DP)
-      && (DevicePathSubType (RemainingDevicePath) != MSG_USB_WWID_DP)
-      )) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (HostControllerPI != 0xFF &&
-      HostControllerPI != 0x00 &&
-      HostControllerPI != 0x20) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Find the usb host controller firstly, then connect with the remaining device path
-  //
-  AtLeastOneConnected = FALSE;
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiPciIoProtocolGuid,
-                  NULL,
-                  &HandleArrayCount,
-                  &HandleArray
-                  );
-  if (!EFI_ERROR (Status)) {
-    for (Index = 0; Index < HandleArrayCount; Index++) {
-      Status = gBS->HandleProtocol (
-                      HandleArray[Index],
-                      &gEfiPciIoProtocolGuid,
-                      (VOID **)&PciIo
-                      );
-      if (!EFI_ERROR (Status)) {
-        //
-        // Check whether the Pci device is the wanted usb host controller
-        //
-        Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class);
-        if (!EFI_ERROR (Status)) {
-          if ((PCI_CLASS_SERIAL == Class[2]) &&
-              (PCI_CLASS_SERIAL_USB == Class[1])) {
-            if (HostControllerPI == Class[0] || HostControllerPI == 0xFF) {
-              Status = gBS->ConnectController (
-                              HandleArray[Index],
-                              NULL,
-                              RemainingDevicePath,
-                              FALSE
-                              );
-              if (!EFI_ERROR(Status)) {
-                AtLeastOneConnected = TRUE;
-              }
-            }
-          }
-        }
-      }
-    }
-
-    if (HandleArray != NULL) {
-      FreePool (HandleArray);
-    }
-
-    if (AtLeastOneConnected) {
-      return EFI_SUCCESS;
-    }
-  }
-
-  return EFI_NOT_FOUND;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c
deleted file mode 100644
index 2fffd9e4bc..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c
+++ /dev/null
@@ -1,1061 +0,0 @@
-/** @file
-  BDS Lib functions which contain all the code to connect console device
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "InternalBdsLib.h"
-
-
-/**
-  Check if we need to save the EFI variable with "ConVarName" as name
-  as NV type
-  If ConVarName is NULL, then ASSERT().
-  
-  @param ConVarName The name of the EFI variable.
-
-  @retval TRUE    Set the EFI variable as NV type.
-  @retval FALSE   EFI variable as NV type can be set NonNV.
-**/
-BOOLEAN
-IsNvNeed (
-  IN CHAR16 *ConVarName
-  )
-{
-  CHAR16 *Ptr;
-
-  ASSERT (ConVarName != NULL);
-  
-  Ptr = ConVarName;
-
-  //
-  // If the variable includes "Dev" at last, we consider
-  // it does not support NV attribute.
-  //
-  while (*Ptr != L'\0') {
-    Ptr++;
-  }
-
-  if (((INTN)((UINTN)Ptr - (UINTN)ConVarName) / sizeof (CHAR16)) <= 3) {
-    return TRUE;
-  }
-  
-  if ((*(Ptr - 3) == 'D') && (*(Ptr - 2) == 'e') && (*(Ptr - 1) == 'v')) {
-    return FALSE;
-  } else {
-    return TRUE;
-  }
-}
-
-/**
-  Fill console handle in System Table if there are no valid console handle in.
-
-  Firstly, check the validation of console handle in System Table. If it is invalid,
-  update it by the first console device handle from EFI console variable. 
-
-  @param  VarName            The name of the EFI console variable.
-  @param  ConsoleGuid        Specified Console protocol GUID.
-  @param  ConsoleHandle      On IN,  console handle in System Table to be checked. 
-                             On OUT, new console handle in system table.
-  @param  ProtocolInterface  On IN,  console protocol on console handle in System Table to be checked. 
-                             On OUT, new console protocol on new console handle in system table.
-
-  @retval TRUE               System Table has been updated.
-  @retval FALSE              System Table hasn't been updated.
-
-**/
-BOOLEAN 
-UpdateSystemTableConsole (
-  IN     CHAR16                          *VarName,
-  IN     EFI_GUID                        *ConsoleGuid,
-  IN OUT EFI_HANDLE                      *ConsoleHandle,
-  IN OUT VOID                            **ProtocolInterface
-  )
-{
-  EFI_STATUS                Status;
-  UINTN                     DevicePathSize;
-  EFI_DEVICE_PATH_PROTOCOL  *FullDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *VarConsole;
-  EFI_DEVICE_PATH_PROTOCOL  *Instance;
-  VOID                      *Interface;
-  EFI_HANDLE                NewHandle;
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut;
-
-  ASSERT (VarName != NULL);
-  ASSERT (ConsoleHandle != NULL);
-  ASSERT (ConsoleGuid != NULL);
-  ASSERT (ProtocolInterface != NULL);
-
-  if (*ConsoleHandle != NULL) {
-    Status = gBS->HandleProtocol (
-                   *ConsoleHandle,
-                   ConsoleGuid,
-                   &Interface
-                   );
-    if (Status == EFI_SUCCESS && Interface == *ProtocolInterface) {
-      //
-      // If ConsoleHandle is valid and console protocol on this handle also
-      // also matched, just return.
-      //
-      return FALSE;
-    }
-  }
-  
-  //
-  // Get all possible consoles device path from EFI variable
-  //
-  VarConsole = BdsLibGetVariableAndSize (
-                VarName,
-                &gEfiGlobalVariableGuid,
-                &DevicePathSize
-                );
-  if (VarConsole == NULL) {
-    //
-    // If there is no any console device, just return.
-    //
-    return FALSE;
-  }
-
-  FullDevicePath = VarConsole;
-
-  do {
-    //
-    // Check every instance of the console variable
-    //
-    Instance  = GetNextDevicePathInstance (&VarConsole, &DevicePathSize);
-    if (Instance == NULL) {
-      FreePool (FullDevicePath);
-      ASSERT (FALSE);
-    }
-    
-    //
-    // Find console device handle by device path instance
-    //
-    Status = gBS->LocateDevicePath (
-                   ConsoleGuid,
-                   &Instance,
-                   &NewHandle
-                   );
-    if (!EFI_ERROR (Status)) {
-      //
-      // Get the console protocol on this console device handle
-      //
-      Status = gBS->HandleProtocol (
-                     NewHandle,
-                     ConsoleGuid,
-                     &Interface
-                     );
-      if (!EFI_ERROR (Status)) {
-        //
-        // Update new console handle in System Table.
-        //
-        *ConsoleHandle     = NewHandle;
-        *ProtocolInterface = Interface;
-        if (CompareGuid (ConsoleGuid, &gEfiSimpleTextOutProtocolGuid)) {
-          //
-          // If it is console out device, set console mode 80x25 if current mode is invalid.
-          //
-          TextOut = (EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *) Interface;
-          if (TextOut->Mode->Mode == -1) {
-            TextOut->SetMode (TextOut, 0);
-          }
-        }
-        return TRUE;
-      }
-    }
-
-  } while (Instance != NULL);
-
-  //
-  // No any available console devcie found.
-  //
-  return FALSE;
-}
-
-/**
-  This function update console variable based on ConVarName, it can
-  add or remove one specific console device path from the variable
-
-  @param  ConVarName               Console related variable name, ConIn, ConOut,
-                                   ErrOut.
-  @param  CustomizedConDevicePath  The console device path which will be added to
-                                   the console variable ConVarName, this parameter
-                                   can not be multi-instance.
-  @param  ExclusiveDevicePath      The console device path which will be removed
-                                   from the console variable ConVarName, this
-                                   parameter can not be multi-instance.
-
-  @retval EFI_UNSUPPORTED          The added device path is same to the removed one.
-  @retval EFI_SUCCESS              Success add or remove the device path from  the
-                                   console variable.
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibUpdateConsoleVariable (
-  IN  CHAR16                    *ConVarName,
-  IN  EFI_DEVICE_PATH_PROTOCOL  *CustomizedConDevicePath,
-  IN  EFI_DEVICE_PATH_PROTOCOL  *ExclusiveDevicePath
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *VarConsole;
-  UINTN                     DevicePathSize;
-  EFI_DEVICE_PATH_PROTOCOL  *NewDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *TempNewDevicePath;
-  UINT32                    Attributes;
-
-  VarConsole      = NULL;
-  DevicePathSize  = 0;
-
-  //
-  // Notes: check the device path point, here should check
-  // with compare memory
-  //
-  if (CustomizedConDevicePath == ExclusiveDevicePath) {
-    return EFI_UNSUPPORTED;
-  }
-  //
-  // Delete the ExclusiveDevicePath from current default console
-  //
-  VarConsole = BdsLibGetVariableAndSize (
-                ConVarName,
-                &gEfiGlobalVariableGuid,
-                &DevicePathSize
-                );
-
-  //
-  // Initialize NewDevicePath
-  //
-  NewDevicePath  = VarConsole;
-
-  //
-  // If ExclusiveDevicePath is even the part of the instance in VarConsole, delete it.
-  // In the end, NewDevicePath is the final device path.
-  //
-  if (ExclusiveDevicePath != NULL && VarConsole != NULL) {
-      NewDevicePath = BdsLibDelPartMatchInstance (VarConsole, ExclusiveDevicePath);
-  }
-  //
-  // Try to append customized device path to NewDevicePath.
-  //
-  if (CustomizedConDevicePath != NULL) {
-    if (!BdsLibMatchDevicePaths (NewDevicePath, CustomizedConDevicePath)) {
-      //
-      // Check if there is part of CustomizedConDevicePath in NewDevicePath, delete it.
-      //
-      NewDevicePath = BdsLibDelPartMatchInstance (NewDevicePath, CustomizedConDevicePath);
-      //
-      // In the first check, the default console variable will be _ModuleEntryPoint,
-      // just append current customized device path
-      //
-      TempNewDevicePath = NewDevicePath;
-      NewDevicePath = AppendDevicePathInstance (NewDevicePath, CustomizedConDevicePath);
-      if (TempNewDevicePath != NULL) {
-        FreePool(TempNewDevicePath);
-      }
-    }
-  }
-
-  //
-  // The attribute for ConInDev, ConOutDev and ErrOutDev does not include NV.
-  //
-  if (IsNvNeed(ConVarName)) {
-    //
-    // ConVarName has NV attribute.
-    //
-    Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE;
-  } else {
-    //
-    // ConVarName does not have NV attribute.
-    //
-    Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;
-  }
-
-  //
-  // Finally, Update the variable of the default console by NewDevicePath
-  //
-  DevicePathSize = GetDevicePathSize (NewDevicePath);
-  Status = SetVariableAndReportStatusCodeOnError (
-             ConVarName,
-             &gEfiGlobalVariableGuid,
-             Attributes,
-             DevicePathSize,
-             NewDevicePath
-             );
-  if ((DevicePathSize == 0) && (Status == EFI_NOT_FOUND)) {
-    Status = EFI_SUCCESS;
-  }
-
-  if (VarConsole == NewDevicePath) {
-    if (VarConsole != NULL) {
-      FreePool(VarConsole);
-    }
-  } else {
-    if (VarConsole != NULL) {
-      FreePool(VarConsole);
-    }
-    if (NewDevicePath != NULL) {
-      FreePool(NewDevicePath);
-    }
-  }
-
-  return Status;
-
-}
-
-
-/**
-  Connect the console device base on the variable ConVarName, if
-  device path of the ConVarName is multi-instance device path and
-  anyone of the instances is connected success, then this function
-  will return success.
-  If the handle associate with one device path node can not
-  be created successfully, then still give chance to do the dispatch,
-  which load the missing drivers if possible..
-
-  @param  ConVarName               Console related variable name, ConIn, ConOut,
-                                   ErrOut.
-
-  @retval EFI_NOT_FOUND            There is not any console devices connected
-                                   success
-  @retval EFI_SUCCESS              Success connect any one instance of the console
-                                   device path base on the variable ConVarName.
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectConsoleVariable (
-  IN  CHAR16                 *ConVarName
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *StartDevicePath;
-  UINTN                     VariableSize;
-  EFI_DEVICE_PATH_PROTOCOL  *Instance;
-  EFI_DEVICE_PATH_PROTOCOL  *Next;
-  EFI_DEVICE_PATH_PROTOCOL  *CopyOfDevicePath;
-  UINTN                     Size;
-  BOOLEAN                   DeviceExist;
-
-  Status      = EFI_SUCCESS;
-  DeviceExist = FALSE;
-
-  //
-  // Check if the console variable exist
-  //
-  StartDevicePath = BdsLibGetVariableAndSize (
-                      ConVarName,
-                      &gEfiGlobalVariableGuid,
-                      &VariableSize
-                      );
-  if (StartDevicePath == NULL) {
-    return EFI_UNSUPPORTED;
-  }
-
-  CopyOfDevicePath = StartDevicePath;
-  do {
-    //
-    // Check every instance of the console variable
-    //
-    Instance  = GetNextDevicePathInstance (&CopyOfDevicePath, &Size);
-    if (Instance == NULL) {
-      FreePool (StartDevicePath);
-      return EFI_UNSUPPORTED;
-    }
-    
-    Next      = Instance;
-    while (!IsDevicePathEndType (Next)) {
-      Next = NextDevicePathNode (Next);
-    }
-
-    SetDevicePathEndNode (Next);
-    //
-    // Connect the USB console
-    // USB console device path is a short-form device path that 
-    //  starts with the first element being a USB WWID
-    //  or a USB Class device path
-    //
-    if ((DevicePathType (Instance) == MESSAGING_DEVICE_PATH) &&
-       ((DevicePathSubType (Instance) == MSG_USB_CLASS_DP)
-       || (DevicePathSubType (Instance) == MSG_USB_WWID_DP)
-       )) {
-      Status = BdsLibConnectUsbDevByShortFormDP (0xFF, Instance);
-      if (!EFI_ERROR (Status)) {
-        DeviceExist = TRUE;
-      }
-    } else {
-      //
-      // Connect the instance device path
-      //
-      Status = BdsLibConnectDevicePath (Instance);
-
-      if (EFI_ERROR (Status)) {
-        //
-        // Delete the instance from the console varialbe
-        //
-        BdsLibUpdateConsoleVariable (ConVarName, NULL, Instance);
-      } else {
-        DeviceExist = TRUE;
-      }
-    }
-    FreePool(Instance);
-  } while (CopyOfDevicePath != NULL);
-
-  FreePool (StartDevicePath);
-
-  if (!DeviceExist) {
-    return EFI_NOT_FOUND;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  This function will search every simpletext device in current system,
-  and make every simpletext device as pertantial console device.
-
-**/
-VOID
-EFIAPI
-BdsLibConnectAllConsoles (
-  VOID
-  )
-{
-  UINTN                     Index;
-  EFI_DEVICE_PATH_PROTOCOL  *ConDevicePath;
-  UINTN                     HandleCount;
-  EFI_HANDLE                *HandleBuffer;
-
-  Index         = 0;
-  HandleCount   = 0;
-  HandleBuffer  = NULL;
-  ConDevicePath = NULL;
-
-  //
-  // Update all the console variables
-  //
-  gBS->LocateHandleBuffer (
-          ByProtocol,
-          &gEfiSimpleTextInProtocolGuid,
-          NULL,
-          &HandleCount,
-          &HandleBuffer
-          );
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    gBS->HandleProtocol (
-            HandleBuffer[Index],
-            &gEfiDevicePathProtocolGuid,
-            (VOID **) &ConDevicePath
-            );
-    BdsLibUpdateConsoleVariable (L"ConIn", ConDevicePath, NULL);
-  }
-
-  if (HandleBuffer != NULL) {
-    FreePool(HandleBuffer);
-    HandleBuffer = NULL;
-  }
-
-  gBS->LocateHandleBuffer (
-          ByProtocol,
-          &gEfiSimpleTextOutProtocolGuid,
-          NULL,
-          &HandleCount,
-          &HandleBuffer
-          );
-  for (Index = 0; Index < HandleCount; Index++) {
-    gBS->HandleProtocol (
-            HandleBuffer[Index],
-            &gEfiDevicePathProtocolGuid,
-            (VOID **) &ConDevicePath
-            );
-    BdsLibUpdateConsoleVariable (L"ConOut", ConDevicePath, NULL);
-    BdsLibUpdateConsoleVariable (L"ErrOut", ConDevicePath, NULL);
-  }
-
-  if (HandleBuffer != NULL) {
-    FreePool(HandleBuffer);
-  }
-
-  //
-  // Connect all console variables
-  //
-  BdsLibConnectAllDefaultConsoles ();
-
-}
-
-/**
-  This function will connect console device base on the console
-  device variable ConIn, ConOut and ErrOut.
-
-  @retval EFI_SUCCESS              At least one of the ConIn and ConOut device have
-                                   been connected success.
-  @retval EFI_STATUS               Return the status of BdsLibConnectConsoleVariable ().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectAllDefaultConsoles (
-  VOID
-  )
-{
-  EFI_STATUS                Status;
-  BOOLEAN                   SystemTableUpdated;
-
-  //
-  // Connect all default console variables
-  //
-
-  //
-  // It seems impossible not to have any ConOut device on platform,
-  // so we check the status here.
-  //
-  Status = BdsLibConnectConsoleVariable (L"ConOut");
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Insert the performance probe for Console Out
-  //
-  PERF_START (NULL, "ConOut", "BDS", 1);
-  PERF_END (NULL, "ConOut", "BDS", 0);
-
-  //
-  // Because possibly the platform is legacy free, in such case,
-  // ConIn devices (Serial Port and PS2 Keyboard ) does not exist,
-  // so we need not check the status.
-  //
-  BdsLibConnectConsoleVariable (L"ConIn");
-
-  //
-  // The _ModuleEntryPoint err out var is legal.
-  //
-  BdsLibConnectConsoleVariable (L"ErrOut");
-
-  SystemTableUpdated = FALSE;
-  //
-  // Fill console handles in System Table if no console device assignd.
-  //
-  if (UpdateSystemTableConsole (L"ConIn", &gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **) &gST->ConIn)) {
-    SystemTableUpdated = TRUE;
-  }
-  if (UpdateSystemTableConsole (L"ConOut", &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **) &gST->ConOut)) {
-    SystemTableUpdated = TRUE;
-  }
-  if (UpdateSystemTableConsole (L"ErrOut", &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **) &gST->StdErr)) {
-    SystemTableUpdated = TRUE;
-  }
-
-  if (SystemTableUpdated) {
-    //
-    // Update the CRC32 in the EFI System Table header
-    //
-    gST->Hdr.CRC32 = 0;
-    gBS->CalculateCrc32 (
-          (UINT8 *) &gST->Hdr,
-          gST->Hdr.HeaderSize,
-          &gST->Hdr.CRC32
-          );
-  }
-
-  //
-  // If any component set PcdTestKeyUsed to TRUE because use of a test key
-  // was detected, then display a warning message on the debug log and the console
-  //
-  if (PcdGetBool (PcdTestKeyUsed) == TRUE) {
-    DEBUG ((DEBUG_ERROR, "**********************************\n"));
-    DEBUG ((DEBUG_ERROR, "**  WARNING: Test Key is used.  **\n"));
-    DEBUG ((DEBUG_ERROR, "**********************************\n"));
-    Print (L"**  WARNING: Test Key is used.  **\n");
-  }
-
-  return EFI_SUCCESS;
-
-}
-
-/**
-  This function will connect console device except ConIn base on the console
-  device variable  ConOut and ErrOut.
-
-  @retval EFI_SUCCESS              At least one of the ConOut device have
-                                   been connected success.
-  @retval EFI_STATUS               Return the status of BdsLibConnectConsoleVariable ().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibConnectAllDefaultConsolesWithOutConIn (
-  VOID
-  )
-{
-  EFI_STATUS                Status;
-  BOOLEAN                   SystemTableUpdated;
-
-  //
-  // Connect all default console variables except ConIn
-  //
-
-  //
-  // It seems impossible not to have any ConOut device on platform,
-  // so we check the status here.
-  //
-  Status = BdsLibConnectConsoleVariable (L"ConOut");
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Insert the performance probe for Console Out
-  //
-  PERF_START (NULL, "ConOut", "BDS", 1);
-  PERF_END (NULL, "ConOut", "BDS", 0);
-
-  //
-  // The _ModuleEntryPoint err out var is legal.
-  //
-  BdsLibConnectConsoleVariable (L"ErrOut");
-
-  SystemTableUpdated = FALSE;
-  //
-  // Fill console handles in System Table if no console device assignd.
-  //
-  if (UpdateSystemTableConsole (L"ConOut", &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **) &gST->ConOut)) {
-    SystemTableUpdated = TRUE;
-  }
-  if (UpdateSystemTableConsole (L"ErrOut", &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **) &gST->StdErr)) {
-    SystemTableUpdated = TRUE;
-  }
-
-  if (SystemTableUpdated) {
-    //
-    // Update the CRC32 in the EFI System Table header
-    //
-    gST->Hdr.CRC32 = 0;
-    gBS->CalculateCrc32 (
-          (UINT8 *) &gST->Hdr,
-          gST->Hdr.HeaderSize,
-          &gST->Hdr.CRC32
-          );
-  }
-
-  return EFI_SUCCESS;
-
-}
-
-/**
-  Use SystemTable Conout to stop video based Simple Text Out consoles from going
-  to the video device. Put up LogoFile on every video device that is a console.
-
-  @param[in]  LogoFile   File name of logo to display on the center of the screen.
-
-  @retval EFI_SUCCESS     ConsoleControl has been flipped to graphics and logo displayed.
-  @retval EFI_UNSUPPORTED Logo not found
-
-**/
-EFI_STATUS
-EFIAPI
-EnableQuietBoot (
-  IN  EFI_GUID  *LogoFile
-  )
-{
-  EFI_STATUS                    Status;
-  EFI_OEM_BADGING_PROTOCOL      *Badging;
-  UINT32                        SizeOfX;
-  UINT32                        SizeOfY;
-  INTN                          DestX;
-  INTN                          DestY;
-  UINT8                         *ImageData;
-  UINTN                         ImageSize;
-  UINTN                         BltSize;
-  UINT32                        Instance;
-  EFI_BADGING_FORMAT            Format;
-  EFI_BADGING_DISPLAY_ATTRIBUTE Attribute;
-  UINTN                         CoordinateX;
-  UINTN                         CoordinateY;
-  UINTN                         Height;
-  UINTN                         Width;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
-  EFI_UGA_DRAW_PROTOCOL         *UgaDraw;
-  UINT32                        ColorDepth;
-  UINT32                        RefreshRate;
-  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;
-  EFI_BOOT_LOGO_PROTOCOL        *BootLogo;
-  UINTN                         NumberOfLogos;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LogoBlt;
-  UINTN                         LogoDestX;
-  UINTN                         LogoDestY;
-  UINTN                         LogoHeight;
-  UINTN                         LogoWidth;
-  UINTN                         NewDestX;
-  UINTN                         NewDestY;
-  UINTN                         NewHeight;
-  UINTN                         NewWidth;
-  UINT64                        BufferSize;
-
-  UgaDraw = NULL;
-  //
-  // Try to open GOP first
-  //
-  Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **) &GraphicsOutput);
-  if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {
-    GraphicsOutput = NULL;
-    //
-    // Open GOP failed, try to open UGA
-    //
-    Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **) &UgaDraw);
-  }
-  if (EFI_ERROR (Status)) {
-    return EFI_UNSUPPORTED;
-  }
-
-  //
-  // Try to open Boot Logo Protocol.
-  //
-  BootLogo = NULL;
-  gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);
-
-  //
-  // Erase Cursor from screen
-  //
-  gST->ConOut->EnableCursor (gST->ConOut, FALSE);
-
-  Badging = NULL;
-  Status  = gBS->LocateProtocol (&gEfiOEMBadgingProtocolGuid, NULL, (VOID **) &Badging);
-
-  if (GraphicsOutput != NULL) {
-    SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;
-    SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;
-
-  } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {
-    Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate);
-    if (EFI_ERROR (Status)) {
-      return EFI_UNSUPPORTED;
-    }
-  } else {
-    return EFI_UNSUPPORTED;
-  }
-
-  Blt = NULL;
-  NumberOfLogos = 0;
-  LogoDestX = 0;
-  LogoDestY = 0;
-  LogoHeight = 0;
-  LogoWidth = 0;
-  NewDestX = 0;
-  NewDestY = 0;
-  NewHeight = 0;
-  NewWidth = 0;
-  Instance = 0;
-  while (1) {
-    ImageData = NULL;
-    ImageSize = 0;
-
-    if (Badging != NULL) {
-      //
-      // Get image from OEMBadging protocol.
-      //
-      Status = Badging->GetImage (
-                          Badging,
-                          &Instance,
-                          &Format,
-                          &ImageData,
-                          &ImageSize,
-                          &Attribute,
-                          &CoordinateX,
-                          &CoordinateY
-                          );
-      if (EFI_ERROR (Status)) {
-        goto Done;
-      }
-
-      //
-      // Currently only support BMP format.
-      //
-      if (Format != EfiBadgingFormatBMP) {
-        if (ImageData != NULL) {
-          FreePool (ImageData);
-        }
-        continue;
-      }
-    } else {
-      //
-      // Get the specified image from FV.
-      //
-      Status = GetSectionFromAnyFv (LogoFile, EFI_SECTION_RAW, 0, (VOID **) &ImageData, &ImageSize);
-      if (EFI_ERROR (Status)) {
-        return EFI_UNSUPPORTED;
-      }
-
-      CoordinateX = 0;
-      CoordinateY = 0;
-      if (!FeaturePcdGet(PcdBootlogoOnlyEnable)) {
-        Attribute   = EfiBadgingDisplayAttributeCenter;
-      } else {
-        Attribute   = EfiBadgingDisplayAttributeCustomized;
-      } 
-    }
-
-    if (Blt != NULL) {
-      FreePool (Blt);
-    }
-    Blt = NULL;
-    Status = TranslateBmpToGopBlt (
-              ImageData,
-              ImageSize,
-              &Blt,
-              &BltSize,
-              &Height,
-              &Width
-              );
-    if (EFI_ERROR (Status)) {
-      FreePool (ImageData);
-
-      if (Badging == NULL) {
-        return Status;
-      } else {
-        continue;
-      }
-    }
-
-    //
-    // Calculate the display position according to Attribute.
-    //
-    switch (Attribute) {
-    case EfiBadgingDisplayAttributeLeftTop:
-      DestX = CoordinateX;
-      DestY = CoordinateY;
-      break;
-
-    case EfiBadgingDisplayAttributeCenterTop:
-      DestX = (SizeOfX - Width) / 2;
-      DestY = CoordinateY;
-      break;
-
-    case EfiBadgingDisplayAttributeRightTop:
-      DestX = (SizeOfX - Width - CoordinateX);
-      DestY = CoordinateY;;
-      break;
-
-    case EfiBadgingDisplayAttributeCenterRight:
-      DestX = (SizeOfX - Width - CoordinateX);
-      DestY = (SizeOfY - Height) / 2;
-      break;
-
-    case EfiBadgingDisplayAttributeRightBottom:
-      DestX = (SizeOfX - Width - CoordinateX);
-      DestY = (SizeOfY - Height - CoordinateY);
-      break;
-
-    case EfiBadgingDisplayAttributeCenterBottom:
-      DestX = (SizeOfX - Width) / 2;
-      DestY = (SizeOfY - Height - CoordinateY);
-      break;
-
-    case EfiBadgingDisplayAttributeLeftBottom:
-      DestX = CoordinateX;
-      DestY = (SizeOfY - Height - CoordinateY);
-      break;
-
-    case EfiBadgingDisplayAttributeCenterLeft:
-      DestX = CoordinateX;
-      DestY = (SizeOfY - Height) / 2;
-      break;
-
-    case EfiBadgingDisplayAttributeCenter:
-      DestX = (SizeOfX - Width) / 2;
-      DestY = (SizeOfY - Height) / 2;
-      break;
-
-    case EfiBadgingDisplayAttributeCustomized:
-      DestX = (SizeOfX - Width) / 2;
-      DestY = ((SizeOfY * 382) / 1000) - Height / 2;
-      break;
-
-    default:
-      DestX = CoordinateX;
-      DestY = CoordinateY;
-      break;
-    }
-
-    if ((DestX >= 0) && (DestY >= 0)) {
-      if (GraphicsOutput != NULL) {
-        Status = GraphicsOutput->Blt (
-                            GraphicsOutput,
-                            Blt,
-                            EfiBltBufferToVideo,
-                            0,
-                            0,
-                            (UINTN) DestX,
-                            (UINTN) DestY,
-                            Width,
-                            Height,
-                            Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
-                            );
-      } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {
-        Status = UgaDraw->Blt (
-                            UgaDraw,
-                            (EFI_UGA_PIXEL *) Blt,
-                            EfiUgaBltBufferToVideo,
-                            0,
-                            0,
-                            (UINTN) DestX,
-                            (UINTN) DestY,
-                            Width,
-                            Height,
-                            Width * sizeof (EFI_UGA_PIXEL)
-                            );
-      } else {
-        Status = EFI_UNSUPPORTED;
-      }
-
-      //
-      // Report displayed Logo information.
-      //
-      if (!EFI_ERROR (Status)) {
-        NumberOfLogos++;
-
-        if (LogoWidth == 0) {
-          //
-          // The first Logo.
-          //
-          LogoDestX = (UINTN) DestX;
-          LogoDestY = (UINTN) DestY;
-          LogoWidth = Width;
-          LogoHeight = Height;
-        } else {
-          //
-          // Merge new logo with old one.
-          //
-          NewDestX = MIN ((UINTN) DestX, LogoDestX);
-          NewDestY = MIN ((UINTN) DestY, LogoDestY);
-          NewWidth = MAX ((UINTN) DestX + Width, LogoDestX + LogoWidth) - NewDestX;
-          NewHeight = MAX ((UINTN) DestY + Height, LogoDestY + LogoHeight) - NewDestY;
-
-          LogoDestX = NewDestX;
-          LogoDestY = NewDestY;
-          LogoWidth = NewWidth;
-          LogoHeight = NewHeight;
-        }
-      }
-    }
-
-    FreePool (ImageData);
-
-    if (Badging == NULL) {
-      break;
-    }
-  }
-
-Done:
-  if (BootLogo == NULL || NumberOfLogos == 0) {
-    //
-    // No logo displayed.
-    //
-    if (Blt != NULL) {
-      FreePool (Blt);
-    }
-
-    return Status;
-  }
-
-  //
-  // Advertise displayed Logo information.
-  //
-  if (NumberOfLogos == 1) {
-    //
-    // Only one logo displayed, use its Blt buffer directly for BootLogo protocol.
-    //
-    LogoBlt = Blt;
-    Status = EFI_SUCCESS;
-  } else {
-    //
-    // More than one Logo displayed, get merged BltBuffer using VideoToBuffer operation. 
-    //
-    if (Blt != NULL) {
-      FreePool (Blt);
-    }
-
-    //
-    // Ensure the LogoHeight * LogoWidth doesn't overflow
-    //
-    if (LogoHeight > DivU64x64Remainder ((UINTN) ~0, LogoWidth, NULL)) {
-      return EFI_UNSUPPORTED;
-    }
-    BufferSize = MultU64x64 (LogoWidth, LogoHeight);
-
-    //
-    // Ensure the BufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow
-    //
-    if (BufferSize > DivU64x32 ((UINTN) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) {
-      return EFI_UNSUPPORTED;
-    }
-
-    LogoBlt = AllocateZeroPool ((UINTN)BufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
-    if (LogoBlt == NULL) {
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    if (GraphicsOutput != NULL) {
-      Status = GraphicsOutput->Blt (
-                          GraphicsOutput,
-                          LogoBlt,
-                          EfiBltVideoToBltBuffer,
-                          LogoDestX,
-                          LogoDestY,
-                          0,
-                          0,
-                          LogoWidth,
-                          LogoHeight,
-                          LogoWidth * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
-                          );
-    } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {
-      Status = UgaDraw->Blt (
-                          UgaDraw,
-                          (EFI_UGA_PIXEL *) LogoBlt,
-                          EfiUgaVideoToBltBuffer,
-                          LogoDestX,
-                          LogoDestY,
-                          0,
-                          0,
-                          LogoWidth,
-                          LogoHeight,
-                          LogoWidth * sizeof (EFI_UGA_PIXEL)
-                          );
-    } else {
-      Status = EFI_UNSUPPORTED;
-    }
-  }
-
-  if (!EFI_ERROR (Status)) {
-    BootLogo->SetBootLogo (BootLogo, LogoBlt, LogoDestX, LogoDestY, LogoWidth, LogoHeight);
-  }
-  FreePool (LogoBlt);
-
-  return Status;
-}
-
-/**
-  Use SystemTable Conout to turn on video based Simple Text Out consoles. The 
-  Simple Text Out screens will now be synced up with all non video output devices
-
-  @retval EFI_SUCCESS     UGA devices are back in text mode and synced up.
-
-**/
-EFI_STATUS
-EFIAPI
-DisableQuietBoot (
-  VOID
-  )
-{
-
-  //
-  // Enable Cursor on Screen
-  //
-  gST->ConOut->EnableCursor (gST->ConOut, TRUE);
-  return EFI_SUCCESS;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c
deleted file mode 100644
index 313a1ea9f6..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c
+++ /dev/null
@@ -1,1575 +0,0 @@
-/** @file
-  Misc BDS library function
-
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "InternalBdsLib.h"
-
-
-#define MAX_STRING_LEN        200
-
-BOOLEAN   mFeaturerSwitch = TRUE;
-BOOLEAN   mResetRequired  = FALSE;
-
-extern UINT16 gPlatformBootTimeOutDefault;
-
-/**
-  The function will go through the driver option link list, load and start
-  every driver the driver option device path point to.
-
-  @param  BdsDriverLists        The header of the current driver option link list
-
-**/
-VOID
-EFIAPI
-BdsLibLoadDrivers (
-  IN LIST_ENTRY                   *BdsDriverLists
-  )
-{
-  EFI_STATUS                Status;
-  LIST_ENTRY                *Link;
-  BDS_COMMON_OPTION         *Option;
-  EFI_HANDLE                ImageHandle;
-  EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;
-  UINTN                     ExitDataSize;
-  CHAR16                    *ExitData;
-  BOOLEAN                   ReconnectAll;
-
-  ReconnectAll = FALSE;
-
-  //
-  // Process the driver option
-  //
-  for (Link = BdsDriverLists->ForwardLink; Link != BdsDriverLists; Link = Link->ForwardLink) {
-    Option = CR (Link, BDS_COMMON_OPTION, Link, BDS_LOAD_OPTION_SIGNATURE);
-    
-    //
-    // If a load option is not marked as LOAD_OPTION_ACTIVE,
-    // the boot manager will not automatically load the option.
-    //
-    if (!IS_LOAD_OPTION_TYPE (Option->Attribute, LOAD_OPTION_ACTIVE)) {
-      continue;
-    }
-    
-    //
-    // If a driver load option is marked as LOAD_OPTION_FORCE_RECONNECT,
-    // then all of the EFI drivers in the system will be disconnected and
-    // reconnected after the last driver load option is processed.
-    //
-    if (IS_LOAD_OPTION_TYPE (Option->Attribute, LOAD_OPTION_FORCE_RECONNECT)) {
-      ReconnectAll = TRUE;
-    }
-    
-    //
-    // Make sure the driver path is connected.
-    //
-    BdsLibConnectDevicePath (Option->DevicePath);
-
-    //
-    // Load and start the image that Driver#### describes
-    //
-    Status = gBS->LoadImage (
-                    FALSE,
-                    gImageHandle,
-                    Option->DevicePath,
-                    NULL,
-                    0,
-                    &ImageHandle
-                    );
-
-    if (!EFI_ERROR (Status)) {
-      gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &ImageInfo);
-
-      //
-      // Verify whether this image is a driver, if not,
-      // exit it and continue to parse next load option
-      //
-      if (ImageInfo->ImageCodeType != EfiBootServicesCode && ImageInfo->ImageCodeType != EfiRuntimeServicesCode) {
-        gBS->Exit (ImageHandle, EFI_INVALID_PARAMETER, 0, NULL);
-        continue;
-      }
-
-      if (Option->LoadOptionsSize != 0) {
-        ImageInfo->LoadOptionsSize  = Option->LoadOptionsSize;
-        ImageInfo->LoadOptions      = Option->LoadOptions;
-      }
-      //
-      // Before calling the image, enable the Watchdog Timer for
-      // the 5 Minute period
-      //
-      gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);
-
-      Status = gBS->StartImage (ImageHandle, &ExitDataSize, &ExitData);
-      DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Driver Return Status = %r\n", Status));
-
-      //
-      // Clear the Watchdog Timer after the image returns
-      //
-      gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);
-    }
-  }
-  
-  //
-  // Process the LOAD_OPTION_FORCE_RECONNECT driver option
-  //
-  if (ReconnectAll) {
-    BdsLibDisconnectAllEfi ();
-    BdsLibConnectAll ();
-  }
-
-}
-
-/**
-  Get the Option Number that does not used.
-  Try to locate the specific option variable one by one utile find a free number.
-
-  @param  VariableName          Indicate if the boot#### or driver#### option
-
-  @return The Minimal Free Option Number
-
-**/
-UINT16
-BdsLibGetFreeOptionNumber (
-  IN  CHAR16    *VariableName
-  )
-{
-  UINTN         Index;
-  CHAR16        StrTemp[10];
-  UINT16        *OptionBuffer;
-  UINTN         OptionSize;
-
-  //
-  // Try to find the minimum free number from 0, 1, 2, 3....
-  //
-  Index = 0;
-  do {
-    if (*VariableName == 'B') {
-      UnicodeSPrint (StrTemp, sizeof (StrTemp), L"Boot%04x", Index);
-    } else {
-      UnicodeSPrint (StrTemp, sizeof (StrTemp), L"Driver%04x", Index);
-    }
-    //
-    // try if the option number is used
-    //
-    OptionBuffer = BdsLibGetVariableAndSize (
-                     StrTemp,
-                     &gEfiGlobalVariableGuid,
-                     &OptionSize
-                     );
-    if (OptionBuffer == NULL) {
-      break;
-    }
-    FreePool(OptionBuffer);
-    Index++;
-  } while (TRUE);
-
-  return ((UINT16) Index);
-}
-
-
-/**
-  This function will register the new boot#### or driver#### option base on
-  the VariableName. The new registered boot#### or driver#### will be linked
-  to BdsOptionList and also update to the VariableName. After the boot#### or
-  driver#### updated, the BootOrder or DriverOrder will also be updated.
-
-  @param  BdsOptionList         The header of the boot#### or driver#### link list
-  @param  DevicePath            The device path which the boot#### or driver####
-                                option present
-  @param  String                The description of the boot#### or driver####
-  @param  VariableName          Indicate if the boot#### or driver#### option
-
-  @retval EFI_SUCCESS           The boot#### or driver#### have been success
-                                registered
-  @retval EFI_STATUS            Return the status of gRT->SetVariable ().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibRegisterNewOption (
-  IN  LIST_ENTRY                     *BdsOptionList,
-  IN  EFI_DEVICE_PATH_PROTOCOL       *DevicePath,
-  IN  CHAR16                         *String,
-  IN  CHAR16                         *VariableName
-  )
-{
-  EFI_STATUS                Status;
-  UINTN                     Index;
-  UINT16                    RegisterOptionNumber;
-  UINT16                    *TempOptionPtr;
-  UINTN                     TempOptionSize;
-  UINT16                    *OptionOrderPtr;
-  VOID                      *OptionPtr;
-  UINTN                     OptionSize;
-  UINT8                     *TempPtr;
-  EFI_DEVICE_PATH_PROTOCOL  *OptionDevicePath;
-  CHAR16                    *Description;
-  CHAR16                    OptionName[10];
-  BOOLEAN                   UpdateDescription;
-  UINT16                    BootOrderEntry;
-  UINTN                     OrderItemNum;
-
-  if (DevicePath == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  OptionPtr             = NULL;
-  OptionSize            = 0;
-  TempPtr               = NULL;
-  OptionDevicePath      = NULL;
-  Description           = NULL;
-  OptionOrderPtr        = NULL;
-  UpdateDescription     = FALSE;
-  Status                = EFI_SUCCESS;
-  ZeroMem (OptionName, sizeof (OptionName));
-
-  TempOptionSize = 0;
-  TempOptionPtr = BdsLibGetVariableAndSize (
-                    VariableName,
-                    &gEfiGlobalVariableGuid,
-                    &TempOptionSize
-                    );
-  //
-  // Compare with current option variable if the previous option is set in global variable.
-  //
-  for (Index = 0; Index < TempOptionSize / sizeof (UINT16); Index++) {
-    //
-    // TempOptionPtr must not be NULL if we have non-zero TempOptionSize.
-    //
-    ASSERT (TempOptionPtr != NULL);
-
-    if (*VariableName == 'B') {
-      UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", TempOptionPtr[Index]);
-    } else {
-      UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", TempOptionPtr[Index]);
-    }
-
-    OptionPtr = BdsLibGetVariableAndSize (
-                  OptionName,
-                  &gEfiGlobalVariableGuid,
-                  &OptionSize
-                  );
-    if (OptionPtr == NULL) {
-      continue;
-    }
-
-    //
-    // Validate the variable.
-    //
-    if (!ValidateOption(OptionPtr, OptionSize)) {
-      FreePool(OptionPtr);
-      continue;
-    }
-
-    TempPtr         =   OptionPtr;
-    TempPtr         +=  sizeof (UINT32) + sizeof (UINT16);
-    Description     =   (CHAR16 *) TempPtr;
-    TempPtr         +=  StrSize ((CHAR16 *) TempPtr);
-    OptionDevicePath =  (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;
-
-    //
-    // Notes: the description may will change base on the GetStringToken
-    //
-    if (CompareMem (OptionDevicePath, DevicePath, GetDevicePathSize (OptionDevicePath)) == 0) {
-      if (CompareMem (Description, String, StrSize (Description)) == 0) { 
-        //
-        // Got the option, so just return
-        //
-        FreePool (OptionPtr);
-        FreePool (TempOptionPtr);
-        return EFI_SUCCESS;
-      } else {
-        //
-        // Option description changed, need update.
-        //
-        UpdateDescription = TRUE;
-        FreePool (OptionPtr);
-        break;
-      }
-    }
-
-    FreePool (OptionPtr);
-  }
-
-  OptionSize          = sizeof (UINT32) + sizeof (UINT16) + StrSize (String);
-  OptionSize          += GetDevicePathSize (DevicePath);
-  OptionPtr           = AllocateZeroPool (OptionSize);
-  ASSERT (OptionPtr != NULL);
-  
-  TempPtr             = OptionPtr;
-  *(UINT32 *) TempPtr = LOAD_OPTION_ACTIVE;
-  TempPtr             += sizeof (UINT32);
-  *(UINT16 *) TempPtr = (UINT16) GetDevicePathSize (DevicePath);
-  TempPtr             += sizeof (UINT16);
-  CopyMem (TempPtr, String, StrSize (String));
-  TempPtr             += StrSize (String);
-  CopyMem (TempPtr, DevicePath, GetDevicePathSize (DevicePath));
-
-  if (UpdateDescription) {
-    //
-    // The number in option#### to be updated. 
-    // In this case, we must have non-NULL TempOptionPtr.
-    //
-    ASSERT (TempOptionPtr != NULL);
-    RegisterOptionNumber = TempOptionPtr[Index];
-  } else {
-    //
-    // The new option#### number
-    //
-    RegisterOptionNumber = BdsLibGetFreeOptionNumber(VariableName);
-  }
-
-  if (*VariableName == 'B') {
-    UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", RegisterOptionNumber);
-  } else {
-    UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", RegisterOptionNumber);
-  }
-
-  Status = gRT->SetVariable (
-                  OptionName,
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  OptionSize,
-                  OptionPtr
-                  );
-  //
-  // Return if only need to update a changed description or fail to set option.
-  //
-  if (EFI_ERROR (Status) || UpdateDescription) {
-    FreePool (OptionPtr);
-    if (TempOptionPtr != NULL) {
-      FreePool (TempOptionPtr);
-    }
-    return Status;
-  }
-
-  FreePool (OptionPtr);
-
-  //
-  // Update the option order variable
-  //
-
-  //
-  // If no option order
-  //
-  if (TempOptionSize == 0) {
-    BootOrderEntry = 0;
-    Status = gRT->SetVariable (
-                    VariableName,
-                    &gEfiGlobalVariableGuid,
-                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                    sizeof (UINT16),
-                    &BootOrderEntry
-                    );
-    if (TempOptionPtr != NULL) {
-      FreePool (TempOptionPtr);
-    }
-    return Status;
-  }
-  
-  //
-  // TempOptionPtr must not be NULL if TempOptionSize is not zero.
-  //
-  ASSERT (TempOptionPtr != NULL);
-  //
-  // Append the new option number to the original option order
-  //
-  OrderItemNum = (TempOptionSize / sizeof (UINT16)) + 1 ;
-  OptionOrderPtr = AllocateZeroPool ( OrderItemNum * sizeof (UINT16));
-  ASSERT (OptionOrderPtr!= NULL);
-  CopyMem (OptionOrderPtr, TempOptionPtr, (OrderItemNum - 1) * sizeof (UINT16));
-
-  OptionOrderPtr[Index] = RegisterOptionNumber;
-
-  Status = gRT->SetVariable (
-                  VariableName,
-                  &gEfiGlobalVariableGuid,
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
-                  OrderItemNum * sizeof (UINT16),
-                  OptionOrderPtr
-                  );
-  FreePool (TempOptionPtr);
-  FreePool (OptionOrderPtr);
-
-  return Status;
-}
-
-/**
-  Returns the size of a device path in bytes.
-
-  This function returns the size, in bytes, of the device path data structure 
-  specified by DevicePath including the end of device path node. If DevicePath 
-  is NULL, then 0 is returned. If the length of the device path is bigger than
-  MaxSize, also return 0 to indicate this is an invalidate device path.
-
-  @param  DevicePath         A pointer to a device path data structure.
-  @param  MaxSize            Max valid device path size. If big than this size, 
-                             return error.
-  
-  @retval 0                  An invalid device path.
-  @retval Others             The size of a device path in bytes.
-
-**/
-UINTN
-GetDevicePathSizeEx (
-  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath,
-  IN UINTN                           MaxSize
-  )
-{
-  UINTN  Size;
-  UINTN  NodeSize;
-
-  if (DevicePath == NULL) {
-    return 0;
-  }
-
-  //
-  // Search for the end of the device path structure
-  //
-  Size = 0;
-  while (!IsDevicePathEnd (DevicePath)) {
-    NodeSize = DevicePathNodeLength (DevicePath);
-    if (NodeSize < END_DEVICE_PATH_LENGTH) {
-      return 0;
-    }
-    Size += NodeSize;
-    if (Size > MaxSize) {
-      return 0;
-    }
-    DevicePath = NextDevicePathNode (DevicePath);
-  }
-  Size += DevicePathNodeLength (DevicePath);
-  if (Size > MaxSize) {
-    return 0;
-  }
-
-  return Size;
-}
-
-/**
-  Returns the length of a Null-terminated Unicode string. If the length is 
-  bigger than MaxStringLen, return length 0 to indicate that this is an 
-  invalidate string.
-
-  This function returns the byte length of Unicode characters in the Null-terminated
-  Unicode string specified by String. 
-
-  If String is NULL, then ASSERT().
-  If String is not aligned on a 16-bit boundary, then ASSERT().
-
-  @param  String           A pointer to a Null-terminated Unicode string.
-  @param  MaxStringLen     Max string len in this string.
-
-  @retval 0                An invalid string.
-  @retval Others           The length of String.
-
-**/
-UINTN
-StrSizeEx (
-  IN      CONST CHAR16              *String,
-  IN      UINTN                     MaxStringLen
-  )
-{
-  UINTN                             Length;
-
-  ASSERT (String != NULL && MaxStringLen != 0);
-  ASSERT (((UINTN) String & BIT0) == 0);
-
-  for (Length = 0; *String != L'\0' && MaxStringLen != Length; String++, Length+=2);
-
-  if (*String != L'\0' && MaxStringLen == Length) {
-    return 0;
-  }
-
-  return Length + 2;
-}
-
-/**
-  Validate the EFI Boot#### variable (VendorGuid/Name)
-
-  @param  Variable              Boot#### variable data.
-  @param  VariableSize          Returns the size of the EFI variable that was read
-
-  @retval TRUE                  The variable data is correct.
-  @retval FALSE                 The variable data is corrupted.
-
-**/
-BOOLEAN 
-ValidateOption (
-  UINT8                     *Variable,
-  UINTN                     VariableSize
-  )
-{
-  UINT16                    FilePathSize;
-  UINT8                     *TempPtr;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  UINTN                     TempSize;
-
-  if (VariableSize <= sizeof (UINT16) + sizeof (UINT32)) {
-    return FALSE;
-  }
-
-  //
-  // Skip the option attribute
-  //
-  TempPtr    = Variable;
-  TempPtr   += sizeof (UINT32);
-
-  //
-  // Get the option's device path size
-  //
-  FilePathSize  = *(UINT16 *) TempPtr;
-  TempPtr      += sizeof (UINT16);
-
-  //
-  // Get the option's description string size
-  //
-  TempSize = StrSizeEx ((CHAR16 *) TempPtr, VariableSize - sizeof (UINT16) - sizeof (UINT32));
-  TempPtr += TempSize;
-
-  //
-  // Get the option's device path
-  //
-  DevicePath =  (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;
-  TempPtr   += FilePathSize;
-
-  //
-  // Validation boot option variable.
-  //
-  if ((FilePathSize == 0) || (TempSize == 0)) {
-    return FALSE;
-  }
-
-  if (TempSize + FilePathSize + sizeof (UINT16) + sizeof (UINT32) > VariableSize) {
-    return FALSE;
-  }
-
-  return (BOOLEAN) (GetDevicePathSizeEx (DevicePath, FilePathSize) != 0);
-}
-
-/**
-  Convert a single character to number.
-  It assumes the input Char is in the scope of L'0' ~ L'9' and L'A' ~ L'F'
-  
-  @param Char    The input char which need to change to a hex number.
-  
-**/
-UINTN
-CharToUint (
-  IN CHAR16                           Char
-  )
-{
-  if ((Char >= L'0') && (Char <= L'9')) {
-    return (UINTN) (Char - L'0');
-  }
-
-  if ((Char >= L'A') && (Char <= L'F')) {
-    return (UINTN) (Char - L'A' + 0xA);
-  }
-
-  ASSERT (FALSE);
-  return 0;
-}
-
-/**
-  Build the boot#### or driver#### option from the VariableName, the
-  build boot#### or driver#### will also be linked to BdsCommonOptionList.
-
-  @param  BdsCommonOptionList   The header of the boot#### or driver#### option
-                                link list
-  @param  VariableName          EFI Variable name indicate if it is boot#### or
-                                driver####
-
-  @retval BDS_COMMON_OPTION     Get the option just been created
-  @retval NULL                  Failed to get the new option
-
-**/
-BDS_COMMON_OPTION *
-EFIAPI
-BdsLibVariableToOption (
-  IN OUT LIST_ENTRY                   *BdsCommonOptionList,
-  IN  CHAR16                          *VariableName
-  )
-{
-  UINT32                    Attribute;
-  UINT16                    FilePathSize;
-  UINT8                     *Variable;
-  UINT8                     *TempPtr;
-  UINTN                     VariableSize;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  BDS_COMMON_OPTION         *Option;
-  VOID                      *LoadOptions;
-  UINT32                    LoadOptionsSize;
-  CHAR16                    *Description;
-  UINT8                     NumOff;
-
-  //
-  // Read the variable. We will never free this data.
-  //
-  Variable = BdsLibGetVariableAndSize (
-              VariableName,
-              &gEfiGlobalVariableGuid,
-              &VariableSize
-              );
-  if (Variable == NULL) {
-    return NULL;
-  }
-
-  //
-  // Validate Boot#### variable data.
-  //
-  if (!ValidateOption(Variable, VariableSize)) {
-    FreePool (Variable);
-    return NULL;
-  }
-
-  //
-  // Notes: careful defined the variable of Boot#### or
-  // Driver####, consider use some macro to abstract the code
-  //
-  //
-  // Get the option attribute
-  //
-  TempPtr   =  Variable;
-  Attribute =  *(UINT32 *) Variable;
-  TempPtr   += sizeof (UINT32);
-
-  //
-  // Get the option's device path size
-  //
-  FilePathSize =  *(UINT16 *) TempPtr;
-  TempPtr      += sizeof (UINT16);
-
-  //
-  // Get the option's description string
-  //
-  Description = (CHAR16 *) TempPtr;
-
-  //
-  // Get the option's description string size
-  //
-  TempPtr += StrSize((CHAR16 *) TempPtr);
-
-  //
-  // Get the option's device path
-  //
-  DevicePath =  (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;
-  TempPtr    += FilePathSize;
-
-  //
-  // Get load opion data.
-  //
-  LoadOptions     = TempPtr;
-  LoadOptionsSize = (UINT32) (VariableSize - (UINTN) (TempPtr - Variable));
-
-  //
-  // The Console variables may have multiple device paths, so make
-  // an Entry for each one.
-  //
-  Option = AllocateZeroPool (sizeof (BDS_COMMON_OPTION));
-  if (Option == NULL) {
-    FreePool (Variable);
-    return NULL;
-  }
-
-  Option->Signature   = BDS_LOAD_OPTION_SIGNATURE;
-  Option->DevicePath  = AllocateZeroPool (GetDevicePathSize (DevicePath));
-  ASSERT(Option->DevicePath != NULL);
-  CopyMem (Option->DevicePath, DevicePath, GetDevicePathSize (DevicePath));
-
-  Option->Attribute   = Attribute;
-  Option->Description = AllocateZeroPool (StrSize (Description));
-  ASSERT(Option->Description != NULL);
-  CopyMem (Option->Description, Description, StrSize (Description));
-
-  Option->LoadOptions = AllocateZeroPool (LoadOptionsSize);
-  ASSERT(Option->LoadOptions != NULL);
-  CopyMem (Option->LoadOptions, LoadOptions, LoadOptionsSize);
-  Option->LoadOptionsSize = LoadOptionsSize;
-
-  //
-  // Get the value from VariableName Unicode string
-  // since the ISO standard assumes ASCII equivalent abbreviations, we can be safe in converting this
-  // Unicode stream to ASCII without any loss in meaning.
-  //
-  if (*VariableName == 'B') {
-    NumOff = (UINT8) (sizeof (L"Boot") / sizeof (CHAR16) - 1);
-    Option->BootCurrent = (UINT16) (CharToUint (VariableName[NumOff+0]) * 0x1000) 
-               + (UINT16) (CharToUint (VariableName[NumOff+1]) * 0x100)
-               + (UINT16) (CharToUint (VariableName[NumOff+2]) * 0x10)
-               + (UINT16) (CharToUint (VariableName[NumOff+3]) * 0x1);
-  }
-  InsertTailList (BdsCommonOptionList, &Option->Link);
-  FreePool (Variable);
-  return Option;
-}
-
-/**
-  Process BootOrder, or DriverOrder variables, by calling
-  BdsLibVariableToOption () for each UINT16 in the variables.
-
-  @param  BdsCommonOptionList   The header of the option list base on variable
-                                VariableName
-  @param  VariableName          EFI Variable name indicate the BootOrder or
-                                DriverOrder
-
-  @retval EFI_SUCCESS           Success create the boot option or driver option
-                                list
-  @retval EFI_OUT_OF_RESOURCES  Failed to get the boot option or driver option list
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibBuildOptionFromVar (
-  IN  LIST_ENTRY                      *BdsCommonOptionList,
-  IN  CHAR16                          *VariableName
-  )
-{
-  UINT16            *OptionOrder;
-  UINTN             OptionOrderSize;
-  UINTN             Index;
-  BDS_COMMON_OPTION *Option;
-  CHAR16            OptionName[20];
-
-  //
-  // Zero Buffer in order to get all BOOT#### variables
-  //
-  ZeroMem (OptionName, sizeof (OptionName));
-
-  //
-  // Read the BootOrder, or DriverOrder variable.
-  //
-  OptionOrder = BdsLibGetVariableAndSize (
-                  VariableName,
-                  &gEfiGlobalVariableGuid,
-                  &OptionOrderSize
-                  );
-  if (OptionOrder == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  for (Index = 0; Index < OptionOrderSize / sizeof (UINT16); Index++) {
-    if (*VariableName == 'B') {
-      UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", OptionOrder[Index]);
-    } else {
-      UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", OptionOrder[Index]);
-    }
-
-    Option              = BdsLibVariableToOption (BdsCommonOptionList, OptionName);
-    if (Option != NULL) {
-      Option->BootCurrent = OptionOrder[Index];
-    }
-  }
-
-  FreePool (OptionOrder);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Get boot mode by looking up configuration table and parsing HOB list
-
-  @param  BootMode              Boot mode from PEI handoff HOB.
-
-  @retval EFI_SUCCESS           Successfully get boot mode
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibGetBootMode (
-  OUT EFI_BOOT_MODE       *BootMode
-  )
-{
-  *BootMode = GetBootModeHob ();
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Read the EFI variable (VendorGuid/Name) and return a dynamically allocated
-  buffer, and the size of the buffer. If failure return NULL.
-
-  @param  Name                  String part of EFI variable name
-  @param  VendorGuid            GUID part of EFI variable name
-  @param  VariableSize          Returns the size of the EFI variable that was read
-
-  @return                       Dynamically allocated memory that contains a copy of the EFI variable
-                                Caller is responsible freeing the buffer.
-  @retval NULL                  Variable was not read
-
-**/
-VOID *
-EFIAPI
-BdsLibGetVariableAndSize (
-  IN  CHAR16              *Name,
-  IN  EFI_GUID            *VendorGuid,
-  OUT UINTN               *VariableSize
-  )
-{
-  EFI_STATUS  Status;
-  UINTN       BufferSize;
-  VOID        *Buffer;
-
-  Buffer = NULL;
-
-  //
-  // Pass in a zero size buffer to find the required buffer size.
-  //
-  BufferSize  = 0;
-  Status      = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize, Buffer);
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    //
-    // Allocate the buffer to return
-    //
-    Buffer = AllocateZeroPool (BufferSize);
-    if (Buffer == NULL) {
-      *VariableSize = 0;
-      return NULL;
-    }
-    //
-    // Read variable into the allocated buffer.
-    //
-    Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize, Buffer);
-    if (EFI_ERROR (Status)) {
-      FreePool (Buffer);
-      BufferSize = 0;
-      Buffer     = NULL;
-    }
-  }
-
-  ASSERT (((Buffer == NULL) && (BufferSize == 0)) ||
-          ((Buffer != NULL) && (BufferSize != 0))
-          );
-  *VariableSize = BufferSize;
-  return Buffer;
-}
-
-/**
-  Delete the instance in Multi which matches partly with Single instance
-
-  @param  Multi                 A pointer to a multi-instance device path data
-                                structure.
-  @param  Single                A pointer to a single-instance device path data
-                                structure.
-
-  @return This function will remove the device path instances in Multi which partly
-          match with the Single, and return the result device path. If there is no
-          remaining device path as a result, this function will return NULL.
-
-**/
-EFI_DEVICE_PATH_PROTOCOL *
-EFIAPI
-BdsLibDelPartMatchInstance (
-  IN     EFI_DEVICE_PATH_PROTOCOL  *Multi,
-  IN     EFI_DEVICE_PATH_PROTOCOL  *Single
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL  *Instance;
-  EFI_DEVICE_PATH_PROTOCOL  *NewDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *TempNewDevicePath;
-  UINTN                     InstanceSize;
-  UINTN                     SingleDpSize;
-  UINTN                     Size;
-
-  NewDevicePath     = NULL;
-  TempNewDevicePath = NULL;
-
-  if (Multi == NULL || Single == NULL) {
-    return Multi;
-  }
-
-  Instance        =  GetNextDevicePathInstance (&Multi, &InstanceSize);
-  SingleDpSize    =  GetDevicePathSize (Single) - END_DEVICE_PATH_LENGTH;
-  InstanceSize    -= END_DEVICE_PATH_LENGTH;
-
-  while (Instance != NULL) {
-
-    Size = (SingleDpSize < InstanceSize) ? SingleDpSize : InstanceSize;
-
-    if ((CompareMem (Instance, Single, Size) != 0)) {
-      //
-      // Append the device path instance which does not match with Single
-      //
-      TempNewDevicePath = NewDevicePath;
-      NewDevicePath = AppendDevicePathInstance (NewDevicePath, Instance);
-      if (TempNewDevicePath != NULL) {
-        FreePool(TempNewDevicePath);
-      }
-    }
-    FreePool(Instance);
-    Instance = GetNextDevicePathInstance (&Multi, &InstanceSize);
-    InstanceSize  -= END_DEVICE_PATH_LENGTH;
-  }
-
-  return NewDevicePath;
-}
-
-/**
-  Function compares a device path data structure to that of all the nodes of a
-  second device path instance.
-
-  @param  Multi                 A pointer to a multi-instance device path data
-                                structure.
-  @param  Single                A pointer to a single-instance device path data
-                                structure.
-
-  @retval TRUE                  If the Single device path is contained within Multi device path.
-  @retval FALSE                 The Single device path is not match within Multi device path.
-
-**/
-BOOLEAN
-EFIAPI
-BdsLibMatchDevicePaths (
-  IN  EFI_DEVICE_PATH_PROTOCOL  *Multi,
-  IN  EFI_DEVICE_PATH_PROTOCOL  *Single
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePathInst;
-  UINTN                     Size;
-
-  if (Multi == NULL || Single  == NULL) {
-    return FALSE;
-  }
-
-  DevicePath      = Multi;
-  DevicePathInst  = GetNextDevicePathInstance (&DevicePath, &Size);
-
-  //
-  // Search for the match of 'Single' in 'Multi'
-  //
-  while (DevicePathInst != NULL) {
-    //
-    // If the single device path is found in multiple device paths,
-    // return success
-    //
-    if (CompareMem (Single, DevicePathInst, Size) == 0) {
-      FreePool (DevicePathInst);
-      return TRUE;
-    }
-
-    FreePool (DevicePathInst);
-    DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);
-  }
-
-  return FALSE;
-}
-
-/**
-  This function prints a series of strings.
-
-  @param  ConOut                Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
-  @param  ...                   A variable argument list containing series of
-                                strings, the last string must be NULL.
-
-  @retval EFI_SUCCESS           Success print out the string using ConOut.
-  @retval EFI_STATUS            Return the status of the ConOut->OutputString ().
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibOutputStrings (
-  IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL   *ConOut,
-  ...
-  )
-{
-  VA_LIST     Args;
-  EFI_STATUS  Status;
-  CHAR16      *String;
-
-  Status = EFI_SUCCESS;
-  VA_START (Args, ConOut);
-
-  while (!EFI_ERROR (Status)) {
-    //
-    // If String is NULL, then it's the end of the list
-    //
-    String = VA_ARG (Args, CHAR16 *);
-    if (String == NULL) {
-      break;
-    }
-
-    Status = ConOut->OutputString (ConOut, String);
-
-    if (EFI_ERROR (Status)) {
-      break;
-    }
-  }
-  
-  VA_END(Args);
-  return Status;
-}
-
-//
-//  Following are BDS Lib functions which contain all the code about setup browser reset reminder feature.
-//  Setup Browser reset reminder feature is that an reset reminder will be given before user leaves the setup browser  if
-//  user change any option setting which needs a reset to be effective, and  the reset will be applied according to  the user selection.
-//
-
-
-/**
-  Enable the setup browser reset reminder feature.
-  This routine is used in platform tip. If the platform policy need the feature, use the routine to enable it.
-
-**/
-VOID
-EFIAPI
-EnableResetReminderFeature (
-  VOID
-  )
-{
-  mFeaturerSwitch = TRUE;
-}
-
-
-/**
-  Disable the setup browser reset reminder feature.
-  This routine is used in platform tip. If the platform policy do not want the feature, use the routine to disable it.
-
-**/
-VOID
-EFIAPI
-DisableResetReminderFeature (
-  VOID
-  )
-{
-  mFeaturerSwitch = FALSE;
-}
-
-
-/**
-  Record the info that  a reset is required.
-  A  module boolean variable is used to record whether a reset is required.
-
-**/
-VOID
-EFIAPI
-EnableResetRequired (
-  VOID
-  )
-{
-  mResetRequired = TRUE;
-}
-
-
-/**
-  Record the info that  no reset is required.
-  A  module boolean variable is used to record whether a reset is required.
-
-**/
-VOID
-EFIAPI
-DisableResetRequired (
-  VOID
-  )
-{
-  mResetRequired = FALSE;
-}
-
-
-/**
-  Check whether platform policy enable the reset reminder feature. The default is enabled.
-
-**/
-BOOLEAN
-EFIAPI
-IsResetReminderFeatureEnable (
-  VOID
-  )
-{
-  return mFeaturerSwitch;
-}
-
-
-/**
-  Check if  user changed any option setting which needs a system reset to be effective.
-
-**/
-BOOLEAN
-EFIAPI
-IsResetRequired (
-  VOID
-  )
-{
-  return mResetRequired;
-}
-
-
-/**
-  Check whether a reset is needed, and finish the reset reminder feature.
-  If a reset is needed, Popup a menu to notice user, and finish the feature
-  according to the user selection.
-
-**/
-VOID
-EFIAPI
-SetupResetReminder (
-  VOID
-  )
-{
-  EFI_INPUT_KEY                 Key;
-  CHAR16                        *StringBuffer1;
-  CHAR16                        *StringBuffer2;
-
-
-  //
-  //check any reset required change is applied? if yes, reset system
-  //
-  if (IsResetReminderFeatureEnable ()) {
-    if (IsResetRequired ()) {
-
-      StringBuffer1 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));
-      ASSERT (StringBuffer1 != NULL);
-      StringBuffer2 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));
-      ASSERT (StringBuffer2 != NULL);
-      StrCpy (StringBuffer1, L"Configuration changed. Reset to apply it Now.");
-      StrCpy (StringBuffer2, L"Press ENTER to reset");
-      //
-      // Popup a menu to notice user
-      //
-      do {
-        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);
-      } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
-
-      FreePool (StringBuffer1);
-      FreePool (StringBuffer2);
-
-      gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
-    }
-  }
-}
-
-/**
-  Get the headers (dos, image, optional header) from an image
-
-  @param  Device                SimpleFileSystem device handle
-  @param  FileName              File name for the image
-  @param  DosHeader             Pointer to dos header
-  @param  Hdr                   The buffer in which to return the PE32, PE32+, or TE header.
-
-  @retval EFI_SUCCESS           Successfully get the machine type.
-  @retval EFI_NOT_FOUND         The file is not found.
-  @retval EFI_LOAD_ERROR        File is not a valid image file.
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibGetImageHeader (
-  IN  EFI_HANDLE                  Device,
-  IN  CHAR16                      *FileName,
-  OUT EFI_IMAGE_DOS_HEADER        *DosHeader,
-  OUT EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr
-  )
-{
-  EFI_STATUS                       Status;
-  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  *Volume;
-  EFI_FILE_HANDLE                  Root;
-  EFI_FILE_HANDLE                  ThisFile;
-  UINTN                            BufferSize;
-  UINT64                           FileSize;
-  EFI_FILE_INFO                    *Info;
-
-  Root     = NULL;
-  ThisFile = NULL;
-  //
-  // Handle the file system interface to the device
-  //
-  Status = gBS->HandleProtocol (
-                  Device,
-                  &gEfiSimpleFileSystemProtocolGuid,
-                  (VOID *) &Volume
-                  );
-  if (EFI_ERROR (Status)) {
-    goto Done;
-  }
-
-  Status = Volume->OpenVolume (
-                     Volume,
-                     &Root
-                     );
-  if (EFI_ERROR (Status)) {
-    Root = NULL;
-    goto Done;
-  }
-  ASSERT (Root != NULL);
-  Status = Root->Open (Root, &ThisFile, FileName, EFI_FILE_MODE_READ, 0);
-  if (EFI_ERROR (Status)) {
-    goto Done;
-  }
-  ASSERT (ThisFile != NULL);
-
-  //
-  // Get file size
-  //
-  BufferSize  = SIZE_OF_EFI_FILE_INFO + 200;
-  do {
-    Info   = NULL;
-    Status = gBS->AllocatePool (EfiBootServicesData, BufferSize, (VOID **) &Info);
-    if (EFI_ERROR (Status)) {
-      goto Done;
-    }
-    Status = ThisFile->GetInfo (
-                         ThisFile,
-                         &gEfiFileInfoGuid,
-                         &BufferSize,
-                         Info
-                         );
-    if (!EFI_ERROR (Status)) {
-      break;
-    }
-    if (Status != EFI_BUFFER_TOO_SMALL) {
-      FreePool (Info);
-      goto Done;
-    }
-    FreePool (Info);
-  } while (TRUE);
-
-  FileSize = Info->FileSize;
-  FreePool (Info);
-
-  //
-  // Read dos header
-  //
-  BufferSize = sizeof (EFI_IMAGE_DOS_HEADER);
-  Status = ThisFile->Read (ThisFile, &BufferSize, DosHeader);
-  if (EFI_ERROR (Status) ||
-      BufferSize < sizeof (EFI_IMAGE_DOS_HEADER) ||
-      FileSize <= DosHeader->e_lfanew ||
-      DosHeader->e_magic != EFI_IMAGE_DOS_SIGNATURE) {
-    Status = EFI_LOAD_ERROR;
-    goto Done;
-  }
-
-  //
-  // Move to PE signature
-  //
-  Status = ThisFile->SetPosition (ThisFile, DosHeader->e_lfanew);
-  if (EFI_ERROR (Status)) {
-    Status = EFI_LOAD_ERROR;
-    goto Done;
-  }
-
-  //
-  // Read and check PE signature
-  //
-  BufferSize = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION);
-  Status = ThisFile->Read (ThisFile, &BufferSize, Hdr.Pe32);
-  if (EFI_ERROR (Status) ||
-      BufferSize < sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION) ||
-      Hdr.Pe32->Signature != EFI_IMAGE_NT_SIGNATURE) {
-    Status = EFI_LOAD_ERROR;
-    goto Done;
-  }
-
-  //
-  // Check PE32 or PE32+ magic
-  //
-  if (Hdr.Pe32->OptionalHeader.Magic != EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC &&
-      Hdr.Pe32->OptionalHeader.Magic != EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
-    Status = EFI_LOAD_ERROR;
-    goto Done;
-  }
-
- Done:
-  if (ThisFile != NULL) {
-    ThisFile->Close (ThisFile);
-  }
-  if (Root != NULL) {
-    Root->Close (Root);
-  }
-  return Status;
-}
-
-/**
-  This routine adjust the memory information for different memory type and 
-  save them into the variables for next boot.
-**/
-VOID
-BdsSetMemoryTypeInformationVariable (
-  VOID
-  )
-{
-  EFI_STATUS                   Status;
-  EFI_MEMORY_TYPE_INFORMATION  *PreviousMemoryTypeInformation;
-  EFI_MEMORY_TYPE_INFORMATION  *CurrentMemoryTypeInformation;
-  UINTN                        VariableSize;
-  UINTN                        Index;
-  UINTN                        Index1;
-  UINT32                       Previous;
-  UINT32                       Current;
-  UINT32                       Next;
-  EFI_HOB_GUID_TYPE            *GuidHob;
-  BOOLEAN                      MemoryTypeInformationModified;
-  BOOLEAN                      MemoryTypeInformationVariableExists;
-  EFI_BOOT_MODE                BootMode;
-
-  MemoryTypeInformationModified       = FALSE;
-  MemoryTypeInformationVariableExists = FALSE;
-
-
-  BootMode = GetBootModeHob ();
-  //
-  // In BOOT_IN_RECOVERY_MODE, Variable region is not reliable.
-  //
-  if (BootMode == BOOT_IN_RECOVERY_MODE) {
-    return;
-  }
-
-  //
-  // Only check the the Memory Type Information variable in the boot mode 
-  // other than BOOT_WITH_DEFAULT_SETTINGS because the Memory Type
-  // Information is not valid in this boot mode.
-  //
-  if (BootMode != BOOT_WITH_DEFAULT_SETTINGS) {
-    VariableSize = 0;
-    Status = gRT->GetVariable (
-                    EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME,
-                    &gEfiMemoryTypeInformationGuid,
-                    NULL, 
-                    &VariableSize, 
-                    NULL
-                    );
-    if (Status == EFI_BUFFER_TOO_SMALL) {
-      MemoryTypeInformationVariableExists = TRUE;
-    }
-  }
-
-  //
-  // Retrieve the current memory usage statistics.  If they are not found, then
-  // no adjustments can be made to the Memory Type Information variable.
-  //
-  Status = EfiGetSystemConfigurationTable (
-             &gEfiMemoryTypeInformationGuid,
-             (VOID **) &CurrentMemoryTypeInformation
-             );
-  if (EFI_ERROR (Status) || CurrentMemoryTypeInformation == NULL) {
-    return;
-  }
-
-  //
-  // Get the Memory Type Information settings from Hob if they exist,
-  // PEI is responsible for getting them from variable and build a Hob to save them.
-  // If the previous Memory Type Information is not available, then set defaults
-  //
-  GuidHob = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
-  if (GuidHob == NULL) {
-    //
-    // If Platform has not built Memory Type Info into the Hob, just return.
-    //
-    return;
-  }
-  PreviousMemoryTypeInformation = GET_GUID_HOB_DATA (GuidHob);
-  VariableSize = GET_GUID_HOB_DATA_SIZE (GuidHob);
-
-  //
-  // Use a heuristic to adjust the Memory Type Information for the next boot
-  //
-  DEBUG ((EFI_D_INFO, "Memory  Previous  Current    Next   \n"));
-  DEBUG ((EFI_D_INFO, " Type    Pages     Pages     Pages  \n"));
-  DEBUG ((EFI_D_INFO, "======  ========  ========  ========\n"));
-
-  for (Index = 0; PreviousMemoryTypeInformation[Index].Type != EfiMaxMemoryType; Index++) {
-
-    for (Index1 = 0; CurrentMemoryTypeInformation[Index1].Type != EfiMaxMemoryType; Index1++) {
-      if (PreviousMemoryTypeInformation[Index].Type == CurrentMemoryTypeInformation[Index1].Type) {
-        break;
-      }
-    }
-    if (CurrentMemoryTypeInformation[Index1].Type == EfiMaxMemoryType) {
-      continue;
-    }
-
-    //
-    // Previous is the number of pages pre-allocated
-    // Current is the number of pages actually needed
-    //
-    Previous = PreviousMemoryTypeInformation[Index].NumberOfPages;
-    Current  = CurrentMemoryTypeInformation[Index1].NumberOfPages;
-    Next     = Previous;
-
-    //
-    // Inconsistent Memory Reserved across bootings may lead to S4 fail
-    // Write next varible to 125% * current when the pre-allocated memory is:
-    //  1. More than 150% of needed memory and boot mode is BOOT_WITH_DEFAULT_SETTING
-    //  2. Less than the needed memory
-    //
-    if ((Current + (Current >> 1)) < Previous) {
-      if (BootMode == BOOT_WITH_DEFAULT_SETTINGS) {
-        Next = Current + (Current >> 2);
-      }
-    } else if (Current > Previous) {
-      Next = Current + (Current >> 2);
-    }
-    if (Next > 0 && Next < 4) {
-      Next = 4;
-    }
-
-    if (Next != Previous) {
-      PreviousMemoryTypeInformation[Index].NumberOfPages = Next;
-      MemoryTypeInformationModified = TRUE;
-    }
-
-    DEBUG ((EFI_D_INFO, "  %02x    %08x  %08x  %08x\n", PreviousMemoryTypeInformation[Index].Type, Previous, Current, Next));
-  }
-
-  //
-  // If any changes were made to the Memory Type Information settings, then set the new variable value;
-  // Or create the variable in first boot.
-  //
-  if (MemoryTypeInformationModified || !MemoryTypeInformationVariableExists) {
-    Status = SetVariableAndReportStatusCodeOnError (
-               EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME,
-               &gEfiMemoryTypeInformationGuid,
-               EFI_VARIABLE_NON_VOLATILE  | EFI_VARIABLE_BOOTSERVICE_ACCESS,
-               VariableSize,
-               PreviousMemoryTypeInformation
-               );
-
-    if (!EFI_ERROR (Status)) {
-      //
-      // If the Memory Type Information settings have been modified, then reset the platform
-      // so the new Memory Type Information setting will be used to guarantee that an S4
-      // entry/resume cycle will not fail.
-      //
-      if (MemoryTypeInformationModified && PcdGetBool (PcdResetOnMemoryTypeInformationChange)) {
-        DEBUG ((EFI_D_INFO, "Memory Type Information settings change. Warm Reset!!!\n"));
-        gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);
-      }
-    } else {
-      DEBUG ((EFI_D_ERROR, "Memory Type Information settings cannot be saved. OS S4 may fail!\n"));
-    }
-  }
-}
-
-/**
-  This routine is kept for backward compatibility.
-**/
-VOID
-EFIAPI
-BdsLibSaveMemoryTypeInformation (
-  VOID
-  )
-{
-}
-
-
-/**
-  Identify a user and, if authenticated, returns the current user profile handle.
-
-  @param[out]  User           Point to user profile handle.
-  
-  @retval EFI_SUCCESS         User is successfully identified, or user identification
-                              is not supported.
-  @retval EFI_ACCESS_DENIED   User is not successfully identified
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibUserIdentify (
-  OUT EFI_USER_PROFILE_HANDLE         *User
-  )
-{
-  EFI_STATUS                          Status;
-  EFI_USER_MANAGER_PROTOCOL           *Manager;
-  
-  Status = gBS->LocateProtocol (
-                  &gEfiUserManagerProtocolGuid,
-                  NULL,
-                  (VOID **) &Manager
-                  );
-  if (EFI_ERROR (Status)) {
-    return EFI_SUCCESS;
-  }
-
-  return Manager->Identify (Manager, User);
-}
-
-/**
-  Set the variable and report the error through status code upon failure.
-
-  @param  VariableName           A Null-terminated string that is the name of the vendor's variable.
-                                 Each VariableName is unique for each VendorGuid. VariableName must
-                                 contain 1 or more characters. If VariableName is an empty string,
-                                 then EFI_INVALID_PARAMETER is returned.
-  @param  VendorGuid             A unique identifier for the vendor.
-  @param  Attributes             Attributes bitmask to set for the variable.
-  @param  DataSize               The size in bytes of the Data buffer. Unless the EFI_VARIABLE_APPEND_WRITE, 
-                                 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS, or 
-                                 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero 
-                                 causes the variable to be deleted. When the EFI_VARIABLE_APPEND_WRITE attribute is 
-                                 set, then a SetVariable() call with a DataSize of zero will not cause any change to 
-                                 the variable value (the timestamp associated with the variable may be updated however 
-                                 even if no new data value is provided,see the description of the 
-                                 EFI_VARIABLE_AUTHENTICATION_2 descriptor below. In this case the DataSize will not 
-                                 be zero since the EFI_VARIABLE_AUTHENTICATION_2 descriptor will be populated). 
-  @param  Data                   The contents for the variable.
-
-  @retval EFI_SUCCESS            The firmware has successfully stored the variable and its data as
-                                 defined by the Attributes.
-  @retval EFI_INVALID_PARAMETER  An invalid combination of attribute bits, name, and GUID was supplied, or the
-                                 DataSize exceeds the maximum allowed.
-  @retval EFI_INVALID_PARAMETER  VariableName is an empty string.
-  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the variable and its data.
-  @retval EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.
-  @retval EFI_WRITE_PROTECTED    The variable in question is read-only.
-  @retval EFI_WRITE_PROTECTED    The variable in question cannot be deleted.
-  @retval EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 
-                                 or EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACESS being set, but the AuthInfo 
-                                 does NOT pass the validation check carried out by the firmware.
-
-  @retval EFI_NOT_FOUND          The variable trying to be updated or deleted was not found.
-**/
-EFI_STATUS
-SetVariableAndReportStatusCodeOnError (
-  IN CHAR16     *VariableName,
-  IN EFI_GUID   *VendorGuid,
-  IN UINT32     Attributes,
-  IN UINTN      DataSize,
-  IN VOID       *Data
-  )
-{
-  EFI_STATUS                 Status;
-  EDKII_SET_VARIABLE_STATUS  *SetVariableStatus;
-  UINTN                      NameSize;
-
-  Status = gRT->SetVariable (
-                  VariableName,
-                  VendorGuid,
-                  Attributes,
-                  DataSize,
-                  Data
-                  );
-  if (EFI_ERROR (Status)) {
-    NameSize = StrSize (VariableName);
-    SetVariableStatus = AllocatePool (sizeof (EDKII_SET_VARIABLE_STATUS) + NameSize + DataSize);
-    if (SetVariableStatus != NULL) {
-      CopyGuid (&SetVariableStatus->Guid, VendorGuid);
-      SetVariableStatus->NameSize   = NameSize;
-      SetVariableStatus->DataSize   = DataSize;
-      SetVariableStatus->SetStatus  = Status;
-      SetVariableStatus->Attributes = Attributes;
-      CopyMem (SetVariableStatus + 1,                          VariableName, NameSize);
-      if ((Data != NULL) && (DataSize != 0)) {
-        CopyMem (((UINT8 *) (SetVariableStatus + 1)) + NameSize, Data,         DataSize);
-      }
-
-      REPORT_STATUS_CODE_EX (
-        EFI_ERROR_CODE,
-        PcdGet32 (PcdErrorCodeSetVariable),
-        0,
-        NULL,
-        &gEdkiiStatusCodeDataTypeVariableGuid,
-        SetVariableStatus,
-        sizeof (EDKII_SET_VARIABLE_STATUS) + NameSize + DataSize
-        );
-
-      FreePool (SetVariableStatus);
-    }
-  }
-
-  return Status;
-}
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/DevicePath.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/DevicePath.c
deleted file mode 100644
index a0b9da880d..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/DevicePath.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/** @file
-  BDS internal function define the default device path string, it can be
-  replaced by platform device path.
-
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "InternalBdsLib.h"
-
-/**
-  This function converts an input device structure to a Unicode string.
-
-  @param DevPath                  A pointer to the device path structure.
-
-  @return A new allocated Unicode string that represents the device path.
-
-**/
-CHAR16 *
-EFIAPI
-DevicePathToStr (
-  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath
-  )
-{
-  return ConvertDevicePathToText (DevPath, TRUE, TRUE);
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
deleted file mode 100644
index 795a9de4b8..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
+++ /dev/null
@@ -1,143 +0,0 @@
-## @file
-#  General BDS library.
-#  
-#  General BDS defines and produce general interfaces for platform BDS driver including:
-#  1) BDS boot policy interface;
-#  2) BDS boot device connect interface;
-#  3) BDS Misc interfaces for mainting boot variable, ouput string, etc.
-#  
-#  Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
-#  SPDX-License-Identifier: BSD-2-Clause-Patent
-#  
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = GenericBdsLib
-  MODULE_UNI_FILE                = GenericBdsLib.uni
-  FILE_GUID                      = e405ec31-ccaa-4dd4-83e8-0aec01703f7e
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = GenericBdsLib|DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION 
-  CONSTRUCTOR                    = GenericBdsLibConstructor
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  DevicePath.c
-  BdsConnect.c
-  BdsMisc.c
-  BdsConsole.c
-  BdsBoot.c
-  InternalBdsLib.h
-  String.h
-  String.c
-  GenericBdsStrings.uni
-  
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
-  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
-  ShellPkg/ShellPkg.dec
-  NetworkPkg/NetworkPkg.dec
-
-[LibraryClasses]
-  DevicePathLib
-  PeCoffGetEntryPointLib
-  BaseLib
-  HobLib
-  UefiRuntimeServicesTableLib
-  DxeServicesTableLib
-  MemoryAllocationLib
-  UefiLib
-  UefiBootServicesTableLib
-  BaseMemoryLib
-  DebugLib
-  PrintLib
-  PcdLib
-  PerformanceLib
-  TimerLib
-  DxeServicesLib
-  HiiLib
-  ReportStatusCodeLib
-  NetLib
-  BmpSupportLib
-
-[Guids]
-  ## SOMETIMES_CONSUMES ## HOB         # The hob holding memory type information
-  ## SOMETIMES_CONSUMES ## SystemTable # The identifier of memory type information type in system table
-  ## SOMETIMES_CONSUMES ## Variable:L"MemoryTypeInformation"
-  ## SOMETIMES_PRODUCES ## Variable:L"MemoryTypeInformation"
-  gEfiMemoryTypeInformationGuid                 
-  ## SOMETIMES_CONSUMES ## Variable:L"BootXXXX"    # Boot option variable
-  ## SOMETIMES_PRODUCES ## Variable:L"BootXXXX"    # Boot option variable
-  ## SOMETIMES_CONSUMES ## Variable:L"DriverXXXX"  # Driver load option.
-  ## SOMETIMES_PRODUCES ## Variable:L"DriverXXXX"  # Driver load option.
-  ## SOMETIMES_CONSUMES ## Variable:L"BootNext"    # Next Boot Option
-  ## SOMETIMES_PRODUCES ## Variable:L"BootNext"    # Next Boot Option
-  ## SOMETIMES_CONSUMES ## Variable:L"BootOrder"   # The boot option array
-  ## SOMETIMES_PRODUCES ## Variable:L"BootOrder"   # The boot option array
-  ## SOMETIMES_CONSUMES ## Variable:L"DriverOrder" # The driver order list
-  ## SOMETIMES_CONSUMES ## Variable:L"ConIn"       # The device path of console in device
-  ## SOMETIMES_PRODUCES ## Variable:L"ConIn"       # The device path of console in device
-  ## SOMETIMES_CONSUMES ## Variable:L"ConOut"      # The device path of console out device
-  ## SOMETIMES_PRODUCES ## Variable:L"ConOut"      # The device path of console out device
-  ## SOMETIMES_CONSUMES ## Variable:L"ErrOut"      # The device path of error out device
-  ## SOMETIMES_PRODUCES ## Variable:L"ErrOut"      # The device path of error out device
-  ## SOMETIMES_PRODUCES ## Variable:L"BootCurrent" # The boot option of current boot
-  ## SOMETIMES_PRODUCES ## Variable:L"BootNext"    # The number of next boot option
-  gEfiGlobalVariableGuid
-  gEfiFileInfoGuid                              ## SOMETIMES_CONSUMES ## GUID
-  gLastEnumLangGuid                             ## SOMETIMES_PRODUCES ## Variable:L"LastEnumLang" # Platform language at last time enumeration.
-  gHdBootDevicePathVariablGuid                  ## SOMETIMES_PRODUCES ## Variable:L"HDDP" # The device path of Boot file on Hard device.
-  gBdsLibStringPackageGuid                      ## CONSUMES ## HII # HII String PackageList Guid
-  ## SOMETIMES_PRODUCES ## Variable:L"LegacyDevOrder"
-  ## SOMETIMES_CONSUMES ## Variable:L"LegacyDevOrder"
-  gEfiLegacyDevOrderVariableGuid
-  gEdkiiStatusCodeDataTypeVariableGuid          ## SOMETIMES_CONSUMES ## GUID
-  gUefiShellFileGuid
-
-[Protocols]
-  gEfiSimpleFileSystemProtocolGuid              ## SOMETIMES_CONSUMES
-  gEfiLoadFileProtocolGuid                      ## SOMETIMES_CONSUMES
-  gEfiSimpleTextOutProtocolGuid                 ## CONSUMES
-  gEfiPciIoProtocolGuid                         ## SOMETIMES_CONSUMES
-  gEfiLoadedImageProtocolGuid                   ## SOMETIMES_CONSUMES
-  gEfiSimpleNetworkProtocolGuid                 ## SOMETIMES_CONSUMES
-  gEfiDebugPortProtocolGuid                     ## SOMETIMES_CONSUMES
-  gEfiSimpleTextInProtocolGuid                  ## CONSUMES
-  gEfiBlockIoProtocolGuid                       ## SOMETIMES_CONSUMES
-  gEfiFirmwareVolume2ProtocolGuid               ## SOMETIMES_CONSUMES
-  gEfiLegacyBiosProtocolGuid                    ## SOMETIMES_CONSUMES
-  gEfiCpuArchProtocolGuid                       ## CONSUMES
-  gEfiDevicePathProtocolGuid                    ## CONSUMES
-  gEfiAcpiS3SaveProtocolGuid                    ## SOMETIMES_CONSUMES
-  gEfiGraphicsOutputProtocolGuid                ## SOMETIMES_CONSUMES
-  gEfiUgaDrawProtocolGuid |gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport ## SOMETIMES_CONSUMES
-  gEfiOEMBadgingProtocolGuid                    ## SOMETIMES_CONSUMES
-  gEfiHiiFontProtocolGuid                       ## CONSUMES
-  gEfiUserManagerProtocolGuid                   ## SOMETIMES_CONSUMES
-  gEfiUsbIoProtocolGuid                         ## SOMETIMES_CONSUMES
-  gEfiBootLogoProtocolGuid                      ## SOMETIMES_CONSUMES
-
-[FeaturePcd]
-  gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport                   ## CONSUMES
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootlogoOnlyEnable ## CONSUMES
-
-[Pcd]
-  gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange ## SOMETIMES_CONSUMES
-  gEfiMdeModulePkgTokenSpaceGuid.PcdProgressCodeOsLoaderLoad  ## SOMETIMES_CONSUMES
-  gEfiMdeModulePkgTokenSpaceGuid.PcdProgressCodeOsLoaderStart ## SOMETIMES_CONSUMES
-  gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable      ## CONSUMES
-  gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed                       ## CONSUMES
-
-#
-# [BootMode] 
-#   RECOVERY_FULL    ## SOMETIMES_CONSUMES # Memory Type Information variable
-#
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.uni b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.uni
deleted file mode 100644
index c853d3409e..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.uni
+++ /dev/null
@@ -1,19 +0,0 @@
-// /** @file
-// General BDS library.
-//
-// General BDS defines and produce general interfaces for platform BDS driver including:
-// 1) BDS boot policy interface;
-// 2) BDS boot device connect interface;
-// 3) BDS Misc interfaces for mainting boot variable, ouput string, etc.
-//
-// Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
-//
-// SPDX-License-Identifier: BSD-2-Clause-Patent
-//
-// **/
-
-
-#string STR_MODULE_ABSTRACT             #language en-US "General BDS library"
-
-#string STR_MODULE_DESCRIPTION          #language en-US "General BDS defines and produces general interfaces for a platform BDS driver including: 1) BDS boot policy interface; 2) BDS boot device connect interface; 3) BDS Misc interfaces for maintaining boot variable, output string, etc."
-
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsStrings.uni b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsStrings.uni
deleted file mode 100644
index 59a75e548b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsStrings.uni
+++ /dev/null
@@ -1,30 +0,0 @@
-///** @file
-//  
-//  String definitions for Boot Option description.
-//  
-//  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
-//  SPDX-License-Identifier: BSD-2-Clause-Patent
-//  
-//**/
-
-/=#
-
-#langdef   en-US "English"
-#langdef   fr-FR "Français"
-
-#string STR_DESCRIPTION_FLOPPY         #language en-US  "EFI Floppy"
-                                       #language fr-FR  "fr-FR: EFI Floppy"
-#string STR_DESCRIPTION_CD_DVD         #language en-US  "EFI DVD/CDROM"
-                                       #language fr-FR  "fr-FR: EFI DVD/CDROM"
-#string STR_DESCRIPTION_HARDDRIVE      #language en-US  "EFI Hard Drive"
-                                       #language fr-FR  "fr-FR: EFI Hard Drive"
-#string STR_DESCRIPTION_USB            #language en-US  "EFI USB Device"
-                                       #language fr-FR  "fr-FR: EFI USB Device"
-#string STR_DESCRIPTION_SCSI           #language en-US  "EFI SCSI Device"
-                                       #language fr-FR  "fr-FR: EFI SCSI Device"
-#string STR_DESCRIPTION_MISC           #language en-US  "EFI Misc Device"
-                                       #language fr-FR  "fr-FR: EFI Misc Device"
-#string STR_DESCRIPTION_NETWORK        #language en-US  "EFI Network "
-                                       #language fr-FR  "fr-FR: EFI Network "
-#string STR_DESCRIPTION_NON_BLOCK      #language en-US  "EFI Non-Block Boot Device"
-                                       #language fr-FR  "fr-FR: EFI Non-Block Boot Device"
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
deleted file mode 100644
index 025f06572b..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/** @file
-  BDS library definition, include the file and data structure
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _INTERNAL_BDS_LIB_H_
-#define _INTERNAL_BDS_LIB_H_
-
-#include <FrameworkDxe.h>
-
-#include <IndustryStandard/Pci.h>
-#include <IndustryStandard/PeImage.h>
-
-#include <Protocol/BlockIo.h>
-#include <Protocol/LoadedImage.h>
-#include <Protocol/Cpu.h>
-#include <Protocol/SimpleFileSystem.h>
-#include <Protocol/LoadFile.h>
-#include <Protocol/DebugPort.h>
-#include <Protocol/DevicePath.h>
-#include <Protocol/SimpleTextIn.h>
-#include <Protocol/LegacyBios.h>
-#include <Protocol/SimpleTextOut.h>
-#include <Protocol/SimpleNetwork.h>
-#include <Protocol/FirmwareVolume2.h>
-#include <Protocol/PciIo.h>
-#include <Protocol/AcpiS3Save.h>
-#include <Protocol/OEMBadging.h>
-#include <Protocol/GraphicsOutput.h>
-#include <Protocol/UgaDraw.h>
-#include <Protocol/HiiFont.h>
-#include <Protocol/HiiImage.h>
-#include <Protocol/UsbIo.h>
-#include <Protocol/BootLogo.h>
-
-#include <Guid/MemoryTypeInformation.h>
-#include <Guid/FileInfo.h>
-#include <Guid/GlobalVariable.h>
-#include <Guid/PcAnsi.h>
-#include <Guid/BdsLibHii.h>
-#include <Guid/HdBootVariable.h>
-#include <Guid/LastEnumLang.h>
-#include <Guid/LegacyDevOrder.h>
-#include <Guid/StatusCodeDataTypeVariable.h>
-
-#include <Library/PrintLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/DxeServicesTableLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/HobLib.h>
-#include <Library/BaseLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/PerformanceLib.h>
-#include <Library/PcdLib.h>
-#include <Library/PeCoffGetEntryPointLib.h>
-#include <Library/GenericBdsLib.h>
-#include <Library/TimerLib.h>
-#include <Library/PcdLib.h>
-#include <Library/DxeServicesLib.h>
-#include <Library/ReportStatusCodeLib.h>
-#include <Library/BmpSupportLib.h>
-
-#if !defined (EFI_REMOVABLE_MEDIA_FILE_NAME)
-    #if defined (MDE_CPU_EBC)
-        //
-        // Uefi specification only defines the default boot file name for IA32, X64
-        // and IPF processor, so need define boot file name for EBC architecture here.
-        //
-        #define EFI_REMOVABLE_MEDIA_FILE_NAME L"\\EFI\\BOOT\\BOOTEBC.EFI"
-    #else
-        #error "Can not determine the default boot file name for unknown processor type!"
-    #endif
-#endif
-
-/**
-  Get the headers (dos, image, optional header) from an image
-
-  @param  Device                SimpleFileSystem device handle
-  @param  FileName              File name for the image
-  @param  DosHeader             Pointer to dos header
-  @param  Hdr                   The buffer in which to return the PE32, PE32+, or TE header.
-
-  @retval EFI_SUCCESS           Successfully get the machine type.
-  @retval EFI_NOT_FOUND         The file is not found.
-  @retval EFI_LOAD_ERROR        File is not a valid image file.
-
-**/
-EFI_STATUS
-EFIAPI
-BdsLibGetImageHeader (
-  IN  EFI_HANDLE                  Device,
-  IN  CHAR16                      *FileName,
-  OUT EFI_IMAGE_DOS_HEADER        *DosHeader,
-  OUT EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr
-  );
-
-/**
-  This routine adjust the memory information for different memory type and 
-  save them into the variables for next boot.
-**/
-VOID
-BdsSetMemoryTypeInformationVariable (
-  VOID
-  );
-
-/**
-  Validate the EFI Boot#### or Driver#### variable (VendorGuid/Name)
-
-  @param  Variable              Boot#### variable data.
-  @param  VariableSize          Returns the size of the EFI variable that was read
-
-  @retval TRUE                  The variable data is correct.
-  @retval FALSE                 The variable data is corrupted.
-
-**/
-BOOLEAN 
-ValidateOption (
-  UINT8                     *Variable,
-  UINTN                     VariableSize
-  );
-
-/**
-  Set the variable and report the error through status code upon failure.
-
-  @param  VariableName           A Null-terminated string that is the name of the vendor's variable.
-                                 Each VariableName is unique for each VendorGuid. VariableName must
-                                 contain 1 or more characters. If VariableName is an empty string,
-                                 then EFI_INVALID_PARAMETER is returned.
-  @param  VendorGuid             A unique identifier for the vendor.
-  @param  Attributes             Attributes bitmask to set for the variable.
-  @param  DataSize               The size in bytes of the Data buffer. Unless the EFI_VARIABLE_APPEND_WRITE, 
-                                 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS, or 
-                                 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero 
-                                 causes the variable to be deleted. When the EFI_VARIABLE_APPEND_WRITE attribute is 
-                                 set, then a SetVariable() call with a DataSize of zero will not cause any change to 
-                                 the variable value (the timestamp associated with the variable may be updated however 
-                                 even if no new data value is provided,see the description of the 
-                                 EFI_VARIABLE_AUTHENTICATION_2 descriptor below. In this case the DataSize will not 
-                                 be zero since the EFI_VARIABLE_AUTHENTICATION_2 descriptor will be populated). 
-  @param  Data                   The contents for the variable.
-
-  @retval EFI_SUCCESS            The firmware has successfully stored the variable and its data as
-                                 defined by the Attributes.
-  @retval EFI_INVALID_PARAMETER  An invalid combination of attribute bits, name, and GUID was supplied, or the
-                                 DataSize exceeds the maximum allowed.
-  @retval EFI_INVALID_PARAMETER  VariableName is an empty string.
-  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the variable and its data.
-  @retval EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.
-  @retval EFI_WRITE_PROTECTED    The variable in question is read-only.
-  @retval EFI_WRITE_PROTECTED    The variable in question cannot be deleted.
-  @retval EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 
-                                 or EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACESS being set, but the AuthInfo 
-                                 does NOT pass the validation check carried out by the firmware.
-
-  @retval EFI_NOT_FOUND          The variable trying to be updated or deleted was not found.
-**/
-EFI_STATUS
-SetVariableAndReportStatusCodeOnError (
-  IN CHAR16     *VariableName,
-  IN EFI_GUID   *VendorGuid,
-  IN UINT32     Attributes,
-  IN UINTN      DataSize,
-  IN VOID       *Data
-  );
-
-#endif // _BDS_LIB_H_
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.c b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.c
deleted file mode 100644
index f36860d5a1..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/** @file
-  String support
-
-Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-#include "String.h"
-
-/**
-  Get string by string id from HII Interface
-
-
-  @param Id              String ID.
-
-  @retval  CHAR16 *  String from ID.
-  @retval  NULL      If error occurs.
-
-**/
-CHAR16 *
-BdsLibGetStringById (
-  IN  EFI_STRING_ID   Id
-  )
-{
-  return HiiGetString (gBdsLibStringPackHandle, Id, NULL);
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.h b/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.h
deleted file mode 100644
index 53cabe64a9..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/String.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/** @file
-  String support
-
-Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _STRING_H_
-#define _STRING_H_
-
-#include <Library/HiiLib.h>
-#include <Library/DebugLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/UefiLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-
-extern EFI_HII_HANDLE gBdsLibStringPackHandle;
-
-//
-// This is the VFR compiler generated header file which defines the
-// string identifiers.
-//
-
-extern UINT8  GenericBdsLibStrings[];
-
-/**
-  Get string by string id from HII Interface
-
-
-  @param Id              String ID.
-
-  @retval  CHAR16 *  String from ID.
-  @retval  NULL      If error occurs.
-
-**/
-CHAR16 *
-BdsLibGetStringById (
-  IN  EFI_STRING_ID   Id
-  );
-
-#endif // _STRING_H_
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index 15a4251cf8..b0fbbdb9cb 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -9,12 +9,10 @@
 #**/
 
 [Defines]
-DEFINE FLASH_BASE       = 0xFF800000     #The base address of the 4Mb FLASH Device.
-DEFINE FLASH_SIZE       = 0x00800000     #The flash size in bytes of the 4Mb FLASH Device.
-DEFINE FLASH_BLOCK_SIZE = 0x1000        #The block size in bytes of the 4Mb FLASH Device.
-DEFINE FLASH_NUM_BLOCKS = 0x800           #The number of blocks in 4Mb FLASH Device.
-DEFINE FLASH_AREA_BASE_ADDRESS                                = 0xFF800000
-DEFINE FLASH_AREA_SIZE                                        = 0x00800000
+DEFINE FLASH_BASE       = 0xFF800000     #The base address of the 8Mb FLASH Device.
+DEFINE FLASH_SIZE       = 0x00800000     #The flash size in bytes of the 8Mb FLASH Device.
+DEFINE FLASH_BLOCK_SIZE = 0x1000         #The block size in bytes of the 8Mb FLASH Device.
+DEFINE FLASH_NUM_BLOCKS = 0x800          #The number of blocks in 8Mb FLASH Device.
 
 DEFINE FLASH_REGION_VLVMICROCODE_OFFSET                       = 0x00400000
 DEFINE FLASH_REGION_VLVMICROCODE_SIZE                         = 0x00040000
@@ -62,8 +60,11 @@ [FD.Vlv]
 #
 #Flash location override based on actual flash map
 #
-SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaBaseAddress            = $(FLASH_AREA_BASE_ADDRESS)
-SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaSize                   = $(FLASH_AREA_SIZE)
+SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaBaseAddress            = $(FLASH_BASE)
+SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaSize                   = $(FLASH_SIZE)
+
+SET gPlatformModuleTokenSpaceGuid.PcdBiosRomBase                     = $(FLASH_BASE)
+SET gPlatformModuleTokenSpaceGuid.PcdBiosRomSize                     = $(FLASH_SIZE)
 
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress = $(FLASH_REGION_VLVMICROCODE_BASE) + 0x60
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize = $(FLASH_REGION_VLVMICROCODE_SIZE) - 0x60
@@ -401,12 +402,9 @@ [FV.FVMAIN]
 INF UefiCpuPkg/CpuDxe/CpuDxe.inf
 INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
 INF MdeModulePkg/Universal/Metronome/Metronome.inf
-INF IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
-!if $(ARCH) == IA32
-INF USE=IA32 MdeModulePkg/Logo/Logo.inf
-!else
-INF USE=X64 MdeModulePkg/Logo/Logo.inf
-!endif
+INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+INF MdeModulePkg/Logo/LogoDxe.inf
+INF MdeModulePkg/Application/UiApp/UiApp.inf
 INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
 INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index b8ac61d710..107c160b76 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -9,34 +9,32 @@
 #**/
 
 [Defines]
-DEFINE FLASH_BASE       = 0xFFC00000     #The base address of the 4Mb FLASH Device.
-DEFINE FLASH_SIZE       = 0x00400000     #The flash size in bytes of the 4Mb FLASH Device.
-DEFINE FLASH_BLOCK_SIZE = 0x1000        #The block size in bytes of the 4Mb FLASH Device.
-DEFINE FLASH_NUM_BLOCKS = 0x400           #The number of blocks in 4Mb FLASH Device.
-DEFINE FLASH_AREA_BASE_ADDRESS                                = 0xFF800000
-DEFINE FLASH_AREA_SIZE                                        = 0x00800000
+DEFINE FLASH_BASE       = 0xFF800000     #The base address of the 8Mb FLASH Device.
+DEFINE FLASH_SIZE       = 0x00800000     #The flash size in bytes of the 8Mb FLASH Device.
+DEFINE FLASH_BLOCK_SIZE = 0x1000         #The block size in bytes of the 8Mb FLASH Device.
+DEFINE FLASH_NUM_BLOCKS = 0x800          #The number of blocks in 8Mb FLASH Device.
 
-DEFINE FLASH_REGION_VLVMICROCODE_OFFSET                       = 0x00000000
+DEFINE FLASH_REGION_VLVMICROCODE_OFFSET                       = 0x00400000
 DEFINE FLASH_REGION_VLVMICROCODE_SIZE                         = 0x00040000
 DEFINE FLASH_REGION_VLVMICROCODE_BASE                         = 0xFFC00000
 
-DEFINE FLASH_REGION_VPD_OFFSET                                = 0x00040000
+DEFINE FLASH_REGION_VPD_OFFSET                                = 0x00440000
 DEFINE FLASH_REGION_VPD_SIZE                                  = 0x0003E000
 
-DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_OFFSET = 0x0007E000
+DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_OFFSET = 0x0047E000
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_WORKING_SIZE   = 0x00002000
 
 
-DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET   = 0x00080000
+DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_OFFSET   = 0x00480000
 DEFINE FLASH_REGION_NVSTORAGE_SUBREGION_NV_FTW_SPARE_SIZE     = 0x00040000
 
-DEFINE FLASH_REGION_FVMAIN_OFFSET                             = 0x00110000
-DEFINE FLASH_REGION_FVMAIN_SIZE                               = 0x00215000
+DEFINE FLASH_REGION_FVMAIN_OFFSET                             = 0x00510000
+DEFINE FLASH_REGION_FVMAIN_SIZE                               = 0x00210000
 
-DEFINE FLASH_REGION_FV_RECOVERY2_OFFSET                       = 0x00325000
-DEFINE FLASH_REGION_FV_RECOVERY2_SIZE                         = 0x0006B000
+DEFINE FLASH_REGION_FV_RECOVERY2_OFFSET                       = 0x00720000
+DEFINE FLASH_REGION_FV_RECOVERY2_SIZE                         = 0x00070000
 
-DEFINE FLASH_REGION_FV_RECOVERY_OFFSET                        = 0x00390000
+DEFINE FLASH_REGION_FV_RECOVERY_OFFSET                        = 0x00790000
 DEFINE FLASH_REGION_FV_RECOVERY_SIZE                          = 0x00070000
 
 ################################################################################
@@ -62,8 +60,11 @@ [FD.Vlv]
 #
 #Flash location override based on actual flash map
 #
-SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaBaseAddress            = $(FLASH_AREA_BASE_ADDRESS)
-SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaSize                   = $(FLASH_AREA_SIZE)
+SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaBaseAddress            = $(FLASH_BASE)
+SET gPlatformModuleTokenSpaceGuid.PcdFlashAreaSize                   = $(FLASH_SIZE)
+
+SET gPlatformModuleTokenSpaceGuid.PcdBiosRomBase                     = $(FLASH_BASE)
+SET gPlatformModuleTokenSpaceGuid.PcdBiosRomSize                     = $(FLASH_SIZE)
 
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress = $(FLASH_REGION_VLVMICROCODE_BASE) + 0x60
 SET gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize = $(FLASH_REGION_VLVMICROCODE_SIZE) - 0x60
@@ -84,9 +85,12 @@ [FD.Vlv]
 # Fv Size can be adjusted; FVMAIN_COMPACT can be reduced to 0x120000, and FV_RECOVERY can be enlarged to 0x80000
 #
 ################################################################################
-# Since the Fce tool don't have gcc version, we can't handle default variable in Linux,
-# so we hardcode the default value of variable here.
-# Please note that we MUST update the binary once the default value is changed.
+
+  #
+  # IFWI Header
+  #
+0x0000|0x1000
+FILE=Vlv2TbltDevicePkg/Stitch/IFWIHeader/IFWI_HEADER.bin
 
 #
   # CPU Microcodes
@@ -347,12 +351,9 @@ [FV.FVMAIN]
 INF UefiCpuPkg/CpuDxe/CpuDxe.inf
 INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
 INF MdeModulePkg/Universal/Metronome/Metronome.inf
-INF IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
-!if $(ARCH) == IA32
-INF USE=IA32 MdeModulePkg/Logo/Logo.inf
-!else
-INF USE=X64 MdeModulePkg/Logo/Logo.inf
-!endif
+INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+INF MdeModulePkg/Logo/LogoDxe.inf
+INF MdeModulePkg/Application/UiApp/UiApp.inf
 INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
 INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
 INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index 3910281c49..e4c6750c70 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -118,7 +118,6 @@ [LibraryClasses.common]
   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
   UefiCpuLib|UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
-  GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
   FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
@@ -523,6 +522,8 @@ [PcdsFixedAtBuild.common]
   #
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackSize|0x4000
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
+
   #
   # Clear unused single certificate PCD
   #
@@ -933,19 +934,18 @@ [Components.X64]
   }
   MdeModulePkg/Universal/Metronome/Metronome.inf
 
-  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
+  MdeModulePkg/Universal/BdsDxe/BdsDxe.inf {
     <LibraryClasses>
-      OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
-      IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
-      BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
-      PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
+      PlatformBootManagerLib|Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
   }
-
-  $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
+  MdeModulePkg/Logo/LogoDxe.inf
+  MdeModulePkg/Application/UiApp/UiApp.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+  }
 
   MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index 2ae594e5be..f5795e5ab0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -116,7 +116,6 @@ [LibraryClasses.common]
   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
   UefiCpuLib|UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
-  GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
   FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
@@ -520,6 +519,8 @@ [PcdsFixedAtBuild.common]
   #
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackSize|0x4000
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
+
   #
   # Clear unused single certificate PCD
   #
@@ -917,19 +918,18 @@ [Components.IA32]
   }
   MdeModulePkg/Universal/Metronome/Metronome.inf
 
-  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
+  MdeModulePkg/Universal/BdsDxe/BdsDxe.inf {
     <LibraryClasses>
-      OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
-      IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
-      BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
-      PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
+      PlatformBootManagerLib|Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
   }
-
-  $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
+  MdeModulePkg/Logo/LogoDxe.inf
+  MdeModulePkg/Application/UiApp/UiApp.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+  }
 
   MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index 5cdc9bebc8..a930a85a35 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -118,7 +118,6 @@ [LibraryClasses.common]
   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
   UefiCpuLib|UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
-  GenericBdsLib|$(PLATFORM_PACKAGE)/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
   FlashDeviceLib|Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLib.inf
@@ -522,6 +521,8 @@ [PcdsFixedAtBuild.common]
   #
   gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackSize|0x4000
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
+
   #
   # Clear unused single certificate PCD
   #
@@ -932,19 +933,18 @@ [Components.X64]
   }
   MdeModulePkg/Universal/Metronome/Metronome.inf
 
-  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf{
+  MdeModulePkg/Universal/BdsDxe/BdsDxe.inf {
     <LibraryClasses>
-      OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
-      IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
-      BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
-      PlatformBdsLib|$(PLATFORM_PACKAGE)/Library/PlatformBdsLib/PlatformBdsLib.inf
-      DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-      PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
-      SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
+      PlatformBootManagerLib|Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
       Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
   }
-
-  $(PLATFORM_PACKAGE)/UiApp/UiApp.inf
+  MdeModulePkg/Logo/LogoDxe.inf
+  MdeModulePkg/Application/UiApp/UiApp.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+  }
 
   MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c b/Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c
deleted file mode 100644
index 3e58a6d22a..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/** @file
-
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-                                                                                   

-
-
-
-**/
-
-/**
-  The user Entry Point for Application. The user code starts with this function
-  as the real entry point for the image goes into a library that calls this
-  function.
-
-  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
-  @param[in] SystemTable    A pointer to the EFI System Table.
-
-  @retval EFI_SUCCESS       The entry point is executed successfully.
-  @retval other             Some error occurs when executing this entry point.
-
-**/
-EFI_STATUS
-EFIAPI
-InitializeUserInterface (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  return EFI_SUCCESS;
-}
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf b/Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf
deleted file mode 100644
index f7a0a83b80..0000000000
--- a/Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-#
-# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
-#                                                                                  

-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-#                                                                                  

-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = UiApp
-  FILE_GUID                      = 462CAA21-7614-4503-836E-8AB6F4662331
-  MODULE_TYPE                    = UEFI_APPLICATION
-  VERSION_STRING                 = 1.0
-  ENTRY_POINT                    = InitializeUserInterface
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-
-[Sources]
-  FrontPage.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-
-[LibraryClasses]
-  UefiApplicationEntryPoint
-- 
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 11/14] Vlv2TbltDevicePkg: Update boot mode/state behaviors
  2019-07-01  2:55 ` [edk2-platforms Patch 11/14] Vlv2TbltDevicePkg: Update boot mode/state behaviors Michael D Kinney
@ 2019-07-01  4:08   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:08 UTC (permalink / raw)
  To: devel@edk2.groups.io, Kinney, Michael D; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Michael D Kinney
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-devel] [edk2-platforms Patch 11/14] Vlv2TbltDevicePkg: Update boot mode/state behaviors

* Add platform specific PcdBootState PCD to remove Intel Framework
  dependency
* Set PcdUserPhysicalPresence to TRUE to Enable UEFI Secure Boot
  Setup Menus
* Remove unused code when NOCS_S3_SUPPORT is not set
* Update PlatformBootManagerLib to not perform a connect all
  when FastBoot is enabled.
* Add support for BOOT_ON_FLASH_UPDATE
* Remove logic in CheckSystemConfigSave() that was generating
  an ASSERT() when setup changes were saved.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../DxePlatformBootManagerLib/BdsPlatform.c   | 33 ++++++-
 .../DxePlatformBootManagerLib.inf             |  4 +-
 .../PlatformDxe/PlatformDxe.inf               |  1 -
 .../Vlv2TbltDevicePkg/PlatformPei/BootMode.c  | 99 +------------------  .../Vlv2TbltDevicePkg/PlatformPei/Platform.c  |  8 --  .../Vlv2TbltDevicePkg/PlatformPei/Platform.h  | 27 +----
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |  8 ++
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |  2 +
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |  2 +
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |  2 +
 .../PlatformSetupDxe/PlatformSetupDxe.inf     |  1 -
 .../PlatformSetupDxe/SetupInfoRecords.c       | 51 ----------
 12 files changed, 51 insertions(+), 187 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
index 4dd3827a6e..7fbbf281c6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/BdsPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib
+++ /BdsPlatform.c
@@ -1,7 +1,7 @@
 /** @file
   This file include all platform action which can be customized by IBV/OEM.
 
-Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -1164,7 +1164,7 @@ PlatformBootManagerBeforeConsole (
   // Fill ConIn/ConOut in Full Configuration boot mode
   //
   gBootMode = GetBootModeHob();
-  DEBUG ((DEBUG_INFO, "PlatformBootManagerInit - %x\n", gBootMode));
+  DEBUG ((DEBUG_INFO, "PlatformBootManagerBeforeConsole: BootMode = 
+ %x\n", gBootMode));
 
   if (gBootMode == BOOT_WITH_FULL_CONFIGURATION ||
       gBootMode == BOOT_WITH_DEFAULT_SETTINGS || @@ -1263,7 +1263,18 @@ ConnectSequence (
   IN EFI_BOOT_MODE         BootMode
   )
 {
-  EfiBootManagerConnectAll ();
+  switch (BootMode) {
+  case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
+  case BOOT_WITH_MINIMAL_CONFIGURATION:
+  case BOOT_ON_S4_RESUME:
+    break;
+  case BOOT_WITH_FULL_CONFIGURATION:
+  case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
+  case BOOT_WITH_DEFAULT_SETTINGS:
+  default:
+    EfiBootManagerConnectAll ();
+    break;
+  }
 }
 
 /**
@@ -1311,6 +1322,7 @@ PlatformBootManagerAfterConsole (
   VOID
   )
 {
+  EFI_STATUS                    Status;
   EFI_BOOT_MODE                 LocalBootMode;
 
   DEBUG ((DEBUG_INFO, "PlatformBootManagerAfterConsole\n"));
@@ -1319,7 +1331,7 @@ PlatformBootManagerAfterConsole (
   // Get current Boot Mode
   //
   LocalBootMode = gBootMode;
-  DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode));
+  DEBUG ((DEBUG_INFO, "PlatformBootManagerAfterConsole: BootMode = 
+ %x\n", gBootMode));
 
   //
   // Logo show
@@ -1372,6 +1384,19 @@ PlatformBootManagerAfterConsole (
     break;
   }
 
+  //
+  // Use a DynamicHii type pcd to save the boot status, which is used 
+ to  // control configuration mode, such as FULL/MINIMAL/NO_CHANGES configuration.
+  //
+  DEBUG ((DEBUG_INFO, "PcdBootState = %d\n", 
+ PcdGetBool(PcdBootState)));  if (PcdGetBool(PcdBootState)) {
+    Status = PcdSetBoolS(PcdBootState, FALSE);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "Set PcdBootState to FALSE failed.\n"));
+    }
+    DEBUG ((DEBUG_INFO, "PcdBootState = %d\n", 
+ PcdGetBool(PcdBootState)));  }
+
   Print (L"Press F7 for BootMenu!\n");
 
   EfiBootManagerRefreshAllBootOption (); diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
index b04169ad33..0579a18660 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBootManagerLib
+++ /DxePlatformBootManagerLib.inf
@@ -1,7 +1,7 @@
 ### @file
 # Component name for module DxePlatformBootManagerLib  # -# Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2017 - 2019, Intel Corporation. All rights 
+reserved.<BR>
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent  # @@ -48,6 +48,7 @@ [Packages]
   MdeModulePkg/MdeModulePkg.dec
   SecurityPkg/SecurityPkg.dec
   MinPlatformPkg/MinPlatformPkg.dec
+  Vlv2TbltDevicePkg/PlatformPkg.dec
 
 [Pcd]
   gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable                    ## CONSUMES
@@ -66,6 +67,7 @@ [Pcd]
   gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleInputDevicePath  ## CONSUMES
   gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleOutputDevicePath ## CONSUMES
   gMinPlatformPkgTokenSpaceGuid.PcdTrustedStorageDevicePath       ## CONSUMES
+  gPlatformModuleTokenSpaceGuid.PcdBootState
 
 [Sources]
   BdsPlatform.c
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
index a9ef744ef7..9fee691365 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
@@ -84,7 +84,6 @@ [Guids]
   gEfiGlobalVariableGuid
   gEfiEventExitBootServicesGuid
   gEfiVlv2VariableGuid
-  gEfiSecureBootEnableDisableGuid
   gEfiEndOfDxeEventGroupGuid
 
 [Protocols]
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/BootMode.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/BootMode.c
index 9fdcb620a3..5269b1ed39 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/BootMode.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/BootMode.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2018, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights 
+ reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -84,6 +82,7 @@ CapsulePpiNotifyCallback (
     if (Status == EFI_SUCCESS) {
       if (Capsule->CheckCapsuleUpdate ((EFI_PEI_SERVICES**)PeiServices) == EFI_SUCCESS) {
         BootMode = BOOT_ON_FLASH_UPDATE;
+        DEBUG ((EFI_D_ERROR, "Setting BootMode to 
+ BOOT_ON_FLASH_UPDATE\n"));
         Status = (*PeiServices)->SetBootMode((const EFI_PEI_SERVICES **)PeiServices, BootMode);
         ASSERT_EFI_ERROR (Status);
       }
@@ -93,98 +92,6 @@ CapsulePpiNotifyCallback (
   return Status;
 }
 
-#ifdef NOCS_S3_SUPPORT
-EFI_STATUS
-UpdateBootMode (
-  IN CONST EFI_PEI_SERVICES     **PeiServices
-  )
-{
-  EFI_STATUS      Status;
-  EFI_BOOT_MODE   BootMode;
-  UINT16          SleepType;
-  CHAR16          *strBootMode;
-
-  Status = (*PeiServices)->GetBootMode(PeiServices, &BootMode);
-  ASSERT_EFI_ERROR (Status);
-  if (BootMode  == BOOT_IN_RECOVERY_MODE){
-    return Status;
-  }
-
-  //
-  // Let's assume things are OK if not told otherwise
-  //
-  BootMode = BOOT_WITH_FULL_CONFIGURATION;
-
-  if (GetSleepTypeAfterWakeup (PeiServices, &SleepType)) {
-    switch (SleepType) {
-      case V_PCH_ACPI_PM1_CNT_S3:
-        BootMode = BOOT_ON_S3_RESUME;
-        Status = (*PeiServices)->NotifyPpi (PeiServices, &mCapsuleNotifyList[0]);
-        ASSERT_EFI_ERROR (Status);
-        break;
-
-      case V_PCH_ACPI_PM1_CNT_S4:
-        BootMode = BOOT_ON_S4_RESUME;
-        break;
-
-      case V_PCH_ACPI_PM1_CNT_S5:
-        BootMode = BOOT_ON_S5_RESUME;
-        break;
-    } // switch (SleepType)
-  }
-
-  if (IsFastBootEnabled (PeiServices)) {
-    DEBUG ((EFI_D_INFO, "Prioritizing Boot mode to BOOT_WITH_MINIMAL_CONFIGURATION\n"));
-    PrioritizeBootMode (&BootMode, BOOT_WITH_MINIMAL_CONFIGURATION);
-  }
-
-  switch (BootMode) {
-    case BOOT_WITH_FULL_CONFIGURATION:
-      strBootMode = L"BOOT_WITH_FULL_CONFIGURATION";
-      break;
-    case BOOT_WITH_MINIMAL_CONFIGURATION:
-      strBootMode = L"BOOT_WITH_MINIMAL_CONFIGURATION";
-      break;
-    case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
-      strBootMode = L"BOOT_ASSUMING_NO_CONFIGURATION_CHANGES";
-      break;
-    case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
-      strBootMode = L"BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS";
-      break;
-    case BOOT_WITH_DEFAULT_SETTINGS:
-      strBootMode = L"BOOT_WITH_DEFAULT_SETTINGS";
-      break;
-    case BOOT_ON_S4_RESUME:
-      strBootMode = L"BOOT_ON_S4_RESUME";
-      break;
-    case BOOT_ON_S5_RESUME:
-      strBootMode = L"BOOT_ON_S5_RESUME";
-      break;
-    case BOOT_ON_S2_RESUME:
-      strBootMode = L"BOOT_ON_S2_RESUME";
-      break;
-    case BOOT_ON_S3_RESUME:
-      strBootMode = L"BOOT_ON_S3_RESUME";
-
-      break;
-    case BOOT_ON_FLASH_UPDATE:
-      strBootMode = L"BOOT_ON_FLASH_UPDATE";
-      break;
-    case BOOT_IN_RECOVERY_MODE:
-      strBootMode = L"BOOT_IN_RECOVERY_MODE";
-      break;
-    default:
-      strBootMode = L"Unknown boot mode";
-  } // switch (BootMode)
-
-  DEBUG ((EFI_D_ERROR, "Setting BootMode to %s\n", strBootMode));
-  Status = (*PeiServices)->SetBootMode(PeiServices, BootMode);
-  ASSERT_EFI_ERROR (Status);
-
-  return Status;
-}
-#endif
-
 /**
   Get sleep type after wakeup
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
index aa03f6ea95..90998871dc 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.c
@@ -813,14 +813,6 @@ PeiInitPlatform (
     sizeof (EFI_PLATFORM_INFO_HOB)
     );
 
-  //
-  // Set the new boot mode for MRC
-  //
-#ifdef NOCS_S3_SUPPORT
-  Status = UpdateBootMode (PeiServices);
-  ASSERT_EFI_ERROR (Status);
-#endif
-
   DEBUG((EFI_D_INFO, "Setup MMIO size ... \n\n"));
 
   //
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.h
index e1817b28c6..4f71e519e0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPei/Platform.h
@@ -1,12 +1,9 @@
 /*++
 
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights 
+ reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
-
 **/
 
 
@@ -24,26 +21,6 @@ typedef struct {
 
 #define STALL_PEIM_FROM_THIS(a) CR (a, STALL_CALLBACK_STATE_INFORMATION, StallNotify, STALL_PEIM_SIGNATURE)
 
-#ifdef NOCS_S3_SUPPORT
-
-/**
-  Peform the boot mode determination logic
-  If the box is closed, then
-  1. If it's first time to boot, it's boot with full config .
-  2. If the ChassisIntrution is selected, force to be a boot with full config
-  3. Otherwise it's boot with no change.
-
-  @param  PeiServices General purpose services available to every PEIM.
-  @param  BootMode The detected boot mode.
-
-  @retval EFI_SUCCESS if the boot mode could be set -**/ -EFI_STATUS -UpdateBootMode (
-  IN CONST EFI_PEI_SERVICES     **PeiServices
-  );
-#endif
-
 /**
   This function reset the entire platform, including all processor and devices, and
   reboots the system.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index 5b255f4b05..a5c7062cbb 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -161,6 +161,14 @@ [PcdsDynamic,PcdsDynamicEx]
   gPlatformModuleTokenSpaceGuid.PcdInConfigMode|FALSE|BOOLEAN|0x80000001
   gPlatformModuleTokenSpaceGuid.PcdConnectUSBKeyboardonWaitForKeyStroke|FALSE|BOOLEAN|0x80000002
   gPlatformModuleTokenSpaceGuid.PcdEnableWatchdogSwSmiInputValue|0|UINT8|0x80000003
+
+  ## Indicates if the machine has completed one boot cycle before.
+  #  After the complete boot, BootState will be set to FALSE.<BR><BR>
+  #   TRUE  - The complete boot cycle has not happened before.<BR>
+  #   FALSE - The complete boot cycle has happened before.<BR>
+  # @Prompt Boot State Flag
+  gPlatformModuleTokenSpaceGuid.PcdBootState|TRUE|BOOLEAN|0x80000004
+
 #
 #device firmware update support
 #
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index e4c6750c70..2123745ccd 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -680,6 +680,7 @@ [PcdsPatchableInModule.common]  [PcdsDynamicHii.common.DEFAULT]
   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|5 # Variable: L"Timeout"
   gEfiMdePkgTokenSpaceGuid.PcdHardwareErrorRecordLevel|L"HwErrRecSupport"|gEfiGlobalVariableGuid|0x0|1 # Variable: L"HwErrRecSupport"
+
+ gPlatformModuleTokenSpaceGuid.PcdBootState|L"BootState"|gPlatformModul
+ eTokenSpaceGuid|0x0|TRUE
 
 [PcdsDynamicDefault.common.DEFAULT]
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0
@@ -733,6 +734,7 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
+  gEfiSecurityPkgTokenSpaceGuid.PcdUserPhysicalPresence|TRUE
 
 [PcdsDynamicExDefault.X64.DEFAULT]
 !if $(RECOVERY_ENABLE)
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index f5795e5ab0..086668d570 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -677,6 +677,7 @@ [PcdsPatchableInModule.common]  [PcdsDynamicHii.common.DEFAULT]
   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|5 # Variable: L"Timeout"
   gEfiMdePkgTokenSpaceGuid.PcdHardwareErrorRecordLevel|L"HwErrRecSupport"|gEfiGlobalVariableGuid|0x0|1 # Variable: L"HwErrRecSupport"
+
+ gPlatformModuleTokenSpaceGuid.PcdBootState|L"BootState"|gPlatformModul
+ eTokenSpaceGuid|0x0|TRUE
 
 [PcdsDynamicDefault.common.DEFAULT]
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0
@@ -730,6 +731,7 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
+  gEfiSecurityPkgTokenSpaceGuid.PcdUserPhysicalPresence|TRUE
 
 [PcdsDynamicExDefault.X64.DEFAULT]
 !if $(RECOVERY_ENABLE)
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index a930a85a35..5f2dd65ec8 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -679,6 +679,7 @@ [PcdsPatchableInModule.common]  [PcdsDynamicHii.common.DEFAULT]
   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|5 # Variable: L"Timeout"
   gEfiMdePkgTokenSpaceGuid.PcdHardwareErrorRecordLevel|L"HwErrRecSupport"|gEfiGlobalVariableGuid|0x0|1 # Variable: L"HwErrRecSupport"
+
+ gPlatformModuleTokenSpaceGuid.PcdBootState|L"BootState"|gPlatformModul
+ eTokenSpaceGuid|0x0|TRUE
 
 [PcdsDynamicDefault.common.DEFAULT]
   gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0
@@ -732,6 +733,7 @@ [PcdsDynamicExDefault.common.DEFAULT]
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuSmramCpuDataAddress|0
   gEfiVLVTokenSpaceGuid.PcdCpuLockBoxSize|0
+  gEfiSecurityPkgTokenSpaceGuid.PcdUserPhysicalPresence|TRUE
 
 [PcdsDynamicExDefault.X64.DEFAULT]
 !if $(RECOVERY_ENABLE)
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
index b745574421..85e8b1e8d6 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe
+++ .inf
@@ -93,7 +93,6 @@ [Guids]
   gEfiIfrTianoGuid                              ## CONSUMES ## Guid
   gEfiPlatformInfoGuid
   gEfiNormalSetupGuid
-  gEfiSecureBootEnableDisableGuid
   gOsSelectionVariableGuid
   gEfiGlobalVariableGuid
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
index efd4a723e1..be99356d0f 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords
+++ .c
@@ -1448,60 +1448,9 @@ CheckSystemConfigLoad(SYSTEM_CONFIGURATION *SystemConfigPtr)
   }
 }
 
-
-//
-// "SecureBootEnable" variable for the Secure boot feature enable/disable.
-//
-#define EFI_SECURE_BOOT_ENABLE_NAME      L"SecureBootEnable"
-extern EFI_GUID gEfiSecureBootEnableDisableGuid;
-
-
 VOID
 CheckSystemConfigSave(SYSTEM_CONFIGURATION *SystemConfigPtr)  {
-  EFI_STATUS              Status;
-  UINT8                   SecureBootCfg;
-  BOOLEAN                 SecureBootNotFound;
-  UINTN                   DataSize;
-
-
-    //
-    // Secure Boot configuration changes
-	//
-    DataSize = sizeof(SecureBootCfg);
-    SecureBootNotFound = FALSE;
-    Status = gRT->GetVariable (
-                    EFI_SECURE_BOOT_ENABLE_NAME,
-                    &gEfiSecureBootEnableDisableGuid,
-                    NULL,
-                    &DataSize,
-                    &SecureBootCfg
-                    );
-
-    if (EFI_ERROR(Status)) {
-      SecureBootNotFound = TRUE;
-    }
-    if (SecureBootNotFound) {
-      Status = gRT->GetVariable (
-                      EFI_SECURE_BOOT_ENABLE_NAME,
-                      &gEfiSecureBootEnableDisableGuid,
-                      NULL,
-                      &DataSize,
-                      &SecureBootCfg
-                      );
-      ASSERT_EFI_ERROR(Status);
-    }
-    if ((SecureBootCfg) != SystemConfigPtr->SecureBoot) {
-      SecureBootCfg = !SecureBootCfg;
-      Status = gRT->SetVariable (
-                      EFI_SECURE_BOOT_ENABLE_NAME,
-                      &gEfiSecureBootEnableDisableGuid,
-                      EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
-                      sizeof (UINT8),
-                      &SecureBootCfg
-                      );
-    }
-
 }
 
 VOID
--
2.21.0.windows.1





^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 12/14] Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols
  2019-07-01  2:55 ` [edk2-platforms Patch 12/14] Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols Michael D Kinney
@ 2019-07-01  4:08   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:08 UTC (permalink / raw)
  To: devel@edk2.groups.io, Kinney, Michael D; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Michael D Kinney
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-devel] [edk2-platforms Patch 12/14] Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols

Change use of Intel Framework SMM Protocols to PI SMM Protocols. This removes Intel Framework dependencies.
The PI SMM Protocols added are:

* gEfiSmmPowerButtonDispatch2ProtocolGuid
* gEfiSmmSxDispatch2ProtocolGuid
* gEfiSmmSwDispatch2ProtocolGuid

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../Vlv2TbltDevicePkg/PlatformSmm/Platform.c  | 112 +++++++++++-------
 .../PlatformSmm/PlatformSmm.inf               |  16 +--
 .../PlatformSmm/SmmPlatform.h                 | 104 +++++++---------
 3 files changed, 114 insertions(+), 118 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
index fb9d090ada..c78174ed08 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
@@ -101,14 +101,14 @@ InitializePlatformSmm (
   EFI_STATUS                                Status;
   UINT8                                     Index;
   EFI_HANDLE                                Handle;
-  EFI_SMM_POWER_BUTTON_DISPATCH_CONTEXT     PowerButtonContext;
-  EFI_SMM_POWER_BUTTON_DISPATCH_PROTOCOL    *PowerButtonDispatch;
+  EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT     PowerButtonContext;
+  EFI_SMM_POWER_BUTTON_DISPATCH2_PROTOCOL   *PowerButtonDispatch;
   EFI_SMM_ICHN_DISPATCH_CONTEXT             IchnContext;
   EFI_SMM_ICHN_DISPATCH_PROTOCOL            *IchnDispatch;
-  EFI_SMM_SX_DISPATCH_PROTOCOL              *SxDispatch;
-  EFI_SMM_SX_DISPATCH_CONTEXT               EntryDispatchContext;
-  EFI_SMM_SW_DISPATCH_PROTOCOL              *SwDispatch;
-  EFI_SMM_SW_DISPATCH_CONTEXT               SwContext;
+  EFI_SMM_SX_DISPATCH2_PROTOCOL             *SxDispatch;
+  EFI_SMM_SX_REGISTER_CONTEXT               EntryDispatchContext;
+  EFI_SMM_SW_DISPATCH2_PROTOCOL             *SwDispatch;
+  EFI_SMM_SW_REGISTER_CONTEXT               SwContext;
   UINTN                                     VarSize;
   EFI_BOOT_MODE                             BootMode;
 
@@ -171,18 +171,18 @@ InitializePlatformSmm (
   //
   // Get the Power Button protocol
   //
-  Status = gBS->LocateProtocol(
-                  &gEfiSmmPowerButtonDispatchProtocolGuid,
-                  NULL,
-                  (void **)&PowerButtonDispatch
-                  );
+  Status = gSmst->SmmLocateProtocol(
+                    &gEfiSmmPowerButtonDispatch2ProtocolGuid,
+                    NULL,
+                    (VOID **)&PowerButtonDispatch
+                    );
   ASSERT_EFI_ERROR(Status);
 
   if (BootMode != BOOT_ON_FLASH_UPDATE) {
     //
     // Register for the power button event
     //
-    PowerButtonContext.Phase = PowerButtonEntry;
+    PowerButtonContext.Phase = EfiPowerButtonEntry;
     Status = PowerButtonDispatch->Register(
                                     PowerButtonDispatch,
                                     PowerButtonCallback, @@ -194,11 +194,11 @@ InitializePlatformSmm (
   //
   // Get the Sx dispatch protocol
   //
-  Status = gBS->LocateProtocol (
-                  &gEfiSmmSxDispatchProtocolGuid,
-                  NULL,
-                                  (void **)&SxDispatch
-                  );
+  Status = gSmst->SmmLocateProtocol(
+                    &gEfiSmmSxDispatch2ProtocolGuid,
+                    NULL,
+                    (VOID **)&SxDispatch
+                    );
   ASSERT_EFI_ERROR(Status);
 
   //
@@ -209,7 +209,7 @@ InitializePlatformSmm (
 
   Status = SxDispatch->Register (
                          SxDispatch,
-                           (EFI_SMM_SX_DISPATCH)SxSleepEntryCallBack,
+                         SxSleepEntryCallBack,
                          &EntryDispatchContext,
                          &Handle
                          );
@@ -247,11 +247,11 @@ InitializePlatformSmm (
   //
   //  Get the Sw dispatch protocol
   //
-  Status = gBS->LocateProtocol (
-                  &gEfiSmmSwDispatchProtocolGuid,
-                  NULL,
-                                  (void **)&SwDispatch
-                  );
+  Status = gSmst->SmmLocateProtocol (
+                    &gEfiSmmSwDispatch2ProtocolGuid,
+                    NULL,
+                    (VOID **)&SwDispatch
+                    );
   ASSERT_EFI_ERROR(Status);
 
   //
@@ -341,11 +341,13 @@ InitializePlatformSmm (
   return EFI_SUCCESS;
 }
 
-VOID
+EFI_STATUS
 EFIAPI
 SmmReadyToBootCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   EFI_STATUS Status;
@@ -371,6 +373,7 @@ SmmReadyToBootCallback (
     mSetSmmVariableProtocolSmiAllowed = FALSE;
   }
 
+  return EFI_SUCCESS;
 }
 
 /**
@@ -385,8 +388,10 @@ SmmReadyToBootCallback (  EFI_STATUS
 EFIAPI
 SxSleepEntryCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   EFI_STATUS              Status;
@@ -479,11 +484,13 @@ SetAfterG3On (
   When a power button event happens, it shuts off the machine
 
 **/
-VOID
+EFI_STATUS
 EFIAPI
 PowerButtonCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_POWER_BUTTON_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   //
@@ -538,6 +545,8 @@ PowerButtonCallback (
   // Should not return
   //
   CpuDeadLoop();
+
+  return EFI_SUCCESS;
 }
 
 
@@ -547,11 +556,13 @@ PowerButtonCallback (
   @param DispatchContext - The predefined context which contained sleep type and phase
 
 **/
-VOID
+EFI_STATUS
 EFIAPI
 S5SleepAcLossCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   //
@@ -561,6 +572,7 @@ S5SleepAcLossCallBack (
   if (mAcLossVariable == 1) {
     SetAfterG3On (TRUE);
   }
+  return EFI_SUCCESS;
 }
 
 /**
@@ -571,11 +583,13 @@ S5SleepAcLossCallBack (
   @retval Clears the Save State bit in the clock.
 
 **/
-VOID
+EFI_STATUS
 EFIAPI
 S4S5CallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
 
@@ -590,6 +604,7 @@ S4S5CallBack (
     IoWrite32(GPIO_BASE_ADDRESS + R_PCH_GPIO_SC_LVL, Data32);
   }
 
+  return EFI_SUCCESS;
 }
 
 
@@ -624,16 +639,18 @@ S4S5ProgClock()
    Enable SCI
 
   @param DispatchHandle  - EFI Handle
-  @param DispatchContext - Pointer to the EFI_SMM_SW_DISPATCH_CONTEXT
+  @param DispatchContext - Pointer to the EFI_SMM_SW_REGISTER_CONTEXT
 
   @retval Nothing
 
 **/
-VOID
+EFI_STATUS
 EFIAPI
 EnableAcpiCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   UINT32 SmiEn;
@@ -690,7 +707,7 @@ EnableAcpiCallback (
   Pm1Cnt |= B_PCH_ACPI_PM1_CNT_SCI_EN;
   IoWrite16(mAcpiBaseAddr + R_PCH_ACPI_PM1_CNT, Pm1Cnt);
 
-
+  return EFI_SUCCESS;
 }
 
 /**
@@ -710,16 +727,18 @@ EnableAcpiCallback (
    Disable SCI
 
   @param DispatchHandle  - EFI Handle
-  @param DispatchContext - Pointer to the EFI_SMM_SW_DISPATCH_CONTEXT
+  @param DispatchContext - Pointer to the EFI_SMM_SW_REGISTER_CONTEXT
 
   @retval Nothing
 
 **/
-VOID
+EFI_STATUS
 EFIAPI
 DisableAcpiCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   )
 {
   UINT16 Pm1Cnt;
@@ -737,6 +756,7 @@ DisableAcpiCallback (
   Pm1Cnt &= ~B_PCH_ACPI_PM1_CNT_SCI_EN;
   IoWrite16(mAcpiBaseAddr + R_PCH_ACPI_PM1_CNT, Pm1Cnt);
 
+  return EFI_SUCCESS;
 }
 
 /**
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
index 73c3b6f2d0..9aff4a4895 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/PlatformSmm.inf
@@ -36,6 +36,7 @@ [Sources]
 [LibraryClasses]
   UefiDriverEntryPoint
   UefiBootServicesTableLib
+  SmmServicesTableLib
   DebugLib
   IoLib
   BaseLib
@@ -52,15 +53,14 @@ [Guids]
 [Protocols]
   gEfiSmmIchnDispatchProtocolGuid
   gEfiGlobalNvsAreaProtocolGuid
-  gEfiSmmSwDispatchProtocolGuid
-  gEfiSmmPowerButtonDispatchProtocolGuid
-  gEfiSmmSxDispatchProtocolGuid
+  gEfiSmmSwDispatch2ProtocolGuid
+  gEfiSmmPowerButtonDispatch2ProtocolGuid
+  gEfiSmmSxDispatch2ProtocolGuid
   gEfiSmmVariableProtocolGuid
 
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
 
@@ -68,11 +68,11 @@ [Pcd.common]
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
 
 [Depex]
-  gEfiSmmAccess2ProtocolGuid               AND
-  gEfiSmmPowerButtonDispatchProtocolGuid  AND
-  gEfiSmmSxDispatchProtocolGuid           AND
+  gEfiSmmAccess2ProtocolGuid              AND
+  gEfiSmmPowerButtonDispatch2ProtocolGuid AND
+  gEfiSmmSxDispatch2ProtocolGuid          AND
   gEfiSmmIchnDispatchProtocolGuid         AND
-  gEfiSmmSwDispatchProtocolGuid           AND
+  gEfiSmmSwDispatch2ProtocolGuid          AND
   gEfiVariableArchProtocolGuid            AND
   gEfiVariableWriteArchProtocolGuid       AND
   gEfiGlobalNvsAreaProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
index bcb1d8ae92..735a562e3e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmPlatform.h
@@ -21,18 +21,16 @@ Abstract:
 
 
 
-#include <Protocol/SmmBase.h>
-#include <Protocol/FirmwareVolume.h>
-#include <Protocol/SmmPowerButtonDispatch.h>
-#include <Protocol/SmmSxDispatch.h>
-#include <Protocol/SmmSwDispatch.h>
+#include <Protocol/SmmBase2.h>
+#include <Protocol/SmmPowerButtonDispatch2.h>
+#include <Protocol/SmmSxDispatch2.h>
 #include <Protocol/SmmSwDispatch2.h>
 #include <Protocol/SmmIchnDispatch.h>
-#include <Protocol/SmmAccess.h>
+#include <Protocol/SmmAccess2.h>
 #include <Protocol/SmmVariable.h>
 #include <Protocol/PciRootBridgeIo.h>
 #include <Protocol/LoadedImage.h>
-#include "Protocol/GlobalNvsArea.h"
+#include <Protocol/GlobalNvsArea.h>
 #include <Guid/SetupVariable.h>
 #include <Guid/EfiVpdData.h>
 #include <Guid/PciLanInfo.h>
@@ -42,6 +40,7 @@ Abstract:
 #include "PlatformBaseAddresses.h"
 
 #include <Library/UefiBootServicesTableLib.h>
+#include <Library/SmmServicesTableLib.h>
 #include <Library/S3BootScriptLib.h>
 #include <Library/IoLib.h>
 #include <Library/DebugLib.h>
@@ -130,53 +129,59 @@ extern EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *mPciRootBridgeIo;  //  // Callback function prototypes  // -VOID
+EFI_STATUS
 EFIAPI
 PowerButtonCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_POWER_BUTTON_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
-VOID
-S5SleepWakeOnLanCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
-  );
-
-VOID
+EFI_STATUS
 EFIAPI
 S5SleepAcLossCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
 
-VOID
+EFI_STATUS
 EFIAPI
 S4S5CallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
-VOID
+EFI_STATUS
 EFIAPI
 EnableAcpiCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
-VOID
+EFI_STATUS
 EFIAPI
 DisableAcpiCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
-VOID
+EFI_STATUS
 EFIAPI
 SmmReadyToBootCallback (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
 VOID
@@ -185,46 +190,18 @@ DummyTco1Callback (
   IN  EFI_SMM_ICHN_DISPATCH_CONTEXT           *DispatchContext
   );
 
-
-VOID
-PerrSerrCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_ICHN_DISPATCH_CONTEXT           *DispatchContext
-  );
-
-VOID
-RiCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_ICHN_DISPATCH_CONTEXT           *DispatchContext
-  );
-
-
 VOID
 SetAfterG3On (
   BOOLEAN Enable
   );
 
-VOID
-TurnOffVregUsb (
-  );
-
-VOID
-PStateSupportCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT             *DispatchContext
-  );
-
-VOID
-PStateTransitionCallback (
-  IN  EFI_HANDLE                              DispatchHandle,
-  IN  EFI_SMM_SW_DISPATCH_CONTEXT             *DispatchContext
-  );
-
 EFI_STATUS
 EFIAPI
 SxSleepEntryCallBack (
-  IN  EFI_HANDLE                    DispatchHandle,
-  IN  EFI_SMM_SX_DISPATCH_CONTEXT   *DispatchContext
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
   );
 
 EFI_STATUS
@@ -232,6 +209,5 @@ SaveRuntimeScriptTable (
   VOID
   );
 
-
 #endif
 
--
2.21.0.windows.1





^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-platforms Patch 13/14] Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol
  2019-07-01  2:55 ` [edk2-platforms Patch 13/14] Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol Michael D Kinney
@ 2019-07-01  4:08   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:08 UTC (permalink / raw)
  To: Kinney, Michael D, devel@edk2.groups.io; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: Kinney, Michael D 
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-platforms Patch 13/14] Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol

Remove use of ACPI Support Protocol from IntelFrameworkPkg and use the ACPI Table Protocol and ACPI SDT Protocol from the MdePkg.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../AcpiPlatform/AcpiPlatform.c               | 72 +++++--------------
 .../AcpiPlatform/AcpiPlatform.h               |  2 +-
 .../AcpiPlatform/AcpiPlatform.inf             |  5 +-
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |  1 -
 .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |  2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |  2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |  2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |  2 +-
 .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |  2 +-
 9 files changed, 26 insertions(+), 64 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
index 13d904b834..962baf561d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
@@ -35,8 +35,7 @@ Abstract:
 #include <Guid/SetupVariable.h>
 #include <Guid/PlatformInfo.h>
 #include <Guid/BoardFeatures.h>
-#include <Protocol/AcpiSupport.h>
-#include <Protocol/AcpiS3Save.h>
+#include <Protocol/AcpiTable.h>
 #include <Library/CpuIA32.h>
 #include <SetupMode.h>
 #include <Guid/AcpiTableStorage.h>
@@ -142,15 +141,15 @@ LocateSupportProtocol (
     //
     // See if it has the ACPI storage file.
     //
-    Status = ((EFI_FIRMWARE_VOLUME_PROTOCOL *) (*Instance))->ReadFile (
-                                                              *Instance,
-                                                              &gEfiAcpiTableStorageGuid,
-                                                              NULL,
-                                                              &Size,
-                                                              &FileType,
-                                                              &Attributes,
-                                                              &FvStatus
-                                                              );
+    Status = ((EFI_FIRMWARE_VOLUME2_PROTOCOL *) (*Instance))->ReadFile (
+                                                                *Instance,
+                                                                &gEfiAcpiTableStorageGuid,
+                                                                NULL,
+                                                                &Size,
+                                                                &FileType,
+                                                                &Attributes,
+                                                                &FvStatus
+                                                                );
 
     //
     // If we found it, then we are done.
@@ -633,13 +632,11 @@ OnReadyToBoot (
   )
 {
   EFI_STATUS                  Status;
-  EFI_ACPI_TABLE_VERSION      TableVersion;
-  EFI_ACPI_SUPPORT_PROTOCOL   *AcpiSupport;
   SYSTEM_CONFIGURATION        SetupVarBuffer;
   UINTN                       VariableSize;
   EFI_PLATFORM_CPU_INFO       *PlatformCpuInfoPtr = NULL;
   EFI_PLATFORM_CPU_INFO       PlatformCpuInfo;
-  EFI_PEI_HOB_POINTERS          GuidHob;
+  EFI_PEI_HOB_POINTERS        GuidHob;
 
   if (mFirstNotify) {
     return;
@@ -701,23 +698,6 @@ OnReadyToBoot (
               );
     ASSERT_EFI_ERROR (Status);
   }
-
-  //
-  // Find the AcpiSupport protocol.
-  //
-  Status = LocateSupportProtocol (&gEfiAcpiSupportProtocolGuid, (VOID **) &AcpiSupport, 0);
-  ASSERT_EFI_ERROR (Status);
-
-  TableVersion = EFI_ACPI_TABLE_VERSION_2_0;
-
-  //
-  // Publish ACPI 1.0 or 2.0 Tables.
-  //
-  Status = AcpiSupport->PublishTables (
-                          AcpiSupport,
-                          TableVersion
-                          );
-  ASSERT_EFI_ERROR (Status);
 }
 
 VOID
@@ -759,8 +739,8 @@ AcpiPlatformEntryPoint (  {
   EFI_STATUS                    Status;
   EFI_STATUS                    AcpiStatus;
-  EFI_ACPI_SUPPORT_PROTOCOL     *AcpiSupport;
-  EFI_FIRMWARE_VOLUME2_PROTOCOL  *FwVol;
+  EFI_ACPI_TABLE_PROTOCOL       *AcpiTable;
+  EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol;
   INTN                          Instance;
   EFI_ACPI_COMMON_HEADER        *CurrentTable;
   UINTN                         TableHandle;
@@ -821,9 +801,9 @@ AcpiPlatformEntryPoint (
   }
 
   //
-  // Find the AcpiSupport protocol.
+  // Find the AcpiTable protocol.
   //
-  Status = LocateSupportProtocol (&gEfiAcpiSupportProtocolGuid, (VOID **) &AcpiSupport, 0);
+  Status = LocateSupportProtocol (&gEfiAcpiTableProtocolGuid, (VOID **) 
+ &AcpiTable, 0);
   ASSERT_EFI_ERROR (Status);
 
   //
@@ -1171,11 +1151,10 @@ AcpiPlatformEntryPoint (
           // Add the table.
           //
           TableHandle = 0;
-          AcpiStatus = AcpiSupport->SetAcpiTable (
-                                      AcpiSupport,
+          AcpiStatus = AcpiTable->InstallAcpiTable (
+                                      AcpiTable,
                                       CurrentTable,
-                                      TRUE,
-                                      TableVersion,
+                                      Size,
                                       &TableHandle
                                       );
           ASSERT_EFI_ERROR (AcpiStatus); @@ -1189,21 +1168,6 @@ AcpiPlatformEntryPoint (
     }
   }
 
-  //
-  // Publish ACPI 1.0 or 2.0 Tables.
-  //
-//  Status = AcpiSupport->PublishTables (
-//                          AcpiSupport,
-//                          TableVersion
-//                          );
-//  ASSERT_EFI_ERROR (Status);
-
-//  Status = EfiCreateEventReadyToBootEx (
-//             TPL_NOTIFY,
-//             OnReadyToBoot,
-//             NULL,
-//             &Event
-//             );
   Event = NULL;
   OnReadyToBoot (Event, NULL);
 
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
index b27ca661ff..8289eecc6d 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.h
@@ -30,7 +30,7 @@ Abstract:
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/UefiRuntimeServicesTableLib.h>
 #include <Library/DebugLib.h>
-#include <Protocol/FirmwareVolume.h>
+#include <Protocol/FirmwareVolume2.h>
 #include <Library/PcdLib.h>
 #include <IndustryStandard/HighPrecisionEventTimerTable.h>
 #include <IndustryStandard/Acpi.h>
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
index ce4db9fa85..6f843d6d2e 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.inf
@@ -34,7 +34,6 @@ [sources.common]
 [Packages]
   Vlv2TbltDevicePkg/PlatformPkg.dec
   MdePkg/MdePkg.dec
-  IntelFrameworkPkg/IntelFrameworkPkg.dec
   MdeModulePkg/MdeModulePkg.dec
   Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -64,7 +63,7 @@ [Guids]
 [Protocols]
   gEnhancedSpeedstepProtocolGuid
   gEfiPlatformCpuProtocolGuid
-  gEfiAcpiSupportProtocolGuid
+  gEfiAcpiTableProtocolGuid
   gEfiFirmwareVolume2ProtocolGuid
   gEfiMpServiceProtocolGuid
   gEfiGlobalNvsAreaProtocolGuid
@@ -78,5 +77,5 @@ [Pcd]
 [Depex]
   gEfiVariableArchProtocolGuid        AND
   gEfiVariableWriteArchProtocolGuid   AND
-  gEfiAcpiSupportProtocolGuid AND
+  gEfiAcpiTableProtocolGuid AND
   gEfiMpServiceProtocolGuid
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
index a5c7062cbb..abe9d7e3a0 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.dec
@@ -44,7 +44,6 @@ [Guids]
   gEfiSetupVariableGuid                   = { 0xec87d643, 0xeba4, 0x4bb5, { 0xa1, 0xe5, 0x3f, 0x3e, 0x36, 0xb2, 0x0d, 0xa9 } }
   gEfiPlatformInfoGuid                    = { 0x1e2acc41, 0xe26a, 0x483d, { 0xaf, 0xc7, 0xa0, 0x56, 0xc3, 0x4e, 0x08, 0x7b } }
   gMfgModeVariableGuid                    = { 0xEF14FD78, 0x0793, 0x4e2b, { 0xAC, 0x6D, 0x06, 0x28, 0x47, 0xE0, 0x17, 0x91 } }
-  gEfiAcpiTableStorageGuid                = { 0x7e374e25, 0x8e01, 0x4fee, { 0x87, 0xf2, 0x39, 0x0c, 0x23, 0xc6, 0x06, 0xcd } }
   gACPIOSFRMfgStringVariableGuid          = { 0x72234213, 0x0fd7, 0x48a1, { 0xa5, 0x9f, 0xb4, 0x1b, 0xc1, 0x07, 0xfb, 0xcd } }
   gACPIOSFRRefDataBlockVariableGuid       = { 0x72234213, 0x0fd7, 0x48a1, { 0xa5, 0x9f, 0xb4, 0x1b, 0xc1, 0x07, 0xfb, 0xcd } }
   gACPIOSFRModelStringVariableGuid        = { 0xca1bcad9, 0xe021, 0x4547, { 0xa1, 0xb0, 0x5b, 0x22, 0xc7, 0xf6, 0x87, 0xf4 } }
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
index b0fbbdb9cb..0661c778c1 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
@@ -504,7 +504,7 @@ [FV.FVMAIN]
   #
 INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
 INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
-INF IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
+INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
 INF RuleOverride = ACPITABLE2 Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
 INF RuleOverride = ACPITABLE Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
index 107c160b76..06bdebb10b 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf
@@ -453,7 +453,7 @@ [FV.FVMAIN]
   #
 INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
 INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
-INF IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
+INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
 INF RuleOverride = ACPITABLE2 Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
 INF RuleOverride = ACPITABLE Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
index 2123745ccd..b558caa61f 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc
@@ -1108,7 +1108,7 @@ [Components.X64]
   }
   MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
+  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
   Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
index 086668d570..99ada0ef0a 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
@@ -1092,7 +1092,7 @@ [Components.IA32]
   }
   MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
+  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
   Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
index 5f2dd65ec8..87404d2d82 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
@@ -1107,7 +1107,7 @@ [Components.X64]
   }
   MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
 
-  IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportDxe.inf
+  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
   Vlv2DeviceRefCodePkg/ValleyView2Soc/CPU/PowerManagement/AcpiTables/PowerManagementAcpiTables.inf
 
   Vlv2DeviceRefCodePkg/AcpiTablesPCAT/AcpiTables.inf
--
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-platforms Patch 14/14] Vlv2TbltDevicePkg/PlatformInitPei: Update MemoryTypeInformation
  2019-07-01  2:55 ` [edk2-platforms Patch 14/14] Vlv2TbltDevicePkg/PlatformInitPei: Update MemoryTypeInformation Michael D Kinney
@ 2019-07-01  4:08   ` Sun, Zailiang
  0 siblings, 0 replies; 42+ messages in thread
From: Sun, Zailiang @ 2019-07-01  4:08 UTC (permalink / raw)
  To: Kinney, Michael D, devel@edk2.groups.io; +Cc: Qian, Yi

Reviewed-By: Zailiang Sun <zailiang.sun@intel.com>

-----Original Message-----
From: Kinney, Michael D 
Sent: Monday, July 01, 2019 10:56 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>
Subject: [edk2-platforms Patch 14/14] Vlv2TbltDevicePkg/PlatformInitPei: Update MemoryTypeInformation

Reduce extra reboots when UEFI Shell is run followed by an OS boot.
The extra reboot is due to use of EfiLoaderCode that exceeds the MemoryTypeInformation bin size.  EfiLoaderCode should not be tracked.
Remove all memory types that should not be tracked, and update the remaining bin sizes based on observed memory usage on an X64 DEBUG profile.

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../PlatformInitPei/MemoryPeim.c              | 21 +++++--------------
 1 file changed, 5 insertions(+), 16 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryPeim.c b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryPeim.c
index e6189b7713..64b606637a 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryPeim.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/MemoryPeim.c
@@ -1,11 +1,9 @@
 /** @file
 
-  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
-                                                                                   

+  Copyright (c) 2004  - 2019, Intel Corporation. All rights 
+ reserved.<BR>
+
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
-                                                                                   

-
 Module Name:
 
 
@@ -40,19 +38,10 @@ Abstract:
 
 EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
   { EfiACPIReclaimMemory,       0x40  },    // 0x40 pages = 256k for ASL
-  { EfiACPIMemoryNVS,           0x100 },    // 0x100 pages = 1 MB for S3, SMM, HII, etc
-  { EfiReservedMemoryType,      0x600 },    // 48k for BIOS Reserved
-  { EfiMemoryMappedIO,          0     },
-  { EfiMemoryMappedIOPortSpace, 0     },
-  { EfiPalCode,                 0     },
-  { EfiRuntimeServicesCode,     0x200 },
+  { EfiACPIMemoryNVS,           0x40  },    // 0x40 pages = 256k MB for S3, SMM, HII, etc
+  { EfiReservedMemoryType,      0x80  },    // 512k for BIOS Reserved
+  { EfiRuntimeServicesCode,     0x100 },
   { EfiRuntimeServicesData,     0x100 },
-  { EfiLoaderCode,              0x100 },
-  { EfiLoaderData,              0x100 },
-  { EfiBootServicesCode,        0x800 },
-  { EfiBootServicesData,        0x2500},
-  { EfiConventionalMemory,      0     },
-  { EfiUnusableMemory,          0     },
   { EfiMaxMemoryType,           0     }
 };
 
--
2.21.0.windows.1


^ permalink raw reply related	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-01  4:04 ` [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Gary Lin
@ 2019-07-01 23:07   ` Michael D Kinney
  2019-07-02  9:48     ` Gary Lin
  0 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-01 23:07 UTC (permalink / raw)
  To: Gary Lin, devel@edk2.groups.io, Kinney, Michael D; +Cc: Qian, Yi, Sun, Zailiang

Hi Gary,

I recommend you rebase on top of this series.

I have verified Linux boots and I have been working
on the GCC and Linux build scripts as well. 

Please let me know if you see any issues with this
series applied and I can help get them fixed.

Thanks,

Mike

> -----Original Message-----
> From: Gary Lin [mailto:GLin@suse.com]
> Sent: Sunday, June 30, 2019 9:04 PM
> To: devel@edk2.groups.io; Kinney, Michael D
> <michael.d.kinney@intel.com>
> Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> <zailiang.sun@intel.com>
> Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> 
> On Sun, Jun 30, 2019 at 07:55:39PM -0700,  Michael D
> Kinney  wrote:
> > The following changes remove all dependencies on the
> IntelFrameworkPkg
> > and IntelFrameworkModulePkg from the Vlv2TbltDevicePkg
> platform
> > builds.  These changes do depend on updates binaries
> on the edk2-non-osi repository.
> >
> Hi Michael,
> 
> I am amending the bash scripts for gcc. The firmware I
> built is using the binaries from Development190216 and
> could boot into Linux successfully with some workarounds
> for Wpce791, Bds, and InteFspWrapper. The patches you
> posted eliminate those parts I have to work around.
> 
> Just want to know if you need any assistance for the gcc
> build? I could rebase my work upon your patches and send
> them later.
> 
> Thanks,
> 
> Gary Lin
> 
> > * Vlv2DeviceRefCodePkg: Add
> gEfiSmmIchnDispatchProtocolGuid
> > * Vlv2TbltDevicePkg: Reduce Intel Framework
> dependencies
> > * Vlv2TbltDevicePkg: Remove unused modules/libraries
> > * Vlv2TbltDevicePkg: Switch from ISA to SIO modules
> > * Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol
> > * Vlv2TbltDevicePkg: Remove use of PS/2 Policy
> Protocol
> > * Vlv2TbltDevicePkg: Remove use of BIOS ID tools
> > * Vlv2TbltDevicePkg: Remove use of Data Hub Protocol
> > * Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI
> > * Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe
> > * Vlv2TbltDevicePkg: Update boot mode/state behaviors
> > * Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM
> Protocols
> > * Vlv2TbltDevicePkg: Change to PI Spec ACPI Table
> Protocol
> >
> > Cc: Zailiang Sun <zailiang.sun@intel.com>
> > Cc: Yi Qian <yi.qian@intel.com>
> > Signed-off-by: Michael D Kinney
> <michael.d.kinney@intel.com>
> >
> > Michael D Kinney (14):
> >   Vlv2DeviceRefCodePkg: Add
> gEfiSmmIchnDispatchProtocolGuid
> >   Vlv2TbltDevicePkg: Reduce Intel Framework
> dependencies
> >   Vlv2TbltDevicePkg: Remove unused modules/libraries
> >   Vlv2TbltDevicePkg: Switch from ISA to SIO modules
> >   Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol
> >   Vlv2TbltDevicePkg: Remove use of PS/2 Policy
> Protocol
> >   Vlv2TbltDevicePkg: Remove use of BIOS ID tools
> >   Vlv2TbltDevicePkg: Remove use of Data Hub Protocol
> >   Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI
> >   Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe
> >   Vlv2TbltDevicePkg: Update boot mode/state behaviors
> >   Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM
> Protocols
> >   Vlv2TbltDevicePkg: Change to PI Spec ACPI Table
> Protocol
> >   Vlv2TbltDevicePkg/PlatformInitPei: Update
> MemoryTypeInformation
> >
> >  .../AcpiPlatform/AcpiPlatform.c               |  137
> +-
> >  .../AcpiPlatform/AcpiPlatform.h               |   11
> +-
> >  .../AcpiPlatform/AcpiPlatform.inf             |   14
> +-
> >  Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env  |   25
> -
> >  Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env  |   25
> -
> >  .../Intel/Vlv2TbltDevicePkg/BiosIdx64D.env    |   25
> -
> >  .../Intel/Vlv2TbltDevicePkg/BiosIdx64R.env    |   25
> -
> >  .../BootScriptSaveDxe/BootScriptSaveDxe.inf   |   60
> -
> >  .../InternalBootScriptSave.h                  |  102
> -
> >  .../BootScriptSaveDxe/ScriptSave.c            |  626
> ---
> >  .../Intel/Vlv2TbltDevicePkg/Build_IFWI.bat    |   33
> -
> >  .../Library/FmpDeviceLib/FmpDeviceLib.c       |   12
> +-
> >  .../FspAzaliaConfigData/AzaliaConfig.bin      |  Bin
> 3708 -> 0 bytes
> >  .../FspSupport/BootModePei/BootModePei.c      |   42
> -
> >  .../FspSupport/BootModePei/BootModePei.inf    |   40
> -
> >  .../FspHobProcessLibVlv2.c                    |  421
> --
> >  .../FspHobProcessLibVlv2.inf                  |   74
> -
> >  .../FspPlatformSecLibVlv2.c                   |  144
> -
> >  .../FspPlatformSecLibVlv2.inf                 |   82
> -
> >  .../Ia32/AsmSaveSecContext.asm                |   45
> -
> >  .../SecFspPlatformSecLibVlv2/Ia32/Fsp.inc     |   45
> -
> >  .../Ia32/PeiCoreEntry.asm                     |  135
> -
> >  .../Ia32/SecEntry.asm                         |  338
> --
> >  .../SecFspPlatformSecLibVlv2/Ia32/Stack.S     |   71
> -
> >  .../SecFspPlatformSecLibVlv2/Ia32/Stack.asm   |   76
> -
> >  .../SecFspPlatformSecLibVlv2/PlatformInit.c   |   36
> -
> >  .../SecFspPlatformSecLibVlv2/SaveSecContext.c |  108
> -
> >  .../SecGetPerformance.c                       |   83
> -
> >  .../SecPlatformInformation.c                  |   77
> -
> >  .../SecFspPlatformSecLibVlv2/SecRamInitData.c |   16
> -
> >  .../SecTempRamSupport.c                       |  149
> -
> >  .../SecFspPlatformSecLibVlv2/UartInit.c       |  192
> -
> >  Platform/Intel/Vlv2TbltDevicePkg/GenBiosId    |  Bin
> 12236 -> 0 bytes
> >  .../Intel/Vlv2TbltDevicePkg/GenBiosId.exe     |  Bin
> 384000 -> 0 bytes
> >  .../Vlv2TbltDevicePkg/Include/Guid/BiosId.h   |   30
> -
> >  .../Vlv2TbltDevicePkg/Include/Guid/IdccData.h |  104
> -
> >  .../Vlv2TbltDevicePkg/Include/Guid/ItkData.h  |   18
> +-
> >  .../Include/Guid/PlatformInfo.h               |    9
> +-
> >  .../Include/Library/BiosIdLib.h               |   22
> +-
> >  .../Include/Library/EfiRegTableLib.h          |   51
> +-
> >  .../Include/Protocol/LpcWpc83627Policy.h      |   92
> -
> >  .../Include/Protocol/LpcWpce791Policy.h       |   55
> -
> >  .../Include/Protocol/TpmMp.h                  |  136
> -
> >  .../Include/Protocol/UsbPolicy.h              |  126
> -
> >  .../Library/BiosIdLib/BiosIdLib.c             |  279
> +-
> >  .../Library/BiosIdLib/BiosIdLib.inf           |   21
> +-
> >  .../DxePlatformBootManagerLib/BdsPlatform.c   | 1434
> ++++++
> >  .../DxePlatformBootManagerLib/BdsPlatform.h   |  253
> +
> >  .../DxePlatformBootManagerLib.inf             |   97
> +
> >  .../DxePlatformBootManagerLib/MemoryTest.c    |   83
> +
> >  .../PlatformBootOption.c                      |  559
> ++
> >  .../Library/EfiRegTableLib/EfiRegTableLib.c   |   57
> +-
> >  .../Library/EfiRegTableLib/EfiRegTableLib.inf |   12
> +-
> >  .../Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c |   46
> -
> >  .../Library/I2CLib/I2CLibNull.inf             |   39
> -
> >  .../Library/I2CLibDxe/I2CLib.c                |  735
> ---
> >  .../Library/I2CLibDxe/I2CLibDxe.inf           |   39
> -
> >  .../Library/I2CLibDxe/I2CRegs.h               |  126
> -
> >  .../Library/I2CLibPei/I2CAccess.h             |   44
> -
> >  .../Library/I2CLibPei/I2CDelayPei.c           |   46
> -
> >  .../Library/I2CLibPei/I2CDelayPei.h           |   30
> -
> >  .../Library/I2CLibPei/I2CIoLibPei.c           |  178
> -
> >  .../Library/I2CLibPei/I2CIoLibPei.h           |  153
> -
> >  .../Library/I2CLibPei/I2CLibPei.c             |  638
> ---
> >  .../Library/I2CLibPei/I2CLibPei.h             |  280
> -
> >  .../Library/I2CLibPei/I2CLibPei.inf           |   40
> -
> >  .../BoardClkGens/BoardClkGens.c               |   23
> +-
> >  .../BoardClkGens/BoardClkGens.h               |    8
> +-
> >  .../MultiPlatformLib/BoardGpios/BoardGpios.c  |   12
> +-
> >  .../MultiPlatformLib/BoardGpios/BoardGpios.h  |    7
> +-
> >  .../MultiPlatformLib/MultiPlatformLib.h       |   11
> +-
> >  .../MultiPlatformLib/MultiPlatformLib.inf     |   11
> +-
> >  .../Library/PlatformBdsLib/BdsPlatform.c      | 3098
> ------------
> >  .../Library/PlatformBdsLib/BdsPlatform.h      |  516
> --
> >  .../Library/PlatformBdsLib/PlatformBdsLib.inf |  128
> -
> >  .../PlatformBdsLib/PlatformBdsStrings.uni     |   30
> -
> >  .../Library/PlatformBdsLib/PlatformData.c     |  306
> --
> >  .../Library/PlatformFspLib/PlatformFspLib.c   |   44
> -
> >  .../Library/PlatformFspLib/PlatformFspLib.inf |   49
> -
> >  .../SerialPortLib/PlatformSerialPortLib.h     |   53
> -
> >  .../Library/SerialPortLib/SerialPortLib.c     |  246
> -
> >  .../Library/SerialPortLib/SerialPortLib.inf   |   52
> -
> >  .../Library/SerialPortLib/SioInit.c           |  127
> -
> >  .../Library/SerialPortLib/SioInit.h           |   62
> -
> >  .../Library/SmbusLib/CommonHeader.h           |   26
> -
> >  .../Library/SmbusLib/SmbusLib.c               |  873
> ----
> >  .../Library/SmbusLib/SmbusLib.inf             |   46
> -
> >  .../Metronome/LegacyMetronome.c               |  185
> -
> >  .../Metronome/LegacyMetronome.h               |   64
> -
> >  .../Vlv2TbltDevicePkg/Metronome/Metronome.inf |   49
> -
> >  .../MonoStatusCode/MonoStatusCode.h           |   47
> +-
> >  .../MonoStatusCode/MonoStatusCode.inf         |    9
> +-
> >  .../Library/GenericBdsLib/BdsBoot.c           | 4490
> -----------------
> >  .../Library/GenericBdsLib/BdsConnect.c        |  429
> --
> >  .../Library/GenericBdsLib/BdsConsole.c        | 1061
> ----
> >  .../Library/GenericBdsLib/BdsMisc.c           | 1575
> ------
> >  .../Library/GenericBdsLib/DevicePath.c        |   27
> -
> >  .../Library/GenericBdsLib/GenericBdsLib.inf   |  143
> -
> >  .../Library/GenericBdsLib/GenericBdsLib.uni   |   19
> -
> >  .../GenericBdsLib/GenericBdsStrings.uni       |   30
> -
> >  .../Library/GenericBdsLib/InternalBdsLib.h    |  173
> -
> >  .../Library/GenericBdsLib/String.c            |   26
> -
> >  .../Library/GenericBdsLib/String.h            |   42
> -
> >  .../PciPlatform/PciPlatform.c                 |    7
> +-
> >  .../PciPlatform/PciPlatform.inf               |    9
> +-
> >  .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c   |  951
> ++++
> >  .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h   |  363
> ++
> >  .../Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf |   38
> +
> >  .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.c   |    8
> +-
> >  .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.h   |   17
> +-
> >  .../PlatformCpuInfoDxe/PlatformCpuInfoDxe.inf |    8
> +-
> >  .../Vlv2TbltDevicePkg/PlatformDxe/BoardId.c   |   45
> +-
> >  .../PlatformDxe/ClockControl.c                |   80
> +-
> >  .../PlatformDxe/Configuration.h               |    8
> +-
> >  .../PlatformDxe/IchRegTable.c                 |    8
> +-
> >  .../Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c  |   72
> -
> >  .../Vlv2TbltDevicePkg/PlatformDxe/Platform.c  |  533
> +-
> >  .../PlatformDxe/PlatformDxe.h                 |  521
> +-
> >  .../PlatformDxe/PlatformDxe.inf               |   28
> +-
> >  .../PlatformDxe/SioPlatformPolicy.c           |   82
> -
> >  .../PlatformGopPolicy/PlatformGopPolicy.inf   |   15
> +-
> >  .../Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c  |  319
> --
> >  .../PlatformInitPei/MemoryCallback.c          |    8
> +-
> >  .../PlatformInitPei/MemoryPeim.c              |   21
> +-
> >  .../PlatformInitPei/PchInitPeim.c             |   10
> +-
> >  .../PlatformInitPei/PlatformEarlyInit.c       |  209
> +-
> >  .../PlatformInitPei/PlatformEarlyInit.h       |   31
> +-
> >  .../PlatformInitPei/PlatformInitPei.inf       |   29
> +-
> >  .../Vlv2TbltDevicePkg/PlatformPei/BootMode.c  |   99
> +-
> >  .../PlatformPei/CommonHeader.h                |   12
> +-
> >  .../PlatformPei/MemoryCallback.c              |    8
> +-
> >  .../Vlv2TbltDevicePkg/PlatformPei/Platform.c  |   24
> +-
> >  .../Vlv2TbltDevicePkg/PlatformPei/Platform.h  |   27
> +-
> >  .../PlatformPei/PlatformPei.inf               |   12
> +-
> >  .../Intel/Vlv2TbltDevicePkg/PlatformPkg.dec   |   28
> +-
> >  .../Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf   |  286
> +-
> >  .../Vlv2TbltDevicePkg/PlatformPkgConfig.dsc   |   22
> +-
> >  .../Vlv2TbltDevicePkg/PlatformPkgGcc.fdf      |  299
> +-
> >  .../Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc   |  561
> +-
> >  .../Vlv2TbltDevicePkg/PlatformPkgIA32.dsc     |  562
> +--
> >  .../Vlv2TbltDevicePkg/PlatformPkgX64.dsc      |  563
> +--
> >  .../PlatformSetupDxe/PlatformSetupDxe.h       |   30
> +-
> >  .../PlatformSetupDxe/PlatformSetupDxe.inf     |   17
> +-
> >  .../PlatformSetupDxe/SetupFunctions.c         |   38
> +-
> >  .../PlatformSetupDxe/SetupInfoRecords.c       |  572
> +--
> >  .../Vlv2TbltDevicePkg/PlatformSmm/Platform.c  |  196
> +-
> >  .../PlatformSmm/PlatformSmm.inf               |   34
> +-
> >  .../Vlv2TbltDevicePkg/PlatformSmm/S3Save.c    |   53
> +-
> >  .../PlatformSmm/SmmPlatform.h                 |  111
> +-
> >  .../PlatformSmm/SmmScriptSave.c               |  252
> -
> >  .../PlatformSmm/SmmScriptSave.h               |   50
> -
> >  .../Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.inf |    6
> +-
> >  .../SmBiosMiscDxe/CommonHeader.h              |   10
> +-
> >  .../SmBiosMiscDxe/DataHubRecords.h            | 2934
> +++++++++++
> >  .../MiscBaseBoardManufacturerFunction.c       |    8
> +-
> >  .../SmBiosMiscDxe/MiscBiosVendorFunction.c    |    9
> +-
> >  .../SmBiosMiscDxe/MiscMemoryDeviceFunction.c  |  318
> +-
> >  .../SmBiosMiscDxe/MiscOemType0x94Function.c   |   45
> +-
> >  .../SmBiosMiscDxe/MiscProcessorCacheData.c    |   11
> +-
> >  .../MiscProcessorCacheFunction.c              |  273
> +-
> >  .../MiscProcessorInformationFunction.c        |  203
> +-
> >  .../MiscSubclassDriverDataTable.c             |   14
> +-
> >  .../MiscSubclassDriverEntryPoint.c            |   13
> +-
> >  .../MiscSystemManufacturerFunction.c          |   10
> +-
> >  .../SmBiosMiscDxe/SmBiosMiscDxe.inf           |   18
> +-
> >  .../SmmSwDispatch2OnSmmSwDispatchThunk.c      |  459
> --
> >  .../SmmSwDispatch2OnSmmSwDispatchThunk.inf    |   54
> -
> >  .../SmramSaveInfoHandlerSmm.c                 |  164
> -
> >  .../SmramSaveInfoHandlerSmm.inf               |   60
> -
> >  .../Stitch/IFWIHeader/Vacant.bin              |  Bin
> 3928064 -> 0 bytes
> >  .../Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat   |  270
> -
> >  .../Stitch/MNW2_Stitch_Config.txt             |   10
> -
> >  .../Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c |   33
> -
> >  .../Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf   |   32
> -
> >  .../VlvPlatformInitDxe/IgdOpRegion.c          |   20
> +-
> >  .../VlvPlatformInitDxe/IgdOpRegion.h          |   27
> +-
> >  .../VlvPlatformInitDxe/VlvPlatformInitDxe.inf |   14
> +-
> >  .../Vlv2TbltDevicePkg/Wpce791/LpcDriver.c     |  340
> --
> >  .../Vlv2TbltDevicePkg/Wpce791/LpcDriver.h     |  112
> -
> >  .../Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c    |  366
> --
> >  .../Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h    |  103
> -
> >  .../Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c  |  126
> -
> > .../Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h  |  101 -
> >  .../Vlv2TbltDevicePkg/Wpce791/Wpce791.inf     |   63
> -
> >  Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.bat  |   47
> +-
> >  Platform/Intel/Vlv2TbltDevicePkg/bld_vlv.sh   |   52
> +-
> >  .../Include/Protocol/SmmIchnDispatch.h        |  183
> +
> >  .../Vlv2DeviceRefCodePkg.dec                  |    5
> +-
> >  188 files changed, 8321 insertions(+), 28666
> deletions(-)  delete
> > mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/BiosIdD.env
> >  delete mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/BiosIdR.env
> >  delete mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64D.env
> >  delete mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/BiosIdx64R.env
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/BootS
> criptSaveDxe.i
> > nf  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/Inter
> nalBootScriptS
> > ave.h  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/BootScriptSaveDxe/Scrip
> tSave.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspAzaliaConfigData/Aza
> liaConfig.bin
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/
> BootModePei.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/BootModePei/
> BootModePei.in
> > f  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiF
> spHobProcessLi
> > bVlv2/FspHobProcessLibVlv2.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/PeiF
> spHobProcessLi
> > bVlv2/FspHobProcessLibVlv2.inf  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/FspPlatformSecLibVlv2.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/FspPlatformSecLibVlv2.inf  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/Ia32/AsmSaveSecContext.asm  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/Ia32/Fsp.inc  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/Ia32/PeiCoreEntry.asm  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/Ia32/SecEntry.asm  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/Ia32/Stack.S  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/Ia32/Stack.asm  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/PlatformInit.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/SaveSecContext.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/SecGetPerformance.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/SecPlatformInformation.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/SecRamInitData.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/SecTempRamSupport.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/FspSupport/Library/SecF
> spPlatformSecL
> > ibVlv2/UartInit.c  delete mode 100755
> > Platform/Intel/Vlv2TbltDevicePkg/GenBiosId
> >  delete mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/GenBiosId.exe
> >  delete mode 100644
> > Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/BiosId.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Include/Guid/IdccData.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc
> 83627Policy.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/LpcWpc
> e791Policy.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/TpmMp.
> h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Include/Protocol/UsbPol
> icy.h
> >  create mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBoot
> ManagerLib/Bds
> > Platform.c  create mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBoot
> ManagerLib/Bds
> > Platform.h  create mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBoot
> ManagerLib/Dxe
> > PlatformBootManagerLib.inf  create mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBoot
> ManagerLib/Mem
> > oryTest.c  create mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBoot
> ManagerLib/Pla
> > tformBootOption.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLib.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLib/I2CLibNu
> ll.inf
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLi
> b.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CLi
> bDxe.inf
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibDxe/I2CRe
> gs.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CAc
> cess.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDe
> layPei.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CDe
> layPei.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIo
> LibPei.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CIo
> LibPei.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLi
> bPei.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLi
> bPei.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLi
> bPei.inf
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/
> BdsPlatform.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/
> BdsPlatform.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/
> PlatformBdsLib
> > .inf  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/
> PlatformBdsStr
> > ings.uni  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformBdsLib/
> PlatformData.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/
> PlatformFspLib
> > .c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/PlatformFspLib/
> PlatformFspLib
> > .inf  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/P
> latformSerialP
> > ortLib.h  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/S
> erialPortLib.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/S
> erialPortLib.i
> > nf  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/S
> ioInit.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/SerialPortLib/S
> ioInit.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/Common
> Header.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusL
> ib.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Library/SmbusLib/SmbusL
> ib.inf
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetrono
> me.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Metronome/LegacyMetrono
> me.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Metronome/Metronome.inf
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/BdsBoot.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/BdsConnect.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/BdsConsole.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/BdsMisc.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/DevicePath.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/GenericBdsLib.inf
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/GenericBdsLib.uni
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/GenericBdsStrings.uni
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/InternalBdsLib.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/String.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Override/IntelFramework
> ModulePkg/Libr
> > ary/GenericBdsLib/String.h  create mode 100644
> > Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.c
> >  create mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.h
> >  create mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/PcuSio/PcuSio.inf
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/IdccInfo.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/PlatformDxe/SioPlatform
> Policy.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/PlatformInitPei/Dimm.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSa
> ve.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSa
> ve.h
> >  create mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubRe
> cords.h
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDi
> spatchThunk/Sm
> > mSwDispatch2OnSmmSwDispatchThunk.c
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/SmmSwDispatch2OnSmmSwDi
> spatchThunk/Sm
> > mSwDispatch2OnSmmSwDispatchThunk.inf
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm
> /SmramSaveInfo
> > HandlerSmm.c  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/SmramSaveInfoHandlerSmm
> /SmramSaveInfo
> > HandlerSmm.inf  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIHeader/Vacan
> t.bin
> >  delete mode 100644
> > Platform/Intel/Vlv2TbltDevicePkg/Stitch/IFWIStitch.bat
> >  delete mode 100644
> >
> Platform/Intel/Vlv2TbltDevicePkg/Stitch/MNW2_Stitch_Conf
> ig.txt
> >  delete mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/UiApp/FrontPage.c
> >  delete mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/UiApp/UiApp.inf
> >  delete mode 100644
> > Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.c
> >  delete mode 100644
> > Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcDriver.h
> >  delete mode 100644
> > Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.c
> >  delete mode 100644
> > Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcIsaAcpi.h
> >  delete mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.c
> >  delete mode 100644
> Platform/Intel/Vlv2TbltDevicePkg/Wpce791/LpcSio.h
> >  delete mode 100644
> > Platform/Intel/Vlv2TbltDevicePkg/Wpce791/Wpce791.inf
> >  create mode 100644
> >
> Silicon/Intel/Vlv2DeviceRefCodePkg/Include/Protocol/SmmI
> chnDispatch.h
> >
> > --
> > 2.21.0.windows.1
> >
> >
> > 
> >
> >

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-01 23:07   ` Michael D Kinney
@ 2019-07-02  9:48     ` Gary Lin
  2019-07-02 16:49       ` Michael D Kinney
  0 siblings, 1 reply; 42+ messages in thread
From: Gary Lin @ 2019-07-02  9:48 UTC (permalink / raw)
  To: devel@edk2.groups.io, michael.d.kinney@intel.com; +Cc: Yi Qian, Zailiang Sun

On Mon, Jul 01, 2019 at 11:07:11PM +0000,  Michael D Kinney  wrote:
> Hi Gary,
> 
> I recommend you rebase on top of this series.
> 
> I have verified Linux boots and I have been working
> on the GCC and Linux build scripts as well. 
> 
> Please let me know if you see any issues with this
> series applied and I can help get them fixed.
> 
Hi Mike,

I'm rebasing my patches and they are available in my branch:

https://github.com/lcp/edk2-platforms/commits/vlv2-fixes-wip

It's based on edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
and edk2-non-osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).

There are 3 problems I currently encountered, and maybe you can give me
some suggestions.

1. Missing DSDT

When compiling DSDT, iasl failed with this error:

DSDT.iiii   6077:             Or(ShiftLeft(Derefof(Index(CDCT, \_SB.PCI0.GFX0.MCHK.DCFE)), 21),PARM, PARM)                                           
Error    6163 -                                                                      ^ Object is created temporarily in another method and cannot be accessed (\_SB.PCI0.GFX0. MCHK.DCFE)

The code is from Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGBDA.ASL

I have to comment out the line or iasl won't generate the aml file and
the OS would fail to get DSDT.

My acpica version is 20190509, and I vaguely remember that the older
acpica seems to be more tolerant to this error.

2. Crash at SMBIOS driver

When booting the system, I got the following error:

Loading driver at 0x00078DBA000 EntryPoint=0x00078DBEC3C MiscSubclass.efi
InstallProtocolInterface: BC62157E-3E33-4FEC-9920-2D3B36D750DF 78FE8D18
ProtectUefiImageCommon - 0x78FE8040
  - 0x0000000078DBA000 - 0x0000000000007B80
PlatformInfoHob->BoardId [0xB0]
GetBiosVersionDateTime :MNW2MAX1.X64.0084.D01 01/01/2019 00:00 
SmbiosAdd: Smbios type 0 with size 0x48 is added to 32-bit table
SmbiosAdd: Smbios type 0 with size 0x48 is added to 64-bit table
SmbiosCreateTable: Initialize 32-bit entry point structure
SmbiosCreateTable() re-allocate SMBIOS 32-bit table
SmbiosCreateTable: Initialize 64-bit entry point structure
SmbiosCreate64BitTable() re-allocate SMBIOS 64-bit table
Create Smbios Manu callback.
!!!! X64 Exception Type - 06(#UD - Invalid Opcode)  CPU Apic ID - 00000000 !!!!
RIP  - 0000000078DBEC26, CS  - 0000000000000038, RFLAGS - 0000000000010206
RAX  - 0000000000000000, RCX - 000000007984A5A0, RDX - 000000007A46E5FF
RBX  - 000000007A46E920, RSP - 000000007A46E8B0, RBP - 0000000078DC0EC0
RSI  - 0000000000000012, RDI - 0000000000000003
R8   - 800000000000000E, R9  - 000000007A46E920, R10 - 0000000078FE8398
R11  - 0000000000000001, R12 - 0000000078FE8798, R13 - 0000000078FE8898
R14  - 0000000078FE8818, R15 - 000000007A46EC60
DS   - 0000000000000030, ES  - 0000000000000030, FS  - 0000000000000030
GS   - 0000000000000030, SS  - 0000000000000030
CR0  - 0000000080010013, CR2 - 0000000000000000, CR3 - 000000007A201000
CR4  - 0000000000000628, CR8 - 0000000000000000
DR0  - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000
DR3  - 0000000000000000, DR6 - 00000000FFFF0FF8, DR7 - 0000000000000400
GDTR - 0000000079FFDA98 0000000000000047, LDTR - 0000000000000000
IDTR - 0000000079862018 0000000000000FFF,   TR - 0000000000000000
FXSAVE_STATE - 000000007A46E510
!!!! Find image based on IP(0x78DBEC26) /home/gary/git/edk2-workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclass.
dll (ImageBase=0000000078DBA000, EntryPoint=0000000078DBEC3C) !!!!

I disaseembled MiscSubclass.debug and found that the address is a "ud2"
instruction at
SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBaseBoardManufacturer()

After adding a few more debug messages, the system crashed at another
function:
SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbiosManuCallback()

If I added debug messages to both functions, the system booted
successfully. I currently didn't have any clue on this.

3. The firmware always booted into EFI shell.

I guess something went wrong with BDS. I haven't looked into this issue
yet.

Thanks,

Gary Lin

> Thanks,
> 
> Mike
> 
> > -----Original Message-----
> > From: Gary Lin [mailto:GLin@suse.com]
> > Sent: Sunday, June 30, 2019 9:04 PM
> > To: devel@edk2.groups.io; Kinney, Michael D
> > <michael.d.kinney@intel.com>
> > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > <zailiang.sun@intel.com>
> > Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> > Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> > 
> > On Sun, Jun 30, 2019 at 07:55:39PM -0700,  Michael D
> > Kinney  wrote:
> > > The following changes remove all dependencies on the
> > IntelFrameworkPkg
> > > and IntelFrameworkModulePkg from the Vlv2TbltDevicePkg
> > platform
> > > builds.  These changes do depend on updates binaries
> > on the edk2-non-osi repository.
> > >
> > Hi Michael,
> > 
> > I am amending the bash scripts for gcc. The firmware I
> > built is using the binaries from Development190216 and
> > could boot into Linux successfully with some workarounds
> > for Wpce791, Bds, and InteFspWrapper. The patches you
> > posted eliminate those parts I have to work around.
> > 
> > Just want to know if you need any assistance for the gcc
> > build? I could rebase my work upon your patches and send
> > them later.
> > 
> > Thanks,
> > 
> > Gary Lin
> > 
> 
> 
> 

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-02  9:48     ` Gary Lin
@ 2019-07-02 16:49       ` Michael D Kinney
  2019-07-02 21:11         ` Michael D Kinney
  0 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-02 16:49 UTC (permalink / raw)
  To: Gary Lin, devel@edk2.groups.io, Kinney, Michael D; +Cc: Qian, Yi, Sun, Zailiang

Hi Gary,

Thanks for the branch.  I have the build working and
have reproduced the SMBIOS issue and am debugging that now.

Mike

> -----Original Message-----
> From: Gary Lin [mailto:GLin@suse.com]
> Sent: Tuesday, July 2, 2019 2:48 AM
> To: devel@edk2.groups.io; Kinney, Michael D
> <michael.d.kinney@intel.com>
> Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> <zailiang.sun@intel.com>
> Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> 
> On Mon, Jul 01, 2019 at 11:07:11PM +0000,  Michael D
> Kinney  wrote:
> > Hi Gary,
> >
> > I recommend you rebase on top of this series.
> >
> > I have verified Linux boots and I have been working on
> the GCC and
> > Linux build scripts as well.
> >
> > Please let me know if you see any issues with this
> series applied and
> > I can help get them fixed.
> >
> Hi Mike,
> 
> I'm rebasing my patches and they are available in my
> branch:
> 
> https://github.com/lcp/edk2-platforms/commits/vlv2-
> fixes-wip
> 
> It's based on
> edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
> and edk2-non-
> osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).
> 
> There are 3 problems I currently encountered, and maybe
> you can give me some suggestions.
> 
> 1. Missing DSDT
> 
> When compiling DSDT, iasl failed with this error:
> 
> DSDT.iiii   6077:
> Or(ShiftLeft(Derefof(Index(CDCT,
> \_SB.PCI0.GFX0.MCHK.DCFE)), 21),PARM, PARM)
> Error    6163 -
> ^ Object is created temporarily in another method and
> cannot be accessed (\_SB.PCI0.GFX0. MCHK.DCFE)
> 
> The code is from
> Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGB
> DA.ASL
> 
> I have to comment out the line or iasl won't generate
> the aml file and the OS would fail to get DSDT.
> 
> My acpica version is 20190509, and I vaguely remember
> that the older acpica seems to be more tolerant to this
> error.
> 
> 2. Crash at SMBIOS driver
> 
> When booting the system, I got the following error:
> 
> Loading driver at 0x00078DBA000 EntryPoint=0x00078DBEC3C
> MiscSubclass.efi
> InstallProtocolInterface: BC62157E-3E33-4FEC-9920-
> 2D3B36D750DF 78FE8D18 ProtectUefiImageCommon -
> 0x78FE8040
>   - 0x0000000078DBA000 - 0x0000000000007B80
> PlatformInfoHob->BoardId [0xB0]
> GetBiosVersionDateTime :MNW2MAX1.X64.0084.D01 01/01/2019
> 00:00
> SmbiosAdd: Smbios type 0 with size 0x48 is added to 32-
> bit table
> SmbiosAdd: Smbios type 0 with size 0x48 is added to 64-
> bit table
> SmbiosCreateTable: Initialize 32-bit entry point
> structure
> SmbiosCreateTable() re-allocate SMBIOS 32-bit table
> SmbiosCreateTable: Initialize 64-bit entry point
> structure
> SmbiosCreate64BitTable() re-allocate SMBIOS 64-bit table
> Create Smbios Manu callback.
> !!!! X64 Exception Type - 06(#UD - Invalid Opcode)  CPU
> Apic ID - 00000000 !!!!
> RIP  - 0000000078DBEC26, CS  - 0000000000000038, RFLAGS
> - 0000000000010206 RAX  - 0000000000000000, RCX -
> 000000007984A5A0, RDX - 000000007A46E5FF RBX  -
> 000000007A46E920, RSP - 000000007A46E8B0, RBP -
> 0000000078DC0EC0 RSI  - 0000000000000012, RDI -
> 0000000000000003
> R8   - 800000000000000E, R9  - 000000007A46E920, R10 -
> 0000000078FE8398
> R11  - 0000000000000001, R12 - 0000000078FE8798, R13 -
> 0000000078FE8898
> R14  - 0000000078FE8818, R15 - 000000007A46EC60
> DS   - 0000000000000030, ES  - 0000000000000030, FS  -
> 0000000000000030
> GS   - 0000000000000030, SS  - 0000000000000030
> CR0  - 0000000080010013, CR2 - 0000000000000000, CR3 -
> 000000007A201000
> CR4  - 0000000000000628, CR8 - 0000000000000000
> DR0  - 0000000000000000, DR1 - 0000000000000000, DR2 -
> 0000000000000000
> DR3  - 0000000000000000, DR6 - 00000000FFFF0FF8, DR7 -
> 0000000000000400 GDTR - 0000000079FFDA98
> 0000000000000047, LDTR - 0000000000000000
> IDTR - 0000000079862018 0000000000000FFF,   TR -
> 0000000000000000
> FXSAVE_STATE - 000000007A46E510
> !!!! Find image based on IP(0x78DBEC26)
> /home/gary/git/edk2-
> workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2Tbl
> tDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclas
> s.
> dll (ImageBase=0000000078DBA000,
> EntryPoint=0000000078DBEC3C) !!!!
> 
> I disaseembled MiscSubclass.debug and found that the
> address is a "ud2"
> instruction at
> SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBa
> seBoardManufacturer()
> 
> After adding a few more debug messages, the system
> crashed at another
> function:
> SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbios
> ManuCallback()
> 
> If I added debug messages to both functions, the system
> booted successfully. I currently didn't have any clue on
> this.
> 
> 3. The firmware always booted into EFI shell.
> 
> I guess something went wrong with BDS. I haven't looked
> into this issue yet.
> 
> Thanks,
> 
> Gary Lin
> 
> > Thanks,
> >
> > Mike
> >
> > > -----Original Message-----
> > > From: Gary Lin [mailto:GLin@suse.com]
> > > Sent: Sunday, June 30, 2019 9:04 PM
> > > To: devel@edk2.groups.io; Kinney, Michael D
> > > <michael.d.kinney@intel.com>
> > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > <zailiang.sun@intel.com>
> > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> 00/14]
> > > Vlv2TbltDevicePkg: Remove Intel Framework
> dependencies
> > >
> > > On Sun, Jun 30, 2019 at 07:55:39PM -0700,  Michael D
> Kinney  wrote:
> > > > The following changes remove all dependencies on
> the
> > > IntelFrameworkPkg
> > > > and IntelFrameworkModulePkg from the
> Vlv2TbltDevicePkg
> > > platform
> > > > builds.  These changes do depend on updates
> binaries
> > > on the edk2-non-osi repository.
> > > >
> > > Hi Michael,
> > >
> > > I am amending the bash scripts for gcc. The firmware
> I built is
> > > using the binaries from Development190216 and could
> boot into Linux
> > > successfully with some workarounds for Wpce791, Bds,
> and
> > > InteFspWrapper. The patches you posted eliminate
> those parts I have
> > > to work around.
> > >
> > > Just want to know if you need any assistance for the
> gcc build? I
> > > could rebase my work upon your patches and send them
> later.
> > >
> > > Thanks,
> > >
> > > Gary Lin
> > >
> > 
> >
> >

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-02 16:49       ` Michael D Kinney
@ 2019-07-02 21:11         ` Michael D Kinney
  2019-07-03  3:57           ` Gary Lin
  0 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-02 21:11 UTC (permalink / raw)
  To: Gary Lin, devel@edk2.groups.io, Kinney, Michael D; +Cc: Qian, Yi, Sun, Zailiang

Hi Gary,

I have posted an update to your patches the removes the setting of WORKSPACE
and accesses all files relative to WORKSPACE in the Linux shell scripts.
It also fixes null pointer bugs in the SmbiosMiscDxe module.

https://github.com/mdkinney/edk2-platforms/tree/Bug_xxx_Vlv2_Linux_And_Smbios_Fixes

With these changes I can boot to the UEFI Shell and to Linux.  Please verify from
your environments.

I see you have added the SDMMC modules, but I do not see that peripheral yet.
That feature looks like it needs some more debug.  We may need to back out those
changes for now.

I agree there are ASL issues.  The ASL code needs to be updated to the 
latest ASL compiler.

Thanks,

Mike

> -----Original Message-----
> From: Kinney, Michael D
> Sent: Tuesday, July 2, 2019 9:50 AM
> To: Gary Lin <GLin@suse.com>; devel@edk2.groups.io;
> Kinney, Michael D <michael.d.kinney@intel.com>
> Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> <zailiang.sun@intel.com>
> Subject: RE: [edk2-devel] [edk2-platforms Patch 00/14]
> Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> 
> Hi Gary,
> 
> Thanks for the branch.  I have the build working and have
> reproduced the SMBIOS issue and am debugging that now.
> 
> Mike
> 
> > -----Original Message-----
> > From: Gary Lin [mailto:GLin@suse.com]
> > Sent: Tuesday, July 2, 2019 2:48 AM
> > To: devel@edk2.groups.io; Kinney, Michael D
> > <michael.d.kinney@intel.com>
> > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > <zailiang.sun@intel.com>
> > Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> > Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> >
> > On Mon, Jul 01, 2019 at 11:07:11PM +0000,  Michael D
> Kinney  wrote:
> > > Hi Gary,
> > >
> > > I recommend you rebase on top of this series.
> > >
> > > I have verified Linux boots and I have been working
> on
> > the GCC and
> > > Linux build scripts as well.
> > >
> > > Please let me know if you see any issues with this
> > series applied and
> > > I can help get them fixed.
> > >
> > Hi Mike,
> >
> > I'm rebasing my patches and they are available in my
> > branch:
> >
> > https://github.com/lcp/edk2-platforms/commits/vlv2-
> > fixes-wip
> >
> > It's based on
> > edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
> > and edk2-non-
> > osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).
> >
> > There are 3 problems I currently encountered, and maybe
> you can give
> > me some suggestions.
> >
> > 1. Missing DSDT
> >
> > When compiling DSDT, iasl failed with this error:
> >
> > DSDT.iiii   6077:
> > Or(ShiftLeft(Derefof(Index(CDCT,
> > \_SB.PCI0.GFX0.MCHK.DCFE)), 21),PARM, PARM)
> > Error    6163 -
> > ^ Object is created temporarily in another method and
> cannot be
> > accessed (\_SB.PCI0.GFX0. MCHK.DCFE)
> >
> > The code is from
> >
> Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGB
> > DA.ASL
> >
> > I have to comment out the line or iasl won't generate
> the aml file and
> > the OS would fail to get DSDT.
> >
> > My acpica version is 20190509, and I vaguely remember
> that the older
> > acpica seems to be more tolerant to this error.
> >
> > 2. Crash at SMBIOS driver
> >
> > When booting the system, I got the following error:
> >
> > Loading driver at 0x00078DBA000
> EntryPoint=0x00078DBEC3C
> > MiscSubclass.efi
> > InstallProtocolInterface: BC62157E-3E33-4FEC-9920-
> 2D3B36D750DF
> > 78FE8D18 ProtectUefiImageCommon -
> > 0x78FE8040
> >   - 0x0000000078DBA000 - 0x0000000000007B80
> > PlatformInfoHob->BoardId [0xB0]
> > GetBiosVersionDateTime :MNW2MAX1.X64.0084.D01
> 01/01/2019
> > 00:00
> > SmbiosAdd: Smbios type 0 with size 0x48 is added to 32-
> bit table
> > SmbiosAdd: Smbios type 0 with size 0x48 is added to 64-
> bit table
> > SmbiosCreateTable: Initialize 32-bit entry point
> structure
> > SmbiosCreateTable() re-allocate SMBIOS 32-bit table
> > SmbiosCreateTable: Initialize 64-bit entry point
> structure
> > SmbiosCreate64BitTable() re-allocate SMBIOS 64-bit
> table Create Smbios
> > Manu callback.
> > !!!! X64 Exception Type - 06(#UD - Invalid Opcode)  CPU
> Apic ID -
> > 00000000 !!!!
> > RIP  - 0000000078DBEC26, CS  - 0000000000000038, RFLAGS
> > - 0000000000010206 RAX  - 0000000000000000, RCX -
> 000000007984A5A0,
> > RDX - 000000007A46E5FF RBX  - 000000007A46E920, RSP -
> > 000000007A46E8B0, RBP -
> > 0000000078DC0EC0 RSI  - 0000000000000012, RDI -
> > 0000000000000003
> > R8   - 800000000000000E, R9  - 000000007A46E920, R10 -
> > 0000000078FE8398
> > R11  - 0000000000000001, R12 - 0000000078FE8798, R13 -
> > 0000000078FE8898
> > R14  - 0000000078FE8818, R15 - 000000007A46EC60
> > DS   - 0000000000000030, ES  - 0000000000000030, FS  -
> > 0000000000000030
> > GS   - 0000000000000030, SS  - 0000000000000030
> > CR0  - 0000000080010013, CR2 - 0000000000000000, CR3 -
> > 000000007A201000
> > CR4  - 0000000000000628, CR8 - 0000000000000000
> > DR0  - 0000000000000000, DR1 - 0000000000000000, DR2 -
> > 0000000000000000
> > DR3  - 0000000000000000, DR6 - 00000000FFFF0FF8, DR7 -
> > 0000000000000400 GDTR - 0000000079FFDA98
> 0000000000000047, LDTR -
> > 0000000000000000
> > IDTR - 0000000079862018 0000000000000FFF,   TR -
> > 0000000000000000
> > FXSAVE_STATE - 000000007A46E510
> > !!!! Find image based on IP(0x78DBEC26)
> > /home/gary/git/edk2-
> >
> workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2Tbl
> >
> tDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclas
> > s.
> > dll (ImageBase=0000000078DBA000,
> > EntryPoint=0000000078DBEC3C) !!!!
> >
> > I disaseembled MiscSubclass.debug and found that the
> address is a
> > "ud2"
> > instruction at
> >
> SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBa
> > seBoardManufacturer()
> >
> > After adding a few more debug messages, the system
> crashed at another
> > function:
> >
> SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbios
> > ManuCallback()
> >
> > If I added debug messages to both functions, the system
> booted
> > successfully. I currently didn't have any clue on this.
> >
> > 3. The firmware always booted into EFI shell.
> >
> > I guess something went wrong with BDS. I haven't looked
> into this
> > issue yet.
> >
> > Thanks,
> >
> > Gary Lin
> >
> > > Thanks,
> > >
> > > Mike
> > >
> > > > -----Original Message-----
> > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > Sent: Sunday, June 30, 2019 9:04 PM
> > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > <michael.d.kinney@intel.com>
> > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > <zailiang.sun@intel.com>
> > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > 00/14]
> > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > dependencies
> > > >
> > > > On Sun, Jun 30, 2019 at 07:55:39PM -0700,  Michael
> D
> > Kinney  wrote:
> > > > > The following changes remove all dependencies on
> > the
> > > > IntelFrameworkPkg
> > > > > and IntelFrameworkModulePkg from the
> > Vlv2TbltDevicePkg
> > > > platform
> > > > > builds.  These changes do depend on updates
> > binaries
> > > > on the edk2-non-osi repository.
> > > > >
> > > > Hi Michael,
> > > >
> > > > I am amending the bash scripts for gcc. The
> firmware
> > I built is
> > > > using the binaries from Development190216 and could
> > boot into Linux
> > > > successfully with some workarounds for Wpce791,
> Bds,
> > and
> > > > InteFspWrapper. The patches you posted eliminate
> > those parts I have
> > > > to work around.
> > > >
> > > > Just want to know if you need any assistance for
> the
> > gcc build? I
> > > > could rebase my work upon your patches and send
> them
> > later.
> > > >
> > > > Thanks,
> > > >
> > > > Gary Lin
> > > >
> > > 
> > >
> > >

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-02 21:11         ` Michael D Kinney
@ 2019-07-03  3:57           ` Gary Lin
  2019-07-09  3:52             ` Michael D Kinney
  0 siblings, 1 reply; 42+ messages in thread
From: Gary Lin @ 2019-07-03  3:57 UTC (permalink / raw)
  To:  Kinney, Michael D ; +Cc: devel@edk2.groups.io, Yi Qian, Zailiang Sun

On Tue, Jul 02, 2019 at 09:11:06PM +0000,  Kinney, Michael D  wrote:
> Hi Gary,
> 
Hi Mike,

> I have posted an update to your patches the removes the setting of WORKSPACE
> and accesses all files relative to WORKSPACE in the Linux shell scripts.
> It also fixes null pointer bugs in the SmbiosMiscDxe module.
> 
> https://github.com/mdkinney/edk2-platforms/tree/Bug_xxx_Vlv2_Linux_And_Smbios_Fixes
> 
> With these changes I can boot to the UEFI Shell and to Linux.  Please verify from
> your environments.
> 
The fix for SmbiosMiscDxe works for me. Thanks for that!

I pushed another commit to my branch to check WORKSPACE to notify the
user:

https://github.com/lcp/edk2-platforms/commit/fc530689e913e3de25ca2c553d616b9cef28901c

We probably have to update Readme.md later. It's already dated.

> I see you have added the SDMMC modules, but I do not see that peripheral yet.
> That feature looks like it needs some more debug.  We may need to back out those
> changes for now.
> 
I saw the SD card settings in the South Cluster Configuration menu even
without those SDMMC modules, so they are probably from the edk2-non-osi
drivers. However, the SD card didn't work until I added the drivers from
MdeModulePkg, so I need those drivers at least for my Minnowboard Turbot.

Thanks,

Gary Lin

> I agree there are ASL issues.  The ASL code needs to be updated to the 
> latest ASL compiler.
> 
> Thanks,
> 
> Mike
> 
> > -----Original Message-----
> > From: Kinney, Michael D
> > Sent: Tuesday, July 2, 2019 9:50 AM
> > To: Gary Lin <GLin@suse.com>; devel@edk2.groups.io;
> > Kinney, Michael D <michael.d.kinney@intel.com>
> > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > <zailiang.sun@intel.com>
> > Subject: RE: [edk2-devel] [edk2-platforms Patch 00/14]
> > Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> > 
> > Hi Gary,
> > 
> > Thanks for the branch.  I have the build working and have
> > reproduced the SMBIOS issue and am debugging that now.
> > 
> > Mike
> > 
> > > -----Original Message-----
> > > From: Gary Lin [mailto:GLin@suse.com]
> > > Sent: Tuesday, July 2, 2019 2:48 AM
> > > To: devel@edk2.groups.io; Kinney, Michael D
> > > <michael.d.kinney@intel.com>
> > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > <zailiang.sun@intel.com>
> > > Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> > > Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> > >
> > > On Mon, Jul 01, 2019 at 11:07:11PM +0000,  Michael D
> > Kinney  wrote:
> > > > Hi Gary,
> > > >
> > > > I recommend you rebase on top of this series.
> > > >
> > > > I have verified Linux boots and I have been working
> > on
> > > the GCC and
> > > > Linux build scripts as well.
> > > >
> > > > Please let me know if you see any issues with this
> > > series applied and
> > > > I can help get them fixed.
> > > >
> > > Hi Mike,
> > >
> > > I'm rebasing my patches and they are available in my
> > > branch:
> > >
> > > https://github.com/lcp/edk2-platforms/commits/vlv2-
> > > fixes-wip
> > >
> > > It's based on
> > > edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
> > > and edk2-non-
> > > osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).
> > >
> > > There are 3 problems I currently encountered, and maybe
> > you can give
> > > me some suggestions.
> > >
> > > 1. Missing DSDT
> > >
> > > When compiling DSDT, iasl failed with this error:
> > >
> > > DSDT.iiii   6077:
> > > Or(ShiftLeft(Derefof(Index(CDCT,
> > > \_SB.PCI0.GFX0.MCHK.DCFE)), 21),PARM, PARM)
> > > Error    6163 -
> > > ^ Object is created temporarily in another method and
> > cannot be
> > > accessed (\_SB.PCI0.GFX0. MCHK.DCFE)
> > >
> > > The code is from
> > >
> > Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGB
> > > DA.ASL
> > >
> > > I have to comment out the line or iasl won't generate
> > the aml file and
> > > the OS would fail to get DSDT.
> > >
> > > My acpica version is 20190509, and I vaguely remember
> > that the older
> > > acpica seems to be more tolerant to this error.
> > >
> > > 2. Crash at SMBIOS driver
> > >
> > > When booting the system, I got the following error:
> > >
> > > Loading driver at 0x00078DBA000
> > EntryPoint=0x00078DBEC3C
> > > MiscSubclass.efi
> > > InstallProtocolInterface: BC62157E-3E33-4FEC-9920-
> > 2D3B36D750DF
> > > 78FE8D18 ProtectUefiImageCommon -
> > > 0x78FE8040
> > >   - 0x0000000078DBA000 - 0x0000000000007B80
> > > PlatformInfoHob->BoardId [0xB0]
> > > GetBiosVersionDateTime :MNW2MAX1.X64.0084.D01
> > 01/01/2019
> > > 00:00
> > > SmbiosAdd: Smbios type 0 with size 0x48 is added to 32-
> > bit table
> > > SmbiosAdd: Smbios type 0 with size 0x48 is added to 64-
> > bit table
> > > SmbiosCreateTable: Initialize 32-bit entry point
> > structure
> > > SmbiosCreateTable() re-allocate SMBIOS 32-bit table
> > > SmbiosCreateTable: Initialize 64-bit entry point
> > structure
> > > SmbiosCreate64BitTable() re-allocate SMBIOS 64-bit
> > table Create Smbios
> > > Manu callback.
> > > !!!! X64 Exception Type - 06(#UD - Invalid Opcode)  CPU
> > Apic ID -
> > > 00000000 !!!!
> > > RIP  - 0000000078DBEC26, CS  - 0000000000000038, RFLAGS
> > > - 0000000000010206 RAX  - 0000000000000000, RCX -
> > 000000007984A5A0,
> > > RDX - 000000007A46E5FF RBX  - 000000007A46E920, RSP -
> > > 000000007A46E8B0, RBP -
> > > 0000000078DC0EC0 RSI  - 0000000000000012, RDI -
> > > 0000000000000003
> > > R8   - 800000000000000E, R9  - 000000007A46E920, R10 -
> > > 0000000078FE8398
> > > R11  - 0000000000000001, R12 - 0000000078FE8798, R13 -
> > > 0000000078FE8898
> > > R14  - 0000000078FE8818, R15 - 000000007A46EC60
> > > DS   - 0000000000000030, ES  - 0000000000000030, FS  -
> > > 0000000000000030
> > > GS   - 0000000000000030, SS  - 0000000000000030
> > > CR0  - 0000000080010013, CR2 - 0000000000000000, CR3 -
> > > 000000007A201000
> > > CR4  - 0000000000000628, CR8 - 0000000000000000
> > > DR0  - 0000000000000000, DR1 - 0000000000000000, DR2 -
> > > 0000000000000000
> > > DR3  - 0000000000000000, DR6 - 00000000FFFF0FF8, DR7 -
> > > 0000000000000400 GDTR - 0000000079FFDA98
> > 0000000000000047, LDTR -
> > > 0000000000000000
> > > IDTR - 0000000079862018 0000000000000FFF,   TR -
> > > 0000000000000000
> > > FXSAVE_STATE - 000000007A46E510
> > > !!!! Find image based on IP(0x78DBEC26)
> > > /home/gary/git/edk2-
> > >
> > workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2Tbl
> > >
> > tDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclas
> > > s.
> > > dll (ImageBase=0000000078DBA000,
> > > EntryPoint=0000000078DBEC3C) !!!!
> > >
> > > I disaseembled MiscSubclass.debug and found that the
> > address is a
> > > "ud2"
> > > instruction at
> > >
> > SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBa
> > > seBoardManufacturer()
> > >
> > > After adding a few more debug messages, the system
> > crashed at another
> > > function:
> > >
> > SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbios
> > > ManuCallback()
> > >
> > > If I added debug messages to both functions, the system
> > booted
> > > successfully. I currently didn't have any clue on this.
> > >
> > > 3. The firmware always booted into EFI shell.
> > >
> > > I guess something went wrong with BDS. I haven't looked
> > into this
> > > issue yet.
> > >
> > > Thanks,
> > >
> > > Gary Lin
> > >
> > > > Thanks,
> > > >
> > > > Mike
> > > >
> > > > > -----Original Message-----
> > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > Sent: Sunday, June 30, 2019 9:04 PM
> > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > <michael.d.kinney@intel.com>
> > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > > <zailiang.sun@intel.com>
> > > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > > 00/14]
> > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > dependencies
> > > > >
> > > > > On Sun, Jun 30, 2019 at 07:55:39PM -0700,  Michael
> > D
> > > Kinney  wrote:
> > > > > > The following changes remove all dependencies on
> > > the
> > > > > IntelFrameworkPkg
> > > > > > and IntelFrameworkModulePkg from the
> > > Vlv2TbltDevicePkg
> > > > > platform
> > > > > > builds.  These changes do depend on updates
> > > binaries
> > > > > on the edk2-non-osi repository.
> > > > > >
> > > > > Hi Michael,
> > > > >
> > > > > I am amending the bash scripts for gcc. The
> > firmware
> > > I built is
> > > > > using the binaries from Development190216 and could
> > > boot into Linux
> > > > > successfully with some workarounds for Wpce791,
> > Bds,
> > > and
> > > > > InteFspWrapper. The patches you posted eliminate
> > > those parts I have
> > > > > to work around.
> > > > >
> > > > > Just want to know if you need any assistance for
> > the
> > > gcc build? I
> > > > > could rebase my work upon your patches and send
> > them
> > > later.
> > > > >
> > > > > Thanks,
> > > > >
> > > > > Gary Lin
> > > > >
> > > > 
> > > >
> > > >
> 

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-03  3:57           ` Gary Lin
@ 2019-07-09  3:52             ` Michael D Kinney
  2019-07-09  6:04               ` Gary Lin
  0 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-09  3:52 UTC (permalink / raw)
  To: devel@edk2.groups.io, glin@suse.com, Kinney, Michael D
  Cc: Qian, Yi, Sun, Zailiang

Hi Gary,

I picked up the changes on your branch.  I re-enabled the BIOS ID
Feature and added support for IA32 GCC builds, so the builds
available from Windows and Linux are matched now.

I have posted my updated branch here:

https://github.com/mdkinney/edk2-platforms/tree/Bug_xxx_Vlv2_Linux_And_Smbios_Fixes_V2

I also verified that the SD Card support does work, so I am
keeping that change.

I agree the Readme is out of date.  I will work on that and
add to the branch referenced above tomorrow.

Thanks,

Mike

> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io]
> On Behalf Of Gary Lin
> Sent: Tuesday, July 2, 2019 8:57 PM
> To: Kinney, Michael D <michael.d.kinney@intel.com>
> Cc: devel@edk2.groups.io; Qian, Yi <yi.qian@intel.com>;
> Sun, Zailiang <zailiang.sun@intel.com>
> Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> 
> On Tue, Jul 02, 2019 at 09:11:06PM +0000,  Kinney,
> Michael D  wrote:
> > Hi Gary,
> >
> Hi Mike,
> 
> > I have posted an update to your patches the removes the
> setting of
> > WORKSPACE and accesses all files relative to WORKSPACE
> in the Linux shell scripts.
> > It also fixes null pointer bugs in the SmbiosMiscDxe
> module.
> >
> > https://github.com/mdkinney/edk2-
> platforms/tree/Bug_xxx_Vlv2_Linux_And
> > _Smbios_Fixes
> >
> > With these changes I can boot to the UEFI Shell and to
> Linux.  Please
> > verify from your environments.
> >
> The fix for SmbiosMiscDxe works for me. Thanks for that!
> 
> I pushed another commit to my branch to check WORKSPACE
> to notify the
> user:
> 
> https://github.com/lcp/edk2-
> platforms/commit/fc530689e913e3de25ca2c553d616b9cef28901c
> 
> We probably have to update Readme.md later. It's already
> dated.
> 
> > I see you have added the SDMMC modules, but I do not
> see that peripheral yet.
> > That feature looks like it needs some more debug.  We
> may need to back
> > out those changes for now.
> >
> I saw the SD card settings in the South Cluster
> Configuration menu even without those SDMMC modules, so
> they are probably from the edk2-non-osi drivers. However,
> the SD card didn't work until I added the drivers from
> MdeModulePkg, so I need those drivers at least for my
> Minnowboard Turbot.
> 
> Thanks,
> 
> Gary Lin
> 
> > I agree there are ASL issues.  The ASL code needs to be
> updated to the
> > latest ASL compiler.
> >
> > Thanks,
> >
> > Mike
> >
> > > -----Original Message-----
> > > From: Kinney, Michael D
> > > Sent: Tuesday, July 2, 2019 9:50 AM
> > > To: Gary Lin <GLin@suse.com>; devel@edk2.groups.io;
> Kinney, Michael
> > > D <michael.d.kinney@intel.com>
> > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > <zailiang.sun@intel.com>
> > > Subject: RE: [edk2-devel] [edk2-platforms Patch
> 00/14]
> > > Vlv2TbltDevicePkg: Remove Intel Framework
> dependencies
> > >
> > > Hi Gary,
> > >
> > > Thanks for the branch.  I have the build working and
> have reproduced
> > > the SMBIOS issue and am debugging that now.
> > >
> > > Mike
> > >
> > > > -----Original Message-----
> > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > Sent: Tuesday, July 2, 2019 2:48 AM
> > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > <michael.d.kinney@intel.com>
> > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > <zailiang.sun@intel.com>
> > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> 00/14]
> > > > Vlv2TbltDevicePkg: Remove Intel Framework
> dependencies
> > > >
> > > > On Mon, Jul 01, 2019 at 11:07:11PM +0000,  Michael
> D
> > > Kinney  wrote:
> > > > > Hi Gary,
> > > > >
> > > > > I recommend you rebase on top of this series.
> > > > >
> > > > > I have verified Linux boots and I have been
> working
> > > on
> > > > the GCC and
> > > > > Linux build scripts as well.
> > > > >
> > > > > Please let me know if you see any issues with
> this
> > > > series applied and
> > > > > I can help get them fixed.
> > > > >
> > > > Hi Mike,
> > > >
> > > > I'm rebasing my patches and they are available in
> my
> > > > branch:
> > > >
> > > > https://github.com/lcp/edk2-platforms/commits/vlv2-
> > > > fixes-wip
> > > >
> > > > It's based on
> > > > edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
> > > > and edk2-non-
> > > > osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).
> > > >
> > > > There are 3 problems I currently encountered, and
> maybe
> > > you can give
> > > > me some suggestions.
> > > >
> > > > 1. Missing DSDT
> > > >
> > > > When compiling DSDT, iasl failed with this error:
> > > >
> > > > DSDT.iiii   6077:
> > > > Or(ShiftLeft(Derefof(Index(CDCT,
> > > > \_SB.PCI0.GFX0.MCHK.DCFE)), 21),PARM, PARM)
> > > > Error    6163 -
> > > > ^ Object is created temporarily in another method
> and
> > > cannot be
> > > > accessed (\_SB.PCI0.GFX0. MCHK.DCFE)
> > > >
> > > > The code is from
> > > >
> > >
> Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGB
> > > > DA.ASL
> > > >
> > > > I have to comment out the line or iasl won't
> generate
> > > the aml file and
> > > > the OS would fail to get DSDT.
> > > >
> > > > My acpica version is 20190509, and I vaguely
> remember
> > > that the older
> > > > acpica seems to be more tolerant to this error.
> > > >
> > > > 2. Crash at SMBIOS driver
> > > >
> > > > When booting the system, I got the following error:
> > > >
> > > > Loading driver at 0x00078DBA000
> > > EntryPoint=0x00078DBEC3C
> > > > MiscSubclass.efi
> > > > InstallProtocolInterface: BC62157E-3E33-4FEC-9920-
> > > 2D3B36D750DF
> > > > 78FE8D18 ProtectUefiImageCommon -
> > > > 0x78FE8040
> > > >   - 0x0000000078DBA000 - 0x0000000000007B80
> > > > PlatformInfoHob->BoardId [0xB0]
> > > > GetBiosVersionDateTime :MNW2MAX1.X64.0084.D01
> > > 01/01/2019
> > > > 00:00
> > > > SmbiosAdd: Smbios type 0 with size 0x48 is added to
> 32-
> > > bit table
> > > > SmbiosAdd: Smbios type 0 with size 0x48 is added to
> 64-
> > > bit table
> > > > SmbiosCreateTable: Initialize 32-bit entry point
> > > structure
> > > > SmbiosCreateTable() re-allocate SMBIOS 32-bit table
> > > > SmbiosCreateTable: Initialize 64-bit entry point
> > > structure
> > > > SmbiosCreate64BitTable() re-allocate SMBIOS 64-bit
> > > table Create Smbios
> > > > Manu callback.
> > > > !!!! X64 Exception Type - 06(#UD - Invalid Opcode)
> CPU
> > > Apic ID -
> > > > 00000000 !!!!
> > > > RIP  - 0000000078DBEC26, CS  - 0000000000000038,
> RFLAGS
> > > > - 0000000000010206 RAX  - 0000000000000000, RCX -
> > > 000000007984A5A0,
> > > > RDX - 000000007A46E5FF RBX  - 000000007A46E920, RSP
> -
> > > > 000000007A46E8B0, RBP -
> > > > 0000000078DC0EC0 RSI  - 0000000000000012, RDI -
> > > > 0000000000000003
> > > > R8   - 800000000000000E, R9  - 000000007A46E920,
> R10 -
> > > > 0000000078FE8398
> > > > R11  - 0000000000000001, R12 - 0000000078FE8798,
> R13 -
> > > > 0000000078FE8898
> > > > R14  - 0000000078FE8818, R15 - 000000007A46EC60
> > > > DS   - 0000000000000030, ES  - 0000000000000030, FS
> -
> > > > 0000000000000030
> > > > GS   - 0000000000000030, SS  - 0000000000000030
> > > > CR0  - 0000000080010013, CR2 - 0000000000000000,
> CR3 -
> > > > 000000007A201000
> > > > CR4  - 0000000000000628, CR8 - 0000000000000000
> > > > DR0  - 0000000000000000, DR1 - 0000000000000000,
> DR2 -
> > > > 0000000000000000
> > > > DR3  - 0000000000000000, DR6 - 00000000FFFF0FF8,
> DR7 -
> > > > 0000000000000400 GDTR - 0000000079FFDA98
> > > 0000000000000047, LDTR -
> > > > 0000000000000000
> > > > IDTR - 0000000079862018 0000000000000FFF,   TR -
> > > > 0000000000000000
> > > > FXSAVE_STATE - 000000007A46E510
> > > > !!!! Find image based on IP(0x78DBEC26)
> > > > /home/gary/git/edk2-
> > > >
> > >
> workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2Tbl
> > > >
> > >
> tDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclas
> > > > s.
> > > > dll (ImageBase=0000000078DBA000,
> > > > EntryPoint=0000000078DBEC3C) !!!!
> > > >
> > > > I disaseembled MiscSubclass.debug and found that
> the
> > > address is a
> > > > "ud2"
> > > > instruction at
> > > >
> > >
> SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBa
> > > > seBoardManufacturer()
> > > >
> > > > After adding a few more debug messages, the system
> > > crashed at another
> > > > function:
> > > >
> > >
> SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbios
> > > > ManuCallback()
> > > >
> > > > If I added debug messages to both functions, the
> system
> > > booted
> > > > successfully. I currently didn't have any clue on
> this.
> > > >
> > > > 3. The firmware always booted into EFI shell.
> > > >
> > > > I guess something went wrong with BDS. I haven't
> looked
> > > into this
> > > > issue yet.
> > > >
> > > > Thanks,
> > > >
> > > > Gary Lin
> > > >
> > > > > Thanks,
> > > > >
> > > > > Mike
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > Sent: Sunday, June 30, 2019 9:04 PM
> > > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > > <michael.d.kinney@intel.com>
> > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > > > <zailiang.sun@intel.com>
> > > > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > > > 00/14]
> > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > dependencies
> > > > > >
> > > > > > On Sun, Jun 30, 2019 at 07:55:39PM -0700,
> Michael
> > > D
> > > > Kinney  wrote:
> > > > > > > The following changes remove all dependencies
> on
> > > > the
> > > > > > IntelFrameworkPkg
> > > > > > > and IntelFrameworkModulePkg from the
> > > > Vlv2TbltDevicePkg
> > > > > > platform
> > > > > > > builds.  These changes do depend on updates
> > > > binaries
> > > > > > on the edk2-non-osi repository.
> > > > > > >
> > > > > > Hi Michael,
> > > > > >
> > > > > > I am amending the bash scripts for gcc. The
> > > firmware
> > > > I built is
> > > > > > using the binaries from Development190216 and
> could
> > > > boot into Linux
> > > > > > successfully with some workarounds for Wpce791,
> > > Bds,
> > > > and
> > > > > > InteFspWrapper. The patches you posted
> eliminate
> > > > those parts I have
> > > > > > to work around.
> > > > > >
> > > > > > Just want to know if you need any assistance
> for
> > > the
> > > > gcc build? I
> > > > > > could rebase my work upon your patches and send
> > > them
> > > > later.
> > > > > >
> > > > > > Thanks,
> > > > > >
> > > > > > Gary Lin
> > > > > >
> > > > >
> > > > >
> > > > >
> >
> 
> 


^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-09  3:52             ` Michael D Kinney
@ 2019-07-09  6:04               ` Gary Lin
  2019-07-10  3:38                 ` Michael D Kinney
  0 siblings, 1 reply; 42+ messages in thread
From: Gary Lin @ 2019-07-09  6:04 UTC (permalink / raw)
  To: devel@edk2.groups.io, michael.d.kinney@intel.com; +Cc: Yi Qian, Zailiang Sun

On Tue, Jul 09, 2019 at 03:52:37AM +0000,  Michael D Kinney  wrote:
> Hi Gary,
> 
Hi Mike,

> I picked up the changes on your branch.  I re-enabled the BIOS ID
> Feature and added support for IA32 GCC builds, so the builds
> available from Windows and Linux are matched now.
> 
> I have posted my updated branch here:
> 
> https://github.com/mdkinney/edk2-platforms/tree/Bug_xxx_Vlv2_Linux_And_Smbios_Fixes_V2
> 
> I also verified that the SD Card support does work, so I am
> keeping that change.
> 
I tested the branch + my ASL workaround and booted into Linux
successfully.

> I agree the Readme is out of date.  I will work on that and
> add to the branch referenced above tomorrow.
> 
Thanks!

Gary Lin

> Thanks,
> 
> Mike
> 
> > -----Original Message-----
> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io]
> > On Behalf Of Gary Lin
> > Sent: Tuesday, July 2, 2019 8:57 PM
> > To: Kinney, Michael D <michael.d.kinney@intel.com>
> > Cc: devel@edk2.groups.io; Qian, Yi <yi.qian@intel.com>;
> > Sun, Zailiang <zailiang.sun@intel.com>
> > Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> > Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> > 
> > On Tue, Jul 02, 2019 at 09:11:06PM +0000,  Kinney,
> > Michael D  wrote:
> > > Hi Gary,
> > >
> > Hi Mike,
> > 
> > > I have posted an update to your patches the removes the
> > setting of
> > > WORKSPACE and accesses all files relative to WORKSPACE
> > in the Linux shell scripts.
> > > It also fixes null pointer bugs in the SmbiosMiscDxe
> > module.
> > >
> > > https://github.com/mdkinney/edk2-
> > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > _Smbios_Fixes
> > >
> > > With these changes I can boot to the UEFI Shell and to
> > Linux.  Please
> > > verify from your environments.
> > >
> > The fix for SmbiosMiscDxe works for me. Thanks for that!
> > 
> > I pushed another commit to my branch to check WORKSPACE
> > to notify the
> > user:
> > 
> > https://github.com/lcp/edk2-
> > platforms/commit/fc530689e913e3de25ca2c553d616b9cef28901c
> > 
> > We probably have to update Readme.md later. It's already
> > dated.
> > 
> > > I see you have added the SDMMC modules, but I do not
> > see that peripheral yet.
> > > That feature looks like it needs some more debug.  We
> > may need to back
> > > out those changes for now.
> > >
> > I saw the SD card settings in the South Cluster
> > Configuration menu even without those SDMMC modules, so
> > they are probably from the edk2-non-osi drivers. However,
> > the SD card didn't work until I added the drivers from
> > MdeModulePkg, so I need those drivers at least for my
> > Minnowboard Turbot.
> > 
> > Thanks,
> > 
> > Gary Lin
> > 
> > > I agree there are ASL issues.  The ASL code needs to be
> > updated to the
> > > latest ASL compiler.
> > >
> > > Thanks,
> > >
> > > Mike
> > >
> > > > -----Original Message-----
> > > > From: Kinney, Michael D
> > > > Sent: Tuesday, July 2, 2019 9:50 AM
> > > > To: Gary Lin <GLin@suse.com>; devel@edk2.groups.io;
> > Kinney, Michael
> > > > D <michael.d.kinney@intel.com>
> > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > <zailiang.sun@intel.com>
> > > > Subject: RE: [edk2-devel] [edk2-platforms Patch
> > 00/14]
> > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > dependencies
> > > >
> > > > Hi Gary,
> > > >
> > > > Thanks for the branch.  I have the build working and
> > have reproduced
> > > > the SMBIOS issue and am debugging that now.
> > > >
> > > > Mike
> > > >
> > > > > -----Original Message-----
> > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > Sent: Tuesday, July 2, 2019 2:48 AM
> > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > <michael.d.kinney@intel.com>
> > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > > <zailiang.sun@intel.com>
> > > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > 00/14]
> > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > dependencies
> > > > >
> > > > > On Mon, Jul 01, 2019 at 11:07:11PM +0000,  Michael
> > D
> > > > Kinney  wrote:
> > > > > > Hi Gary,
> > > > > >
> > > > > > I recommend you rebase on top of this series.
> > > > > >
> > > > > > I have verified Linux boots and I have been
> > working
> > > > on
> > > > > the GCC and
> > > > > > Linux build scripts as well.
> > > > > >
> > > > > > Please let me know if you see any issues with
> > this
> > > > > series applied and
> > > > > > I can help get them fixed.
> > > > > >
> > > > > Hi Mike,
> > > > >
> > > > > I'm rebasing my patches and they are available in
> > my
> > > > > branch:
> > > > >
> > > > > https://github.com/lcp/edk2-platforms/commits/vlv2-
> > > > > fixes-wip
> > > > >
> > > > > It's based on
> > > > > edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
> > > > > and edk2-non-
> > > > > osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).
> > > > >
> > > > > There are 3 problems I currently encountered, and
> > maybe
> > > > you can give
> > > > > me some suggestions.
> > > > >
> > > > > 1. Missing DSDT
> > > > >
> > > > > When compiling DSDT, iasl failed with this error:
> > > > >
> > > > > DSDT.iiii   6077:
> > > > > Or(ShiftLeft(Derefof(Index(CDCT,
> > > > > \_SB.PCI0.GFX0.MCHK.DCFE)), 21),PARM, PARM)
> > > > > Error    6163 -
> > > > > ^ Object is created temporarily in another method
> > and
> > > > cannot be
> > > > > accessed (\_SB.PCI0.GFX0. MCHK.DCFE)
> > > > >
> > > > > The code is from
> > > > >
> > > >
> > Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGB
> > > > > DA.ASL
> > > > >
> > > > > I have to comment out the line or iasl won't
> > generate
> > > > the aml file and
> > > > > the OS would fail to get DSDT.
> > > > >
> > > > > My acpica version is 20190509, and I vaguely
> > remember
> > > > that the older
> > > > > acpica seems to be more tolerant to this error.
> > > > >
> > > > > 2. Crash at SMBIOS driver
> > > > >
> > > > > When booting the system, I got the following error:
> > > > >
> > > > > Loading driver at 0x00078DBA000
> > > > EntryPoint=0x00078DBEC3C
> > > > > MiscSubclass.efi
> > > > > InstallProtocolInterface: BC62157E-3E33-4FEC-9920-
> > > > 2D3B36D750DF
> > > > > 78FE8D18 ProtectUefiImageCommon -
> > > > > 0x78FE8040
> > > > >   - 0x0000000078DBA000 - 0x0000000000007B80
> > > > > PlatformInfoHob->BoardId [0xB0]
> > > > > GetBiosVersionDateTime :MNW2MAX1.X64.0084.D01
> > > > 01/01/2019
> > > > > 00:00
> > > > > SmbiosAdd: Smbios type 0 with size 0x48 is added to
> > 32-
> > > > bit table
> > > > > SmbiosAdd: Smbios type 0 with size 0x48 is added to
> > 64-
> > > > bit table
> > > > > SmbiosCreateTable: Initialize 32-bit entry point
> > > > structure
> > > > > SmbiosCreateTable() re-allocate SMBIOS 32-bit table
> > > > > SmbiosCreateTable: Initialize 64-bit entry point
> > > > structure
> > > > > SmbiosCreate64BitTable() re-allocate SMBIOS 64-bit
> > > > table Create Smbios
> > > > > Manu callback.
> > > > > !!!! X64 Exception Type - 06(#UD - Invalid Opcode)
> > CPU
> > > > Apic ID -
> > > > > 00000000 !!!!
> > > > > RIP  - 0000000078DBEC26, CS  - 0000000000000038,
> > RFLAGS
> > > > > - 0000000000010206 RAX  - 0000000000000000, RCX -
> > > > 000000007984A5A0,
> > > > > RDX - 000000007A46E5FF RBX  - 000000007A46E920, RSP
> > -
> > > > > 000000007A46E8B0, RBP -
> > > > > 0000000078DC0EC0 RSI  - 0000000000000012, RDI -
> > > > > 0000000000000003
> > > > > R8   - 800000000000000E, R9  - 000000007A46E920,
> > R10 -
> > > > > 0000000078FE8398
> > > > > R11  - 0000000000000001, R12 - 0000000078FE8798,
> > R13 -
> > > > > 0000000078FE8898
> > > > > R14  - 0000000078FE8818, R15 - 000000007A46EC60
> > > > > DS   - 0000000000000030, ES  - 0000000000000030, FS
> > -
> > > > > 0000000000000030
> > > > > GS   - 0000000000000030, SS  - 0000000000000030
> > > > > CR0  - 0000000080010013, CR2 - 0000000000000000,
> > CR3 -
> > > > > 000000007A201000
> > > > > CR4  - 0000000000000628, CR8 - 0000000000000000
> > > > > DR0  - 0000000000000000, DR1 - 0000000000000000,
> > DR2 -
> > > > > 0000000000000000
> > > > > DR3  - 0000000000000000, DR6 - 00000000FFFF0FF8,
> > DR7 -
> > > > > 0000000000000400 GDTR - 0000000079FFDA98
> > > > 0000000000000047, LDTR -
> > > > > 0000000000000000
> > > > > IDTR - 0000000079862018 0000000000000FFF,   TR -
> > > > > 0000000000000000
> > > > > FXSAVE_STATE - 000000007A46E510
> > > > > !!!! Find image based on IP(0x78DBEC26)
> > > > > /home/gary/git/edk2-
> > > > >
> > > >
> > workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2Tbl
> > > > >
> > > >
> > tDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclas
> > > > > s.
> > > > > dll (ImageBase=0000000078DBA000,
> > > > > EntryPoint=0000000078DBEC3C) !!!!
> > > > >
> > > > > I disaseembled MiscSubclass.debug and found that
> > the
> > > > address is a
> > > > > "ud2"
> > > > > instruction at
> > > > >
> > > >
> > SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBa
> > > > > seBoardManufacturer()
> > > > >
> > > > > After adding a few more debug messages, the system
> > > > crashed at another
> > > > > function:
> > > > >
> > > >
> > SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbios
> > > > > ManuCallback()
> > > > >
> > > > > If I added debug messages to both functions, the
> > system
> > > > booted
> > > > > successfully. I currently didn't have any clue on
> > this.
> > > > >
> > > > > 3. The firmware always booted into EFI shell.
> > > > >
> > > > > I guess something went wrong with BDS. I haven't
> > looked
> > > > into this
> > > > > issue yet.
> > > > >
> > > > > Thanks,
> > > > >
> > > > > Gary Lin
> > > > >
> > > > > > Thanks,
> > > > > >
> > > > > > Mike
> > > > > >
> > > > > > > -----Original Message-----
> > > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > > Sent: Sunday, June 30, 2019 9:04 PM
> > > > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > > > <michael.d.kinney@intel.com>
> > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > > > > <zailiang.sun@intel.com>
> > > > > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > > > > 00/14]
> > > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > > dependencies
> > > > > > >
> > > > > > > On Sun, Jun 30, 2019 at 07:55:39PM -0700,
> > Michael
> > > > D
> > > > > Kinney  wrote:
> > > > > > > > The following changes remove all dependencies
> > on
> > > > > the
> > > > > > > IntelFrameworkPkg
> > > > > > > > and IntelFrameworkModulePkg from the
> > > > > Vlv2TbltDevicePkg
> > > > > > > platform
> > > > > > > > builds.  These changes do depend on updates
> > > > > binaries
> > > > > > > on the edk2-non-osi repository.
> > > > > > > >
> > > > > > > Hi Michael,
> > > > > > >
> > > > > > > I am amending the bash scripts for gcc. The
> > > > firmware
> > > > > I built is
> > > > > > > using the binaries from Development190216 and
> > could
> > > > > boot into Linux
> > > > > > > successfully with some workarounds for Wpce791,
> > > > Bds,
> > > > > and
> > > > > > > InteFspWrapper. The patches you posted
> > eliminate
> > > > > those parts I have
> > > > > > > to work around.
> > > > > > >
> > > > > > > Just want to know if you need any assistance
> > for
> > > > the
> > > > > gcc build? I
> > > > > > > could rebase my work upon your patches and send
> > > > them
> > > > > later.
> > > > > > >
> > > > > > > Thanks,
> > > > > > >
> > > > > > > Gary Lin
> > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > >
> > 
> > 
> 
> 
> 
> 
> 

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-09  6:04               ` Gary Lin
@ 2019-07-10  3:38                 ` Michael D Kinney
  2019-07-10  4:14                   ` Gary Lin
  0 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-10  3:38 UTC (permalink / raw)
  To: devel@edk2.groups.io, glin@suse.com, Kinney, Michael D
  Cc: Qian, Yi, Sun, Zailiang

Hi Gary,

I have pushed 2 more patches to my branch.  One fixes the
ASL issue without removing the code.  The second is a clean
up to all the DSC files and build scripts to make everything
more consistent and remove more unused content.

https://github.com/mdkinney/edk2-platforms/tree/Bug_xxx_Vlv2_Linux_And_Smbios_Fixes_V2

Please test this to make sure it still works.

I will work on the Readme and will review the series to prepare
for sending the patch email review tomorrow.

Thanks for all your help and testing.

Mike

> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io]
> On Behalf Of Gary Lin
> Sent: Monday, July 8, 2019 11:04 PM
> To: devel@edk2.groups.io; Kinney, Michael D
> <michael.d.kinney@intel.com>
> Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> <zailiang.sun@intel.com>
> Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> 
> On Tue, Jul 09, 2019 at 03:52:37AM +0000,  Michael D
> Kinney  wrote:
> > Hi Gary,
> >
> Hi Mike,
> 
> > I picked up the changes on your branch.  I re-enabled
> the BIOS ID
> > Feature and added support for IA32 GCC builds, so the
> builds available
> > from Windows and Linux are matched now.
> >
> > I have posted my updated branch here:
> >
> > https://github.com/mdkinney/edk2-
> platforms/tree/Bug_xxx_Vlv2_Linux_And
> > _Smbios_Fixes_V2
> >
> > I also verified that the SD Card support does work, so
> I am keeping
> > that change.
> >
> I tested the branch + my ASL workaround and booted into
> Linux successfully.
> 
> > I agree the Readme is out of date.  I will work on that
> and add to the
> > branch referenced above tomorrow.
> >
> Thanks!
> 
> Gary Lin
> 
> > Thanks,
> >
> > Mike
> >
> > > -----Original Message-----
> > > From: devel@edk2.groups.io
> [mailto:devel@edk2.groups.io] On Behalf
> > > Of Gary Lin
> > > Sent: Tuesday, July 2, 2019 8:57 PM
> > > To: Kinney, Michael D <michael.d.kinney@intel.com>
> > > Cc: devel@edk2.groups.io; Qian, Yi
> <yi.qian@intel.com>; Sun,
> > > Zailiang <zailiang.sun@intel.com>
> > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> 00/14]
> > > Vlv2TbltDevicePkg: Remove Intel Framework
> dependencies
> > >
> > > On Tue, Jul 02, 2019 at 09:11:06PM +0000,  Kinney,
> Michael D  wrote:
> > > > Hi Gary,
> > > >
> > > Hi Mike,
> > >
> > > > I have posted an update to your patches the removes
> the
> > > setting of
> > > > WORKSPACE and accesses all files relative to
> WORKSPACE
> > > in the Linux shell scripts.
> > > > It also fixes null pointer bugs in the
> SmbiosMiscDxe
> > > module.
> > > >
> > > > https://github.com/mdkinney/edk2-
> > > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > > _Smbios_Fixes
> > > >
> > > > With these changes I can boot to the UEFI Shell and
> to
> > > Linux.  Please
> > > > verify from your environments.
> > > >
> > > The fix for SmbiosMiscDxe works for me. Thanks for
> that!
> > >
> > > I pushed another commit to my branch to check
> WORKSPACE to notify
> > > the
> > > user:
> > >
> > > https://github.com/lcp/edk2-
> > >
> platforms/commit/fc530689e913e3de25ca2c553d616b9cef28901c
> > >
> > > We probably have to update Readme.md later. It's
> already dated.
> > >
> > > > I see you have added the SDMMC modules, but I do
> not
> > > see that peripheral yet.
> > > > That feature looks like it needs some more debug.
> We
> > > may need to back
> > > > out those changes for now.
> > > >
> > > I saw the SD card settings in the South Cluster
> Configuration menu
> > > even without those SDMMC modules, so they are
> probably from the
> > > edk2-non-osi drivers. However, the SD card didn't
> work until I added
> > > the drivers from MdeModulePkg, so I need those
> drivers at least for
> > > my Minnowboard Turbot.
> > >
> > > Thanks,
> > >
> > > Gary Lin
> > >
> > > > I agree there are ASL issues.  The ASL code needs
> to be
> > > updated to the
> > > > latest ASL compiler.
> > > >
> > > > Thanks,
> > > >
> > > > Mike
> > > >
> > > > > -----Original Message-----
> > > > > From: Kinney, Michael D
> > > > > Sent: Tuesday, July 2, 2019 9:50 AM
> > > > > To: Gary Lin <GLin@suse.com>;
> devel@edk2.groups.io;
> > > Kinney, Michael
> > > > > D <michael.d.kinney@intel.com>
> > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > > <zailiang.sun@intel.com>
> > > > > Subject: RE: [edk2-devel] [edk2-platforms Patch
> > > 00/14]
> > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > dependencies
> > > > >
> > > > > Hi Gary,
> > > > >
> > > > > Thanks for the branch.  I have the build working
> and
> > > have reproduced
> > > > > the SMBIOS issue and am debugging that now.
> > > > >
> > > > > Mike
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > Sent: Tuesday, July 2, 2019 2:48 AM
> > > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > > <michael.d.kinney@intel.com>
> > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > > > <zailiang.sun@intel.com>
> > > > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > > 00/14]
> > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > dependencies
> > > > > >
> > > > > > On Mon, Jul 01, 2019 at 11:07:11PM +0000,
> Michael
> > > D
> > > > > Kinney  wrote:
> > > > > > > Hi Gary,
> > > > > > >
> > > > > > > I recommend you rebase on top of this series.
> > > > > > >
> > > > > > > I have verified Linux boots and I have been
> > > working
> > > > > on
> > > > > > the GCC and
> > > > > > > Linux build scripts as well.
> > > > > > >
> > > > > > > Please let me know if you see any issues with
> > > this
> > > > > > series applied and
> > > > > > > I can help get them fixed.
> > > > > > >
> > > > > > Hi Mike,
> > > > > >
> > > > > > I'm rebasing my patches and they are available
> in
> > > my
> > > > > > branch:
> > > > > >
> > > > > > https://github.com/lcp/edk2-
> platforms/commits/vlv2-
> > > > > > fixes-wip
> > > > > >
> > > > > > It's based on
> > > > > > edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
> > > > > > and edk2-non-
> > > > > > osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).
> > > > > >
> > > > > > There are 3 problems I currently encountered,
> and
> > > maybe
> > > > > you can give
> > > > > > me some suggestions.
> > > > > >
> > > > > > 1. Missing DSDT
> > > > > >
> > > > > > When compiling DSDT, iasl failed with this
> error:
> > > > > >
> > > > > > DSDT.iiii   6077:
> > > > > > Or(ShiftLeft(Derefof(Index(CDCT,
> \_SB.PCI0.GFX0.MCHK.DCFE)),
> > > > > > 21),PARM, PARM)
> > > > > > Error    6163 -
> > > > > > ^ Object is created temporarily in another
> method
> > > and
> > > > > cannot be
> > > > > > accessed (\_SB.PCI0.GFX0. MCHK.DCFE)
> > > > > >
> > > > > > The code is from
> > > > > >
> > > > >
> > >
> Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGB
> > > > > > DA.ASL
> > > > > >
> > > > > > I have to comment out the line or iasl won't
> > > generate
> > > > > the aml file and
> > > > > > the OS would fail to get DSDT.
> > > > > >
> > > > > > My acpica version is 20190509, and I vaguely
> > > remember
> > > > > that the older
> > > > > > acpica seems to be more tolerant to this error.
> > > > > >
> > > > > > 2. Crash at SMBIOS driver
> > > > > >
> > > > > > When booting the system, I got the following
> error:
> > > > > >
> > > > > > Loading driver at 0x00078DBA000
> > > > > EntryPoint=0x00078DBEC3C
> > > > > > MiscSubclass.efi
> > > > > > InstallProtocolInterface: BC62157E-3E33-4FEC-
> 9920-
> > > > > 2D3B36D750DF
> > > > > > 78FE8D18 ProtectUefiImageCommon -
> > > > > > 0x78FE8040
> > > > > >   - 0x0000000078DBA000 - 0x0000000000007B80
> > > > > > PlatformInfoHob->BoardId [0xB0]
> > > > > > GetBiosVersionDateTime :MNW2MAX1.X64.0084.D01
> > > > > 01/01/2019
> > > > > > 00:00
> > > > > > SmbiosAdd: Smbios type 0 with size 0x48 is
> added to
> > > 32-
> > > > > bit table
> > > > > > SmbiosAdd: Smbios type 0 with size 0x48 is
> added to
> > > 64-
> > > > > bit table
> > > > > > SmbiosCreateTable: Initialize 32-bit entry
> point
> > > > > structure
> > > > > > SmbiosCreateTable() re-allocate SMBIOS 32-bit
> table
> > > > > > SmbiosCreateTable: Initialize 64-bit entry
> point
> > > > > structure
> > > > > > SmbiosCreate64BitTable() re-allocate SMBIOS 64-
> bit
> > > > > table Create Smbios
> > > > > > Manu callback.
> > > > > > !!!! X64 Exception Type - 06(#UD - Invalid
> Opcode)
> > > CPU
> > > > > Apic ID -
> > > > > > 00000000 !!!!
> > > > > > RIP  - 0000000078DBEC26, CS  -
> 0000000000000038,
> > > RFLAGS
> > > > > > - 0000000000010206 RAX  - 0000000000000000, RCX
> -
> > > > > 000000007984A5A0,
> > > > > > RDX - 000000007A46E5FF RBX  - 000000007A46E920,
> RSP
> > > -
> > > > > > 000000007A46E8B0, RBP -
> > > > > > 0000000078DC0EC0 RSI  - 0000000000000012, RDI -
> > > > > > 0000000000000003
> > > > > > R8   - 800000000000000E, R9  -
> 000000007A46E920,
> > > R10 -
> > > > > > 0000000078FE8398
> > > > > > R11  - 0000000000000001, R12 -
> 0000000078FE8798,
> > > R13 -
> > > > > > 0000000078FE8898
> > > > > > R14  - 0000000078FE8818, R15 - 000000007A46EC60
> > > > > > DS   - 0000000000000030, ES  -
> 0000000000000030, FS
> > > -
> > > > > > 0000000000000030
> > > > > > GS   - 0000000000000030, SS  - 0000000000000030
> > > > > > CR0  - 0000000080010013, CR2 -
> 0000000000000000,
> > > CR3 -
> > > > > > 000000007A201000
> > > > > > CR4  - 0000000000000628, CR8 - 0000000000000000
> > > > > > DR0  - 0000000000000000, DR1 -
> 0000000000000000,
> > > DR2 -
> > > > > > 0000000000000000
> > > > > > DR3  - 0000000000000000, DR6 -
> 00000000FFFF0FF8,
> > > DR7 -
> > > > > > 0000000000000400 GDTR - 0000000079FFDA98
> > > > > 0000000000000047, LDTR -
> > > > > > 0000000000000000
> > > > > > IDTR - 0000000079862018 0000000000000FFF,   TR
> -
> > > > > > 0000000000000000
> > > > > > FXSAVE_STATE - 000000007A46E510 !!!! Find image
> based on
> > > > > > IP(0x78DBEC26)
> > > > > > /home/gary/git/edk2-
> > > > > >
> > > > >
> > >
> workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2Tbl
> > > > > >
> > > > >
> > >
> tDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclas
> > > > > > s.
> > > > > > dll (ImageBase=0000000078DBA000,
> > > > > > EntryPoint=0000000078DBEC3C) !!!!
> > > > > >
> > > > > > I disaseembled MiscSubclass.debug and found
> that
> > > the
> > > > > address is a
> > > > > > "ud2"
> > > > > > instruction at
> > > > > >
> > > > >
> > >
> SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBa
> > > > > > seBoardManufacturer()
> > > > > >
> > > > > > After adding a few more debug messages, the
> system
> > > > > crashed at another
> > > > > > function:
> > > > > >
> > > > >
> > >
> SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbios
> > > > > > ManuCallback()
> > > > > >
> > > > > > If I added debug messages to both functions,
> the
> > > system
> > > > > booted
> > > > > > successfully. I currently didn't have any clue
> on
> > > this.
> > > > > >
> > > > > > 3. The firmware always booted into EFI shell.
> > > > > >
> > > > > > I guess something went wrong with BDS. I
> haven't
> > > looked
> > > > > into this
> > > > > > issue yet.
> > > > > >
> > > > > > Thanks,
> > > > > >
> > > > > > Gary Lin
> > > > > >
> > > > > > > Thanks,
> > > > > > >
> > > > > > > Mike
> > > > > > >
> > > > > > > > -----Original Message-----
> > > > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > > > Sent: Sunday, June 30, 2019 9:04 PM
> > > > > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > > > > <michael.d.kinney@intel.com>
> > > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun,
> Zailiang
> > > > > > > > <zailiang.sun@intel.com>
> > > > > > > > Subject: Re: [edk2-devel] [edk2-platforms
> Patch
> > > > > > 00/14]
> > > > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > > > dependencies
> > > > > > > >
> > > > > > > > On Sun, Jun 30, 2019 at 07:55:39PM -0700,
> > > Michael
> > > > > D
> > > > > > Kinney  wrote:
> > > > > > > > > The following changes remove all
> dependencies
> > > on
> > > > > > the
> > > > > > > > IntelFrameworkPkg
> > > > > > > > > and IntelFrameworkModulePkg from the
> > > > > > Vlv2TbltDevicePkg
> > > > > > > > platform
> > > > > > > > > builds.  These changes do depend on
> updates
> > > > > > binaries
> > > > > > > > on the edk2-non-osi repository.
> > > > > > > > >
> > > > > > > > Hi Michael,
> > > > > > > >
> > > > > > > > I am amending the bash scripts for gcc. The
> > > > > firmware
> > > > > > I built is
> > > > > > > > using the binaries from Development190216
> and
> > > could
> > > > > > boot into Linux
> > > > > > > > successfully with some workarounds for
> Wpce791,
> > > > > Bds,
> > > > > > and
> > > > > > > > InteFspWrapper. The patches you posted
> > > eliminate
> > > > > > those parts I have
> > > > > > > > to work around.
> > > > > > > >
> > > > > > > > Just want to know if you need any
> assistance
> > > for
> > > > > the
> > > > > > gcc build? I
> > > > > > > > could rebase my work upon your patches and
> send
> > > > > them
> > > > > > later.
> > > > > > > >
> > > > > > > > Thanks,
> > > > > > > >
> > > > > > > > Gary Lin
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > >
> > >
> > >
> >
> >
> >
> >
> >
> 
> 


^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-10  3:38                 ` Michael D Kinney
@ 2019-07-10  4:14                   ` Gary Lin
  2019-07-10  5:01                     ` Michael D Kinney
  0 siblings, 1 reply; 42+ messages in thread
From: Gary Lin @ 2019-07-10  4:14 UTC (permalink / raw)
  To: devel@edk2.groups.io, michael.d.kinney@intel.com; +Cc: Yi Qian, Zailiang Sun

On Wed, Jul 10, 2019 at 03:38:01AM +0000,  Michael D Kinney  wrote:
> Hi Gary,
> 
> I have pushed 2 more patches to my branch.  One fixes the
> ASL issue without removing the code.  The second is a clean
> up to all the DSC files and build scripts to make everything
> more consistent and remove more unused content.
> 
> https://github.com/mdkinney/edk2-platforms/tree/Bug_xxx_Vlv2_Linux_And_Smbios_Fixes_V2
> 
> Please test this to make sure it still works.
> 
It works great! I don't need to comment out the problematic line
anymore.

> I will work on the Readme and will review the series to prepare
> for sending the patch email review tomorrow.
> 
> Thanks for all your help and testing.
Thanks for fixing the gcc build :)

Gary Lin

> 
> Mike
> 
> > -----Original Message-----
> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io]
> > On Behalf Of Gary Lin
> > Sent: Monday, July 8, 2019 11:04 PM
> > To: devel@edk2.groups.io; Kinney, Michael D
> > <michael.d.kinney@intel.com>
> > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > <zailiang.sun@intel.com>
> > Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> > Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> > 
> > On Tue, Jul 09, 2019 at 03:52:37AM +0000,  Michael D
> > Kinney  wrote:
> > > Hi Gary,
> > >
> > Hi Mike,
> > 
> > > I picked up the changes on your branch.  I re-enabled
> > the BIOS ID
> > > Feature and added support for IA32 GCC builds, so the
> > builds available
> > > from Windows and Linux are matched now.
> > >
> > > I have posted my updated branch here:
> > >
> > > https://github.com/mdkinney/edk2-
> > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > _Smbios_Fixes_V2
> > >
> > > I also verified that the SD Card support does work, so
> > I am keeping
> > > that change.
> > >
> > I tested the branch + my ASL workaround and booted into
> > Linux successfully.
> > 
> > > I agree the Readme is out of date.  I will work on that
> > and add to the
> > > branch referenced above tomorrow.
> > >
> > Thanks!
> > 
> > Gary Lin
> > 
> > > Thanks,
> > >
> > > Mike
> > >
> > > > -----Original Message-----
> > > > From: devel@edk2.groups.io
> > [mailto:devel@edk2.groups.io] On Behalf
> > > > Of Gary Lin
> > > > Sent: Tuesday, July 2, 2019 8:57 PM
> > > > To: Kinney, Michael D <michael.d.kinney@intel.com>
> > > > Cc: devel@edk2.groups.io; Qian, Yi
> > <yi.qian@intel.com>; Sun,
> > > > Zailiang <zailiang.sun@intel.com>
> > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > 00/14]
> > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > dependencies
> > > >
> > > > On Tue, Jul 02, 2019 at 09:11:06PM +0000,  Kinney,
> > Michael D  wrote:
> > > > > Hi Gary,
> > > > >
> > > > Hi Mike,
> > > >
> > > > > I have posted an update to your patches the removes
> > the
> > > > setting of
> > > > > WORKSPACE and accesses all files relative to
> > WORKSPACE
> > > > in the Linux shell scripts.
> > > > > It also fixes null pointer bugs in the
> > SmbiosMiscDxe
> > > > module.
> > > > >
> > > > > https://github.com/mdkinney/edk2-
> > > > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > > > _Smbios_Fixes
> > > > >
> > > > > With these changes I can boot to the UEFI Shell and
> > to
> > > > Linux.  Please
> > > > > verify from your environments.
> > > > >
> > > > The fix for SmbiosMiscDxe works for me. Thanks for
> > that!
> > > >
> > > > I pushed another commit to my branch to check
> > WORKSPACE to notify
> > > > the
> > > > user:
> > > >
> > > > https://github.com/lcp/edk2-
> > > >
> > platforms/commit/fc530689e913e3de25ca2c553d616b9cef28901c
> > > >
> > > > We probably have to update Readme.md later. It's
> > already dated.
> > > >
> > > > > I see you have added the SDMMC modules, but I do
> > not
> > > > see that peripheral yet.
> > > > > That feature looks like it needs some more debug.
> > We
> > > > may need to back
> > > > > out those changes for now.
> > > > >
> > > > I saw the SD card settings in the South Cluster
> > Configuration menu
> > > > even without those SDMMC modules, so they are
> > probably from the
> > > > edk2-non-osi drivers. However, the SD card didn't
> > work until I added
> > > > the drivers from MdeModulePkg, so I need those
> > drivers at least for
> > > > my Minnowboard Turbot.
> > > >
> > > > Thanks,
> > > >
> > > > Gary Lin
> > > >
> > > > > I agree there are ASL issues.  The ASL code needs
> > to be
> > > > updated to the
> > > > > latest ASL compiler.
> > > > >
> > > > > Thanks,
> > > > >
> > > > > Mike
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Kinney, Michael D
> > > > > > Sent: Tuesday, July 2, 2019 9:50 AM
> > > > > > To: Gary Lin <GLin@suse.com>;
> > devel@edk2.groups.io;
> > > > Kinney, Michael
> > > > > > D <michael.d.kinney@intel.com>
> > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > > > <zailiang.sun@intel.com>
> > > > > > Subject: RE: [edk2-devel] [edk2-platforms Patch
> > > > 00/14]
> > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > dependencies
> > > > > >
> > > > > > Hi Gary,
> > > > > >
> > > > > > Thanks for the branch.  I have the build working
> > and
> > > > have reproduced
> > > > > > the SMBIOS issue and am debugging that now.
> > > > > >
> > > > > > Mike
> > > > > >
> > > > > > > -----Original Message-----
> > > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > > Sent: Tuesday, July 2, 2019 2:48 AM
> > > > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > > > <michael.d.kinney@intel.com>
> > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > > > > <zailiang.sun@intel.com>
> > > > > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > > > 00/14]
> > > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > dependencies
> > > > > > >
> > > > > > > On Mon, Jul 01, 2019 at 11:07:11PM +0000,
> > Michael
> > > > D
> > > > > > Kinney  wrote:
> > > > > > > > Hi Gary,
> > > > > > > >
> > > > > > > > I recommend you rebase on top of this series.
> > > > > > > >
> > > > > > > > I have verified Linux boots and I have been
> > > > working
> > > > > > on
> > > > > > > the GCC and
> > > > > > > > Linux build scripts as well.
> > > > > > > >
> > > > > > > > Please let me know if you see any issues with
> > > > this
> > > > > > > series applied and
> > > > > > > > I can help get them fixed.
> > > > > > > >
> > > > > > > Hi Mike,
> > > > > > >
> > > > > > > I'm rebasing my patches and they are available
> > in
> > > > my
> > > > > > > branch:
> > > > > > >
> > > > > > > https://github.com/lcp/edk2-
> > platforms/commits/vlv2-
> > > > > > > fixes-wip
> > > > > > >
> > > > > > > It's based on
> > > > > > > edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
> > > > > > > and edk2-non-
> > > > > > > osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).
> > > > > > >
> > > > > > > There are 3 problems I currently encountered,
> > and
> > > > maybe
> > > > > > you can give
> > > > > > > me some suggestions.
> > > > > > >
> > > > > > > 1. Missing DSDT
> > > > > > >
> > > > > > > When compiling DSDT, iasl failed with this
> > error:
> > > > > > >
> > > > > > > DSDT.iiii   6077:
> > > > > > > Or(ShiftLeft(Derefof(Index(CDCT,
> > \_SB.PCI0.GFX0.MCHK.DCFE)),
> > > > > > > 21),PARM, PARM)
> > > > > > > Error    6163 -
> > > > > > > ^ Object is created temporarily in another
> > method
> > > > and
> > > > > > cannot be
> > > > > > > accessed (\_SB.PCI0.GFX0. MCHK.DCFE)
> > > > > > >
> > > > > > > The code is from
> > > > > > >
> > > > > >
> > > >
> > Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGB
> > > > > > > DA.ASL
> > > > > > >
> > > > > > > I have to comment out the line or iasl won't
> > > > generate
> > > > > > the aml file and
> > > > > > > the OS would fail to get DSDT.
> > > > > > >
> > > > > > > My acpica version is 20190509, and I vaguely
> > > > remember
> > > > > > that the older
> > > > > > > acpica seems to be more tolerant to this error.
> > > > > > >
> > > > > > > 2. Crash at SMBIOS driver
> > > > > > >
> > > > > > > When booting the system, I got the following
> > error:
> > > > > > >
> > > > > > > Loading driver at 0x00078DBA000
> > > > > > EntryPoint=0x00078DBEC3C
> > > > > > > MiscSubclass.efi
> > > > > > > InstallProtocolInterface: BC62157E-3E33-4FEC-
> > 9920-
> > > > > > 2D3B36D750DF
> > > > > > > 78FE8D18 ProtectUefiImageCommon -
> > > > > > > 0x78FE8040
> > > > > > >   - 0x0000000078DBA000 - 0x0000000000007B80
> > > > > > > PlatformInfoHob->BoardId [0xB0]
> > > > > > > GetBiosVersionDateTime :MNW2MAX1.X64.0084.D01
> > > > > > 01/01/2019
> > > > > > > 00:00
> > > > > > > SmbiosAdd: Smbios type 0 with size 0x48 is
> > added to
> > > > 32-
> > > > > > bit table
> > > > > > > SmbiosAdd: Smbios type 0 with size 0x48 is
> > added to
> > > > 64-
> > > > > > bit table
> > > > > > > SmbiosCreateTable: Initialize 32-bit entry
> > point
> > > > > > structure
> > > > > > > SmbiosCreateTable() re-allocate SMBIOS 32-bit
> > table
> > > > > > > SmbiosCreateTable: Initialize 64-bit entry
> > point
> > > > > > structure
> > > > > > > SmbiosCreate64BitTable() re-allocate SMBIOS 64-
> > bit
> > > > > > table Create Smbios
> > > > > > > Manu callback.
> > > > > > > !!!! X64 Exception Type - 06(#UD - Invalid
> > Opcode)
> > > > CPU
> > > > > > Apic ID -
> > > > > > > 00000000 !!!!
> > > > > > > RIP  - 0000000078DBEC26, CS  -
> > 0000000000000038,
> > > > RFLAGS
> > > > > > > - 0000000000010206 RAX  - 0000000000000000, RCX
> > -
> > > > > > 000000007984A5A0,
> > > > > > > RDX - 000000007A46E5FF RBX  - 000000007A46E920,
> > RSP
> > > > -
> > > > > > > 000000007A46E8B0, RBP -
> > > > > > > 0000000078DC0EC0 RSI  - 0000000000000012, RDI -
> > > > > > > 0000000000000003
> > > > > > > R8   - 800000000000000E, R9  -
> > 000000007A46E920,
> > > > R10 -
> > > > > > > 0000000078FE8398
> > > > > > > R11  - 0000000000000001, R12 -
> > 0000000078FE8798,
> > > > R13 -
> > > > > > > 0000000078FE8898
> > > > > > > R14  - 0000000078FE8818, R15 - 000000007A46EC60
> > > > > > > DS   - 0000000000000030, ES  -
> > 0000000000000030, FS
> > > > -
> > > > > > > 0000000000000030
> > > > > > > GS   - 0000000000000030, SS  - 0000000000000030
> > > > > > > CR0  - 0000000080010013, CR2 -
> > 0000000000000000,
> > > > CR3 -
> > > > > > > 000000007A201000
> > > > > > > CR4  - 0000000000000628, CR8 - 0000000000000000
> > > > > > > DR0  - 0000000000000000, DR1 -
> > 0000000000000000,
> > > > DR2 -
> > > > > > > 0000000000000000
> > > > > > > DR3  - 0000000000000000, DR6 -
> > 00000000FFFF0FF8,
> > > > DR7 -
> > > > > > > 0000000000000400 GDTR - 0000000079FFDA98
> > > > > > 0000000000000047, LDTR -
> > > > > > > 0000000000000000
> > > > > > > IDTR - 0000000079862018 0000000000000FFF,   TR
> > -
> > > > > > > 0000000000000000
> > > > > > > FXSAVE_STATE - 000000007A46E510 !!!! Find image
> > based on
> > > > > > > IP(0x78DBEC26)
> > > > > > > /home/gary/git/edk2-
> > > > > > >
> > > > > >
> > > >
> > workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2Tbl
> > > > > > >
> > > > > >
> > > >
> > tDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclas
> > > > > > > s.
> > > > > > > dll (ImageBase=0000000078DBA000,
> > > > > > > EntryPoint=0000000078DBEC3C) !!!!
> > > > > > >
> > > > > > > I disaseembled MiscSubclass.debug and found
> > that
> > > > the
> > > > > > address is a
> > > > > > > "ud2"
> > > > > > > instruction at
> > > > > > >
> > > > > >
> > > >
> > SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBa
> > > > > > > seBoardManufacturer()
> > > > > > >
> > > > > > > After adding a few more debug messages, the
> > system
> > > > > > crashed at another
> > > > > > > function:
> > > > > > >
> > > > > >
> > > >
> > SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbios
> > > > > > > ManuCallback()
> > > > > > >
> > > > > > > If I added debug messages to both functions,
> > the
> > > > system
> > > > > > booted
> > > > > > > successfully. I currently didn't have any clue
> > on
> > > > this.
> > > > > > >
> > > > > > > 3. The firmware always booted into EFI shell.
> > > > > > >
> > > > > > > I guess something went wrong with BDS. I
> > haven't
> > > > looked
> > > > > > into this
> > > > > > > issue yet.
> > > > > > >
> > > > > > > Thanks,
> > > > > > >
> > > > > > > Gary Lin
> > > > > > >
> > > > > > > > Thanks,
> > > > > > > >
> > > > > > > > Mike
> > > > > > > >
> > > > > > > > > -----Original Message-----
> > > > > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > > > > Sent: Sunday, June 30, 2019 9:04 PM
> > > > > > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > > > > > <michael.d.kinney@intel.com>
> > > > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun,
> > Zailiang
> > > > > > > > > <zailiang.sun@intel.com>
> > > > > > > > > Subject: Re: [edk2-devel] [edk2-platforms
> > Patch
> > > > > > > 00/14]
> > > > > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > > > > dependencies
> > > > > > > > >
> > > > > > > > > On Sun, Jun 30, 2019 at 07:55:39PM -0700,
> > > > Michael
> > > > > > D
> > > > > > > Kinney  wrote:
> > > > > > > > > > The following changes remove all
> > dependencies
> > > > on
> > > > > > > the
> > > > > > > > > IntelFrameworkPkg
> > > > > > > > > > and IntelFrameworkModulePkg from the
> > > > > > > Vlv2TbltDevicePkg
> > > > > > > > > platform
> > > > > > > > > > builds.  These changes do depend on
> > updates
> > > > > > > binaries
> > > > > > > > > on the edk2-non-osi repository.
> > > > > > > > > >
> > > > > > > > > Hi Michael,
> > > > > > > > >
> > > > > > > > > I am amending the bash scripts for gcc. The
> > > > > > firmware
> > > > > > > I built is
> > > > > > > > > using the binaries from Development190216
> > and
> > > > could
> > > > > > > boot into Linux
> > > > > > > > > successfully with some workarounds for
> > Wpce791,
> > > > > > Bds,
> > > > > > > and
> > > > > > > > > InteFspWrapper. The patches you posted
> > > > eliminate
> > > > > > > those parts I have
> > > > > > > > > to work around.
> > > > > > > > >
> > > > > > > > > Just want to know if you need any
> > assistance
> > > > for
> > > > > > the
> > > > > > > gcc build? I
> > > > > > > > > could rebase my work upon your patches and
> > send
> > > > > > them
> > > > > > > later.
> > > > > > > > >
> > > > > > > > > Thanks,
> > > > > > > > >
> > > > > > > > > Gary Lin
> > > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> > >
> > >
> > >
> > 
> > 
> 
> 
> 
> 
> 

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-10  4:14                   ` Gary Lin
@ 2019-07-10  5:01                     ` Michael D Kinney
  2019-07-10  7:10                       ` Gary Lin
  0 siblings, 1 reply; 42+ messages in thread
From: Michael D Kinney @ 2019-07-10  5:01 UTC (permalink / raw)
  To: devel@edk2.groups.io, glin@suse.com, Kinney, Michael D
  Cc: Qian, Yi, Sun, Zailiang

Hi Gary,

I have added 2 more patches.  One to disable capsule generation
for IA32 builds.  There are several places the output directory
is hard coded for X64.  Will require converting the POST_BUILD
scripts to python to make this much better.

The second patch is for the Readme.md.  Please review and
verify the instructions.

Thanks,

Mike

> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io]
> On Behalf Of Gary Lin
> Sent: Tuesday, July 9, 2019 9:14 PM
> To: devel@edk2.groups.io; Kinney, Michael D
> <michael.d.kinney@intel.com>
> Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> <zailiang.sun@intel.com>
> Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> 
> On Wed, Jul 10, 2019 at 03:38:01AM +0000,  Michael D
> Kinney  wrote:
> > Hi Gary,
> >
> > I have pushed 2 more patches to my branch.  One fixes
> the ASL issue
> > without removing the code.  The second is a clean up to
> all the DSC
> > files and build scripts to make everything more
> consistent and remove
> > more unused content.
> >
> > https://github.com/mdkinney/edk2-
> platforms/tree/Bug_xxx_Vlv2_Linux_And
> > _Smbios_Fixes_V2
> >
> > Please test this to make sure it still works.
> >
> It works great! I don't need to comment out the
> problematic line anymore.
> 
> > I will work on the Readme and will review the series to
> prepare for
> > sending the patch email review tomorrow.
> >
> > Thanks for all your help and testing.
> Thanks for fixing the gcc build :)
> 
> Gary Lin
> 
> >
> > Mike
> >
> > > -----Original Message-----
> > > From: devel@edk2.groups.io
> [mailto:devel@edk2.groups.io] On Behalf
> > > Of Gary Lin
> > > Sent: Monday, July 8, 2019 11:04 PM
> > > To: devel@edk2.groups.io; Kinney, Michael D
> > > <michael.d.kinney@intel.com>
> > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > <zailiang.sun@intel.com>
> > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> 00/14]
> > > Vlv2TbltDevicePkg: Remove Intel Framework
> dependencies
> > >
> > > On Tue, Jul 09, 2019 at 03:52:37AM +0000,  Michael D
> Kinney  wrote:
> > > > Hi Gary,
> > > >
> > > Hi Mike,
> > >
> > > > I picked up the changes on your branch.  I re-
> enabled
> > > the BIOS ID
> > > > Feature and added support for IA32 GCC builds, so
> the
> > > builds available
> > > > from Windows and Linux are matched now.
> > > >
> > > > I have posted my updated branch here:
> > > >
> > > > https://github.com/mdkinney/edk2-
> > > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > > _Smbios_Fixes_V2
> > > >
> > > > I also verified that the SD Card support does work,
> so
> > > I am keeping
> > > > that change.
> > > >
> > > I tested the branch + my ASL workaround and booted
> into Linux
> > > successfully.
> > >
> > > > I agree the Readme is out of date.  I will work on
> that
> > > and add to the
> > > > branch referenced above tomorrow.
> > > >
> > > Thanks!
> > >
> > > Gary Lin
> > >
> > > > Thanks,
> > > >
> > > > Mike
> > > >
> > > > > -----Original Message-----
> > > > > From: devel@edk2.groups.io
> > > [mailto:devel@edk2.groups.io] On Behalf
> > > > > Of Gary Lin
> > > > > Sent: Tuesday, July 2, 2019 8:57 PM
> > > > > To: Kinney, Michael D
> <michael.d.kinney@intel.com>
> > > > > Cc: devel@edk2.groups.io; Qian, Yi
> > > <yi.qian@intel.com>; Sun,
> > > > > Zailiang <zailiang.sun@intel.com>
> > > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > > 00/14]
> > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > dependencies
> > > > >
> > > > > On Tue, Jul 02, 2019 at 09:11:06PM +0000,
> Kinney,
> > > Michael D  wrote:
> > > > > > Hi Gary,
> > > > > >
> > > > > Hi Mike,
> > > > >
> > > > > > I have posted an update to your patches the
> removes
> > > the
> > > > > setting of
> > > > > > WORKSPACE and accesses all files relative to
> > > WORKSPACE
> > > > > in the Linux shell scripts.
> > > > > > It also fixes null pointer bugs in the
> > > SmbiosMiscDxe
> > > > > module.
> > > > > >
> > > > > > https://github.com/mdkinney/edk2-
> > > > > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > > > > _Smbios_Fixes
> > > > > >
> > > > > > With these changes I can boot to the UEFI Shell
> and
> > > to
> > > > > Linux.  Please
> > > > > > verify from your environments.
> > > > > >
> > > > > The fix for SmbiosMiscDxe works for me. Thanks
> for
> > > that!
> > > > >
> > > > > I pushed another commit to my branch to check
> > > WORKSPACE to notify
> > > > > the
> > > > > user:
> > > > >
> > > > > https://github.com/lcp/edk2-
> > > > >
> > >
> platforms/commit/fc530689e913e3de25ca2c553d616b9cef28901c
> > > > >
> > > > > We probably have to update Readme.md later. It's
> > > already dated.
> > > > >
> > > > > > I see you have added the SDMMC modules, but I
> do
> > > not
> > > > > see that peripheral yet.
> > > > > > That feature looks like it needs some more
> debug.
> > > We
> > > > > may need to back
> > > > > > out those changes for now.
> > > > > >
> > > > > I saw the SD card settings in the South Cluster
> > > Configuration menu
> > > > > even without those SDMMC modules, so they are
> > > probably from the
> > > > > edk2-non-osi drivers. However, the SD card didn't
> > > work until I added
> > > > > the drivers from MdeModulePkg, so I need those
> > > drivers at least for
> > > > > my Minnowboard Turbot.
> > > > >
> > > > > Thanks,
> > > > >
> > > > > Gary Lin
> > > > >
> > > > > > I agree there are ASL issues.  The ASL code
> needs
> > > to be
> > > > > updated to the
> > > > > > latest ASL compiler.
> > > > > >
> > > > > > Thanks,
> > > > > >
> > > > > > Mike
> > > > > >
> > > > > > > -----Original Message-----
> > > > > > > From: Kinney, Michael D
> > > > > > > Sent: Tuesday, July 2, 2019 9:50 AM
> > > > > > > To: Gary Lin <GLin@suse.com>;
> > > devel@edk2.groups.io;
> > > > > Kinney, Michael
> > > > > > > D <michael.d.kinney@intel.com>
> > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun,
> Zailiang
> > > > > > > <zailiang.sun@intel.com>
> > > > > > > Subject: RE: [edk2-devel] [edk2-platforms
> Patch
> > > > > 00/14]
> > > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > > dependencies
> > > > > > >
> > > > > > > Hi Gary,
> > > > > > >
> > > > > > > Thanks for the branch.  I have the build
> working
> > > and
> > > > > have reproduced
> > > > > > > the SMBIOS issue and am debugging that now.
> > > > > > >
> > > > > > > Mike
> > > > > > >
> > > > > > > > -----Original Message-----
> > > > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > > > Sent: Tuesday, July 2, 2019 2:48 AM
> > > > > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > > > > <michael.d.kinney@intel.com>
> > > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun,
> Zailiang
> > > > > > > > <zailiang.sun@intel.com>
> > > > > > > > Subject: Re: [edk2-devel] [edk2-platforms
> Patch
> > > > > 00/14]
> > > > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > > dependencies
> > > > > > > >
> > > > > > > > On Mon, Jul 01, 2019 at 11:07:11PM +0000,
> > > Michael
> > > > > D
> > > > > > > Kinney  wrote:
> > > > > > > > > Hi Gary,
> > > > > > > > >
> > > > > > > > > I recommend you rebase on top of this
> series.
> > > > > > > > >
> > > > > > > > > I have verified Linux boots and I have
> been
> > > > > working
> > > > > > > on
> > > > > > > > the GCC and
> > > > > > > > > Linux build scripts as well.
> > > > > > > > >
> > > > > > > > > Please let me know if you see any issues
> with
> > > > > this
> > > > > > > > series applied and
> > > > > > > > > I can help get them fixed.
> > > > > > > > >
> > > > > > > > Hi Mike,
> > > > > > > >
> > > > > > > > I'm rebasing my patches and they are
> available
> > > in
> > > > > my
> > > > > > > > branch:
> > > > > > > >
> > > > > > > > https://github.com/lcp/edk2-
> > > platforms/commits/vlv2-
> > > > > > > > fixes-wip
> > > > > > > >
> > > > > > > > It's based on
> > > > > > > >
> edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
> > > > > > > > and edk2-non-
> > > > > > > >
> osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).
> > > > > > > >
> > > > > > > > There are 3 problems I currently
> encountered,
> > > and
> > > > > maybe
> > > > > > > you can give
> > > > > > > > me some suggestions.
> > > > > > > >
> > > > > > > > 1. Missing DSDT
> > > > > > > >
> > > > > > > > When compiling DSDT, iasl failed with this
> > > error:
> > > > > > > >
> > > > > > > > DSDT.iiii   6077:
> > > > > > > > Or(ShiftLeft(Derefof(Index(CDCT,
> > > \_SB.PCI0.GFX0.MCHK.DCFE)),
> > > > > > > > 21),PARM, PARM)
> > > > > > > > Error    6163 -
> > > > > > > > ^ Object is created temporarily in another
> > > method
> > > > > and
> > > > > > > cannot be
> > > > > > > > accessed (\_SB.PCI0.GFX0. MCHK.DCFE)
> > > > > > > >
> > > > > > > > The code is from
> > > > > > > >
> > > > > > >
> > > > >
> > >
> Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGB
> > > > > > > > DA.ASL
> > > > > > > >
> > > > > > > > I have to comment out the line or iasl
> won't
> > > > > generate
> > > > > > > the aml file and
> > > > > > > > the OS would fail to get DSDT.
> > > > > > > >
> > > > > > > > My acpica version is 20190509, and I
> vaguely
> > > > > remember
> > > > > > > that the older
> > > > > > > > acpica seems to be more tolerant to this
> error.
> > > > > > > >
> > > > > > > > 2. Crash at SMBIOS driver
> > > > > > > >
> > > > > > > > When booting the system, I got the
> following
> > > error:
> > > > > > > >
> > > > > > > > Loading driver at 0x00078DBA000
> > > > > > > EntryPoint=0x00078DBEC3C
> > > > > > > > MiscSubclass.efi
> > > > > > > > InstallProtocolInterface: BC62157E-3E33-
> 4FEC-
> > > 9920-
> > > > > > > 2D3B36D750DF
> > > > > > > > 78FE8D18 ProtectUefiImageCommon -
> > > > > > > > 0x78FE8040
> > > > > > > >   - 0x0000000078DBA000 - 0x0000000000007B80
> > > > > > > > PlatformInfoHob->BoardId [0xB0]
> > > > > > > > GetBiosVersionDateTime
> :MNW2MAX1.X64.0084.D01
> > > > > > > 01/01/2019
> > > > > > > > 00:00
> > > > > > > > SmbiosAdd: Smbios type 0 with size 0x48 is
> > > added to
> > > > > 32-
> > > > > > > bit table
> > > > > > > > SmbiosAdd: Smbios type 0 with size 0x48 is
> > > added to
> > > > > 64-
> > > > > > > bit table
> > > > > > > > SmbiosCreateTable: Initialize 32-bit entry
> > > point
> > > > > > > structure
> > > > > > > > SmbiosCreateTable() re-allocate SMBIOS 32-
> bit
> > > table
> > > > > > > > SmbiosCreateTable: Initialize 64-bit entry
> > > point
> > > > > > > structure
> > > > > > > > SmbiosCreate64BitTable() re-allocate SMBIOS
> 64-
> > > bit
> > > > > > > table Create Smbios
> > > > > > > > Manu callback.
> > > > > > > > !!!! X64 Exception Type - 06(#UD - Invalid
> > > Opcode)
> > > > > CPU
> > > > > > > Apic ID -
> > > > > > > > 00000000 !!!!
> > > > > > > > RIP  - 0000000078DBEC26, CS  -
> > > 0000000000000038,
> > > > > RFLAGS
> > > > > > > > - 0000000000010206 RAX  - 0000000000000000,
> RCX
> > > -
> > > > > > > 000000007984A5A0,
> > > > > > > > RDX - 000000007A46E5FF RBX  -
> 000000007A46E920,
> > > RSP
> > > > > -
> > > > > > > > 000000007A46E8B0, RBP -
> > > > > > > > 0000000078DC0EC0 RSI  - 0000000000000012,
> RDI -
> > > > > > > > 0000000000000003
> > > > > > > > R8   - 800000000000000E, R9  -
> > > 000000007A46E920,
> > > > > R10 -
> > > > > > > > 0000000078FE8398
> > > > > > > > R11  - 0000000000000001, R12 -
> > > 0000000078FE8798,
> > > > > R13 -
> > > > > > > > 0000000078FE8898
> > > > > > > > R14  - 0000000078FE8818, R15 -
> 000000007A46EC60
> > > > > > > > DS   - 0000000000000030, ES  -
> > > 0000000000000030, FS
> > > > > -
> > > > > > > > 0000000000000030
> > > > > > > > GS   - 0000000000000030, SS  -
> 0000000000000030
> > > > > > > > CR0  - 0000000080010013, CR2 -
> > > 0000000000000000,
> > > > > CR3 -
> > > > > > > > 000000007A201000
> > > > > > > > CR4  - 0000000000000628, CR8 -
> 0000000000000000
> > > > > > > > DR0  - 0000000000000000, DR1 -
> > > 0000000000000000,
> > > > > DR2 -
> > > > > > > > 0000000000000000
> > > > > > > > DR3  - 0000000000000000, DR6 -
> > > 00000000FFFF0FF8,
> > > > > DR7 -
> > > > > > > > 0000000000000400 GDTR - 0000000079FFDA98
> > > > > > > 0000000000000047, LDTR -
> > > > > > > > 0000000000000000
> > > > > > > > IDTR - 0000000079862018 0000000000000FFF,
> TR
> > > -
> > > > > > > > 0000000000000000
> > > > > > > > FXSAVE_STATE - 000000007A46E510 !!!! Find
> image
> > > based on
> > > > > > > > IP(0x78DBEC26)
> > > > > > > > /home/gary/git/edk2-
> > > > > > > >
> > > > > > >
> > > > >
> > >
> workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2Tbl
> > > > > > > >
> > > > > > >
> > > > >
> > >
> tDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclas
> > > > > > > > s.
> > > > > > > > dll (ImageBase=0000000078DBA000,
> > > > > > > > EntryPoint=0000000078DBEC3C) !!!!
> > > > > > > >
> > > > > > > > I disaseembled MiscSubclass.debug and found
> > > that
> > > > > the
> > > > > > > address is a
> > > > > > > > "ud2"
> > > > > > > > instruction at
> > > > > > > >
> > > > > > >
> > > > >
> > >
> SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBa
> > > > > > > > seBoardManufacturer()
> > > > > > > >
> > > > > > > > After adding a few more debug messages, the
> > > system
> > > > > > > crashed at another
> > > > > > > > function:
> > > > > > > >
> > > > > > >
> > > > >
> > >
> SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbios
> > > > > > > > ManuCallback()
> > > > > > > >
> > > > > > > > If I added debug messages to both
> functions,
> > > the
> > > > > system
> > > > > > > booted
> > > > > > > > successfully. I currently didn't have any
> clue
> > > on
> > > > > this.
> > > > > > > >
> > > > > > > > 3. The firmware always booted into EFI
> shell.
> > > > > > > >
> > > > > > > > I guess something went wrong with BDS. I
> > > haven't
> > > > > looked
> > > > > > > into this
> > > > > > > > issue yet.
> > > > > > > >
> > > > > > > > Thanks,
> > > > > > > >
> > > > > > > > Gary Lin
> > > > > > > >
> > > > > > > > > Thanks,
> > > > > > > > >
> > > > > > > > > Mike
> > > > > > > > >
> > > > > > > > > > -----Original Message-----
> > > > > > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > > > > > Sent: Sunday, June 30, 2019 9:04 PM
> > > > > > > > > > To: devel@edk2.groups.io; Kinney,
> Michael D
> > > > > > > > > > <michael.d.kinney@intel.com>
> > > > > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun,
> > > Zailiang
> > > > > > > > > > <zailiang.sun@intel.com>
> > > > > > > > > > Subject: Re: [edk2-devel] [edk2-
> platforms
> > > Patch
> > > > > > > > 00/14]
> > > > > > > > > > Vlv2TbltDevicePkg: Remove Intel
> Framework
> > > > > > > > dependencies
> > > > > > > > > >
> > > > > > > > > > On Sun, Jun 30, 2019 at 07:55:39PM -
> 0700,
> > > > > Michael
> > > > > > > D
> > > > > > > > Kinney  wrote:
> > > > > > > > > > > The following changes remove all
> > > dependencies
> > > > > on
> > > > > > > > the
> > > > > > > > > > IntelFrameworkPkg
> > > > > > > > > > > and IntelFrameworkModulePkg from the
> > > > > > > > Vlv2TbltDevicePkg
> > > > > > > > > > platform
> > > > > > > > > > > builds.  These changes do depend on
> > > updates
> > > > > > > > binaries
> > > > > > > > > > on the edk2-non-osi repository.
> > > > > > > > > > >
> > > > > > > > > > Hi Michael,
> > > > > > > > > >
> > > > > > > > > > I am amending the bash scripts for gcc.
> The
> > > > > > > firmware
> > > > > > > > I built is
> > > > > > > > > > using the binaries from
> Development190216
> > > and
> > > > > could
> > > > > > > > boot into Linux
> > > > > > > > > > successfully with some workarounds for
> > > Wpce791,
> > > > > > > Bds,
> > > > > > > > and
> > > > > > > > > > InteFspWrapper. The patches you posted
> > > > > eliminate
> > > > > > > > those parts I have
> > > > > > > > > > to work around.
> > > > > > > > > >
> > > > > > > > > > Just want to know if you need any
> > > assistance
> > > > > for
> > > > > > > the
> > > > > > > > gcc build? I
> > > > > > > > > > could rebase my work upon your patches
> and
> > > send
> > > > > > > them
> > > > > > > > later.
> > > > > > > > > >
> > > > > > > > > > Thanks,
> > > > > > > > > >
> > > > > > > > > > Gary Lin
> > > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
> >
> >
> >
> 
> 


^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-10  5:01                     ` Michael D Kinney
@ 2019-07-10  7:10                       ` Gary Lin
  2019-07-10 19:27                         ` Michael D Kinney
  0 siblings, 1 reply; 42+ messages in thread
From: Gary Lin @ 2019-07-10  7:10 UTC (permalink / raw)
  To: devel@edk2.groups.io, michael.d.kinney@intel.com; +Cc: Yi Qian, Zailiang Sun

On Wed, Jul 10, 2019 at 05:01:32AM +0000,  Michael D Kinney  wrote:
> Hi Gary,
> 
> I have added 2 more patches.  One to disable capsule generation
> for IA32 builds.  There are several places the output directory
> is hard coded for X64.  Will require converting the POST_BUILD
> scripts to python to make this much better.
> 
> The second patch is for the Readme.md.  Please review and
> verify the instructions.
I found some typos in the Readme.md:

1. The path to the capsules:

  -    apt-get install libc:i386
  +`Build\Vlv2TbltDevicePkgIA32\RELEASE_VS2015x86\FV\Vlv.ROM`
  +
  +The X64 CapsuleApp and generated UEFI Capsules are in the directory
  +
  +`Build/Vlv2TbltDevicePkg/Capsules`
  +
  +# Linux Pre-requisites
   
   # Download and Build MinnowMax using Linux/GCC

Since it's still in the section of windows, so the path needs the fix:

Build/Vlv2TbltDevicePkg/Capsules => Build\Vlv2TbltDevicePkg\Capsules

2. The name of gcc script:

   Once the environment is setup, the MinnowBoard MAX firmware and capsules can be
   rebuilt using the following commands.
 
  +* Build X64 Debug Image with report file
  +
  +```
  +cd edk2-platforms/Platform/Intel/Vlv2TbltDevicePkg
  +Build_IFWI.bat /m /y MNW2 Debug
  +```
 
  -* Build Debug Image
  +* Build X64 Release Image with build log
 
   ```
  -cd Vlv2TbltDevicePkg
  -./Build_IFWI.sh MNW2 Debug
  +cd edk2-platforms/Platform/Intel/Vlv2TbltDevicePkg
  +Build_IFWI.bat /m /l MNW2 Release
   ```
   
  -* Build Release Image
  +* Build IA32 Debug Image
   
   ```
  -cd Vlv2TbltDevicePkg
  -./Build_IFWI.sh MNW2 Release
  +cd edk2-platforms/Platform/Intel/Vlv2TbltDevicePkg
  +Build_IFWI.bat /m /IA32 MNW2 Debug
   ```

This is the section of Linux, so the build script is Build_IFWI.sh, not
Build_IFWI.bat.

Gary Lin

> 
> Thanks,
> 
> Mike
> 
> > -----Original Message-----
> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io]
> > On Behalf Of Gary Lin
> > Sent: Tuesday, July 9, 2019 9:14 PM
> > To: devel@edk2.groups.io; Kinney, Michael D
> > <michael.d.kinney@intel.com>
> > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > <zailiang.sun@intel.com>
> > Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> > Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> > 
> > On Wed, Jul 10, 2019 at 03:38:01AM +0000,  Michael D
> > Kinney  wrote:
> > > Hi Gary,
> > >
> > > I have pushed 2 more patches to my branch.  One fixes
> > the ASL issue
> > > without removing the code.  The second is a clean up to
> > all the DSC
> > > files and build scripts to make everything more
> > consistent and remove
> > > more unused content.
> > >
> > > https://github.com/mdkinney/edk2-
> > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > _Smbios_Fixes_V2
> > >
> > > Please test this to make sure it still works.
> > >
> > It works great! I don't need to comment out the
> > problematic line anymore.
> > 
> > > I will work on the Readme and will review the series to
> > prepare for
> > > sending the patch email review tomorrow.
> > >
> > > Thanks for all your help and testing.
> > Thanks for fixing the gcc build :)
> > 
> > Gary Lin
> > 
> > >
> > > Mike
> > >
> > > > -----Original Message-----
> > > > From: devel@edk2.groups.io
> > [mailto:devel@edk2.groups.io] On Behalf
> > > > Of Gary Lin
> > > > Sent: Monday, July 8, 2019 11:04 PM
> > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > <michael.d.kinney@intel.com>
> > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > <zailiang.sun@intel.com>
> > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > 00/14]
> > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > dependencies
> > > >
> > > > On Tue, Jul 09, 2019 at 03:52:37AM +0000,  Michael D
> > Kinney  wrote:
> > > > > Hi Gary,
> > > > >
> > > > Hi Mike,
> > > >
> > > > > I picked up the changes on your branch.  I re-
> > enabled
> > > > the BIOS ID
> > > > > Feature and added support for IA32 GCC builds, so
> > the
> > > > builds available
> > > > > from Windows and Linux are matched now.
> > > > >
> > > > > I have posted my updated branch here:
> > > > >
> > > > > https://github.com/mdkinney/edk2-
> > > > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > > > _Smbios_Fixes_V2
> > > > >
> > > > > I also verified that the SD Card support does work,
> > so
> > > > I am keeping
> > > > > that change.
> > > > >
> > > > I tested the branch + my ASL workaround and booted
> > into Linux
> > > > successfully.
> > > >
> > > > > I agree the Readme is out of date.  I will work on
> > that
> > > > and add to the
> > > > > branch referenced above tomorrow.
> > > > >
> > > > Thanks!
> > > >
> > > > Gary Lin
> > > >
> > > > > Thanks,
> > > > >
> > > > > Mike
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: devel@edk2.groups.io
> > > > [mailto:devel@edk2.groups.io] On Behalf
> > > > > > Of Gary Lin
> > > > > > Sent: Tuesday, July 2, 2019 8:57 PM
> > > > > > To: Kinney, Michael D
> > <michael.d.kinney@intel.com>
> > > > > > Cc: devel@edk2.groups.io; Qian, Yi
> > > > <yi.qian@intel.com>; Sun,
> > > > > > Zailiang <zailiang.sun@intel.com>
> > > > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > > > 00/14]
> > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > dependencies
> > > > > >
> > > > > > On Tue, Jul 02, 2019 at 09:11:06PM +0000,
> > Kinney,
> > > > Michael D  wrote:
> > > > > > > Hi Gary,
> > > > > > >
> > > > > > Hi Mike,
> > > > > >
> > > > > > > I have posted an update to your patches the
> > removes
> > > > the
> > > > > > setting of
> > > > > > > WORKSPACE and accesses all files relative to
> > > > WORKSPACE
> > > > > > in the Linux shell scripts.
> > > > > > > It also fixes null pointer bugs in the
> > > > SmbiosMiscDxe
> > > > > > module.
> > > > > > >
> > > > > > > https://github.com/mdkinney/edk2-
> > > > > > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > > > > > _Smbios_Fixes
> > > > > > >
> > > > > > > With these changes I can boot to the UEFI Shell
> > and
> > > > to
> > > > > > Linux.  Please
> > > > > > > verify from your environments.
> > > > > > >
> > > > > > The fix for SmbiosMiscDxe works for me. Thanks
> > for
> > > > that!
> > > > > >
> > > > > > I pushed another commit to my branch to check
> > > > WORKSPACE to notify
> > > > > > the
> > > > > > user:
> > > > > >
> > > > > > https://github.com/lcp/edk2-
> > > > > >
> > > >
> > platforms/commit/fc530689e913e3de25ca2c553d616b9cef28901c
> > > > > >
> > > > > > We probably have to update Readme.md later. It's
> > > > already dated.
> > > > > >
> > > > > > > I see you have added the SDMMC modules, but I
> > do
> > > > not
> > > > > > see that peripheral yet.
> > > > > > > That feature looks like it needs some more
> > debug.
> > > > We
> > > > > > may need to back
> > > > > > > out those changes for now.
> > > > > > >
> > > > > > I saw the SD card settings in the South Cluster
> > > > Configuration menu
> > > > > > even without those SDMMC modules, so they are
> > > > probably from the
> > > > > > edk2-non-osi drivers. However, the SD card didn't
> > > > work until I added
> > > > > > the drivers from MdeModulePkg, so I need those
> > > > drivers at least for
> > > > > > my Minnowboard Turbot.
> > > > > >
> > > > > > Thanks,
> > > > > >
> > > > > > Gary Lin
> > > > > >
> > > > > > > I agree there are ASL issues.  The ASL code
> > needs
> > > > to be
> > > > > > updated to the
> > > > > > > latest ASL compiler.
> > > > > > >
> > > > > > > Thanks,
> > > > > > >
> > > > > > > Mike
> > > > > > >
> > > > > > > > -----Original Message-----
> > > > > > > > From: Kinney, Michael D
> > > > > > > > Sent: Tuesday, July 2, 2019 9:50 AM
> > > > > > > > To: Gary Lin <GLin@suse.com>;
> > > > devel@edk2.groups.io;
> > > > > > Kinney, Michael
> > > > > > > > D <michael.d.kinney@intel.com>
> > > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun,
> > Zailiang
> > > > > > > > <zailiang.sun@intel.com>
> > > > > > > > Subject: RE: [edk2-devel] [edk2-platforms
> > Patch
> > > > > > 00/14]
> > > > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > > > dependencies
> > > > > > > >
> > > > > > > > Hi Gary,
> > > > > > > >
> > > > > > > > Thanks for the branch.  I have the build
> > working
> > > > and
> > > > > > have reproduced
> > > > > > > > the SMBIOS issue and am debugging that now.
> > > > > > > >
> > > > > > > > Mike
> > > > > > > >
> > > > > > > > > -----Original Message-----
> > > > > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > > > > Sent: Tuesday, July 2, 2019 2:48 AM
> > > > > > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > > > > > <michael.d.kinney@intel.com>
> > > > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun,
> > Zailiang
> > > > > > > > > <zailiang.sun@intel.com>
> > > > > > > > > Subject: Re: [edk2-devel] [edk2-platforms
> > Patch
> > > > > > 00/14]
> > > > > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > > > dependencies
> > > > > > > > >
> > > > > > > > > On Mon, Jul 01, 2019 at 11:07:11PM +0000,
> > > > Michael
> > > > > > D
> > > > > > > > Kinney  wrote:
> > > > > > > > > > Hi Gary,
> > > > > > > > > >
> > > > > > > > > > I recommend you rebase on top of this
> > series.
> > > > > > > > > >
> > > > > > > > > > I have verified Linux boots and I have
> > been
> > > > > > working
> > > > > > > > on
> > > > > > > > > the GCC and
> > > > > > > > > > Linux build scripts as well.
> > > > > > > > > >
> > > > > > > > > > Please let me know if you see any issues
> > with
> > > > > > this
> > > > > > > > > series applied and
> > > > > > > > > > I can help get them fixed.
> > > > > > > > > >
> > > > > > > > > Hi Mike,
> > > > > > > > >
> > > > > > > > > I'm rebasing my patches and they are
> > available
> > > > in
> > > > > > my
> > > > > > > > > branch:
> > > > > > > > >
> > > > > > > > > https://github.com/lcp/edk2-
> > > > platforms/commits/vlv2-
> > > > > > > > > fixes-wip
> > > > > > > > >
> > > > > > > > > It's based on
> > > > > > > > >
> > edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
> > > > > > > > > and edk2-non-
> > > > > > > > >
> > osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).
> > > > > > > > >
> > > > > > > > > There are 3 problems I currently
> > encountered,
> > > > and
> > > > > > maybe
> > > > > > > > you can give
> > > > > > > > > me some suggestions.
> > > > > > > > >
> > > > > > > > > 1. Missing DSDT
> > > > > > > > >
> > > > > > > > > When compiling DSDT, iasl failed with this
> > > > error:
> > > > > > > > >
> > > > > > > > > DSDT.iiii   6077:
> > > > > > > > > Or(ShiftLeft(Derefof(Index(CDCT,
> > > > \_SB.PCI0.GFX0.MCHK.DCFE)),
> > > > > > > > > 21),PARM, PARM)
> > > > > > > > > Error    6163 -
> > > > > > > > > ^ Object is created temporarily in another
> > > > method
> > > > > > and
> > > > > > > > cannot be
> > > > > > > > > accessed (\_SB.PCI0.GFX0. MCHK.DCFE)
> > > > > > > > >
> > > > > > > > > The code is from
> > > > > > > > >
> > > > > > > >
> > > > > >
> > > >
> > Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGB
> > > > > > > > > DA.ASL
> > > > > > > > >
> > > > > > > > > I have to comment out the line or iasl
> > won't
> > > > > > generate
> > > > > > > > the aml file and
> > > > > > > > > the OS would fail to get DSDT.
> > > > > > > > >
> > > > > > > > > My acpica version is 20190509, and I
> > vaguely
> > > > > > remember
> > > > > > > > that the older
> > > > > > > > > acpica seems to be more tolerant to this
> > error.
> > > > > > > > >
> > > > > > > > > 2. Crash at SMBIOS driver
> > > > > > > > >
> > > > > > > > > When booting the system, I got the
> > following
> > > > error:
> > > > > > > > >
> > > > > > > > > Loading driver at 0x00078DBA000
> > > > > > > > EntryPoint=0x00078DBEC3C
> > > > > > > > > MiscSubclass.efi
> > > > > > > > > InstallProtocolInterface: BC62157E-3E33-
> > 4FEC-
> > > > 9920-
> > > > > > > > 2D3B36D750DF
> > > > > > > > > 78FE8D18 ProtectUefiImageCommon -
> > > > > > > > > 0x78FE8040
> > > > > > > > >   - 0x0000000078DBA000 - 0x0000000000007B80
> > > > > > > > > PlatformInfoHob->BoardId [0xB0]
> > > > > > > > > GetBiosVersionDateTime
> > :MNW2MAX1.X64.0084.D01
> > > > > > > > 01/01/2019
> > > > > > > > > 00:00
> > > > > > > > > SmbiosAdd: Smbios type 0 with size 0x48 is
> > > > added to
> > > > > > 32-
> > > > > > > > bit table
> > > > > > > > > SmbiosAdd: Smbios type 0 with size 0x48 is
> > > > added to
> > > > > > 64-
> > > > > > > > bit table
> > > > > > > > > SmbiosCreateTable: Initialize 32-bit entry
> > > > point
> > > > > > > > structure
> > > > > > > > > SmbiosCreateTable() re-allocate SMBIOS 32-
> > bit
> > > > table
> > > > > > > > > SmbiosCreateTable: Initialize 64-bit entry
> > > > point
> > > > > > > > structure
> > > > > > > > > SmbiosCreate64BitTable() re-allocate SMBIOS
> > 64-
> > > > bit
> > > > > > > > table Create Smbios
> > > > > > > > > Manu callback.
> > > > > > > > > !!!! X64 Exception Type - 06(#UD - Invalid
> > > > Opcode)
> > > > > > CPU
> > > > > > > > Apic ID -
> > > > > > > > > 00000000 !!!!
> > > > > > > > > RIP  - 0000000078DBEC26, CS  -
> > > > 0000000000000038,
> > > > > > RFLAGS
> > > > > > > > > - 0000000000010206 RAX  - 0000000000000000,
> > RCX
> > > > -
> > > > > > > > 000000007984A5A0,
> > > > > > > > > RDX - 000000007A46E5FF RBX  -
> > 000000007A46E920,
> > > > RSP
> > > > > > -
> > > > > > > > > 000000007A46E8B0, RBP -
> > > > > > > > > 0000000078DC0EC0 RSI  - 0000000000000012,
> > RDI -
> > > > > > > > > 0000000000000003
> > > > > > > > > R8   - 800000000000000E, R9  -
> > > > 000000007A46E920,
> > > > > > R10 -
> > > > > > > > > 0000000078FE8398
> > > > > > > > > R11  - 0000000000000001, R12 -
> > > > 0000000078FE8798,
> > > > > > R13 -
> > > > > > > > > 0000000078FE8898
> > > > > > > > > R14  - 0000000078FE8818, R15 -
> > 000000007A46EC60
> > > > > > > > > DS   - 0000000000000030, ES  -
> > > > 0000000000000030, FS
> > > > > > -
> > > > > > > > > 0000000000000030
> > > > > > > > > GS   - 0000000000000030, SS  -
> > 0000000000000030
> > > > > > > > > CR0  - 0000000080010013, CR2 -
> > > > 0000000000000000,
> > > > > > CR3 -
> > > > > > > > > 000000007A201000
> > > > > > > > > CR4  - 0000000000000628, CR8 -
> > 0000000000000000
> > > > > > > > > DR0  - 0000000000000000, DR1 -
> > > > 0000000000000000,
> > > > > > DR2 -
> > > > > > > > > 0000000000000000
> > > > > > > > > DR3  - 0000000000000000, DR6 -
> > > > 00000000FFFF0FF8,
> > > > > > DR7 -
> > > > > > > > > 0000000000000400 GDTR - 0000000079FFDA98
> > > > > > > > 0000000000000047, LDTR -
> > > > > > > > > 0000000000000000
> > > > > > > > > IDTR - 0000000079862018 0000000000000FFF,
> > TR
> > > > -
> > > > > > > > > 0000000000000000
> > > > > > > > > FXSAVE_STATE - 000000007A46E510 !!!! Find
> > image
> > > > based on
> > > > > > > > > IP(0x78DBEC26)
> > > > > > > > > /home/gary/git/edk2-
> > > > > > > > >
> > > > > > > >
> > > > > >
> > > >
> > workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2Tbl
> > > > > > > > >
> > > > > > > >
> > > > > >
> > > >
> > tDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclas
> > > > > > > > > s.
> > > > > > > > > dll (ImageBase=0000000078DBA000,
> > > > > > > > > EntryPoint=0000000078DBEC3C) !!!!
> > > > > > > > >
> > > > > > > > > I disaseembled MiscSubclass.debug and found
> > > > that
> > > > > > the
> > > > > > > > address is a
> > > > > > > > > "ud2"
> > > > > > > > > instruction at
> > > > > > > > >
> > > > > > > >
> > > > > >
> > > >
> > SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBa
> > > > > > > > > seBoardManufacturer()
> > > > > > > > >
> > > > > > > > > After adding a few more debug messages, the
> > > > system
> > > > > > > > crashed at another
> > > > > > > > > function:
> > > > > > > > >
> > > > > > > >
> > > > > >
> > > >
> > SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbios
> > > > > > > > > ManuCallback()
> > > > > > > > >
> > > > > > > > > If I added debug messages to both
> > functions,
> > > > the
> > > > > > system
> > > > > > > > booted
> > > > > > > > > successfully. I currently didn't have any
> > clue
> > > > on
> > > > > > this.
> > > > > > > > >
> > > > > > > > > 3. The firmware always booted into EFI
> > shell.
> > > > > > > > >
> > > > > > > > > I guess something went wrong with BDS. I
> > > > haven't
> > > > > > looked
> > > > > > > > into this
> > > > > > > > > issue yet.
> > > > > > > > >
> > > > > > > > > Thanks,
> > > > > > > > >
> > > > > > > > > Gary Lin
> > > > > > > > >
> > > > > > > > > > Thanks,
> > > > > > > > > >
> > > > > > > > > > Mike
> > > > > > > > > >
> > > > > > > > > > > -----Original Message-----
> > > > > > > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > > > > > > Sent: Sunday, June 30, 2019 9:04 PM
> > > > > > > > > > > To: devel@edk2.groups.io; Kinney,
> > Michael D
> > > > > > > > > > > <michael.d.kinney@intel.com>
> > > > > > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun,
> > > > Zailiang
> > > > > > > > > > > <zailiang.sun@intel.com>
> > > > > > > > > > > Subject: Re: [edk2-devel] [edk2-
> > platforms
> > > > Patch
> > > > > > > > > 00/14]
> > > > > > > > > > > Vlv2TbltDevicePkg: Remove Intel
> > Framework
> > > > > > > > > dependencies
> > > > > > > > > > >
> > > > > > > > > > > On Sun, Jun 30, 2019 at 07:55:39PM -
> > 0700,
> > > > > > Michael
> > > > > > > > D
> > > > > > > > > Kinney  wrote:
> > > > > > > > > > > > The following changes remove all
> > > > dependencies
> > > > > > on
> > > > > > > > > the
> > > > > > > > > > > IntelFrameworkPkg
> > > > > > > > > > > > and IntelFrameworkModulePkg from the
> > > > > > > > > Vlv2TbltDevicePkg
> > > > > > > > > > > platform
> > > > > > > > > > > > builds.  These changes do depend on
> > > > updates
> > > > > > > > > binaries
> > > > > > > > > > > on the edk2-non-osi repository.
> > > > > > > > > > > >
> > > > > > > > > > > Hi Michael,
> > > > > > > > > > >
> > > > > > > > > > > I am amending the bash scripts for gcc.
> > The
> > > > > > > > firmware
> > > > > > > > > I built is
> > > > > > > > > > > using the binaries from
> > Development190216
> > > > and
> > > > > > could
> > > > > > > > > boot into Linux
> > > > > > > > > > > successfully with some workarounds for
> > > > Wpce791,
> > > > > > > > Bds,
> > > > > > > > > and
> > > > > > > > > > > InteFspWrapper. The patches you posted
> > > > > > eliminate
> > > > > > > > > those parts I have
> > > > > > > > > > > to work around.
> > > > > > > > > > >
> > > > > > > > > > > Just want to know if you need any
> > > > assistance
> > > > > > for
> > > > > > > > the
> > > > > > > > > gcc build? I
> > > > > > > > > > > could rebase my work upon your patches
> > and
> > > > send
> > > > > > > > them
> > > > > > > > > later.
> > > > > > > > > > >
> > > > > > > > > > > Thanks,
> > > > > > > > > > >
> > > > > > > > > > > Gary Lin
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> > >
> > >
> > >
> > 
> > 
> 
> 
> 
> 
> 

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies
  2019-07-10  7:10                       ` Gary Lin
@ 2019-07-10 19:27                         ` Michael D Kinney
  0 siblings, 0 replies; 42+ messages in thread
From: Michael D Kinney @ 2019-07-10 19:27 UTC (permalink / raw)
  To: Gary Lin, devel@edk2.groups.io, Kinney, Michael D; +Cc: Qian, Yi, Sun, Zailiang

Gary,

Thanks for the feedback.  I fixes these in the patch email review
I sent out today.

Mike

> -----Original Message-----
> From: Gary Lin [mailto:GLin@suse.com]
> Sent: Wednesday, July 10, 2019 12:10 AM
> To: devel@edk2.groups.io; Kinney, Michael D
> <michael.d.kinney@intel.com>
> Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> <zailiang.sun@intel.com>
> Subject: Re: [edk2-devel] [edk2-platforms Patch 00/14]
> Vlv2TbltDevicePkg: Remove Intel Framework dependencies
> 
> On Wed, Jul 10, 2019 at 05:01:32AM +0000,  Michael D
> Kinney  wrote:
> > Hi Gary,
> >
> > I have added 2 more patches.  One to disable capsule
> generation for
> > IA32 builds.  There are several places the output
> directory is hard
> > coded for X64.  Will require converting the POST_BUILD
> scripts to
> > python to make this much better.
> >
> > The second patch is for the Readme.md.  Please review
> and verify the
> > instructions.
> I found some typos in the Readme.md:
> 
> 1. The path to the capsules:
> 
>   -    apt-get install libc:i386
> 
> +`Build\Vlv2TbltDevicePkgIA32\RELEASE_VS2015x86\FV\Vlv.RO
> M`
>   +
>   +The X64 CapsuleApp and generated UEFI Capsules are in
> the directory
>   +
>   +`Build/Vlv2TbltDevicePkg/Capsules`
>   +
>   +# Linux Pre-requisites
> 
>    # Download and Build MinnowMax using Linux/GCC
> 
> Since it's still in the section of windows, so the path
> needs the fix:
> 
> Build/Vlv2TbltDevicePkg/Capsules =>
> Build\Vlv2TbltDevicePkg\Capsules
> 
> 2. The name of gcc script:
> 
>    Once the environment is setup, the MinnowBoard MAX
> firmware and capsules can be
>    rebuilt using the following commands.
> 
>   +* Build X64 Debug Image with report file
>   +
>   +```
>   +cd edk2-platforms/Platform/Intel/Vlv2TbltDevicePkg
>   +Build_IFWI.bat /m /y MNW2 Debug
>   +```
> 
>   -* Build Debug Image
>   +* Build X64 Release Image with build log
> 
>    ```
>   -cd Vlv2TbltDevicePkg
>   -./Build_IFWI.sh MNW2 Debug
>   +cd edk2-platforms/Platform/Intel/Vlv2TbltDevicePkg
>   +Build_IFWI.bat /m /l MNW2 Release
>    ```
> 
>   -* Build Release Image
>   +* Build IA32 Debug Image
> 
>    ```
>   -cd Vlv2TbltDevicePkg
>   -./Build_IFWI.sh MNW2 Release
>   +cd edk2-platforms/Platform/Intel/Vlv2TbltDevicePkg
>   +Build_IFWI.bat /m /IA32 MNW2 Debug
>    ```
> 
> This is the section of Linux, so the build script is
> Build_IFWI.sh, not Build_IFWI.bat.
> 
> Gary Lin
> 
> >
> > Thanks,
> >
> > Mike
> >
> > > -----Original Message-----
> > > From: devel@edk2.groups.io
> [mailto:devel@edk2.groups.io] On Behalf
> > > Of Gary Lin
> > > Sent: Tuesday, July 9, 2019 9:14 PM
> > > To: devel@edk2.groups.io; Kinney, Michael D
> > > <michael.d.kinney@intel.com>
> > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > <zailiang.sun@intel.com>
> > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> 00/14]
> > > Vlv2TbltDevicePkg: Remove Intel Framework
> dependencies
> > >
> > > On Wed, Jul 10, 2019 at 03:38:01AM +0000,  Michael D
> Kinney  wrote:
> > > > Hi Gary,
> > > >
> > > > I have pushed 2 more patches to my branch.  One
> fixes
> > > the ASL issue
> > > > without removing the code.  The second is a clean
> up to
> > > all the DSC
> > > > files and build scripts to make everything more
> > > consistent and remove
> > > > more unused content.
> > > >
> > > > https://github.com/mdkinney/edk2-
> > > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > > _Smbios_Fixes_V2
> > > >
> > > > Please test this to make sure it still works.
> > > >
> > > It works great! I don't need to comment out the
> problematic line
> > > anymore.
> > >
> > > > I will work on the Readme and will review the
> series to
> > > prepare for
> > > > sending the patch email review tomorrow.
> > > >
> > > > Thanks for all your help and testing.
> > > Thanks for fixing the gcc build :)
> > >
> > > Gary Lin
> > >
> > > >
> > > > Mike
> > > >
> > > > > -----Original Message-----
> > > > > From: devel@edk2.groups.io
> > > [mailto:devel@edk2.groups.io] On Behalf
> > > > > Of Gary Lin
> > > > > Sent: Monday, July 8, 2019 11:04 PM
> > > > > To: devel@edk2.groups.io; Kinney, Michael D
> > > > > <michael.d.kinney@intel.com>
> > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun, Zailiang
> > > > > <zailiang.sun@intel.com>
> > > > > Subject: Re: [edk2-devel] [edk2-platforms Patch
> > > 00/14]
> > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > dependencies
> > > > >
> > > > > On Tue, Jul 09, 2019 at 03:52:37AM +0000,
> Michael D
> > > Kinney  wrote:
> > > > > > Hi Gary,
> > > > > >
> > > > > Hi Mike,
> > > > >
> > > > > > I picked up the changes on your branch.  I re-
> > > enabled
> > > > > the BIOS ID
> > > > > > Feature and added support for IA32 GCC builds,
> so
> > > the
> > > > > builds available
> > > > > > from Windows and Linux are matched now.
> > > > > >
> > > > > > I have posted my updated branch here:
> > > > > >
> > > > > > https://github.com/mdkinney/edk2-
> > > > > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > > > > _Smbios_Fixes_V2
> > > > > >
> > > > > > I also verified that the SD Card support does
> work,
> > > so
> > > > > I am keeping
> > > > > > that change.
> > > > > >
> > > > > I tested the branch + my ASL workaround and
> booted
> > > into Linux
> > > > > successfully.
> > > > >
> > > > > > I agree the Readme is out of date.  I will work
> on
> > > that
> > > > > and add to the
> > > > > > branch referenced above tomorrow.
> > > > > >
> > > > > Thanks!
> > > > >
> > > > > Gary Lin
> > > > >
> > > > > > Thanks,
> > > > > >
> > > > > > Mike
> > > > > >
> > > > > > > -----Original Message-----
> > > > > > > From: devel@edk2.groups.io
> > > > > [mailto:devel@edk2.groups.io] On Behalf
> > > > > > > Of Gary Lin
> > > > > > > Sent: Tuesday, July 2, 2019 8:57 PM
> > > > > > > To: Kinney, Michael D
> > > <michael.d.kinney@intel.com>
> > > > > > > Cc: devel@edk2.groups.io; Qian, Yi
> > > > > <yi.qian@intel.com>; Sun,
> > > > > > > Zailiang <zailiang.sun@intel.com>
> > > > > > > Subject: Re: [edk2-devel] [edk2-platforms
> Patch
> > > > > 00/14]
> > > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > > dependencies
> > > > > > >
> > > > > > > On Tue, Jul 02, 2019 at 09:11:06PM +0000,
> > > Kinney,
> > > > > Michael D  wrote:
> > > > > > > > Hi Gary,
> > > > > > > >
> > > > > > > Hi Mike,
> > > > > > >
> > > > > > > > I have posted an update to your patches the
> > > removes
> > > > > the
> > > > > > > setting of
> > > > > > > > WORKSPACE and accesses all files relative
> to
> > > > > WORKSPACE
> > > > > > > in the Linux shell scripts.
> > > > > > > > It also fixes null pointer bugs in the
> > > > > SmbiosMiscDxe
> > > > > > > module.
> > > > > > > >
> > > > > > > > https://github.com/mdkinney/edk2-
> > > > > > > platforms/tree/Bug_xxx_Vlv2_Linux_And
> > > > > > > > _Smbios_Fixes
> > > > > > > >
> > > > > > > > With these changes I can boot to the UEFI
> Shell
> > > and
> > > > > to
> > > > > > > Linux.  Please
> > > > > > > > verify from your environments.
> > > > > > > >
> > > > > > > The fix for SmbiosMiscDxe works for me.
> Thanks
> > > for
> > > > > that!
> > > > > > >
> > > > > > > I pushed another commit to my branch to check
> > > > > WORKSPACE to notify
> > > > > > > the
> > > > > > > user:
> > > > > > >
> > > > > > > https://github.com/lcp/edk2-
> > > > > > >
> > > > >
> > >
> platforms/commit/fc530689e913e3de25ca2c553d616b9cef28901c
> > > > > > >
> > > > > > > We probably have to update Readme.md later.
> It's
> > > > > already dated.
> > > > > > >
> > > > > > > > I see you have added the SDMMC modules, but
> I
> > > do
> > > > > not
> > > > > > > see that peripheral yet.
> > > > > > > > That feature looks like it needs some more
> > > debug.
> > > > > We
> > > > > > > may need to back
> > > > > > > > out those changes for now.
> > > > > > > >
> > > > > > > I saw the SD card settings in the South
> Cluster
> > > > > Configuration menu
> > > > > > > even without those SDMMC modules, so they are
> > > > > probably from the
> > > > > > > edk2-non-osi drivers. However, the SD card
> didn't
> > > > > work until I added
> > > > > > > the drivers from MdeModulePkg, so I need
> those
> > > > > drivers at least for
> > > > > > > my Minnowboard Turbot.
> > > > > > >
> > > > > > > Thanks,
> > > > > > >
> > > > > > > Gary Lin
> > > > > > >
> > > > > > > > I agree there are ASL issues.  The ASL code
> > > needs
> > > > > to be
> > > > > > > updated to the
> > > > > > > > latest ASL compiler.
> > > > > > > >
> > > > > > > > Thanks,
> > > > > > > >
> > > > > > > > Mike
> > > > > > > >
> > > > > > > > > -----Original Message-----
> > > > > > > > > From: Kinney, Michael D
> > > > > > > > > Sent: Tuesday, July 2, 2019 9:50 AM
> > > > > > > > > To: Gary Lin <GLin@suse.com>;
> > > > > devel@edk2.groups.io;
> > > > > > > Kinney, Michael
> > > > > > > > > D <michael.d.kinney@intel.com>
> > > > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun,
> > > Zailiang
> > > > > > > > > <zailiang.sun@intel.com>
> > > > > > > > > Subject: RE: [edk2-devel] [edk2-platforms
> > > Patch
> > > > > > > 00/14]
> > > > > > > > > Vlv2TbltDevicePkg: Remove Intel Framework
> > > > > > > dependencies
> > > > > > > > >
> > > > > > > > > Hi Gary,
> > > > > > > > >
> > > > > > > > > Thanks for the branch.  I have the build
> > > working
> > > > > and
> > > > > > > have reproduced
> > > > > > > > > the SMBIOS issue and am debugging that
> now.
> > > > > > > > >
> > > > > > > > > Mike
> > > > > > > > >
> > > > > > > > > > -----Original Message-----
> > > > > > > > > > From: Gary Lin [mailto:GLin@suse.com]
> > > > > > > > > > Sent: Tuesday, July 2, 2019 2:48 AM
> > > > > > > > > > To: devel@edk2.groups.io; Kinney,
> Michael D
> > > > > > > > > > <michael.d.kinney@intel.com>
> > > > > > > > > > Cc: Qian, Yi <yi.qian@intel.com>; Sun,
> > > Zailiang
> > > > > > > > > > <zailiang.sun@intel.com>
> > > > > > > > > > Subject: Re: [edk2-devel] [edk2-
> platforms
> > > Patch
> > > > > > > 00/14]
> > > > > > > > > > Vlv2TbltDevicePkg: Remove Intel
> Framework
> > > > > > > dependencies
> > > > > > > > > >
> > > > > > > > > > On Mon, Jul 01, 2019 at 11:07:11PM
> +0000,
> > > > > Michael
> > > > > > > D
> > > > > > > > > Kinney  wrote:
> > > > > > > > > > > Hi Gary,
> > > > > > > > > > >
> > > > > > > > > > > I recommend you rebase on top of this
> > > series.
> > > > > > > > > > >
> > > > > > > > > > > I have verified Linux boots and I
> have
> > > been
> > > > > > > working
> > > > > > > > > on
> > > > > > > > > > the GCC and
> > > > > > > > > > > Linux build scripts as well.
> > > > > > > > > > >
> > > > > > > > > > > Please let me know if you see any
> issues
> > > with
> > > > > > > this
> > > > > > > > > > series applied and
> > > > > > > > > > > I can help get them fixed.
> > > > > > > > > > >
> > > > > > > > > > Hi Mike,
> > > > > > > > > >
> > > > > > > > > > I'm rebasing my patches and they are
> > > available
> > > > > in
> > > > > > > my
> > > > > > > > > > branch:
> > > > > > > > > >
> > > > > > > > > > https://github.com/lcp/edk2-
> > > > > platforms/commits/vlv2-
> > > > > > > > > > fixes-wip
> > > > > > > > > >
> > > > > > > > > > It's based on
> > > > > > > > > >
> > > edk2(dcce9cbd48e07fcd11f7ef34cad48faf7bb61e6e)
> > > > > > > > > > and edk2-non-
> > > > > > > > > >
> > > osi(de0a6bc19c4ee0468f04e4d37035cdc59558137f).
> > > > > > > > > >
> > > > > > > > > > There are 3 problems I currently
> > > encountered,
> > > > > and
> > > > > > > maybe
> > > > > > > > > you can give
> > > > > > > > > > me some suggestions.
> > > > > > > > > >
> > > > > > > > > > 1. Missing DSDT
> > > > > > > > > >
> > > > > > > > > > When compiling DSDT, iasl failed with
> this
> > > > > error:
> > > > > > > > > >
> > > > > > > > > > DSDT.iiii   6077:
> > > > > > > > > > Or(ShiftLeft(Derefof(Index(CDCT,
> > > > > \_SB.PCI0.GFX0.MCHK.DCFE)),
> > > > > > > > > > 21),PARM, PARM)
> > > > > > > > > > Error    6163 -
> > > > > > > > > > ^ Object is created temporarily in
> another
> > > > > method
> > > > > > > and
> > > > > > > > > cannot be
> > > > > > > > > > accessed (\_SB.PCI0.GFX0. MCHK.DCFE)
> > > > > > > > > >
> > > > > > > > > > The code is from
> > > > > > > > > >
> > > > > > > > >
> > > > > > >
> > > > >
> > >
> Silicon/Intel/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/IgdOGB
> > > > > > > > > > DA.ASL
> > > > > > > > > >
> > > > > > > > > > I have to comment out the line or iasl
> > > won't
> > > > > > > generate
> > > > > > > > > the aml file and
> > > > > > > > > > the OS would fail to get DSDT.
> > > > > > > > > >
> > > > > > > > > > My acpica version is 20190509, and I
> > > vaguely
> > > > > > > remember
> > > > > > > > > that the older
> > > > > > > > > > acpica seems to be more tolerant to
> this
> > > error.
> > > > > > > > > >
> > > > > > > > > > 2. Crash at SMBIOS driver
> > > > > > > > > >
> > > > > > > > > > When booting the system, I got the
> > > following
> > > > > error:
> > > > > > > > > >
> > > > > > > > > > Loading driver at 0x00078DBA000
> > > > > > > > > EntryPoint=0x00078DBEC3C
> > > > > > > > > > MiscSubclass.efi
> > > > > > > > > > InstallProtocolInterface: BC62157E-
> 3E33-
> > > 4FEC-
> > > > > 9920-
> > > > > > > > > 2D3B36D750DF
> > > > > > > > > > 78FE8D18 ProtectUefiImageCommon -
> > > > > > > > > > 0x78FE8040
> > > > > > > > > >   - 0x0000000078DBA000 -
> 0x0000000000007B80
> > > > > > > > > > PlatformInfoHob->BoardId [0xB0]
> > > > > > > > > > GetBiosVersionDateTime
> > > :MNW2MAX1.X64.0084.D01
> > > > > > > > > 01/01/2019
> > > > > > > > > > 00:00
> > > > > > > > > > SmbiosAdd: Smbios type 0 with size 0x48
> is
> > > > > added to
> > > > > > > 32-
> > > > > > > > > bit table
> > > > > > > > > > SmbiosAdd: Smbios type 0 with size 0x48
> is
> > > > > added to
> > > > > > > 64-
> > > > > > > > > bit table
> > > > > > > > > > SmbiosCreateTable: Initialize 32-bit
> entry
> > > > > point
> > > > > > > > > structure
> > > > > > > > > > SmbiosCreateTable() re-allocate SMBIOS
> 32-
> > > bit
> > > > > table
> > > > > > > > > > SmbiosCreateTable: Initialize 64-bit
> entry
> > > > > point
> > > > > > > > > structure
> > > > > > > > > > SmbiosCreate64BitTable() re-allocate
> SMBIOS
> > > 64-
> > > > > bit
> > > > > > > > > table Create Smbios
> > > > > > > > > > Manu callback.
> > > > > > > > > > !!!! X64 Exception Type - 06(#UD -
> Invalid
> > > > > Opcode)
> > > > > > > CPU
> > > > > > > > > Apic ID -
> > > > > > > > > > 00000000 !!!!
> > > > > > > > > > RIP  - 0000000078DBEC26, CS  -
> > > > > 0000000000000038,
> > > > > > > RFLAGS
> > > > > > > > > > - 0000000000010206 RAX  -
> 0000000000000000,
> > > RCX
> > > > > -
> > > > > > > > > 000000007984A5A0,
> > > > > > > > > > RDX - 000000007A46E5FF RBX  -
> > > 000000007A46E920,
> > > > > RSP
> > > > > > > -
> > > > > > > > > > 000000007A46E8B0, RBP -
> > > > > > > > > > 0000000078DC0EC0 RSI  -
> 0000000000000012,
> > > RDI -
> > > > > > > > > > 0000000000000003
> > > > > > > > > > R8   - 800000000000000E, R9  -
> > > > > 000000007A46E920,
> > > > > > > R10 -
> > > > > > > > > > 0000000078FE8398
> > > > > > > > > > R11  - 0000000000000001, R12 -
> > > > > 0000000078FE8798,
> > > > > > > R13 -
> > > > > > > > > > 0000000078FE8898
> > > > > > > > > > R14  - 0000000078FE8818, R15 -
> > > 000000007A46EC60
> > > > > > > > > > DS   - 0000000000000030, ES  -
> > > > > 0000000000000030, FS
> > > > > > > -
> > > > > > > > > > 0000000000000030
> > > > > > > > > > GS   - 0000000000000030, SS  -
> > > 0000000000000030
> > > > > > > > > > CR0  - 0000000080010013, CR2 -
> > > > > 0000000000000000,
> > > > > > > CR3 -
> > > > > > > > > > 000000007A201000
> > > > > > > > > > CR4  - 0000000000000628, CR8 -
> > > 0000000000000000
> > > > > > > > > > DR0  - 0000000000000000, DR1 -
> > > > > 0000000000000000,
> > > > > > > DR2 -
> > > > > > > > > > 0000000000000000
> > > > > > > > > > DR3  - 0000000000000000, DR6 -
> > > > > 00000000FFFF0FF8,
> > > > > > > DR7 -
> > > > > > > > > > 0000000000000400 GDTR -
> 0000000079FFDA98
> > > > > > > > > 0000000000000047, LDTR -
> > > > > > > > > > 0000000000000000
> > > > > > > > > > IDTR - 0000000079862018
> 0000000000000FFF,
> > > TR
> > > > > -
> > > > > > > > > > 0000000000000000
> > > > > > > > > > FXSAVE_STATE - 000000007A46E510 !!!!
> Find
> > > image
> > > > > based on
> > > > > > > > > > IP(0x78DBEC26)
> > > > > > > > > > /home/gary/git/edk2-
> > > > > > > > > >
> > > > > > > > >
> > > > > > >
> > > > >
> > >
> workspace/Build/Vlv2TbltDevicePkg/DEBUG_GCC5/X64/Vlv2Tbl
> > > > > > > > > >
> > > > > > > > >
> > > > > > >
> > > > >
> > >
> tDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe/DEBUG/MiscSubclas
> > > > > > > > > > s.
> > > > > > > > > > dll (ImageBase=0000000078DBA000,
> > > > > > > > > > EntryPoint=0000000078DBEC3C) !!!!
> > > > > > > > > >
> > > > > > > > > > I disaseembled MiscSubclass.debug and
> found
> > > > > that
> > > > > > > the
> > > > > > > > > address is a
> > > > > > > > > > "ud2"
> > > > > > > > > > instruction at
> > > > > > > > > >
> > > > > > > > >
> > > > > > >
> > > > >
> > >
> SmBiosMiscDxe/MiscBaseBoardManufacturerFunction.c:MiscBa
> > > > > > > > > > seBoardManufacturer()
> > > > > > > > > >
> > > > > > > > > > After adding a few more debug messages,
> the
> > > > > system
> > > > > > > > > crashed at another
> > > > > > > > > > function:
> > > > > > > > > >
> > > > > > > > >
> > > > > > >
> > > > >
> > >
> SmBiosMiscDxe/MiscSystemManufacturerFunction.c:AddSmbios
> > > > > > > > > > ManuCallback()
> > > > > > > > > >
> > > > > > > > > > If I added debug messages to both
> > > functions,
> > > > > the
> > > > > > > system
> > > > > > > > > booted
> > > > > > > > > > successfully. I currently didn't have
> any
> > > clue
> > > > > on
> > > > > > > this.
> > > > > > > > > >
> > > > > > > > > > 3. The firmware always booted into EFI
> > > shell.
> > > > > > > > > >
> > > > > > > > > > I guess something went wrong with BDS.
> I
> > > > > haven't
> > > > > > > looked
> > > > > > > > > into this
> > > > > > > > > > issue yet.
> > > > > > > > > >
> > > > > > > > > > Thanks,
> > > > > > > > > >
> > > > > > > > > > Gary Lin
> > > > > > > > > >
> > > > > > > > > > > Thanks,
> > > > > > > > > > >
> > > > > > > > > > > Mike
> > > > > > > > > > >
> > > > > > > > > > > > -----Original Message-----
> > > > > > > > > > > > From: Gary Lin
> [mailto:GLin@suse.com]
> > > > > > > > > > > > Sent: Sunday, June 30, 2019 9:04 PM
> > > > > > > > > > > > To: devel@edk2.groups.io; Kinney,
> > > Michael D
> > > > > > > > > > > > <michael.d.kinney@intel.com>
> > > > > > > > > > > > Cc: Qian, Yi <yi.qian@intel.com>;
> Sun,
> > > > > Zailiang
> > > > > > > > > > > > <zailiang.sun@intel.com>
> > > > > > > > > > > > Subject: Re: [edk2-devel] [edk2-
> > > platforms
> > > > > Patch
> > > > > > > > > > 00/14]
> > > > > > > > > > > > Vlv2TbltDevicePkg: Remove Intel
> > > Framework
> > > > > > > > > > dependencies
> > > > > > > > > > > >
> > > > > > > > > > > > On Sun, Jun 30, 2019 at 07:55:39PM
> -
> > > 0700,
> > > > > > > Michael
> > > > > > > > > D
> > > > > > > > > > Kinney  wrote:
> > > > > > > > > > > > > The following changes remove all
> > > > > dependencies
> > > > > > > on
> > > > > > > > > > the
> > > > > > > > > > > > IntelFrameworkPkg
> > > > > > > > > > > > > and IntelFrameworkModulePkg from
> the
> > > > > > > > > > Vlv2TbltDevicePkg
> > > > > > > > > > > > platform
> > > > > > > > > > > > > builds.  These changes do depend
> on
> > > > > updates
> > > > > > > > > > binaries
> > > > > > > > > > > > on the edk2-non-osi repository.
> > > > > > > > > > > > >
> > > > > > > > > > > > Hi Michael,
> > > > > > > > > > > >
> > > > > > > > > > > > I am amending the bash scripts for
> gcc.
> > > The
> > > > > > > > > firmware
> > > > > > > > > > I built is
> > > > > > > > > > > > using the binaries from
> > > Development190216
> > > > > and
> > > > > > > could
> > > > > > > > > > boot into Linux
> > > > > > > > > > > > successfully with some workarounds
> for
> > > > > Wpce791,
> > > > > > > > > Bds,
> > > > > > > > > > and
> > > > > > > > > > > > InteFspWrapper. The patches you
> posted
> > > > > > > eliminate
> > > > > > > > > > those parts I have
> > > > > > > > > > > > to work around.
> > > > > > > > > > > >
> > > > > > > > > > > > Just want to know if you need any
> > > > > assistance
> > > > > > > for
> > > > > > > > > the
> > > > > > > > > > gcc build? I
> > > > > > > > > > > > could rebase my work upon your
> patches
> > > and
> > > > > send
> > > > > > > > > them
> > > > > > > > > > later.
> > > > > > > > > > > >
> > > > > > > > > > > > Thanks,
> > > > > > > > > > > >
> > > > > > > > > > > > Gary Lin
> > > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
> > 
> >
> >

^ permalink raw reply	[flat|nested] 42+ messages in thread

end of thread, other threads:[~2019-07-10 19:27 UTC | newest]

Thread overview: 42+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-07-01  2:55 [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Michael D Kinney
2019-07-01  2:55 ` [edk2-platforms Patch 01/14] Vlv2DeviceRefCodePkg: Add gEfiSmmIchnDispatchProtocolGuid Michael D Kinney
2019-07-01  4:06   ` Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 02/14] Vlv2TbltDevicePkg: Reduce Intel Framework dependencies Michael D Kinney
2019-07-01  4:06   ` Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 03/14] Vlv2TbltDevicePkg: Remove unused modules/libraries Michael D Kinney
2019-07-01  4:07   ` Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 04/14] Vlv2TbltDevicePkg: Switch from ISA to SIO modules Michael D Kinney
2019-07-01  4:07   ` Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 05/14] Vlv2TbltDevicePkg: Switch to CPU I/O 2 Protocol Michael D Kinney
2019-07-01  4:07   ` Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 06/14] Vlv2TbltDevicePkg: Remove use of PS/2 Policy Protocol Michael D Kinney
2019-07-01  4:07   ` [edk2-devel] " Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 07/14] Vlv2TbltDevicePkg: Remove use of BIOS ID tools Michael D Kinney
2019-07-01  4:07   ` Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 08/14] Vlv2TbltDevicePkg: Remove use of Data Hub Protocol Michael D Kinney
2019-07-01  4:08   ` [edk2-devel] " Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 09/14] Vlv2TbltDevicePkg: Use PI Spec SMBUS2 PPI Michael D Kinney
2019-07-01  4:08   ` Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 10/14] Vlv2TbltDevicePkg: Switch to MdeModulePkg BdsDxe Michael D Kinney
2019-07-01  4:08   ` Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 11/14] Vlv2TbltDevicePkg: Update boot mode/state behaviors Michael D Kinney
2019-07-01  4:08   ` [edk2-devel] " Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 12/14] Vlv2TbltDevicePkg/PlatformSmm: Switch to PI SMM Protocols Michael D Kinney
2019-07-01  4:08   ` [edk2-devel] " Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 13/14] Vlv2TbltDevicePkg: Change to PI Spec ACPI Table Protocol Michael D Kinney
2019-07-01  4:08   ` Sun, Zailiang
2019-07-01  2:55 ` [edk2-platforms Patch 14/14] Vlv2TbltDevicePkg/PlatformInitPei: Update MemoryTypeInformation Michael D Kinney
2019-07-01  4:08   ` Sun, Zailiang
2019-07-01  4:04 ` [edk2-devel] [edk2-platforms Patch 00/14] Vlv2TbltDevicePkg: Remove Intel Framework dependencies Gary Lin
2019-07-01 23:07   ` Michael D Kinney
2019-07-02  9:48     ` Gary Lin
2019-07-02 16:49       ` Michael D Kinney
2019-07-02 21:11         ` Michael D Kinney
2019-07-03  3:57           ` Gary Lin
2019-07-09  3:52             ` Michael D Kinney
2019-07-09  6:04               ` Gary Lin
2019-07-10  3:38                 ` Michael D Kinney
2019-07-10  4:14                   ` Gary Lin
2019-07-10  5:01                     ` Michael D Kinney
2019-07-10  7:10                       ` Gary Lin
2019-07-10 19:27                         ` Michael D Kinney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox