From 5121087836c1ad2a08857d494c0d9ecb183f4f98 Mon Sep 17 00:00:00 2001
From: CoolStar <coolstarorganization@gmail.com>
Date: Tue, 18 Jul 2017 15:50:38 -0600
Subject: [PATCH] Rebasing

---
 CorebootModulePkg/CorebootModulePkg.dec            |    8 +
 .../Include/Guid/LdrMemoryDescriptor.h             |   33 +
 .../Include/Guid/PciExpressBaseAddress.h           |   46 +
 CorebootModulePkg/Include/Guid/PciOptionRomTable.h |   41 +
 .../Library/CorebootBdsLib/BdsPlatform.c           | 1731 ++++++++++++++++++++
 .../Library/CorebootBdsLib/BdsPlatform.h           |  288 ++++
 .../Library/CorebootBdsLib/PlatformBds.inf         |   65 +
 .../Library/CorebootBdsLib/PlatformData.c          |  161 ++
 CorebootPayloadPkg/CorebootPayloadPkg.fdf          |    5 +-
 CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc      |   12 +-
 CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc   |   12 +-
 11 files changed, 2388 insertions(+), 14 deletions(-)
 create mode 100644 CorebootModulePkg/Include/Guid/LdrMemoryDescriptor.h
 create mode 100644 CorebootModulePkg/Include/Guid/PciExpressBaseAddress.h
 create mode 100644 CorebootModulePkg/Include/Guid/PciOptionRomTable.h
 create mode 100644 CorebootModulePkg/Library/CorebootBdsLib/BdsPlatform.c
 create mode 100644 CorebootModulePkg/Library/CorebootBdsLib/BdsPlatform.h
 create mode 100644 CorebootModulePkg/Library/CorebootBdsLib/PlatformBds.inf
 create mode 100644 CorebootModulePkg/Library/CorebootBdsLib/PlatformData.c

diff --git a/CorebootModulePkg/CorebootModulePkg.dec b/CorebootModulePkg/CorebootModulePkg.dec
index 7f1309bdae..20932a1d04 100644
--- a/CorebootModulePkg/CorebootModulePkg.dec
+++ b/CorebootModulePkg/CorebootModulePkg.dec
@@ -33,8 +33,16 @@
   gUefiCorebootModulePkgTokenSpaceGuid  = {0xe6ff49a0, 0x15df, 0x48fd, {0x9a, 0xcf, 0xd7, 0xdc, 0x27, 0x1b, 0x39, 0xd5}}
   gUefiSystemTableInfoGuid = {0x16c8a6d0, 0xfe8a, 0x4082, {0xa2, 0x8, 0xcf, 0x89, 0xc4, 0x29, 0x4, 0x33}}
   gUefiFrameBufferInfoGuid = {0xdc2cd8bd, 0x402c, 0x4dc4, {0x9b, 0xe0, 0xc, 0x43, 0x2b, 0x7, 0xfa, 0x34}}
+  gEfiPciExpressBaseAddressGuid = {0x3677d529, 0x326f, 0x4603, {0xa9, 0x26, 0xea, 0xac, 0xe0, 0x1d, 0xcb, 0xb0 }}
   gUefiAcpiBoardInfoGuid   = {0xad3d31b, 0xb3d8, 0x4506, {0xae, 0x71, 0x2e, 0xf1, 0x10, 0x6, 0xd9, 0xf}}
 
+  ## Include/Guid/PciOptionRomTable.h
+  gEfiPciOptionRomTableGuid     = { 0x7462660F, 0x1CBD, 0x48DA, { 0xAD, 0x11, 0x91, 0x71, 0x79, 0x13, 0x83, 0x1C }}
+
+  ## Include/Guid/LdrMemoryDescriptor.h
+  gLdrMemoryDescriptorGuid      = { 0x7701d7e5, 0x7d1d, 0x4432, { 0xa4, 0x68, 0x67, 0x3d, 0xab, 0x8a, 0xde, 0x60 }}
+
+
 
 [Ppis]
 
diff --git a/CorebootModulePkg/Include/Guid/LdrMemoryDescriptor.h b/CorebootModulePkg/Include/Guid/LdrMemoryDescriptor.h
new file mode 100644
index 0000000000..38a997deea
--- /dev/null
+++ b/CorebootModulePkg/Include/Guid/LdrMemoryDescriptor.h
@@ -0,0 +1,33 @@
+/** @file
+  Guid is for GUIDED HOB of LDR memory descriptor.
+
+Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials                          
+are licensed and made available under the terms and conditions of the BSD License         
+which accompanies this distribution.  The full text of the license may be found at        
+http://opensource.org/licenses/bsd-license.php                                            
+                                                                                          
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#ifndef __LDR_MEMORY_DESCRIPTOR__
+#define __LDR_MEMORY_DESCRIPTOR__
+
+#define LDR_MEMORY_DESCRIPTOR_GUID \
+  { 0x7701d7e5, 0x7d1d, 0x4432, {0xa4, 0x68, 0x67, 0x3d, 0xab, 0x8a, 0xde, 0x60}}
+
+#pragma pack(1)
+
+typedef struct {
+  EFI_HOB_GUID_TYPE             Hob;
+  UINTN                         MemDescCount;
+  EFI_MEMORY_DESCRIPTOR         *MemDesc;
+} MEMORY_DESC_HOB;
+
+#pragma pack()
+
+extern EFI_GUID gLdrMemoryDescriptorGuid;
+
+#endif
diff --git a/CorebootModulePkg/Include/Guid/PciExpressBaseAddress.h b/CorebootModulePkg/Include/Guid/PciExpressBaseAddress.h
new file mode 100644
index 0000000000..ff554383c1
--- /dev/null
+++ b/CorebootModulePkg/Include/Guid/PciExpressBaseAddress.h
@@ -0,0 +1,46 @@
+/** @file
+
+Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials                          
+are licensed and made available under the terms and conditions of the BSD License         
+which accompanies this distribution.  The full text of the license may be found at        
+http://opensource.org/licenses/bsd-license.php                                            
+                                                                                          
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+Module Name:
+  
+    PciExpressBaseAddress.h
+    
+Abstract:
+
+
+   GUIDs used for PciExpress Base Address
+
+**/
+
+#ifndef _EFI_PCI_EXPRESS_BASE_ADDRESS_H_
+#define _EFI_PCI_EXPRESS_BASE_ADDRESS_H_
+
+#define EFI_PCI_EXPRESS_BASE_ADDRESS_GUID \
+  { \
+  0x3677d529, 0x326f, 0x4603, {0xa9, 0x26, 0xea, 0xac, 0xe0, 0x1d, 0xcb, 0xb0} \
+  }
+
+//
+// Following structure defines PCI Express Base Address information.
+// This information is platform specific, and built into hob in PEI phase.
+// It can be consumed by PEI PCI driver and DXE PCI driver.
+//
+#pragma pack(1)
+typedef struct _EFI_PCI_EXPRESS_BASE_ADDRESS_INFORMATION {
+  UINT32       HostBridgeNumber;
+  UINT32       RootBridgeNumber;
+  UINT64       PciExpressBaseAddress;
+} EFI_PCI_EXPRESS_BASE_ADDRESS_INFORMATION;
+#pragma pack()
+
+extern EFI_GUID gEfiPciExpressBaseAddressGuid;
+
+#endif
diff --git a/CorebootModulePkg/Include/Guid/PciOptionRomTable.h b/CorebootModulePkg/Include/Guid/PciOptionRomTable.h
new file mode 100644
index 0000000000..a2fb99710a
--- /dev/null
+++ b/CorebootModulePkg/Include/Guid/PciOptionRomTable.h
@@ -0,0 +1,41 @@
+/** @file
+  GUID and data structure used to describe the list of PCI Option ROMs present in a system.
+  
+Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials                          
+are licensed and made available under the terms and conditions of the BSD License         
+which accompanies this distribution.  The full text of the license may be found at        
+http://opensource.org/licenses/bsd-license.php                                            
+                                                                                          
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#ifndef __PCI_OPTION_ROM_TABLE_GUID_H_
+#define __PCI_OPTION_ROM_TABLE_GUID_H_
+
+#define EFI_PCI_OPTION_ROM_TABLE_GUID \
+  { 0x7462660f, 0x1cbd, 0x48da, {0xad, 0x11, 0x91, 0x71, 0x79, 0x13, 0x83, 0x1c } }
+
+extern EFI_GUID gEfiPciOptionRomTableGuid;
+
+typedef struct {
+  EFI_PHYSICAL_ADDRESS   RomAddress; 
+  EFI_MEMORY_TYPE        MemoryType;
+  UINT32                 RomLength; 
+  UINT32                 Seg; 
+  UINT8                  Bus; 
+  UINT8                  Dev; 
+  UINT8                  Func; 
+  BOOLEAN                ExecutedLegacyBiosImage; 
+  BOOLEAN                DontLoadEfiRom;
+} EFI_PCI_OPTION_ROM_DESCRIPTOR;
+
+typedef struct {
+  UINT64                         PciOptionRomCount;
+  EFI_PCI_OPTION_ROM_DESCRIPTOR   *PciOptionRomDescriptors;
+} EFI_PCI_OPTION_ROM_TABLE;
+
+#endif // __PCI_OPTION_ROM_TABLE_GUID_H_
+
diff --git a/CorebootModulePkg/Library/CorebootBdsLib/BdsPlatform.c b/CorebootModulePkg/Library/CorebootBdsLib/BdsPlatform.c
new file mode 100644
index 0000000000..b6253a17f8
--- /dev/null
+++ b/CorebootModulePkg/Library/CorebootBdsLib/BdsPlatform.c
@@ -0,0 +1,1731 @@
+/*++
+
+Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials                          
+are licensed and made available under the terms and conditions of the BSD License         
+which accompanies this distribution.  The full text of the license may be found at        
+http://opensource.org/licenses/bsd-license.php                                            
+                                                                                          
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+Module Name:
+
+  BdsPlatform.c
+
+Abstract:
+
+  This file include all platform action which can be customized
+  by IBV/OEM.
+
+--*/
+
+#include "BdsPlatform.h"
+
+#define IS_PCI_ISA_PDECODE(_p)        IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
+
+extern BOOLEAN  gConnectAllHappened;
+extern USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboardDevicePath;
+
+EFI_GUID                    *gTableGuidArray[] = {
+    &gEfiAcpi20TableGuid, &gEfiAcpiTableGuid, &gEfiSmbiosTableGuid, &gEfiMpsTableGuid
+  };
+
+//
+// BDS Platform Functions
+//
+
+VOID
+GetSystemTablesFromHob (
+  VOID
+  )
+/*++
+
+Routine Description:
+  Find GUID'ed HOBs that contain EFI_PHYSICAL_ADDRESS of ACPI, SMBIOS, MPs tables
+
+Arguments:
+  None
+
+Returns:
+  None.
+
+--*/
+{
+  EFI_PEI_HOB_POINTERS        GuidHob;
+  EFI_PEI_HOB_POINTERS        HobStart;
+  EFI_PHYSICAL_ADDRESS        *Table;
+  UINTN                       Index;
+
+  //
+  // Get Hob List
+  //
+  HobStart.Raw = GetHobList ();
+  //
+  // Iteratively add ACPI Table, SMBIOS Table, MPS Table to EFI System Table
+  //
+  for (Index = 0; Index < ARRAY_SIZE (gTableGuidArray); ++Index) {
+    GuidHob.Raw = GetNextGuidHob (gTableGuidArray[Index], HobStart.Raw);
+    if (GuidHob.Raw != NULL) {
+      Table = GET_GUID_HOB_DATA (GuidHob.Guid);
+      if (Table != NULL) {
+        //
+        // Check if Mps Table/Smbios Table/Acpi Table exists in E/F seg,
+        // According to UEFI Spec, we should make sure Smbios table, 
+        // ACPI table and Mps tables kept in memory of specified type
+        //
+        ConvertSystemTable(gTableGuidArray[Index], (VOID**)&Table);
+        gBS->InstallConfigurationTable (gTableGuidArray[Index], (VOID *)Table);
+      }
+    }
+  }
+
+  return ;
+}
+
+#if 0
+VOID
+PrintMemoryMap (
+  VOID
+  )
+{
+  EFI_MEMORY_DESCRIPTOR       *MemMap;
+  EFI_MEMORY_DESCRIPTOR       *MemMapPtr;
+  UINTN                       MemMapSize;
+  UINTN                       MapKey, DescriptorSize;
+  UINTN                       Index;
+  UINT32                      DescriptorVersion;
+  UINT64                      Bytes;
+  EFI_STATUS                  Status;
+
+  MemMapSize = 0;
+  MemMap     = NULL;
+  Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize, &DescriptorVersion);
+  ASSERT (Status == EFI_BUFFER_TOO_SMALL);
+  MemMapSize += EFI_PAGE_SIZE;
+  Status = gBS->AllocatePool (EfiBootServicesData, MemMapSize, &MemMap);
+  ASSERT (Status == EFI_SUCCESS);
+  Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize, &DescriptorVersion);
+  ASSERT (Status == EFI_SUCCESS);
+  MemMapPtr = MemMap;
+
+  ASSERT (DescriptorVersion == EFI_MEMORY_DESCRIPTOR_VERSION);
+
+  for (Index = 0; Index < MemMapSize / DescriptorSize; Index ++) {
+    Bytes = LShiftU64 (MemMap->NumberOfPages, 12);
+    DEBUG ((EFI_D_ERROR, "%lX-%lX  %lX %lX %X\n",
+          MemMap->PhysicalStart, 
+          MemMap->PhysicalStart + Bytes - 1,
+          MemMap->NumberOfPages, 
+          MemMap->Attribute,
+          (UINTN)MemMap->Type));
+    MemMap = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemMap + DescriptorSize);
+  }
+
+  gBS->FreePool (MemMapPtr);
+}
+#endif
+
+VOID
+UpdateMemoryMap (
+  VOID
+  )
+{
+  EFI_STATUS                      Status;
+  EFI_PEI_HOB_POINTERS            GuidHob;
+  VOID                            *Table;
+  MEMORY_DESC_HOB                 MemoryDescHob;
+  UINTN                           Index;
+  EFI_PHYSICAL_ADDRESS            Memory;
+  EFI_GCD_MEMORY_SPACE_DESCRIPTOR Descriptor;
+  
+  GuidHob.Raw = GetFirstGuidHob (&gLdrMemoryDescriptorGuid);
+  if (GuidHob.Raw == NULL) {
+    DEBUG ((EFI_D_ERROR, "Fail to get gEfiLdrMemoryDescriptorGuid from GUID HOB LIST!\n"));
+    return;
+  }
+  Table = GET_GUID_HOB_DATA (GuidHob.Guid);
+  if (Table == NULL) {
+    DEBUG ((EFI_D_ERROR, "Fail to get gEfiLdrMemoryDescriptorGuid from GUID HOB LIST!\n"));
+    return;
+  }
+  MemoryDescHob.MemDescCount = *(UINTN *)Table;
+  MemoryDescHob.MemDesc      = *(EFI_MEMORY_DESCRIPTOR **)((UINTN)Table + sizeof(UINTN));
+
+  //
+  // Add ACPINVS, ACPIReclaim, and Reserved memory to MemoryMap
+  //
+  for (Index = 0; Index < MemoryDescHob.MemDescCount; Index++) {
+    if (MemoryDescHob.MemDesc[Index].PhysicalStart < 0x100000) {
+      continue;
+    }
+    if (MemoryDescHob.MemDesc[Index].PhysicalStart >= 0x100000000ULL) {
+      continue;
+    }
+    if ((MemoryDescHob.MemDesc[Index].Type == EfiReservedMemoryType) ||
+        (MemoryDescHob.MemDesc[Index].Type == EfiRuntimeServicesData) ||
+        (MemoryDescHob.MemDesc[Index].Type == EfiRuntimeServicesCode) ||
+        (MemoryDescHob.MemDesc[Index].Type == EfiACPIReclaimMemory) ||
+        (MemoryDescHob.MemDesc[Index].Type == EfiACPIMemoryNVS)) {
+      DEBUG ((EFI_D_ERROR, "PhysicalStart - 0x%016lx, ", MemoryDescHob.MemDesc[Index].PhysicalStart));
+      DEBUG ((EFI_D_ERROR, "PageNumber    - 0x%016lx, ", MemoryDescHob.MemDesc[Index].NumberOfPages));
+      DEBUG ((EFI_D_ERROR, "Attribute     - 0x%016lx, ", MemoryDescHob.MemDesc[Index].Attribute));
+      DEBUG ((EFI_D_ERROR, "Type          - 0x%08x\n", MemoryDescHob.MemDesc[Index].Type));
+      if ((MemoryDescHob.MemDesc[Index].Type == EfiRuntimeServicesData) ||
+          (MemoryDescHob.MemDesc[Index].Type == EfiRuntimeServicesCode)) {
+        //
+        // For RuntimeSevicesData and RuntimeServicesCode, they are BFV or DxeCore.
+        // The memory type is assigned in EfiLdr
+        //
+        Status = gDS->GetMemorySpaceDescriptor (MemoryDescHob.MemDesc[Index].PhysicalStart, &Descriptor);
+        if (EFI_ERROR (Status)) {
+          continue;
+        }
+        if (Descriptor.GcdMemoryType != EfiGcdMemoryTypeReserved) {
+          //
+          // BFV or tested DXE core
+          //
+          continue;
+        }
+        //
+        // Untested DXE Core region, free and remove
+        //
+        Status = gDS->FreeMemorySpace (
+                        MemoryDescHob.MemDesc[Index].PhysicalStart,
+                        LShiftU64 (MemoryDescHob.MemDesc[Index].NumberOfPages, EFI_PAGE_SHIFT)
+                        );
+        if (EFI_ERROR (Status)) {
+          DEBUG ((EFI_D_ERROR, "FreeMemorySpace fail - %r!\n", Status));
+          continue;
+        }
+        Status = gDS->RemoveMemorySpace (
+                        MemoryDescHob.MemDesc[Index].PhysicalStart,
+                        LShiftU64 (MemoryDescHob.MemDesc[Index].NumberOfPages, EFI_PAGE_SHIFT)
+                        );
+        if (EFI_ERROR (Status)) {
+          DEBUG ((EFI_D_ERROR, "RemoveMemorySpace fail - %r!\n", Status));
+          continue;
+        }
+
+        //
+        // Convert Runtime type to BootTime type
+        //
+        if (MemoryDescHob.MemDesc[Index].Type == EfiRuntimeServicesData) {
+          MemoryDescHob.MemDesc[Index].Type = EfiBootServicesData;
+        } else {
+          MemoryDescHob.MemDesc[Index].Type = EfiBootServicesCode;
+        }
+
+        //
+        // PassThrough, let below code add and alloate.
+        //
+      }
+      //
+      // ACPI or reserved memory
+      //
+      Status = gDS->AddMemorySpace (
+                      EfiGcdMemoryTypeSystemMemory,
+                      MemoryDescHob.MemDesc[Index].PhysicalStart,
+                      LShiftU64 (MemoryDescHob.MemDesc[Index].NumberOfPages, EFI_PAGE_SHIFT),
+                      MemoryDescHob.MemDesc[Index].Attribute
+                      );
+      if (EFI_ERROR (Status)) {
+        DEBUG ((EFI_D_ERROR, "AddMemorySpace fail - %r!\n", Status));
+        if ((MemoryDescHob.MemDesc[Index].Type == EfiACPIReclaimMemory) ||
+            (MemoryDescHob.MemDesc[Index].Type == EfiACPIMemoryNVS)) {
+          //
+          // For EfiACPIReclaimMemory and EfiACPIMemoryNVS, it must success.
+          // For EfiReservedMemoryType, there maybe overlap. So skip check here.
+          //
+//          ASSERT_EFI_ERROR (Status);
+        }
+        continue;
+      }
+
+      Memory = MemoryDescHob.MemDesc[Index].PhysicalStart;
+      Status = gBS->AllocatePages (
+                      AllocateAddress,
+                      (EFI_MEMORY_TYPE)MemoryDescHob.MemDesc[Index].Type,
+                      (UINTN)MemoryDescHob.MemDesc[Index].NumberOfPages,
+                      &Memory
+                      );
+      if (EFI_ERROR (Status)) {
+        DEBUG ((EFI_D_ERROR, "AllocatePages fail - %r!\n", Status));
+        //
+        // For the page added, it must be allocated.
+        //
+//        ASSERT_EFI_ERROR (Status);
+        continue;
+      }
+    }
+  }
+  
+}
+
+EFI_STATUS
+DisableUsbLegacySupport(
+  void
+  )
+/*++
+
+Routine Description:
+  Disabble the USB legacy Support in all Ehci and Uhci.
+  This function assume all PciIo handles have been created in system.
+  
+Arguments:
+  None
+  
+Returns:
+  EFI_SUCCESS
+  EFI_NOT_FOUND
+--*/
+{
+  EFI_STATUS                            Status;
+  EFI_HANDLE                            *HandleArray;
+  UINTN                                 HandleArrayCount;
+  UINTN                                 Index;
+  EFI_PCI_IO_PROTOCOL                   *PciIo;
+  UINT8                                 Class[3];
+  UINT16                                Command;
+  UINT32                                HcCapParams;
+  UINT32                                ExtendCap;
+  UINT32                                Value;
+  UINT32                                TimeOut;
+  
+  //
+  // Find the usb host controller 
+  //   
+  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)) {
+        //
+        // Find the USB host controller 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 (PCI_IF_UHCI == Class[0]) {
+              //
+              // Found the UHCI, then disable the legacy support
+              //
+              Command = 0;
+              Status = PciIo->Pci.Write (PciIo, EfiPciIoWidthUint16, 0xC0, 1, &Command);
+            } else if (PCI_IF_EHCI == Class[0]) {
+              //
+              // Found the EHCI, then disable the legacy support
+              //
+              Status = PciIo->Mem.Read (
+                                   PciIo,
+                                   EfiPciIoWidthUint32,
+                                   0,                   //EHC_BAR_INDEX
+                                   (UINT64) 0x08,       //EHC_HCCPARAMS_OFFSET
+                                   1,
+                                   &HcCapParams
+                                   );
+              
+              ExtendCap = (HcCapParams >> 8) & 0xFF;
+              //
+              // Disable the SMI in USBLEGCTLSTS firstly
+              //
+              PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap + 0x4, 1, &Value);
+              Value &= 0xFFFF0000;
+              PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, ExtendCap + 0x4, 1, &Value);
+              
+              //
+              // Get EHCI Ownership from legacy bios
+              //
+              PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap, 1, &Value);
+              Value |= (0x1 << 24);
+              PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, ExtendCap, 1, &Value);
+
+              TimeOut = 40;
+              while (TimeOut--) {
+                gBS->Stall (500);
+
+                PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap, 1, &Value);
+
+                if ((Value & 0x01010000) == 0x01000000) {
+                  break;
+                }
+              }
+            }
+          } 
+        }
+      }
+    }
+  } else {
+    return Status;
+  }
+  gBS->FreePool (HandleArray);
+  return EFI_SUCCESS;
+}
+
+
+VOID
+EFIAPI
+PlatformBdsInit (
+  VOID
+  )
+/*++
+
+Routine Description:
+
+  Platform Bds init. Include the platform firmware vendor, revision
+  and so crc check.
+
+Arguments:
+
+Returns:
+
+  None.
+
+--*/
+{
+  GetSystemTablesFromHob ();
+
+  UpdateMemoryMap ();
+  
+  //
+  // Append Usb Keyboard short form DevicePath into "ConInDev" 
+  //
+  BdsLibUpdateConsoleVariable (
+    VarConsoleInpDev,
+    (EFI_DEVICE_PATH_PROTOCOL *) &gUsbClassKeyboardDevicePath,
+    NULL
+    );
+}
+
+UINT64
+GetPciExpressBaseAddressForRootBridge (
+  IN UINTN    HostBridgeNumber,
+  IN UINTN    RootBridgeNumber
+  )
+/*++
+
+Routine Description:
+  This routine is to get PciExpress Base Address for this RootBridge
+
+Arguments:
+  HostBridgeNumber - The number of HostBridge
+  RootBridgeNumber - The number of RootBridge
+    
+Returns:
+  UINT64 - PciExpressBaseAddress for this HostBridge and RootBridge
+
+--*/
+{
+  EFI_PCI_EXPRESS_BASE_ADDRESS_INFORMATION *PciExpressBaseAddressInfo;
+  UINTN                                    BufferSize;
+  UINT32                                   Index;
+  UINT32                                   Number;
+  EFI_PEI_HOB_POINTERS                     GuidHob;
+
+  //
+  // Get PciExpressAddressInfo Hob
+  //
+  PciExpressBaseAddressInfo = NULL;
+  BufferSize                = 0;
+  GuidHob.Raw = GetFirstGuidHob (&gEfiPciExpressBaseAddressGuid);
+  if (GuidHob.Raw != NULL) {
+    PciExpressBaseAddressInfo = GET_GUID_HOB_DATA (GuidHob.Guid);
+    BufferSize                = GET_GUID_HOB_DATA_SIZE (GuidHob.Guid);
+  } else {
+    return 0;
+  }
+
+  //
+  // Search the PciExpress Base Address in the Hob for current RootBridge
+  //
+  Number = (UINT32)(BufferSize / sizeof(EFI_PCI_EXPRESS_BASE_ADDRESS_INFORMATION));
+  for (Index = 0; Index < Number; Index++) {
+    if ((PciExpressBaseAddressInfo[Index].HostBridgeNumber == HostBridgeNumber) &&
+        (PciExpressBaseAddressInfo[Index].RootBridgeNumber == RootBridgeNumber)) {
+      return PciExpressBaseAddressInfo[Index].PciExpressBaseAddress;
+    }
+  }
+
+  //
+  // Do not find the PciExpress Base Address in the Hob
+  //
+  return 0;  
+}
+
+VOID
+PatchPciRootBridgeDevicePath (
+  IN UINTN    HostBridgeNumber,
+  IN UINTN    RootBridgeNumber,
+  IN PLATFORM_ROOT_BRIDGE_DEVICE_PATH  *RootBridge
+  )
+{
+  UINT64  PciExpressBase;
+
+  PciExpressBase = GetPciExpressBaseAddressForRootBridge (HostBridgeNumber, RootBridgeNumber);
+  
+  DEBUG ((EFI_D_INFO, "Get PciExpress Address from Hob: 0x%X\n", PciExpressBase));
+  
+  if (PciExpressBase != 0) {
+    RootBridge->PciRootBridge.HID = EISA_PNP_ID(0x0A08);
+  }
+}
+
+EFI_STATUS
+ConnectRootBridge (
+  VOID
+  )
+/*++
+
+Routine Description:
+
+  Connect RootBridge
+
+Arguments:
+
+  None.
+ 
+Returns:
+
+  EFI_SUCCESS             - Connect RootBridge successfully.
+  EFI_STATUS              - Connect RootBridge fail.
+
+--*/
+{
+  EFI_STATUS                Status;
+  EFI_HANDLE                RootHandle;
+
+  //
+  // Patch Pci Root Bridge Device Path
+  //
+  PatchPciRootBridgeDevicePath (0, 0, &gPlatformRootBridge0);
+
+  //
+  // Make all the PCI_IO protocols on PCI Seg 0 show up
+  //
+  BdsLibConnectDevicePath (gPlatformRootBridges[0]);
+
+  Status = gBS->LocateDevicePath (
+                  &gEfiDevicePathProtocolGuid, 
+                  &gPlatformRootBridges[0], 
+                  &RootHandle
+                  );
+  DEBUG ((EFI_D_INFO, "Pci Root bridge handle is 0x%X\n", RootHandle));
+  
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = gBS->ConnectController (RootHandle, NULL, NULL, FALSE);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+PrepareLpcBridgeDevicePath (
+  IN EFI_HANDLE                DeviceHandle
+  )
+/*++
+
+Routine Description:
+
+  Add IsaKeyboard to ConIn,
+  add IsaSerial to ConOut, ConIn, ErrOut.
+  LPC Bridge: 06 01 00
+
+Arguments:
+
+  DeviceHandle            - Handle of PCIIO protocol.
+ 
+Returns:
+
+  EFI_SUCCESS             - LPC bridge is added to ConOut, ConIn, and ErrOut.
+  EFI_STATUS              - No LPC bridge is added.
+
+--*/
+{
+  EFI_STATUS                Status;
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;
+
+  DevicePath = NULL;
+  Status = gBS->HandleProtocol (
+                  DeviceHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  (VOID*)&DevicePath
+                  );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  TempDevicePath = DevicePath;
+
+  //
+  // Register Keyboard
+  //
+  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gPnpPs2KeyboardDeviceNode);
+
+  BdsLibUpdateConsoleVariable (VarConsoleInp, DevicePath, NULL);
+
+  //
+  // Register COM1
+  //
+  DevicePath = TempDevicePath;
+  gPnp16550ComPortDeviceNode.UID = 0;
+
+  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gPnp16550ComPortDeviceNode);
+  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gUartDeviceNode);
+  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gTerminalTypeDeviceNode);
+
+  BdsLibUpdateConsoleVariable (VarConsoleOut, DevicePath, NULL);
+  BdsLibUpdateConsoleVariable (VarConsoleInp, DevicePath, NULL);
+  BdsLibUpdateConsoleVariable (VarErrorOut, DevicePath, NULL);
+
+  //
+  // Register COM2
+  //
+  DevicePath = TempDevicePath;
+  gPnp16550ComPortDeviceNode.UID = 1;
+
+  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gPnp16550ComPortDeviceNode);
+  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gUartDeviceNode);
+  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gTerminalTypeDeviceNode);
+
+  BdsLibUpdateConsoleVariable (VarConsoleOut, DevicePath, NULL);
+  BdsLibUpdateConsoleVariable (VarConsoleInp, DevicePath, NULL);
+  BdsLibUpdateConsoleVariable (VarErrorOut, DevicePath, NULL);
+
+  return EFI_SUCCESS;
+}
+
+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;
+
+  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.
+  //
+  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;
+
+        //
+        // Delete the PCI device's path that added by GetPlugInPciVgaDevicePath()
+        // Add the integrity GOP device path.
+        //
+        BdsLibUpdateConsoleVariable (VarConsoleOutDev, NULL, PciDevicePath);
+        BdsLibUpdateConsoleVariable (VarConsoleOutDev, TempDevicePath, NULL);
+      }
+    }
+    gBS->FreePool (GopHandleBuffer);
+  }
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+PreparePciVgaDevicePath (
+  IN EFI_HANDLE                DeviceHandle
+  )
+/*++
+
+Routine Description:
+
+  Add PCI VGA to ConOut.
+  PCI VGA: 03 00 00
+
+Arguments:
+
+  DeviceHandle            - Handle of PCIIO protocol.
+ 
+Returns:
+
+  EFI_SUCCESS             - PCI VGA is added to ConOut.
+  EFI_STATUS              - No PCI VGA device is added.
+
+--*/
+{
+  EFI_STATUS                Status;
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+  EFI_DEVICE_PATH_PROTOCOL  *GopDevicePath;
+
+  DevicePath    = NULL;
+  GopDevicePath = NULL;
+  Status = gBS->HandleProtocol (
+                  DeviceHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  (VOID*)&DevicePath
+                  );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  
+  GetGopDevicePath (DevicePath, &GopDevicePath);
+  DevicePath = GopDevicePath;
+
+  BdsLibUpdateConsoleVariable (VarConsoleOut, DevicePath, NULL);
+  
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+PreparePciSerialDevicePath (
+  IN EFI_HANDLE                DeviceHandle
+  )
+/*++
+
+Routine Description:
+
+  Add PCI Serial to ConOut, ConIn, ErrOut.
+  PCI Serial: 07 00 02
+
+Arguments:
+
+  DeviceHandle            - Handle of PCIIO protocol.
+ 
+Returns:
+
+  EFI_SUCCESS             - PCI Serial is added to ConOut, ConIn, and ErrOut.
+  EFI_STATUS              - No PCI Serial device is added.
+
+--*/
+{
+  EFI_STATUS                Status;
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+  
+  DevicePath = NULL;
+  Status = gBS->HandleProtocol (
+                  DeviceHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  (VOID*)&DevicePath
+                  );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gUartDeviceNode);
+  DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gTerminalTypeDeviceNode);
+
+  BdsLibUpdateConsoleVariable (VarConsoleOut, DevicePath, NULL);
+  BdsLibUpdateConsoleVariable (VarConsoleInp, DevicePath, NULL);
+  BdsLibUpdateConsoleVariable (VarErrorOut, DevicePath, NULL);
+  
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+DetectAndPreparePlatformPciDevicePath (
+  BOOLEAN DetectVgaOnly
+  )
+/*++
+
+Routine Description:
+
+  Do platform specific PCI Device check and add them to ConOut, ConIn, ErrOut
+
+Arguments:
+
+  DetectVgaOnly           - Only detect VGA device if it's TRUE.
+ 
+Returns:
+
+  EFI_SUCCESS             - PCI Device check and Console variable update successfully.
+  EFI_STATUS              - PCI Device check or Console variable update fail.
+
+--*/
+{
+  EFI_STATUS                Status;
+  UINTN                     HandleCount;
+  EFI_HANDLE                *HandleBuffer;
+  UINTN                     Index;
+  EFI_PCI_IO_PROTOCOL       *PciIo;
+  PCI_TYPE00                Pci;
+
+  //
+  // Start to check all the PciIo to find all possible 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)) {
+      continue;
+    }
+
+    //
+    // Check for all PCI device
+    //
+    Status = PciIo->Pci.Read (
+                      PciIo,
+                      EfiPciIoWidthUint32,
+                      0,
+                      sizeof (Pci) / sizeof (UINT32),
+                      &Pci
+                      );
+    if (EFI_ERROR (Status)) {
+      continue;
+    }
+
+    if (!DetectVgaOnly) {
+      //
+      // Here we decide whether it is LPC Bridge
+      //
+      if ((IS_PCI_LPC (&Pci)) ||
+          ((IS_PCI_ISA_PDECODE (&Pci)) && (Pci.Hdr.VendorId == 0x8086) && (Pci.Hdr.DeviceId == 0x7110))) {
+        //
+        // Add IsaKeyboard to ConIn,
+        // add IsaSerial to ConOut, ConIn, ErrOut
+        //
+        DEBUG ((EFI_D_INFO, "Find the LPC Bridge device\n"));
+        PrepareLpcBridgeDevicePath (HandleBuffer[Index]);
+        continue;
+      }
+      //
+      // Here we decide which Serial device to enable in PCI bus 
+      //
+      if (IS_PCI_16550SERIAL (&Pci)) {
+        //
+        // Add them to ConOut, ConIn, ErrOut.
+        //
+        DEBUG ((EFI_D_INFO, "Find the 16550 SERIAL device\n"));
+        PreparePciSerialDevicePath (HandleBuffer[Index]);
+        continue;
+      }
+    }
+
+    //
+    // Here we decide which VGA device to enable in PCI bus 
+    //
+    if (IS_PCI_VGA (&Pci)) {
+      //
+      // Add them to ConOut.
+      //
+      DEBUG ((EFI_D_INFO, "Find the VGA device\n"));
+      PreparePciVgaDevicePath (HandleBuffer[Index]);
+      continue;
+    }
+  }
+  
+  gBS->FreePool (HandleBuffer);
+  
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+PlatformBdsConnectConsole (
+  IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
+  )
+/*++
+
+Routine Description:
+
+  Connect the predefined platform default console device. Always try to find
+  and enable the vga device if have.
+
+Arguments:
+
+  PlatformConsole         - Predefined platform default console device array.
+ 
+Returns:
+
+  EFI_SUCCESS             - Success connect at least one ConIn and ConOut 
+                            device, there must have one ConOut device is 
+                            active vga device.
+  
+  EFI_STATUS              - Return the status of 
+                            BdsLibConnectAllDefaultConsoles ()
+
+--*/
+{
+  EFI_STATUS                         Status;
+  UINTN                              Index;
+  EFI_DEVICE_PATH_PROTOCOL           *VarConout;
+  EFI_DEVICE_PATH_PROTOCOL           *VarConin;
+  UINTN                              DevicePathSize;
+
+  //
+  // Connect RootBridge
+  //
+  ConnectRootBridge ();
+
+  VarConout = BdsLibGetVariableAndSize (
+                VarConsoleOut,
+                &gEfiGlobalVariableGuid,
+                &DevicePathSize
+                );
+  VarConin = BdsLibGetVariableAndSize (
+               VarConsoleInp,
+               &gEfiGlobalVariableGuid,
+               &DevicePathSize
+               );
+  
+  if (VarConout == NULL || VarConin == NULL) {
+    //
+    // Do platform specific PCI Device check and add them to ConOut, ConIn, ErrOut
+    //
+    DetectAndPreparePlatformPciDevicePath (FALSE);
+
+    //
+    // Have chance to connect the platform default console,
+    // the platform default console is the minimum device group
+    // the platform should support
+    //
+    for (Index = 0; PlatformConsole[Index].DevicePath != NULL; ++Index) {
+      //
+      // Update the console variable with the connect type
+      //
+      if ((PlatformConsole[Index].ConnectType & CONSOLE_IN) == CONSOLE_IN) {
+        BdsLibUpdateConsoleVariable (VarConsoleInp, PlatformConsole[Index].DevicePath, NULL);
+      }
+      if ((PlatformConsole[Index].ConnectType & CONSOLE_OUT) == CONSOLE_OUT) {
+        BdsLibUpdateConsoleVariable (VarConsoleOut, PlatformConsole[Index].DevicePath, NULL);
+      }
+      if ((PlatformConsole[Index].ConnectType & STD_ERROR) == STD_ERROR) {
+        BdsLibUpdateConsoleVariable (VarErrorOut, PlatformConsole[Index].DevicePath, NULL);
+      }
+    }
+  } else {
+    //
+    // Only detect VGA device and add them to ConOut
+    //
+    DetectAndPreparePlatformPciDevicePath (TRUE);
+  }
+  
+  //
+  // The ConIn devices connection will start the USB bus, should disable all
+  // Usb legacy support firstly.
+  // Caution: Must ensure the PCI bus driver has been started. Since the 
+  // ConnectRootBridge() will create all the PciIo protocol, it's safe here now
+  //
+  Status = DisableUsbLegacySupport();
+  
+  //
+  // Connect the all the default console with current cosole variable
+  //
+  Status = BdsLibConnectAllDefaultConsoles ();
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  return EFI_SUCCESS;
+}
+
+VOID
+PlatformBdsConnectSequence (
+  VOID
+  )
+/*++
+
+Routine Description:
+
+  Connect with predefined platform connect sequence,
+  the OEM/IBV can customize with their own connect sequence.
+  
+Arguments:
+
+  None.
+ 
+Returns:
+
+  None.
+  
+--*/
+{
+  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++;
+  }
+
+}
+
+VOID
+PlatformBdsGetDriverOption (
+  IN OUT LIST_ENTRY              *BdsDriverLists
+  )
+/*++
+
+Routine Description:
+
+  Load the predefined driver option, OEM/IBV can customize this
+  to load their own drivers
+  
+Arguments:
+
+  BdsDriverLists  - The header of the driver option link list.
+ 
+Returns:
+
+  None.
+  
+--*/
+{
+  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++;
+  }
+
+}
+
+VOID
+PlatformBdsDiagnostics (
+  IN EXTENDMEM_COVERAGE_LEVEL    MemoryTestLevel,
+  IN BOOLEAN                     QuietBoot,
+  IN BASEM_MEMORY_TEST           BaseMemoryTest
+  )
+/*++
+
+Routine Description:
+
+  Perform the platform diagnostic, such like test memory. OEM/IBV also
+  can customize this fuction to support specific platform diagnostic.
+  
+Arguments:
+
+  MemoryTestLevel  - The memory test intensive level
+  
+  QuietBoot        - Indicate if need to enable the quiet boot
+
+  BaseMemoryTest   - A pointer to BdsMemoryTest()
+ 
+Returns:
+
+  None.
+  
+--*/
+{
+  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) {
+    Status = EnableQuietBoot (PcdGetPtr(PcdLogoFile));
+    if (EFI_ERROR (Status)) {
+      DisableQuietBoot ();
+      return;
+    }
+
+    //
+    // Perform system diagnostic
+    //
+    Status = BaseMemoryTest (MemoryTestLevel);
+    if (EFI_ERROR (Status)) {
+      DisableQuietBoot ();
+    }
+
+    return ;
+  }
+  //
+  // Perform system diagnostic
+  //
+  Status = BaseMemoryTest (MemoryTestLevel);
+}
+
+VOID
+EFIAPI
+PlatformBdsPolicyBehavior (
+  IN OUT LIST_ENTRY              *DriverOptionList,
+  IN OUT LIST_ENTRY              *BootOptionList,
+  IN PROCESS_CAPSULES            ProcessCapsules,
+  IN BASEM_MEMORY_TEST           BaseMemoryTest
+  )
+/*++
+
+Routine Description:
+
+  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.
+  
+Arguments:
+
+  DriverOptionList - The header of the driver option link list
+  
+  BootOptionList   - The header of the boot option link list
+ 
+Returns:
+
+  None.
+  
+--*/
+{
+  EFI_STATUS                         Status;
+  UINT16                             Timeout;
+  EFI_EVENT                          UserInputDurationTime;
+  UINTN                              Index;
+  EFI_INPUT_KEY                      Key;
+  EFI_BOOT_MODE                      BootMode;
+
+  //
+  // Init the time out value
+  //
+  Timeout = PcdGet16 (PcdPlatformBootTimeOut);
+
+  //
+  // Load the driver option as the driver option list
+  //
+  PlatformBdsGetDriverOption (DriverOptionList);
+
+  //
+  // Get current Boot Mode
+  //
+  Status = BdsLibGetBootMode (&BootMode);
+  DEBUG ((EFI_D_ERROR, "Boot Mode:%x\n", BootMode));
+
+  //
+  // Go the different platform policy with different boot mode
+  // Notes: this part code can be change with the table policy
+  //
+  ASSERT (BootMode == BOOT_WITH_FULL_CONFIGURATION);
+  //
+  // Connect platform console
+  //
+  Status = PlatformBdsConnectConsole (gPlatformConsole);
+  if (EFI_ERROR (Status)) {
+    //
+    // Here OEM/IBV can customize with defined action
+    //
+    PlatformBdsNoConsoleAction ();
+  }
+  //
+  // Create a 300ms duration event to ensure user has enough input time to enter Setup
+  //
+  Status = gBS->CreateEvent (
+                  EVT_TIMER,
+                  0,
+                  NULL,
+                  NULL,
+                  &UserInputDurationTime
+                  );
+  ASSERT (Status == EFI_SUCCESS);
+  Status = gBS->SetTimer (UserInputDurationTime, TimerRelative, 3000000);
+  ASSERT (Status == EFI_SUCCESS);
+  //
+  // Memory test and Logo show
+  //
+  PlatformBdsDiagnostics (IGNORE, TRUE, BaseMemoryTest);
+
+  //
+  // Perform some platform specific connect sequence
+  //
+  PlatformBdsConnectSequence ();
+
+  //
+  // Give one chance to enter the setup if we
+  // have the time out
+  //
+  // BUGBUG: hard code timeout to 5 second to show logo in graphic mode.
+  Timeout = 5;  
+  if (Timeout != 0) {
+    PlatformBdsEnterFrontPage (Timeout, FALSE);
+  }
+
+  //
+  //BdsLibConnectAll ();
+  //BdsLibEnumerateAllBootOption (BootOptionList);  
+  
+  //
+  // Please uncomment above ConnectAll and EnumerateAll code and remove following first boot
+  // checking code in real production tip.
+  //          
+  // In BOOT_WITH_FULL_CONFIGURATION boot mode, should always connect every device 
+  // and do enumerate all the default boot options. But in development system board, the boot mode 
+  // cannot be BOOT_ASSUMING_NO_CONFIGURATION_CHANGES because the machine box
+  // is always open. So the following code only do the ConnectAll and EnumerateAll at first boot.
+  //
+  Status = BdsLibBuildOptionFromVar (BootOptionList, L"BootOrder");
+  if (EFI_ERROR(Status)) {
+    //
+    // If cannot find "BootOrder" variable,  it may be first boot. 
+    // Try to connect all devices and enumerate all boot options here.
+    //
+    BdsLibConnectAll ();
+    BdsLibEnumerateAllBootOption (BootOptionList);
+  } 
+
+  //
+  // To give the User a chance to enter Setup here, if user set TimeOut is 0.
+  // BDS should still give user a chance to enter Setup
+  // Check whether the user input after the duration time has expired 
+  //
+  gBS->WaitForEvent (1, &UserInputDurationTime, &Index);
+  gBS->CloseEvent (UserInputDurationTime);
+  Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
+  
+  if (!EFI_ERROR (Status)) {
+    //
+    // Enter Setup if user input 
+    //
+    Timeout = 0xffff;
+    PlatformBdsEnterFrontPage (Timeout, FALSE);
+  }
+  
+  return ;
+
+}
+
+VOID
+EFIAPI
+PlatformBdsBootSuccess (
+  IN  BDS_COMMON_OPTION *Option
+  )
+/*++
+
+Routine Description:
+  
+  Hook point after a boot attempt succeeds. We don't expect a boot option to
+  return, so the EFI 1.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.
+
+Arguments:
+
+  Option - Pointer to Boot Option that succeeded to boot.
+
+Returns:
+  
+  None.
+
+--*/
+{
+  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);
+    gBS->FreePool (TmpStr);
+  }
+}
+
+VOID
+EFIAPI
+PlatformBdsBootFail (
+  IN  BDS_COMMON_OPTION  *Option,
+  IN  EFI_STATUS         Status,
+  IN  CHAR16             *ExitData,
+  IN  UINTN              ExitDataSize
+  )
+/*++
+
+Routine Description:
+  
+  Hook point after a boot attempt fails.
+
+Arguments:
+  
+  Option - Pointer to Boot Option that failed to boot.
+
+  Status - Status returned from failed boot.
+
+  ExitData - Exit data returned from failed boot.
+
+  ExitDataSize - Exit data size returned from failed boot.
+
+Returns:
+  
+  None.
+
+--*/
+{
+  CHAR16  *TmpStr;
+
+  //
+  // 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);
+    gBS->FreePool (TmpStr);
+  }
+
+}
+
+EFI_STATUS
+PlatformBdsNoConsoleAction (
+  VOID
+  )
+/*++
+
+Routine Description:
+  
+  This function is remained for IBV/OEM to do some platform action,
+  if there no console device can be connected.
+
+Arguments:
+  
+  None.
+  
+Returns:
+  
+  EFI_SUCCESS      - Direct return success now.
+
+--*/
+{
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+ConvertSystemTable (
+  IN     EFI_GUID        *TableGuid,
+  IN OUT VOID            **Table
+  )
+/*++
+
+Routine Description:
+  Convert ACPI Table /Smbios Table /MP Table if its location is lower than Address:0x100000
+  Assumption here:
+   As in legacy Bios, ACPI/Smbios/MP table is required to place in E/F Seg, 
+   So here we just check if the range is E/F seg, 
+   and if Not, assume the Memory type is EfiACPIReclaimMemory/EfiACPIMemoryNVS
+
+Arguments:
+  TableGuid - Guid of the table
+  Table     - pointer to the table  
+
+Returns:
+  EFI_SUCEESS - Convert Table successfully
+  Other       - Failed
+
+--*/
+{
+  EFI_STATUS      Status;
+  VOID            *AcpiHeader;
+  UINTN           AcpiTableLen;
+  
+  //
+  // If match acpi guid (1.0, 2.0, or later), Convert ACPI table according to version. 
+  //
+  AcpiHeader = (VOID*)(UINTN)(*(UINT64 *)(*Table));
+  
+  if (CompareGuid(TableGuid, &gEfiAcpiTableGuid) || CompareGuid(TableGuid, &gEfiAcpi20TableGuid)){
+    if (((EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)AcpiHeader)->Reserved == 0x00){
+      //
+      // If Acpi 1.0 Table, then RSDP structure doesn't contain Length field, use structure size
+      //
+      AcpiTableLen = sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
+    } else if (((EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)AcpiHeader)->Reserved >= 0x02){
+      //
+      // If Acpi 2.0 or later, use RSDP Length fied.
+      //
+      AcpiTableLen = ((EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)AcpiHeader)->Length;
+    } else {
+      //
+      // Invalid Acpi Version, return
+      //
+      return EFI_UNSUPPORTED;
+    }
+    Status = ConvertAcpiTable (AcpiTableLen, Table);
+    return Status; 
+  }
+  
+  //
+  // If matches smbios guid, convert Smbios table.
+  //
+  if (CompareGuid(TableGuid, &gEfiSmbiosTableGuid)){
+    Status = ConvertSmbiosTable (Table);
+    return Status;
+  }
+  
+  //
+  // If the table is MP table?
+  //
+  if (CompareGuid(TableGuid, &gEfiMpsTableGuid)){
+    Status = ConvertMpsTable (Table);
+    return Status;
+  }
+  
+  return EFI_UNSUPPORTED;
+}  
+
+
+EFI_STATUS
+ConvertAcpiTable (
+  IN     UINTN                       TableLen,
+  IN OUT VOID                        **Table
+  )
+/*++
+
+Routine Description:
+  Convert RSDP of ACPI Table if its location is lower than Address:0x100000
+  Assumption here:
+   As in legacy Bios, ACPI table is required to place in E/F Seg, 
+   So here we just check if the range is E/F seg, 
+   and if Not, assume the Memory type is EfiACPIReclaimMemory/EfiACPIMemoryNVS
+
+Arguments:
+  TableLen  - Acpi RSDP length
+  Table     - pointer to the table  
+
+Returns:
+  EFI_SUCEESS - Convert Table successfully
+  Other       - Failed
+
+--*/
+{
+  VOID                  *AcpiTableOri;
+  VOID                  *AcpiTableNew;
+  EFI_STATUS            Status;
+  EFI_PHYSICAL_ADDRESS  BufferPtr;
+
+  
+  AcpiTableOri    =  (VOID *)(UINTN)(*(UINT64*)(*Table));
+  if (((UINTN)AcpiTableOri < 0x100000) && ((UINTN)AcpiTableOri > 0xE0000)) {
+    BufferPtr = EFI_SYSTEM_TABLE_MAX_ADDRESS;
+    Status = gBS->AllocatePages (
+                    AllocateMaxAddress,
+                    EfiACPIMemoryNVS,
+                    EFI_SIZE_TO_PAGES(TableLen),
+                    &BufferPtr
+                    );
+    ASSERT_EFI_ERROR (Status);
+    AcpiTableNew = (VOID *)(UINTN)BufferPtr;
+    CopyMem (AcpiTableNew, AcpiTableOri, TableLen);
+  } else {
+    AcpiTableNew = AcpiTableOri;
+  }
+  //
+  // Change configuration table Pointer
+  //
+  *Table = AcpiTableNew;
+  
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+ConvertSmbiosTable (
+  IN OUT VOID        **Table
+  )
+/*++
+
+Routine Description:
+
+  Convert Smbios Table if the Location of the SMBios Table is lower than Addres 0x100000
+  Assumption here:
+   As in legacy Bios, Smbios table is required to place in E/F Seg, 
+   So here we just check if the range is F seg, 
+   and if Not, assume the Memory type is EfiACPIMemoryNVS/EfiRuntimeServicesData
+Arguments:
+  Table     - pointer to the table
+
+Returns:
+  EFI_SUCEESS - Convert Table successfully
+  Other       - Failed
+
+--*/
+{
+  SMBIOS_TABLE_ENTRY_POINT *SmbiosTableNew;
+  SMBIOS_TABLE_ENTRY_POINT *SmbiosTableOri;
+  EFI_STATUS               Status;
+  UINT32                   SmbiosEntryLen;
+  UINT32                   BufferLen;
+  EFI_PHYSICAL_ADDRESS     BufferPtr;
+  
+  SmbiosTableNew  = NULL;
+  SmbiosTableOri  = NULL;
+  
+  //
+  // Get Smibos configuration Table 
+  //
+  SmbiosTableOri =  (SMBIOS_TABLE_ENTRY_POINT *)(UINTN)(*(UINT64*)(*Table));
+  
+  if ((SmbiosTableOri == NULL) ||
+      ((UINTN)SmbiosTableOri > 0x100000) ||
+      ((UINTN)SmbiosTableOri < 0xF0000)){
+    return EFI_SUCCESS;
+  }
+  //
+  // Relocate the Smibos memory
+  //
+  BufferPtr = EFI_SYSTEM_TABLE_MAX_ADDRESS;
+  if (SmbiosTableOri->SmbiosBcdRevision != 0x21) {
+    SmbiosEntryLen  = SmbiosTableOri->EntryPointLength;
+  } else {
+    //
+    // According to Smbios Spec 2.4, we should set entry point length as 0x1F if version is 2.1
+    //
+    SmbiosEntryLen = 0x1F;
+  }
+  BufferLen = SmbiosEntryLen + SYS_TABLE_PAD(SmbiosEntryLen) + SmbiosTableOri->TableLength;
+  Status = gBS->AllocatePages (
+                  AllocateMaxAddress,
+                  EfiACPIMemoryNVS,
+                  EFI_SIZE_TO_PAGES(BufferLen),
+                  &BufferPtr
+                  );
+  ASSERT_EFI_ERROR (Status);
+  SmbiosTableNew = (SMBIOS_TABLE_ENTRY_POINT *)(UINTN)BufferPtr;
+  CopyMem (
+    SmbiosTableNew, 
+    SmbiosTableOri,
+    SmbiosEntryLen
+    );
+  // 
+  // Get Smbios Structure table address, and make sure the start address is 32-bit align
+  //
+  BufferPtr += SmbiosEntryLen + SYS_TABLE_PAD(SmbiosEntryLen);
+  CopyMem (
+    (VOID *)(UINTN)BufferPtr, 
+    (VOID *)(UINTN)(SmbiosTableOri->TableAddress),
+    SmbiosTableOri->TableLength
+    );
+  SmbiosTableNew->TableAddress = (UINT32)BufferPtr;
+  SmbiosTableNew->IntermediateChecksum = 0;
+  SmbiosTableNew->IntermediateChecksum = 
+          CalculateCheckSum8 ((UINT8*)SmbiosTableNew + 0x10, SmbiosEntryLen -0x10);
+  //
+  // Change the SMBIOS pointer
+  //
+  *Table = SmbiosTableNew;
+  
+  return EFI_SUCCESS;  
+} 
+
+EFI_STATUS
+ConvertMpsTable (
+  IN OUT VOID          **Table
+  )
+/*++
+
+Routine Description:
+
+  Convert MP Table if the Location of the SMBios Table is lower than Addres 0x100000
+  Assumption here:
+   As in legacy Bios, MP table is required to place in E/F Seg, 
+   So here we just check if the range is E/F seg, 
+   and if Not, assume the Memory type is EfiACPIMemoryNVS/EfiRuntimeServicesData
+Arguments:
+  Table     - pointer to the table
+
+Returns:
+  EFI_SUCEESS - Convert Table successfully
+  Other       - Failed
+
+--*/
+{
+  UINT32                                       Data32;
+  UINT32                                       FPLength;
+  EFI_LEGACY_MP_TABLE_FLOATING_POINTER         *MpsFloatingPointerOri;
+  EFI_LEGACY_MP_TABLE_FLOATING_POINTER         *MpsFloatingPointerNew;
+  EFI_LEGACY_MP_TABLE_HEADER                   *MpsTableOri;
+  EFI_LEGACY_MP_TABLE_HEADER                   *MpsTableNew;
+  VOID                                         *OemTableOri;
+  VOID                                         *OemTableNew;
+  EFI_STATUS                                   Status;
+  EFI_PHYSICAL_ADDRESS                         BufferPtr;
+  
+  //
+  // Get MP configuration Table 
+  //
+  MpsFloatingPointerOri = (EFI_LEGACY_MP_TABLE_FLOATING_POINTER *)(UINTN)(*(UINT64*)(*Table));
+  if (!(((UINTN)MpsFloatingPointerOri <= 0x100000) && 
+        ((UINTN)MpsFloatingPointerOri >= 0xF0000))){
+    return EFI_SUCCESS;
+  }
+  //
+  // Get Floating pointer structure length
+  //
+  FPLength = MpsFloatingPointerOri->Length * 16;
+  Data32   = FPLength + SYS_TABLE_PAD (FPLength);
+  MpsTableOri = (EFI_LEGACY_MP_TABLE_HEADER *)(UINTN)(MpsFloatingPointerOri->PhysicalAddress);
+  if (MpsTableOri != NULL) {
+    Data32 += MpsTableOri->BaseTableLength;
+    Data32 += MpsTableOri->ExtendedTableLength;
+    if (MpsTableOri->OemTablePointer != 0x00) {
+      Data32 += SYS_TABLE_PAD (Data32);
+      Data32 += MpsTableOri->OemTableSize;
+    }
+  } else {
+    return EFI_SUCCESS;
+  }
+  //
+  // Relocate memory
+  //
+  BufferPtr = EFI_SYSTEM_TABLE_MAX_ADDRESS;
+  Status = gBS->AllocatePages (
+                  AllocateMaxAddress,
+                  EfiACPIMemoryNVS,
+                  EFI_SIZE_TO_PAGES(Data32),
+                  &BufferPtr
+                  );
+  ASSERT_EFI_ERROR (Status); 
+  MpsFloatingPointerNew = (EFI_LEGACY_MP_TABLE_FLOATING_POINTER *)(UINTN)BufferPtr;
+  CopyMem (MpsFloatingPointerNew, MpsFloatingPointerOri, FPLength);
+  //
+  // If Mp Table exists
+  //
+  if (MpsTableOri != NULL) {
+    //
+    // Get Mps table length, including Ext table
+    //
+    BufferPtr = BufferPtr + FPLength + SYS_TABLE_PAD (FPLength);
+    MpsTableNew = (EFI_LEGACY_MP_TABLE_HEADER *)(UINTN)BufferPtr;
+    CopyMem (MpsTableNew, MpsTableOri, MpsTableOri->BaseTableLength + MpsTableOri->ExtendedTableLength);
+    
+    if ((MpsTableOri->OemTableSize != 0x0000) && (MpsTableOri->OemTablePointer != 0x0000)){
+        BufferPtr += MpsTableOri->BaseTableLength + MpsTableOri->ExtendedTableLength;
+        BufferPtr += SYS_TABLE_PAD (BufferPtr);
+        OemTableNew = (VOID *)(UINTN)BufferPtr;
+        OemTableOri = (VOID *)(UINTN)MpsTableOri->OemTablePointer;
+        CopyMem (OemTableNew, OemTableOri, MpsTableOri->OemTableSize);
+        MpsTableNew->OemTablePointer = (UINT32)(UINTN)OemTableNew;
+    }
+    MpsTableNew->Checksum = 0;
+    MpsTableNew->Checksum = CalculateCheckSum8 ((UINT8*)MpsTableNew, MpsTableOri->BaseTableLength);
+    MpsFloatingPointerNew->PhysicalAddress = (UINT32)(UINTN)MpsTableNew;
+    MpsFloatingPointerNew->Checksum = 0;
+    MpsFloatingPointerNew->Checksum = CalculateCheckSum8 ((UINT8*)MpsFloatingPointerNew, FPLength);
+  }
+  //
+  // Change the pointer
+  //
+  *Table = MpsFloatingPointerNew;
+  
+  return EFI_SUCCESS;  
+} 
+  
+/**
+  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;
+}
+
+/**
+  This function locks platform flash that is not allowed to be updated during normal boot path.
+  The flash layout is platform specific.
+
+  **/
+VOID
+EFIAPI
+PlatformBdsLockNonUpdatableFlash (
+  VOID
+  )
+{
+  return;
+}
diff --git a/CorebootModulePkg/Library/CorebootBdsLib/BdsPlatform.h b/CorebootModulePkg/Library/CorebootBdsLib/BdsPlatform.h
new file mode 100644
index 0000000000..d447f77747
--- /dev/null
+++ b/CorebootModulePkg/Library/CorebootBdsLib/BdsPlatform.h
@@ -0,0 +1,288 @@
+/*++
+
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials                          
+are licensed and made available under the terms and conditions of the BSD License         
+which accompanies this distribution.  The full text of the license may be found at        
+http://opensource.org/licenses/bsd-license.php                                            
+                                                                                          
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+Module Name: 
+
+  BdsPlatform.h
+
+Abstract:
+
+  Head file for BDS Platform specific code
+
+--*/
+
+#ifndef _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
+#define _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
+
+
+#include <PiDxe.h>
+
+#include <IndustryStandard/Pci.h>
+#include <IndustryStandard/Acpi.h>
+#include <IndustryStandard/SmBios.h>
+#include <IndustryStandard/LegacyBiosMpTable.h>
+
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/BaseLib.h>
+#include <Library/PcdLib.h>
+#include <Library/GenericBdsLib.h>
+#include <Library/PlatformBdsLib.h>
+#include <Library/HobLib.h>
+#include <Library/UefiLib.h>
+#include <Library/DxeServicesTableLib.h>
+#include <Library/DevicePathLib.h>
+
+#include <Protocol/PciIo.h>
+
+#include <Guid/Acpi.h>
+#include <Guid/SmBios.h>
+#include <Guid/Mps.h>
+#include <Guid/HobList.h>
+#include <Guid/PciExpressBaseAddress.h>
+#include <Guid/GlobalVariable.h>
+#include <Guid/LdrMemoryDescriptor.h>
+
+extern BDS_CONSOLE_CONNECT_ENTRY  gPlatformConsole[];
+extern EFI_DEVICE_PATH_PROTOCOL   *gPlatformConnectSequence[];
+extern EFI_DEVICE_PATH_PROTOCOL   *gPlatformDriverOption[];
+extern EFI_DEVICE_PATH_PROTOCOL   *gPlatformRootBridges[];
+extern ACPI_HID_DEVICE_PATH       gPnpPs2KeyboardDeviceNode;
+extern ACPI_HID_DEVICE_PATH       gPnp16550ComPortDeviceNode;
+extern UART_DEVICE_PATH           gUartDeviceNode;
+extern VENDOR_DEVICE_PATH         gTerminalTypeDeviceNode;
+//
+//
+//
+#define VarConsoleInpDev        L"ConInDev"
+#define VarConsoleInp           L"ConIn"
+#define VarConsoleOutDev        L"ConOutDev"
+#define VarConsoleOut           L"ConOut"
+#define VarErrorOutDev          L"ErrOutDev"
+#define VarErrorOut             L"ErrOut"
+
+#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 \
+  PNPID_DEVICE_PATH_NODE(0x0A03)
+
+#define gPciIsaBridge \
+  PCI_DEVICE_PATH_NODE(0, 0x1f)
+
+#define gP2PBridge \
+  PCI_DEVICE_PATH_NODE(0, 0x1e)
+
+#define gPnpPs2Keyboard \
+  PNPID_DEVICE_PATH_NODE(0x0303)
+
+#define gPnp16550ComPort \
+  PNPID_DEVICE_PATH_NODE(0x0501)
+
+#define gUart \
+  { \
+    { \
+      MESSAGING_DEVICE_PATH, \
+      MSG_UART_DP, \
+      { \
+        (UINT8) (sizeof (UART_DEVICE_PATH)), \
+        (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) \
+      } \
+    }, \
+    0, \
+    115200, \
+    8, \
+    1, \
+    1 \
+  }
+
+#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 \
+    } \
+  }
+
+#define PCI_CLASS_SCC          0x07
+#define PCI_SUBCLASS_SERIAL    0x00
+#define PCI_IF_16550           0x02
+#define IS_PCI_16550SERIAL(_p)           IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)
+
+#define EFI_SYSTEM_TABLE_MAX_ADDRESS 0xFFFFFFFF
+#define SYS_TABLE_PAD(ptr) (((~ptr) +1) & 0x07 )
+//
+// Platform Root Bridge
+//
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_ROOT_BRIDGE_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           IsaBridge;
+  ACPI_HID_DEVICE_PATH      Keyboard;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_DUMMY_ISA_KEYBOARD_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_DUMMY_ISA_SERIAL_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           VgaDevice;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_DUMMY_PCI_VGA_DEVICE_PATH;
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH      PciRootBridge;
+  PCI_DEVICE_PATH           PciBridge;
+  PCI_DEVICE_PATH           SerialDevice;
+  UART_DEVICE_PATH          Uart;
+  VENDOR_DEVICE_PATH        TerminalType;
+  EFI_DEVICE_PATH_PROTOCOL  End;
+} PLATFORM_DUMMY_PCI_SERIAL_DEVICE_PATH;
+
+//
+// the short form device path for Usb keyboard
+//
+#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;  
+
+extern PLATFORM_ROOT_BRIDGE_DEVICE_PATH  gPlatformRootBridge0;
+
+//
+// Platform BDS Functions
+//
+VOID
+PlatformBdsGetDriverOption (
+  IN LIST_ENTRY               *BdsDriverLists
+  );
+
+EFI_STATUS
+BdsMemoryTest (
+  EXTENDMEM_COVERAGE_LEVEL Level
+  );
+
+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
+ProcessCapsules (
+  EFI_BOOT_MODE BootMode
+  );
+
+EFI_STATUS
+PlatformBdsConnectConsole (
+  IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
+  );
+
+EFI_STATUS
+PlatformBdsNoConsoleAction (
+  VOID
+  );
+
+EFI_STATUS
+ConvertMpsTable (
+  IN OUT  VOID     **Table
+  );
+  
+EFI_STATUS
+ConvertSmbiosTable (
+  IN OUT VOID       **Table
+  );
+  
+EFI_STATUS
+ConvertAcpiTable (
+ IN      UINTN      TableLen,
+ IN OUT  VOID       **Table
+  );
+
+EFI_STATUS
+ConvertSystemTable (
+ IN     EFI_GUID   *TableGuid,
+ IN OUT VOID       **Table
+  );
+
+VOID
+PlatformBdsEnterFrontPage (
+  IN UINT16                 TimeoutDefault,
+  IN BOOLEAN                ConnectAllHappened
+  );
+
+#endif // _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
diff --git a/CorebootModulePkg/Library/CorebootBdsLib/PlatformBds.inf b/CorebootModulePkg/Library/CorebootBdsLib/PlatformBds.inf
new file mode 100644
index 0000000000..578c74afae
--- /dev/null
+++ b/CorebootModulePkg/Library/CorebootBdsLib/PlatformBds.inf
@@ -0,0 +1,65 @@
+## @file
+#
+# Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
+# This program and the accompanying materials                          
+# are licensed and made available under the terms and conditions of the BSD License         
+# which accompanies this distribution.  The full text of the license may be found at        
+# http://opensource.org/licenses/bsd-license.php                                            
+#                                                                                           
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+# 
+#  Module Name:
+#
+#    PlatformBds.inf
+#
+#  Abstract:
+#
+#    Component description file for Bds module.
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = CorebootBds
+  FILE_GUID                      = A6F691AC-31C8-4444-854C-E2C1A6950F92
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = PlatformBdsLib|DXE_DRIVER
+
+[Sources]
+  BdsPlatform.c
+  PlatformData.c
+  BdsPlatform.h
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  CorebootModulePkg/CorebootModulePkg.dec
+  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
+
+[LibraryClasses]
+  BaseLib
+  MemoryAllocationLib
+  UefiBootServicesTableLib
+  BaseMemoryLib
+  DebugLib
+  PcdLib
+  GenericBdsLib
+  HobLib
+  UefiLib
+  DevicePathLib
+
+[Guids]
+  gEfiGlobalVariableGuid
+  gEfiPciExpressBaseAddressGuid
+  gEfiAcpi20TableGuid
+  gEfiMpsTableGuid
+  gEfiSmbiosTableGuid
+  gEfiAcpiTableGuid
+  gLdrMemoryDescriptorGuid
+
+[Pcd]
+  gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut
+  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile
+
diff --git a/CorebootModulePkg/Library/CorebootBdsLib/PlatformData.c b/CorebootModulePkg/Library/CorebootBdsLib/PlatformData.c
new file mode 100644
index 0000000000..fbdcc7de81
--- /dev/null
+++ b/CorebootModulePkg/Library/CorebootBdsLib/PlatformData.c
@@ -0,0 +1,161 @@
+/*++
+
+Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials                          
+are licensed and made available under the terms and conditions of the BSD License         
+which accompanies this distribution.  The full text of the license may be found at        
+http://opensource.org/licenses/bsd-license.php                                            
+                                                                                          
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+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 = 3;
+
+ACPI_HID_DEVICE_PATH       gPnpPs2KeyboardDeviceNode  = gPnpPs2Keyboard;
+ACPI_HID_DEVICE_PATH       gPnp16550ComPortDeviceNode = gPnp16550ComPort;
+UART_DEVICE_PATH           gUartDeviceNode            = gUart;
+VENDOR_DEVICE_PATH         gTerminalTypeDeviceNode    = gPcAnsiTerminal;
+
+//
+// Predefined platform root bridge
+//
+PLATFORM_ROOT_BRIDGE_DEVICE_PATH  gPlatformRootBridge0 = {
+  gPciRootBridge,
+  gEndEntire
+};
+
+EFI_DEVICE_PATH_PROTOCOL          *gPlatformRootBridges[] = {
+  (EFI_DEVICE_PATH_PROTOCOL *) &gPlatformRootBridge0,
+  NULL
+};
+
+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
+  },
+
+  { 
+    END_DEVICE_PATH_TYPE, 
+    END_ENTIRE_DEVICE_PATH_SUBTYPE, 
+    {
+      END_DEVICE_PATH_LENGTH, 
+      0
+    }
+  }
+};
+
+/*
+//
+// Platform specific Dummy ISA keyboard device path
+//
+PLATFORM_DUMMY_ISA_KEYBOARD_DEVICE_PATH     gDummyIsaKeyboardDevicePath = {
+  gPciRootBridge,
+  gPciIsaBridge,
+  gPnpPs2Keyboard,
+  gEndEntire
+};
+
+//
+// Platform specific Dummy ISA serial device path
+//
+PLATFORM_DUMMY_ISA_SERIAL_DEVICE_PATH   gDummyIsaSerialDevicePath = {
+  gPciRootBridge,
+  gPciIsaBridge,
+  gPnp16550ComPort,
+  gUart,
+  gPcAnsiTerminal,
+  gEndEntire
+};
+
+//
+// Platform specific Dummy PCI VGA device path
+//
+PLATFORM_DUMMY_PCI_VGA_DEVICE_PATH gDummyPciVgaDevicePath = {
+  gPciRootBridge,
+  PCI_DEVICE_PATH_NODE(0, 0x2),
+  gEndEntire
+};
+
+//
+// Platform specific Dummy PCI serial device path
+//
+PLATFORM_DUMMY_PCI_SERIAL_DEVICE_PATH gDummyPciSerialDevicePath = {
+  gPciRootBridge,
+  gP2PBridge,
+  PCI_DEVICE_PATH_NODE(0, 0x0),
+  gUart,
+  gPcAnsiTerminal,
+  gEndEntire
+};
+*/
+//
+// Predefined platform default console device path
+//
+BDS_CONSOLE_CONNECT_ENTRY         gPlatformConsole[] = {
+  //
+  // need update dynamically
+  //
+//  {
+//    (EFI_DEVICE_PATH_PROTOCOL *) &gDummyIsaSerialDevicePath,
+//    (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
+//  },
+//  {
+//    (EFI_DEVICE_PATH_PROTOCOL *) &gDummyIsaKeyboardDevicePath,
+//    (CONSOLE_IN | STD_ERROR)
+//  },
+//  {
+//    (EFI_DEVICE_PATH_PROTOCOL *) &gDummyPciVgaDevicePath,
+//    CONSOLE_OUT
+//  },
+//  {
+//    (EFI_DEVICE_PATH_PROTOCOL *) &gDummyPciSerialDevicePath,
+//    (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
+//  },
+  {
+    (EFI_DEVICE_PATH_PROTOCOL*) &gUsbClassKeyboardDevicePath, 
+    CONSOLE_IN
+  },
+  {
+    NULL,
+    0
+  }
+};
+
+//
+// Predefined platform specific driver option
+//
+EFI_DEVICE_PATH_PROTOCOL    *gPlatformDriverOption[] = { NULL };
+
+//
+// Predefined platform connect sequence
+//
+EFI_DEVICE_PATH_PROTOCOL    *gPlatformConnectSequence[] = { NULL };
+
diff --git a/CorebootPayloadPkg/CorebootPayloadPkg.fdf b/CorebootPayloadPkg/CorebootPayloadPkg.fdf
index a39e3999ba..623ff9c344 100644
--- a/CorebootPayloadPkg/CorebootPayloadPkg.fdf
+++ b/CorebootPayloadPkg/CorebootPayloadPkg.fdf
@@ -95,8 +95,9 @@ INF MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntime
 
 INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
 INF UefiCpuPkg/CpuDxe/CpuDxe.inf
-INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
-INF MdeModulePkg/Application/UiApp/UiApp.inf
+
+INF  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
+
 !if $(USE_HPET_TIMER) == TRUE
 INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
 !else
diff --git a/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc b/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc
index e838aca61d..a329b78f08 100644
--- a/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc
+++ b/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc
@@ -165,6 +165,7 @@
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
   OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
+  GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
   SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
@@ -183,7 +184,7 @@
   ResetSystemLib|CorebootPayloadPkg/Library/ResetSystemLib/ResetSystemLib.inf
   SerialPortLib|CorebootModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   PlatformHookLib|CorebootPayloadPkg/Library/PlatformHookLib/PlatformHookLib.inf
-  PlatformBootManagerLib|CorebootPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+  PlatformBdsLib|CorebootModulePkg/Library/CorebootBdsLib/PlatformBds.inf
   IoApicLib|PcAtChipsetPkg/Library/BaseIoApicLib/BaseIoApicLib.inf
   CbPlatformSupportLib|CorebootModulePkg/Library/CbPlatformSupportLibNull/CbPlatformSupportLibNull.inf
 
@@ -396,13 +397,12 @@
   #
   MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
   UefiCpuPkg/CpuDxe/CpuDxe.inf
-  MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
-  MdeModulePkg/Application/UiApp/UiApp.inf {
+  
+  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf {
     <LibraryClasses>
-      NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
-      NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
-      NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+      PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
+
 !if $(USE_HPET_TIMER) == TRUE
   PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
 !else
diff --git a/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc b/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc
index c25d821fd4..790efd7810 100644
--- a/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc
+++ b/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc
@@ -165,6 +165,7 @@
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
   OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
+  GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
   SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
@@ -183,7 +184,7 @@
   ResetSystemLib|CorebootPayloadPkg/Library/ResetSystemLib/ResetSystemLib.inf
   SerialPortLib|CorebootModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
   PlatformHookLib|CorebootPayloadPkg/Library/PlatformHookLib/PlatformHookLib.inf
-  PlatformBootManagerLib|CorebootPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+  PlatformBdsLib|CorebootModulePkg/Library/CorebootBdsLib/PlatformBds.inf
   IoApicLib|PcAtChipsetPkg/Library/BaseIoApicLib/BaseIoApicLib.inf
   CbPlatformSupportLib|CorebootModulePkg/Library/CbPlatformSupportLibNull/CbPlatformSupportLibNull.inf
 
@@ -397,13 +398,12 @@
   #
   MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
   UefiCpuPkg/CpuDxe/CpuDxe.inf
-  MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
-  MdeModulePkg/Application/UiApp/UiApp.inf {
+  
+  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf {
     <LibraryClasses>
-      NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
-      NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
-      NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+      PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   }
+
 !if $(USE_HPET_TIMER) == TRUE
   PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf
 !else
-- 
2.13.2.932.g7449e964c-goog

