[edk2] Silicon/Hisilicon: switch to NonDiscoverable driver for EHCI

Message ID 20170824202132.24624-1-ard.biesheuvel@linaro.org
State New
Headers show
Series
  • [edk2] Silicon/Hisilicon: switch to NonDiscoverable driver for EHCI
Related show

Commit Message

Ard Biesheuvel Aug. 24, 2017, 8:21 p.m.
Replace the open coded PCI 'emulation' with a simple call into
the NonDiscoverable device registration library, and fix up all
platform .DSCs/FDFs accordingly.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

---
I can't test this myself, unfortunately.

 Platform/Hisilicon/D02/Pv660D02.dsc                             |   1 +
 Platform/Hisilicon/D02/Pv660D02.fdf                             |   1 +
 Platform/Hisilicon/D03/D03.dsc                                  |   1 +
 Platform/Hisilicon/D03/D03.fdf                                  |   1 +
 Platform/Hisilicon/D05/D05.dsc                                  |   1 +
 Platform/Hisilicon/D05/D05.fdf                                  |   1 +
 Platform/Hisilicon/HiKey/HiKey.dsc                              |   2 -
 Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.c   | 669 +-------------------
 Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.h   |  82 ---
 Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf |  26 +-
 10 files changed, 19 insertions(+), 766 deletions(-)

-- 
2.11.0

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Comments

Ard Biesheuvel Aug. 24, 2017, 8:23 p.m. | #1
On 24 August 2017 at 21:21, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> Replace the open coded PCI 'emulation' with a simple call into

> the NonDiscoverable device registration library, and fix up all

> platform .DSCs/FDFs accordingly.

>

> Contributed-under: TianoCore Contribution Agreement 1.1

> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

> ---

> I can't test this myself, unfortunately.

>

>  Platform/Hisilicon/D02/Pv660D02.dsc                             |   1 +

>  Platform/Hisilicon/D02/Pv660D02.fdf                             |   1 +

>  Platform/Hisilicon/D03/D03.dsc                                  |   1 +

>  Platform/Hisilicon/D03/D03.fdf                                  |   1 +

>  Platform/Hisilicon/D05/D05.dsc                                  |   1 +

>  Platform/Hisilicon/D05/D05.fdf                                  |   1 +

>  Platform/Hisilicon/HiKey/HiKey.dsc                              |   2 -


Apologies, this hunk does not belong in this patch. I intended to
include the following instead.

diff --git a/Silicon/Hisilicon/Hisilicon.dsc.inc
b/Silicon/Hisilicon/Hisilicon.dsc.inc
index a48c4773adc2..fadd352192ee 100644
--- a/Silicon/Hisilicon/Hisilicon.dsc.inc
+++ b/Silicon/Hisilicon/Hisilicon.dsc.inc
@@ -16,10 +16,8 @@
 [LibraryClasses.common]
 !if $(TARGET) == RELEASE
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-  UncachedMemoryAllocationLib|ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf
 !else
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
-  UncachedMemoryAllocationLib|ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf
 !endif
   DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf

@@ -114,6 +112,8 @@
   ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
   LzmaDecompressLib|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf

+  NonDiscoverableDeviceRegistrationLib|MdeModulePkg/Library/NonDiscoverableDeviceRegistrationLib/NonDiscoverableDeviceRegistrationLib.inf
+
   #
   # It is not possible to prevent the ARM compiler for generic
intrinsic functions.
   # This library provides the instrinsic functions generate by a
given compiler.
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Leif Lindholm Aug. 29, 2017, 3 p.m. | #2
On Thu, Aug 24, 2017 at 09:21:32PM +0100, Ard Biesheuvel wrote:
> Replace the open coded PCI 'emulation' with a simple call into

> the NonDiscoverable device registration library, and fix up all

> platform .DSCs/FDFs accordingly.

> 

> Contributed-under: TianoCore Contribution Agreement 1.1

> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>


D02 no longer builds after (the fixed version, based on your
follow-up) is applied:

edk2-platforms/Platform/Hisilicon/D02/Pv660D02.dsc(...): error 4000:
Instance of library class [UncachedMemoryAllocationLib] is not found in
        [/work/maint/edk2-platforms/Silicon/Hisilicon/Drivers/SasV1Dxe/SasV1Dxe.inf]
        [AARCH64]
        consumed by module [/work/maint/edk2-platforms/Silicon/Hisilicon/Drivers/SasV1Dxe/SasV1Dxe.inf]

That does appear to be a false dependency though, so if you can fold
in its deletion:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>


> ---

> I can't test this myself, unfortunately.

> 

>  Platform/Hisilicon/D02/Pv660D02.dsc                             |   1 +

>  Platform/Hisilicon/D02/Pv660D02.fdf                             |   1 +

>  Platform/Hisilicon/D03/D03.dsc                                  |   1 +

>  Platform/Hisilicon/D03/D03.fdf                                  |   1 +

>  Platform/Hisilicon/D05/D05.dsc                                  |   1 +

>  Platform/Hisilicon/D05/D05.fdf                                  |   1 +

>  Platform/Hisilicon/HiKey/HiKey.dsc                              |   2 -

>  Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.c   | 669 +-------------------

>  Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.h   |  82 ---

>  Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf |  26 +-

>  10 files changed, 19 insertions(+), 766 deletions(-)

> 

> diff --git a/Platform/Hisilicon/D02/Pv660D02.dsc b/Platform/Hisilicon/D02/Pv660D02.dsc

> index 99d6972c7542..423f7d77ff8d 100644

> --- a/Platform/Hisilicon/D02/Pv660D02.dsc

> +++ b/Platform/Hisilicon/D02/Pv660D02.dsc

> @@ -397,6 +397,7 @@

>    # USB Support

>    #

>    Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf

> +  MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf

>    MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf

>    MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf

>    MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf

> diff --git a/Platform/Hisilicon/D02/Pv660D02.fdf b/Platform/Hisilicon/D02/Pv660D02.fdf

> index 2d6cdcd9f649..e0bb0ab2733c 100644

> --- a/Platform/Hisilicon/D02/Pv660D02.fdf

> +++ b/Platform/Hisilicon/D02/Pv660D02.fdf

> @@ -257,6 +257,7 @@ READ_LOCK_STATUS   = TRUE

>    # USB Support

>    #

>    INF Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf

> +  INF MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf

>    INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf

>    INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf

>    INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf

> diff --git a/Platform/Hisilicon/D03/D03.dsc b/Platform/Hisilicon/D03/D03.dsc

> index fc675c17ecae..6363b7eeec50 100644

> --- a/Platform/Hisilicon/D03/D03.dsc

> +++ b/Platform/Hisilicon/D03/D03.dsc

> @@ -408,6 +408,7 @@

>    # Usb Support

>    #

>    Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf

> +  MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf

>    MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf

>    Platform/Hisilicon/D03/Drivers/OhciDxe/OhciDxe.inf

>    MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf

> diff --git a/Platform/Hisilicon/D03/D03.fdf b/Platform/Hisilicon/D03/D03.fdf

> index d831b42a1a52..b62b90816a6b 100644

> --- a/Platform/Hisilicon/D03/D03.fdf

> +++ b/Platform/Hisilicon/D03/D03.fdf

> @@ -205,6 +205,7 @@ READ_LOCK_STATUS   = TRUE

>    #

>  

>    INF Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf

> +  INF MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf

>    INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf

>    INF Platform/Hisilicon/D03/Drivers/OhciDxe/OhciDxe.inf

>    INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf

> diff --git a/Platform/Hisilicon/D05/D05.dsc b/Platform/Hisilicon/D05/D05.dsc

> index 603cf34b8408..35c319757ef8 100644

> --- a/Platform/Hisilicon/D05/D05.dsc

> +++ b/Platform/Hisilicon/D05/D05.dsc

> @@ -528,6 +528,7 @@

>    # Usb Support

>    #

>    Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf

> +  MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf

>    MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf

>    MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf

>    MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf

> diff --git a/Platform/Hisilicon/D05/D05.fdf b/Platform/Hisilicon/D05/D05.fdf

> index 6cd7239d9442..b6d0e4252375 100644

> --- a/Platform/Hisilicon/D05/D05.fdf

> +++ b/Platform/Hisilicon/D05/D05.fdf

> @@ -209,6 +209,7 @@ READ_LOCK_STATUS   = TRUE

>    #

>  

>    INF Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf

> +  INF MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf

>    INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf

>    INF Platform/Hisilicon/D05/Drivers/OhciDxe/OhciDxe.inf

>    INF MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf

> diff --git a/Platform/Hisilicon/HiKey/HiKey.dsc b/Platform/Hisilicon/HiKey/HiKey.dsc

> index 1bc8ae4ce8f7..9accf781c25f 100644

> --- a/Platform/Hisilicon/HiKey/HiKey.dsc

> +++ b/Platform/Hisilicon/HiKey/HiKey.dsc

> @@ -110,8 +110,6 @@

>    UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf

>    DmaLib|ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf

>  

> -  UncachedMemoryAllocationLib|ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf

> -

>    # Network Libraries

>    UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf

>    NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf

> diff --git a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.c b/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.c

> index 0cb1e8049a26..706eb123f2e6 100644

> --- a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.c

> +++ b/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.c

> @@ -13,611 +13,9 @@

>  *

>  **/

>  

> -#include "VirtualEhciPciIo.h"

> -#include <Protocol/PciRootBridgeIo.h>

> -

> -UINT32 mUsbMemBase;

> -UINTN mSegmentNumber  = 0;

> -// Use 0xFF for the virtual PCI devices

> -UINTN mBusNumber      = 0xFF;

> -UINTN mDeviceNumber   = 0;

> -UINTN mFunctionNumber = 0;

> -

> -typedef struct {

> -  EFI_PHYSICAL_ADDRESS              HostAddress;

> -  EFI_PHYSICAL_ADDRESS              DeviceAddress;

> -  UINTN                             NumberOfBytes;

> -  EFI_PCI_IO_PROTOCOL_OPERATION     Operation;

> -  BOOLEAN                           DoubleBuffer;

> -} MEM_MAP_INFO_INSTANCE;

> -

> -

> -EFI_CPU_ARCH_PROTOCOL      *gCpu;

> -

> -

> -EHCI_PCI_CONFIG mEhciPciConfig = {

> -  {

> -    0x00,//UINT16  VendorId;

> -    0x00,//UINT16  DeviceId;

> -    0x00,//UINT16  Command;

> -    0x0010,//UINT16  Status;

> -    0x00,//UINT8   RevisionID;

> -    {

> -      PCI_IF_EHCI,//UINT8   ClassCode[3];

> -      PCI_CLASS_SERIAL_USB,

> -      PCI_CLASS_SERIAL

> -    },

> -    0x00,//UINT8   CacheLineSize;

> -    0x00,//UINT8   LatencyTimer;

> -    0x00,//UINT8   HeaderType;

> -    0x00//UINT8   BIST;

> -  },

> -  {

> -    {

> -      0x00,//UINT32  Bar[6];

> -      0x00,

> -      0x00,

> -      0x00,

> -      0x00,

> -      0x00

> -    },

> -    0x00,//UINT32  CISPtr;

> -    0x00,//UINT16  SubsystemVendorID;

> -    0x00,//UINT16  SubsystemID;

> -    0x00,//UINT32  ExpansionRomBar;

> -    0x40,//UINT8   CapabilityPtr;

> -    {

> -      0x00,//UINT8   Reserved1[3];

> -      0x00,

> -      0x00

> -    },

> -    0x00,//UINT32  Reserved2;

> -    0x00,//UINT8   InterruptLine;

> -    0x00,//UINT8   InterruptPin;

> -    0x00,//UINT8   MinGnt;

> -    0x00//UINT8   MaxLat;

> -  },

> -    0x0A,//  UINT8 CapabilityID offset 0x40

> -    0x00,// UINT8 NextItemPtr

> -    0x2000 //UINT16 DebugPort

> -};

> -

> -

> -

> -EFI_STATUS

> -EhciPciIoPollMem (

> -  IN EFI_PCI_IO_PROTOCOL           *This,

> -  IN  EFI_PCI_IO_PROTOCOL_WIDTH    Width,

> -  IN  UINT8                        BarIndex,

> -  IN  UINT64                       Offset,

> -  IN  UINT64                       Mask,

> -  IN  UINT64                       Value,

> -  IN  UINT64                       Delay,

> -  OUT UINT64                       *Result

> -  )

> -{

> -  ASSERT (FALSE);

> -  return EFI_UNSUPPORTED;

> -}

> -

> -EFI_STATUS

> -EhciPciIoPollIo (

> -  IN EFI_PCI_IO_PROTOCOL           *This,

> -  IN  EFI_PCI_IO_PROTOCOL_WIDTH    Width,

> -  IN  UINT8                        BarIndex,

> -  IN  UINT64                       Offset,

> -  IN  UINT64                       Mask,

> -  IN  UINT64                       Value,

> -  IN  UINT64                       Delay,

> -  OUT UINT64                       *Result

> -  )

> -{

> -  ASSERT (FALSE);

> -  return EFI_UNSUPPORTED;

> -}

> -

> -EFI_STATUS

> -EhciPciIoMemRead (

> -  IN EFI_PCI_IO_PROTOCOL              *This,

> -  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,

> -  IN     UINT8                        BarIndex,

> -  IN     UINT64                       Offset,

> -  IN     UINTN                        Count,

> -  IN OUT VOID                         *Buffer

> -  )

> -{

> -  UINT32 i;

> -

> -  if ((UINT32)Width >= EfiPciIoWidthMaximum) {

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  if (Buffer == NULL) {

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  if (BarIndex != 0) {

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  Width     = Width & 0x03;

> -

> -  //

> -  // Loop for each iteration and move the data

> -  //

> -  switch (Width) {

> -  case EfiPciWidthUint8:

> -    for (i = 0; i < Count; i++){

> -      *((UINT8 *)Buffer + i)= MmioRead8(mUsbMemBase + Offset + i);

> -    }

> -    break;

> -  case EfiPciWidthUint16:

> -    for (i = 0; i < Count; i++){

> -      *((UINT16 *)Buffer + i)= MmioRead16(mUsbMemBase + Offset + i * 2);

> -    }

> -    break;

> -  case EfiPciWidthUint32:

> -    for (i = 0; i < Count; i++){

> -      *((UINT32 *)Buffer + i)= MmioRead32(mUsbMemBase + Offset + i * 4);

> -    }

> -    break;

> -  case EfiPciWidthUint64:

> -    for (i = 0; i < Count; i++){

> -      *((UINT64 *)Buffer + i)= MmioRead64(mUsbMemBase + Offset + i * 8);

> -    }

> -    break;

> -  default:

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  return EFI_SUCCESS;

> -}

> -

> -EFI_STATUS

> -EhciPciIoMemWrite (

> -  IN EFI_PCI_IO_PROTOCOL              *This,

> -  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,

> -  IN     UINT8                        BarIndex,

> -  IN     UINT64                       Offset,

> -  IN     UINTN                        Count,

> -  IN OUT VOID                         *Buffer

> -  )

> -{

> -  UINT32 i;

> -

> -  if ((UINT32)Width >= EfiPciIoWidthMaximum) {

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  if (Buffer == NULL) {

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  Width     = Width & 0x03;

> -

> -  //

> -  // Loop for each iteration and move the data

> -  //

> -  switch (Width) {

> -  case EfiPciWidthUint8:

> -    for (i = 0; i < Count; i++){

> -      MmioWrite8(mUsbMemBase + Offset + i, *((UINT8 *)Buffer + i));

> -    }

> -    break;

> -  case EfiPciWidthUint16:

> -    for (i = 0; i < Count; i++){

> -      MmioWrite16(mUsbMemBase + Offset + i * 2, *((UINT16 *)Buffer + i));

> -    }

> -    break;

> -  case EfiPciWidthUint32:

> -    for (i = 0; i < Count; i++){

> -      MmioWrite32(mUsbMemBase + Offset + i * 4, *((UINT32 *)Buffer + i));

> -    }

> -    break;

> -  case EfiPciWidthUint64:

> -    for (i = 0; i < Count; i++){

> -      MmioWrite64(mUsbMemBase + Offset + i * 8, *((UINT64 *)Buffer + i));

> -    }

> -    break;

> -  default:

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  return EFI_SUCCESS;

> -

> -}

> -

> -EFI_STATUS

> -EhciPciIoIoRead (

> -  IN EFI_PCI_IO_PROTOCOL              *This,

> -  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,

> -  IN     UINT8                        BarIndex,

> -  IN     UINT64                       Offset,

> -  IN     UINTN                        Count,

> -  IN OUT VOID                         *Buffer

> -  )

> -{

> -  ASSERT (FALSE);

> -  return EFI_UNSUPPORTED;

> -}

> -

> -EFI_STATUS

> -EhciPciIoIoWrite (

> -  IN EFI_PCI_IO_PROTOCOL              *This,

> -  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,

> -  IN     UINT8                        BarIndex,

> -  IN     UINT64                       Offset,

> -  IN     UINTN                        Count,

> -  IN OUT VOID                         *Buffer

> -  )

> -{

> -  ASSERT (FALSE);

> -  return EFI_UNSUPPORTED;

> -}

> -

> -EFI_STATUS

> -EhciPciIoPciRead (

> -  IN     EFI_PCI_IO_PROTOCOL       *This,

> -  IN     EFI_PCI_IO_PROTOCOL_WIDTH  Width,

> -  IN     UINT32                     Offset,

> -  IN     UINTN                      Count,

> -  IN OUT VOID                      *Buffer

> -  )

> -{

> -  UINT32 i;

> -  UINT8 *DataPtr;

> -

> -  Width     = Width & 0x03;

> -

> -  if (Offset < sizeof (EHCI_PCI_CONFIG) / sizeof (UINT8)){

> -

> -    DataPtr = (UINT8 *)(&mEhciPciConfig) + Offset;

> -

> -    switch (Width) {

> -    case EfiPciWidthUint8:

> -      for (i = 0; i < Count; i++){

> -        *((UINT8 *)Buffer + i)= *(DataPtr + i);

> -      }

> -      break;

> -    case EfiPciWidthUint16:

> -      for (i = 0; i < Count; i++){

> -        *((UINT16 *)Buffer + i)= *((UINT16 *)DataPtr + i);

> -      }

> -      break;

> -    case EfiPciWidthUint32:

> -      for (i = 0; i < Count; i++){

> -        *(UINT32 *)(Buffer + i)= *((UINT32 *)DataPtr + i);

> -      }

> -      break;

> -    case EfiPciWidthUint64:

> -      for (i = 0; i < Count; i++){

> -        *(UINT64 *)(Buffer + i)= *((UINT64 *)DataPtr + i);

> -      }

> -      break;

> -    default:

> -      return EFI_INVALID_PARAMETER;

> -    }

> -

> -  } else {

> -    switch (Width) {

> -    case EfiPciWidthUint8:

> -        *(UINT8 *)Buffer = 0xFF;

> -      break;

> -    case EfiPciWidthUint16:

> -        *(UINT16 *)Buffer = 0xFFFF;

> -      break;

> -    case EfiPciWidthUint32:

> -        *(UINT32 *)Buffer = 0xFFFFFFFF;

> -      break;

> -    case EfiPciWidthUint64:

> -        *(UINT64 *)Buffer = 0xFFFFFFFFFFFFFFFF;

> -      break;

> -    default:

> -      return EFI_INVALID_PARAMETER;

> -    }

> -  }

> -

> -  return EFI_SUCCESS;

> -}

> -

> -EFI_STATUS

> -EhciPciIoPciWrite (

> -  IN EFI_PCI_IO_PROTOCOL              *This,

> -  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,

> -  IN     UINT32                       Offset,

> -  IN     UINTN                        Count,

> -  IN OUT VOID                         *Buffer

> -  )

> -{

> -

> -  return EFI_SUCCESS;

> -}

> -

> -EFI_STATUS

> -EhciPciIoCopyMem (

> -  IN EFI_PCI_IO_PROTOCOL              *This,

> -  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,

> -  IN     UINT8                        DestBarIndex,

> -  IN     UINT64                       DestOffset,

> -  IN     UINT8                        SrcBarIndex,

> -  IN     UINT64                       SrcOffset,

> -  IN     UINTN                        Count

> -  )

> -{

> -  ASSERT (FALSE);

> -  return EFI_UNSUPPORTED;

> -}

> -

> -EFI_STATUS

> -EhciPciIoMap (

> -  IN EFI_PCI_IO_PROTOCOL                *This,

> -  IN     EFI_PCI_IO_PROTOCOL_OPERATION  Operation,

> -  IN     VOID                           *HostAddress,

> -  IN OUT UINTN                          *NumberOfBytes,

> -  OUT    EFI_PHYSICAL_ADDRESS           *DeviceAddress,

> -  OUT    VOID                           **Mapping

> -  )

> -{

> -  EFI_STATUS                      Status;

> -  MEM_MAP_INFO_INSTANCE           *Map;

> -  VOID                            *Buffer;

> -  EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;

> -

> -  if (HostAddress == NULL || NumberOfBytes == NULL || DeviceAddress == NULL || Mapping == NULL) {

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  if ((UINT32)Operation >= EfiPciIoOperationMaximum) {

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  *DeviceAddress = ConvertToPhysicalAddress (HostAddress);

> -

> -  // Remember range so we can flush on the other side

> -  Map = AllocatePool (sizeof (MEM_MAP_INFO_INSTANCE));

> -  if (Map == NULL) {

> -    return  EFI_OUT_OF_RESOURCES;

> -  }

> -

> -  *Mapping = Map;

> -

> -  if ((((UINTN)HostAddress & (EFI_PAGE_SIZE - 1)) != 0) ||

> -      ((*NumberOfBytes % EFI_PAGE_SIZE) != 0)) {

> -

> -    // Get the cacheability of the region

> -    Status = gDS->GetMemorySpaceDescriptor (*DeviceAddress, &GcdDescriptor);

> -    if (EFI_ERROR(Status)) {

> -      return Status;

> -    }

> -

> -    // If the mapped buffer is not an uncached buffer

> -    if ( (GcdDescriptor.Attributes != EFI_MEMORY_WC) &&

> -         (GcdDescriptor.Attributes != EFI_MEMORY_UC) )

> -    {

> -      //

> -      // If the buffer does not fill entire cache lines we must double buffer into

> -      // uncached memory. Device (PCI) address becomes uncached page.

> -      //

> -      Map->DoubleBuffer  = TRUE;

> -      Buffer = UncachedAllocatePages(EFI_SIZE_TO_PAGES (*NumberOfBytes));

> -

> -      if (Buffer == NULL) {

> -        return EFI_OUT_OF_RESOURCES;

> -      }

> -

> -    CopyMem (Buffer,  HostAddress, *NumberOfBytes);

> -      *DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer;

> -    } else {

> -      Map->DoubleBuffer  = FALSE;

> -    }

> -  } else {

> -    Map->DoubleBuffer  = FALSE;

> -

> -    // Flush the Data Cache (should not have any effect if the memory region is uncached)

> -    gCpu->FlushDataCache (gCpu, *DeviceAddress, *NumberOfBytes, EfiCpuFlushTypeWriteBackInvalidate);

> -

> -    Status = gDS->SetMemorySpaceAttributes (*DeviceAddress & ~(BASE_4KB - 1), ALIGN_VALUE (*NumberOfBytes, BASE_4KB), EFI_MEMORY_WC);

> -    if (EFI_ERROR (Status)) {

> -      DEBUG((EFI_D_ERROR, "[%a]:[%dL] SetMemorySpaceAttributes Fail. %r\n", __FUNCTION__, __LINE__, Status));

> -    }

> -  }

> -

> -  Map->HostAddress   = (UINTN)HostAddress;

> -  Map->DeviceAddress = *DeviceAddress;

> -  Map->NumberOfBytes = *NumberOfBytes;

> -  Map->Operation     = Operation;

> -

> -  return EFI_SUCCESS;

> -}

> -

> -EFI_STATUS

> -EhciPciIoUnmap (

> -  IN EFI_PCI_IO_PROTOCOL           *This,

> -  IN  VOID                         *Mapping

> -  )

> -{

> -  MEM_MAP_INFO_INSTANCE *Map;

> -

> -  if (Mapping == NULL) {

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  Map = (MEM_MAP_INFO_INSTANCE *)Mapping;

> -

> -  if (Map->DoubleBuffer) {

> -    if ((Map->Operation == EfiPciIoOperationBusMasterWrite) || (Map->Operation == EfiPciIoOperationBusMasterCommonBuffer)) {

> -      CopyMem ((VOID *)(UINTN)Map->HostAddress, (VOID *)(UINTN)Map->DeviceAddress, Map->NumberOfBytes);

> -    }

> -

> -    if((VOID *)(UINTN)Map->DeviceAddress != NULL) {

> -      UncachedFreePages ((VOID *)(UINTN)Map->DeviceAddress, EFI_SIZE_TO_PAGES (Map->NumberOfBytes));

> -    }

> -

> -

> -  } else {

> -    if (Map->Operation == EfiPciIoOperationBusMasterWrite) {

> -      //

> -      // Make sure we read buffer from uncached memory and not the cache

> -      //

> -      gCpu->FlushDataCache (gCpu, Map->HostAddress, Map->NumberOfBytes, EfiCpuFlushTypeInvalidate);

> -    }

> -  }

> -

> -  FreePool (Map);

> -

> -  return EFI_SUCCESS;

> -}

> -

> -

> -

> -EFI_STATUS

> -EhciPciIoAllocateBuffer (

> -  IN EFI_PCI_IO_PROTOCOL  *This,

> -  IN  EFI_ALLOCATE_TYPE   Type,

> -  IN  EFI_MEMORY_TYPE     MemoryType,

> -  IN  UINTN               Pages,

> -  OUT VOID                **HostAddress,

> -  IN  UINT64              Attributes

> -  )

> -{

> -  UINT32 HcCapParams;

> -

> -  if (Attributes &

> -      (~(EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE |

> -         EFI_PCI_ATTRIBUTE_MEMORY_CACHED         ))) {

> -    return EFI_UNSUPPORTED;

> -  }

> -

> -  if (HostAddress == NULL) {

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  if (MemoryType == EfiBootServicesData) {

> -    HcCapParams  = MmioRead32(mUsbMemBase + EHC_HCCPARAMS_OFFSET);

> -    if ((BOOLEAN)(((HcCapParams) & (HCCP_64BIT)) == (HCCP_64BIT))){

> -      *HostAddress = UncachedAllocatePages(Pages);

> -    } else {

> -      // TODO: We need support allocating UC memory below 4GB strictly

> -      *HostAddress = UncachedAllocatePages(Pages);

> -    }

> -

> -  }else{

> -    return EFI_INVALID_PARAMETER;

> -  }

> -

> -  return EFI_SUCCESS;

> -}

> -

> -

> -EFI_STATUS

> -EhciPciIoFreeBuffer (

> -  IN EFI_PCI_IO_PROTOCOL           *This,

> -  IN  UINTN                        Pages,

> -  IN  VOID                         *HostAddress

> -  )

> -{

> -  UncachedFreePages (HostAddress, Pages);

> -  return EFI_SUCCESS;

> -}

> -

> -EFI_STATUS

> -EhciPciIoFlush (

> -  IN EFI_PCI_IO_PROTOCOL  *This

> -  )

> -{

> -  return EFI_SUCCESS;

> -}

> -

> -EFI_STATUS

> -EhciPciIoGetLocation (

> -  IN   EFI_PCI_IO_PROTOCOL  *This,

> -  OUT  UINTN                *SegmentNumber,

> -  OUT  UINTN                *BusNumber,

> -  OUT  UINTN                *DeviceNumber,

> -  OUT  UINTN                *FunctionNumber

> -  )

> -{

> -

> -  *SegmentNumber  = mSegmentNumber;

> -  *BusNumber      = mBusNumber;

> -  *DeviceNumber   = mDeviceNumber;

> -  *FunctionNumber = mFunctionNumber;

> -

> -  return EFI_SUCCESS;

> -}

> -

> -

> -EFI_STATUS

> -EhciPciIoAttributes (

> -  IN EFI_PCI_IO_PROTOCOL                       *This,

> -  IN  EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION  Operation,

> -  IN  UINT64                                   Attributes,

> -  OUT UINT64                                   *Result OPTIONAL

> -  )

> -{

> -  if (Result != NULL) {

> -     *Result = 0;

> -  }

> -  return EFI_SUCCESS;

> -}

> -

> -EFI_STATUS

> -EhciPciIoGetBarAttributes (

> -  IN EFI_PCI_IO_PROTOCOL             *This,

> -  IN  UINT8                          BarIndex,

> -  OUT UINT64                         *Supports, OPTIONAL

> -  OUT VOID                           **Resources OPTIONAL

> -  )

> -{

> -  ASSERT (FALSE);

> -  return EFI_UNSUPPORTED;

> -}

> -

> -EFI_STATUS

> -EhciPciIoSetBarAttributes (

> -  IN EFI_PCI_IO_PROTOCOL              *This,

> -  IN     UINT64                       Attributes,

> -  IN     UINT8                        BarIndex,

> -  IN OUT UINT64                       *Offset,

> -  IN OUT UINT64                       *Length

> -  )

> -{

> -  ASSERT (FALSE);

> -  return EFI_UNSUPPORTED;

> -}

> -

> -//

> -// Pci Io Protocol Interface

> -//

> -EFI_PCI_IO_PROTOCOL  mEhciPciIoInterface = {

> -  EhciPciIoPollMem,

> -  EhciPciIoPollIo,

> -  {

> -    EhciPciIoMemRead,

> -    EhciPciIoMemWrite

> -  },

> -  {

> -    EhciPciIoIoRead,

> -    EhciPciIoIoWrite

> -  },

> -  {

> -    EhciPciIoPciRead,

> -    EhciPciIoPciWrite

> -  },

> -  EhciPciIoCopyMem,

> -  EhciPciIoMap,

> -  EhciPciIoUnmap,

> -  EhciPciIoAllocateBuffer,

> -  EhciPciIoFreeBuffer,

> -  EhciPciIoFlush,

> -  EhciPciIoGetLocation,

> -  EhciPciIoAttributes,

> -  EhciPciIoGetBarAttributes,

> -  EhciPciIoSetBarAttributes,

> -  0,

> -  NULL

> -};

> -

> +#include <PiDxe.h>

> +#include <Library/NonDiscoverableDeviceRegistrationLib.h>

> +#include <Library/PlatformSysCtrlLib.h>

>  

>  EFI_STATUS

>  EFIAPI

> @@ -626,57 +24,12 @@ EhciVirtualPciIoInitialize (

>    IN EFI_SYSTEM_TABLE   *SystemTable

>    )

>  {

> -  EFI_STATUS          Status;

> -  EFI_HANDLE                    Handle;

> -  EFI_DEV_PATH              EndNode;

> -  EFI_DEV_PATH              Node;

> -  EFI_DEVICE_PATH_PROTOCOL  *DevicePath = NULL;

> -

> -  mUsbMemBase            = PlatformGetEhciBase ();

> -

> -    DEBUG ((EFI_D_ERROR, "mUsbMemBase: 0x%x\n", mUsbMemBase));

> -

> -  // Get the Cpu protocol for later use

> -  Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&gCpu);

> -

> -  //

> -  // Install the pciio protocol, device path protocol

> -  //

> -  Handle = NULL;

> -

> -  Status = gBS->InstallMultipleProtocolInterfaces (

> -                  &Handle,

> -                  &gEfiPciIoProtocolGuid,

> -                  &mEhciPciIoInterface,

> -                  NULL

> -                  );

> -  if (EFI_ERROR (Status)) {

> -    return Status;

> -  }

> -

> -  (void)ZeroMem (&Node, sizeof (Node));

> -  Node.DevPath.Type = HARDWARE_DEVICE_PATH;

> -  Node.DevPath.SubType = HW_PCI_DP;

> -  (void)SetDevicePathNodeLength (&Node.DevPath, sizeof (PCI_DEVICE_PATH));

> -  // Make USB controller device path different from built-in SATA controller

> -  Node.Pci.Function = 1;

> -  Node.Pci.Device = 0;

> -

> -  SetDevicePathEndNode (&EndNode.DevPath);

> -

> -  DevicePath = AppendDevicePathNode (&EndNode.DevPath, &Node.DevPath);

> -

> -  Status = gBS->InstallProtocolInterface (

> -                  &Handle,

> -                  &gEfiDevicePathProtocolGuid,

> -                  EFI_NATIVE_INTERFACE,

> -                  DevicePath

> -                  );

> -  if(EFI_ERROR(Status))

> -  {

> -      DEBUG((EFI_D_ERROR, "[%a]:[%dL] InstallProtocolInterface fail. %r\n", __FUNCTION__, __LINE__, Status));

> -  }

> -

> -

> -  return EFI_SUCCESS;

> +  return RegisterNonDiscoverableMmioDevice (

> +           NonDiscoverableDeviceTypeEhci,

> +           NonDiscoverableDeviceDmaTypeNonCoherent,

> +           NULL,

> +           NULL,

> +           1,

> +           PlatformGetEhciBase (),

> +           SIZE_4KB);

>  }

> diff --git a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.h b/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.h

> deleted file mode 100644

> index ae7a934a11e3..000000000000

> --- a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.h

> +++ /dev/null

> @@ -1,82 +0,0 @@

> -/** @file

> -*

> -*  Copyright (c) 2016, Hisilicon Limited. All rights reserved.

> -*  Copyright (c) 2016, Linaro Limited. All rights reserved.

> -*

> -*  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 _EHCI_PCIIO_H_

> -#define _EHCI_PCIIO_H_

> -

> -#include <Uefi.h>

> -#include <PiDxe.h>

> -

> -#include <Protocol/Usb2HostController.h>

> -#include <Protocol/PciIo.h>

> -#include <Protocol/Cpu.h>

> -

> -#include <Guid/EventGroup.h>

> -

> -#include <Library/DebugLib.h>

> -#include <Library/BaseMemoryLib.h>

> -#include <Library/UefiDriverEntryPoint.h>

> -#include <Library/UefiBootServicesTableLib.h>

> -#include <Library/UefiLib.h>

> -#include <Library/BaseLib.h>

> -#include <Library/MemoryAllocationLib.h>

> -#include <Library/PcdLib.h>

> -#include <Library/IoLib.h>

> -#include <Library/DevicePathLib.h>

> -#include <Library/ArmLib.h>

> -#include <Library/UncachedMemoryAllocationLib.h>

> -#include <Library/DxeServicesTableLib.h>

> -#include <Library/TimerLib.h>

> -#include <Library/CacheMaintenanceLib.h>

> -

> -#include <Library/ReportStatusCodeLib.h>

> -

> -#include <IndustryStandard/Pci.h>

> -#include <Library/PlatformSysCtrlLib.h>

> -

> -#define PCI_CLASS_SERIAL              0x0C

> -#define PCI_CLASS_SERIAL_FIREWIRE     0x00

> -#define PCI_CLASS_SERIAL_ACCESS_BUS   0x01

> -#define PCI_CLASS_SERIAL_SSA          0x02

> -#define PCI_CLASS_SERIAL_USB          0x03

> -#define PCI_IF_EHCI                   0x20

> -#define PCI_CLASS_SERIAL_FIBRECHANNEL 0x04

> -#define PCI_CLASS_SERIAL_SMB          0x05

> -

> -//

> -// Capability register offset

> -//

> -#define EHC_CAPLENGTH_OFFSET    0    // Capability register length offset

> -#define EHC_HCSPARAMS_OFFSET    0x04 // Structural Parameters 04-07h

> -#define EHC_HCCPARAMS_OFFSET    0x08 // Capability parameters offset

> -

> -//

> -// Capability register bit definition

> -//

> -#define HCSP_NPORTS             0x0F // Number of root hub port

> -#define HCSP_PPC                0x10 // Port Power Control

> -#define HCCP_64BIT              0x01 // 64-bit addressing capability

> -

> -

> -typedef struct {

> -  PCI_DEVICE_INDEPENDENT_REGION Hdr;

> -  PCI_DEVICE_HEADER_TYPE_REGION Device;

> -  UINT8 CapabilityID;

> -  UINT8 NextItemPtr;

> -  UINT16 DebugPort;

> -} EHCI_PCI_CONFIG;

> -

> -

> -#endif    // _EHCI_PCIIO_H_

> diff --git a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf b/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf

> index 4a5f5c30bcfa..c07a5b8aa250 100644

> --- a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf

> +++ b/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf

> @@ -25,36 +25,14 @@

>  

>  

>  [Sources]

> -  VirtualEhciPciIo.h

>    VirtualEhciPciIo.c

>  

>  [Packages]

>    MdePkg/MdePkg.dec

>    MdeModulePkg/MdeModulePkg.dec

> -  ArmPkg/ArmPkg.dec

>    Silicon/Hisilicon/HisiPkg.dec

>  

> -[FeaturePcd]

> -

> -

>  [LibraryClasses]

> -  MemoryAllocationLib

> -  BaseLib

> -  UefiLib

> -  UefiBootServicesTableLib

> -  UefiDriverEntryPoint

> -  BaseMemoryLib

> -  DebugLib

> -  PcdLib

> -  IoLib

> -  ReportStatusCodeLib

> -  UncachedMemoryAllocationLib

> -  ArmLib

> -  DxeServicesTableLib

> -  CacheMaintenanceLib

> +  NonDiscoverableDeviceRegistrationLib

>    PlatformSysCtrlLib

> -

> -[Guids]

> -

> -[Protocols]

> -  gEfiPciIoProtocolGuid                         ## TO_START

> +  UefiDriverEntryPoint

> -- 

> 2.11.0

> 

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Ard Biesheuvel Aug. 29, 2017, 3:02 p.m. | #3
On 29 August 2017 at 16:00, Leif Lindholm <leif.lindholm@linaro.org> wrote:
> On Thu, Aug 24, 2017 at 09:21:32PM +0100, Ard Biesheuvel wrote:

>> Replace the open coded PCI 'emulation' with a simple call into

>> the NonDiscoverable device registration library, and fix up all

>> platform .DSCs/FDFs accordingly.

>>

>> Contributed-under: TianoCore Contribution Agreement 1.1

>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

>

> D02 no longer builds after (the fixed version, based on your

> follow-up) is applied:

>

> edk2-platforms/Platform/Hisilicon/D02/Pv660D02.dsc(...): error 4000:

> Instance of library class [UncachedMemoryAllocationLib] is not found in

>         [/work/maint/edk2-platforms/Silicon/Hisilicon/Drivers/SasV1Dxe/SasV1Dxe.inf]

>         [AARCH64]

>         consumed by module [/work/maint/edk2-platforms/Silicon/Hisilicon/Drivers/SasV1Dxe/SasV1Dxe.inf]

>

> That does appear to be a false dependency though, so if you can fold

> in its deletion:

> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>


Ah yes, I already had a separate patch for that, which is why I didn't notice.

Thanks.
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Ard Biesheuvel Aug. 29, 2017, 4:35 p.m. | #4
On 29 August 2017 at 16:02, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> On 29 August 2017 at 16:00, Leif Lindholm <leif.lindholm@linaro.org> wrote:

>> On Thu, Aug 24, 2017 at 09:21:32PM +0100, Ard Biesheuvel wrote:

>>> Replace the open coded PCI 'emulation' with a simple call into

>>> the NonDiscoverable device registration library, and fix up all

>>> platform .DSCs/FDFs accordingly.

>>>

>>> Contributed-under: TianoCore Contribution Agreement 1.1

>>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

>>

>> D02 no longer builds after (the fixed version, based on your

>> follow-up) is applied:

>>

>> edk2-platforms/Platform/Hisilicon/D02/Pv660D02.dsc(...): error 4000:

>> Instance of library class [UncachedMemoryAllocationLib] is not found in

>>         [/work/maint/edk2-platforms/Silicon/Hisilicon/Drivers/SasV1Dxe/SasV1Dxe.inf]

>>         [AARCH64]

>>         consumed by module [/work/maint/edk2-platforms/Silicon/Hisilicon/Drivers/SasV1Dxe/SasV1Dxe.inf]

>>

>> That does appear to be a false dependency though, so if you can fold

>> in its deletion:

>> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

>

> Ah yes, I already had a separate patch for that, which is why I didn't notice.

>


Pushed as

260c957a962e Silicon/Hisilicon/SasV1Dxe: remove bogus
UncachedMemoryAllocationLib ref
2f03dc80017c Silicon/Hisilicon: switch to NonDiscoverable driver for EHCI
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Patch

diff --git a/Platform/Hisilicon/D02/Pv660D02.dsc b/Platform/Hisilicon/D02/Pv660D02.dsc
index 99d6972c7542..423f7d77ff8d 100644
--- a/Platform/Hisilicon/D02/Pv660D02.dsc
+++ b/Platform/Hisilicon/D02/Pv660D02.dsc
@@ -397,6 +397,7 @@ 
   # USB Support
   #
   Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf
+  MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf
   MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
   MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
   MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf
diff --git a/Platform/Hisilicon/D02/Pv660D02.fdf b/Platform/Hisilicon/D02/Pv660D02.fdf
index 2d6cdcd9f649..e0bb0ab2733c 100644
--- a/Platform/Hisilicon/D02/Pv660D02.fdf
+++ b/Platform/Hisilicon/D02/Pv660D02.fdf
@@ -257,6 +257,7 @@  READ_LOCK_STATUS   = TRUE
   # USB Support
   #
   INF Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf
+  INF MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf
   INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
   INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
   INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf
diff --git a/Platform/Hisilicon/D03/D03.dsc b/Platform/Hisilicon/D03/D03.dsc
index fc675c17ecae..6363b7eeec50 100644
--- a/Platform/Hisilicon/D03/D03.dsc
+++ b/Platform/Hisilicon/D03/D03.dsc
@@ -408,6 +408,7 @@ 
   # Usb Support
   #
   Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf
+  MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf
   MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
   Platform/Hisilicon/D03/Drivers/OhciDxe/OhciDxe.inf
   MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
diff --git a/Platform/Hisilicon/D03/D03.fdf b/Platform/Hisilicon/D03/D03.fdf
index d831b42a1a52..b62b90816a6b 100644
--- a/Platform/Hisilicon/D03/D03.fdf
+++ b/Platform/Hisilicon/D03/D03.fdf
@@ -205,6 +205,7 @@  READ_LOCK_STATUS   = TRUE
   #
 
   INF Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf
+  INF MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf
   INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
   INF Platform/Hisilicon/D03/Drivers/OhciDxe/OhciDxe.inf
   INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
diff --git a/Platform/Hisilicon/D05/D05.dsc b/Platform/Hisilicon/D05/D05.dsc
index 603cf34b8408..35c319757ef8 100644
--- a/Platform/Hisilicon/D05/D05.dsc
+++ b/Platform/Hisilicon/D05/D05.dsc
@@ -528,6 +528,7 @@ 
   # Usb Support
   #
   Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf
+  MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf
   MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
   MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf
   MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
diff --git a/Platform/Hisilicon/D05/D05.fdf b/Platform/Hisilicon/D05/D05.fdf
index 6cd7239d9442..b6d0e4252375 100644
--- a/Platform/Hisilicon/D05/D05.fdf
+++ b/Platform/Hisilicon/D05/D05.fdf
@@ -209,6 +209,7 @@  READ_LOCK_STATUS   = TRUE
   #
 
   INF Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf
+  INF MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf
   INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
   INF Platform/Hisilicon/D05/Drivers/OhciDxe/OhciDxe.inf
   INF MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf
diff --git a/Platform/Hisilicon/HiKey/HiKey.dsc b/Platform/Hisilicon/HiKey/HiKey.dsc
index 1bc8ae4ce8f7..9accf781c25f 100644
--- a/Platform/Hisilicon/HiKey/HiKey.dsc
+++ b/Platform/Hisilicon/HiKey/HiKey.dsc
@@ -110,8 +110,6 @@ 
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
   DmaLib|ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf
 
-  UncachedMemoryAllocationLib|ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf
-
   # Network Libraries
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
   NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
diff --git a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.c b/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.c
index 0cb1e8049a26..706eb123f2e6 100644
--- a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.c
+++ b/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.c
@@ -13,611 +13,9 @@ 
 *
 **/
 
-#include "VirtualEhciPciIo.h"
-#include <Protocol/PciRootBridgeIo.h>
-
-UINT32 mUsbMemBase;
-UINTN mSegmentNumber  = 0;
-// Use 0xFF for the virtual PCI devices
-UINTN mBusNumber      = 0xFF;
-UINTN mDeviceNumber   = 0;
-UINTN mFunctionNumber = 0;
-
-typedef struct {
-  EFI_PHYSICAL_ADDRESS              HostAddress;
-  EFI_PHYSICAL_ADDRESS              DeviceAddress;
-  UINTN                             NumberOfBytes;
-  EFI_PCI_IO_PROTOCOL_OPERATION     Operation;
-  BOOLEAN                           DoubleBuffer;
-} MEM_MAP_INFO_INSTANCE;
-
-
-EFI_CPU_ARCH_PROTOCOL      *gCpu;
-
-
-EHCI_PCI_CONFIG mEhciPciConfig = {
-  {
-    0x00,//UINT16  VendorId;
-    0x00,//UINT16  DeviceId;
-    0x00,//UINT16  Command;
-    0x0010,//UINT16  Status;
-    0x00,//UINT8   RevisionID;
-    {
-      PCI_IF_EHCI,//UINT8   ClassCode[3];
-      PCI_CLASS_SERIAL_USB,
-      PCI_CLASS_SERIAL
-    },
-    0x00,//UINT8   CacheLineSize;
-    0x00,//UINT8   LatencyTimer;
-    0x00,//UINT8   HeaderType;
-    0x00//UINT8   BIST;
-  },
-  {
-    {
-      0x00,//UINT32  Bar[6];
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00
-    },
-    0x00,//UINT32  CISPtr;
-    0x00,//UINT16  SubsystemVendorID;
-    0x00,//UINT16  SubsystemID;
-    0x00,//UINT32  ExpansionRomBar;
-    0x40,//UINT8   CapabilityPtr;
-    {
-      0x00,//UINT8   Reserved1[3];
-      0x00,
-      0x00
-    },
-    0x00,//UINT32  Reserved2;
-    0x00,//UINT8   InterruptLine;
-    0x00,//UINT8   InterruptPin;
-    0x00,//UINT8   MinGnt;
-    0x00//UINT8   MaxLat;
-  },
-    0x0A,//  UINT8 CapabilityID offset 0x40
-    0x00,// UINT8 NextItemPtr
-    0x2000 //UINT16 DebugPort
-};
-
-
-
-EFI_STATUS
-EhciPciIoPollMem (
-  IN EFI_PCI_IO_PROTOCOL           *This,
-  IN  EFI_PCI_IO_PROTOCOL_WIDTH    Width,
-  IN  UINT8                        BarIndex,
-  IN  UINT64                       Offset,
-  IN  UINT64                       Mask,
-  IN  UINT64                       Value,
-  IN  UINT64                       Delay,
-  OUT UINT64                       *Result
-  )
-{
-  ASSERT (FALSE);
-  return EFI_UNSUPPORTED;
-}
-
-EFI_STATUS
-EhciPciIoPollIo (
-  IN EFI_PCI_IO_PROTOCOL           *This,
-  IN  EFI_PCI_IO_PROTOCOL_WIDTH    Width,
-  IN  UINT8                        BarIndex,
-  IN  UINT64                       Offset,
-  IN  UINT64                       Mask,
-  IN  UINT64                       Value,
-  IN  UINT64                       Delay,
-  OUT UINT64                       *Result
-  )
-{
-  ASSERT (FALSE);
-  return EFI_UNSUPPORTED;
-}
-
-EFI_STATUS
-EhciPciIoMemRead (
-  IN EFI_PCI_IO_PROTOCOL              *This,
-  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,
-  IN     UINT8                        BarIndex,
-  IN     UINT64                       Offset,
-  IN     UINTN                        Count,
-  IN OUT VOID                         *Buffer
-  )
-{
-  UINT32 i;
-
-  if ((UINT32)Width >= EfiPciIoWidthMaximum) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (Buffer == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (BarIndex != 0) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Width     = Width & 0x03;
-
-  //
-  // Loop for each iteration and move the data
-  //
-  switch (Width) {
-  case EfiPciWidthUint8:
-    for (i = 0; i < Count; i++){
-      *((UINT8 *)Buffer + i)= MmioRead8(mUsbMemBase + Offset + i);
-    }
-    break;
-  case EfiPciWidthUint16:
-    for (i = 0; i < Count; i++){
-      *((UINT16 *)Buffer + i)= MmioRead16(mUsbMemBase + Offset + i * 2);
-    }
-    break;
-  case EfiPciWidthUint32:
-    for (i = 0; i < Count; i++){
-      *((UINT32 *)Buffer + i)= MmioRead32(mUsbMemBase + Offset + i * 4);
-    }
-    break;
-  case EfiPciWidthUint64:
-    for (i = 0; i < Count; i++){
-      *((UINT64 *)Buffer + i)= MmioRead64(mUsbMemBase + Offset + i * 8);
-    }
-    break;
-  default:
-    return EFI_INVALID_PARAMETER;
-  }
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EhciPciIoMemWrite (
-  IN EFI_PCI_IO_PROTOCOL              *This,
-  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,
-  IN     UINT8                        BarIndex,
-  IN     UINT64                       Offset,
-  IN     UINTN                        Count,
-  IN OUT VOID                         *Buffer
-  )
-{
-  UINT32 i;
-
-  if ((UINT32)Width >= EfiPciIoWidthMaximum) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (Buffer == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Width     = Width & 0x03;
-
-  //
-  // Loop for each iteration and move the data
-  //
-  switch (Width) {
-  case EfiPciWidthUint8:
-    for (i = 0; i < Count; i++){
-      MmioWrite8(mUsbMemBase + Offset + i, *((UINT8 *)Buffer + i));
-    }
-    break;
-  case EfiPciWidthUint16:
-    for (i = 0; i < Count; i++){
-      MmioWrite16(mUsbMemBase + Offset + i * 2, *((UINT16 *)Buffer + i));
-    }
-    break;
-  case EfiPciWidthUint32:
-    for (i = 0; i < Count; i++){
-      MmioWrite32(mUsbMemBase + Offset + i * 4, *((UINT32 *)Buffer + i));
-    }
-    break;
-  case EfiPciWidthUint64:
-    for (i = 0; i < Count; i++){
-      MmioWrite64(mUsbMemBase + Offset + i * 8, *((UINT64 *)Buffer + i));
-    }
-    break;
-  default:
-    return EFI_INVALID_PARAMETER;
-  }
-
-  return EFI_SUCCESS;
-
-}
-
-EFI_STATUS
-EhciPciIoIoRead (
-  IN EFI_PCI_IO_PROTOCOL              *This,
-  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,
-  IN     UINT8                        BarIndex,
-  IN     UINT64                       Offset,
-  IN     UINTN                        Count,
-  IN OUT VOID                         *Buffer
-  )
-{
-  ASSERT (FALSE);
-  return EFI_UNSUPPORTED;
-}
-
-EFI_STATUS
-EhciPciIoIoWrite (
-  IN EFI_PCI_IO_PROTOCOL              *This,
-  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,
-  IN     UINT8                        BarIndex,
-  IN     UINT64                       Offset,
-  IN     UINTN                        Count,
-  IN OUT VOID                         *Buffer
-  )
-{
-  ASSERT (FALSE);
-  return EFI_UNSUPPORTED;
-}
-
-EFI_STATUS
-EhciPciIoPciRead (
-  IN     EFI_PCI_IO_PROTOCOL       *This,
-  IN     EFI_PCI_IO_PROTOCOL_WIDTH  Width,
-  IN     UINT32                     Offset,
-  IN     UINTN                      Count,
-  IN OUT VOID                      *Buffer
-  )
-{
-  UINT32 i;
-  UINT8 *DataPtr;
-
-  Width     = Width & 0x03;
-
-  if (Offset < sizeof (EHCI_PCI_CONFIG) / sizeof (UINT8)){
-
-    DataPtr = (UINT8 *)(&mEhciPciConfig) + Offset;
-
-    switch (Width) {
-    case EfiPciWidthUint8:
-      for (i = 0; i < Count; i++){
-        *((UINT8 *)Buffer + i)= *(DataPtr + i);
-      }
-      break;
-    case EfiPciWidthUint16:
-      for (i = 0; i < Count; i++){
-        *((UINT16 *)Buffer + i)= *((UINT16 *)DataPtr + i);
-      }
-      break;
-    case EfiPciWidthUint32:
-      for (i = 0; i < Count; i++){
-        *(UINT32 *)(Buffer + i)= *((UINT32 *)DataPtr + i);
-      }
-      break;
-    case EfiPciWidthUint64:
-      for (i = 0; i < Count; i++){
-        *(UINT64 *)(Buffer + i)= *((UINT64 *)DataPtr + i);
-      }
-      break;
-    default:
-      return EFI_INVALID_PARAMETER;
-    }
-
-  } else {
-    switch (Width) {
-    case EfiPciWidthUint8:
-        *(UINT8 *)Buffer = 0xFF;
-      break;
-    case EfiPciWidthUint16:
-        *(UINT16 *)Buffer = 0xFFFF;
-      break;
-    case EfiPciWidthUint32:
-        *(UINT32 *)Buffer = 0xFFFFFFFF;
-      break;
-    case EfiPciWidthUint64:
-        *(UINT64 *)Buffer = 0xFFFFFFFFFFFFFFFF;
-      break;
-    default:
-      return EFI_INVALID_PARAMETER;
-    }
-  }
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EhciPciIoPciWrite (
-  IN EFI_PCI_IO_PROTOCOL              *This,
-  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,
-  IN     UINT32                       Offset,
-  IN     UINTN                        Count,
-  IN OUT VOID                         *Buffer
-  )
-{
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EhciPciIoCopyMem (
-  IN EFI_PCI_IO_PROTOCOL              *This,
-  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,
-  IN     UINT8                        DestBarIndex,
-  IN     UINT64                       DestOffset,
-  IN     UINT8                        SrcBarIndex,
-  IN     UINT64                       SrcOffset,
-  IN     UINTN                        Count
-  )
-{
-  ASSERT (FALSE);
-  return EFI_UNSUPPORTED;
-}
-
-EFI_STATUS
-EhciPciIoMap (
-  IN EFI_PCI_IO_PROTOCOL                *This,
-  IN     EFI_PCI_IO_PROTOCOL_OPERATION  Operation,
-  IN     VOID                           *HostAddress,
-  IN OUT UINTN                          *NumberOfBytes,
-  OUT    EFI_PHYSICAL_ADDRESS           *DeviceAddress,
-  OUT    VOID                           **Mapping
-  )
-{
-  EFI_STATUS                      Status;
-  MEM_MAP_INFO_INSTANCE           *Map;
-  VOID                            *Buffer;
-  EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;
-
-  if (HostAddress == NULL || NumberOfBytes == NULL || DeviceAddress == NULL || Mapping == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if ((UINT32)Operation >= EfiPciIoOperationMaximum) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  *DeviceAddress = ConvertToPhysicalAddress (HostAddress);
-
-  // Remember range so we can flush on the other side
-  Map = AllocatePool (sizeof (MEM_MAP_INFO_INSTANCE));
-  if (Map == NULL) {
-    return  EFI_OUT_OF_RESOURCES;
-  }
-
-  *Mapping = Map;
-
-  if ((((UINTN)HostAddress & (EFI_PAGE_SIZE - 1)) != 0) ||
-      ((*NumberOfBytes % EFI_PAGE_SIZE) != 0)) {
-
-    // Get the cacheability of the region
-    Status = gDS->GetMemorySpaceDescriptor (*DeviceAddress, &GcdDescriptor);
-    if (EFI_ERROR(Status)) {
-      return Status;
-    }
-
-    // If the mapped buffer is not an uncached buffer
-    if ( (GcdDescriptor.Attributes != EFI_MEMORY_WC) &&
-         (GcdDescriptor.Attributes != EFI_MEMORY_UC) )
-    {
-      //
-      // If the buffer does not fill entire cache lines we must double buffer into
-      // uncached memory. Device (PCI) address becomes uncached page.
-      //
-      Map->DoubleBuffer  = TRUE;
-      Buffer = UncachedAllocatePages(EFI_SIZE_TO_PAGES (*NumberOfBytes));
-
-      if (Buffer == NULL) {
-        return EFI_OUT_OF_RESOURCES;
-      }
-
-    CopyMem (Buffer,  HostAddress, *NumberOfBytes);
-      *DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer;
-    } else {
-      Map->DoubleBuffer  = FALSE;
-    }
-  } else {
-    Map->DoubleBuffer  = FALSE;
-
-    // Flush the Data Cache (should not have any effect if the memory region is uncached)
-    gCpu->FlushDataCache (gCpu, *DeviceAddress, *NumberOfBytes, EfiCpuFlushTypeWriteBackInvalidate);
-
-    Status = gDS->SetMemorySpaceAttributes (*DeviceAddress & ~(BASE_4KB - 1), ALIGN_VALUE (*NumberOfBytes, BASE_4KB), EFI_MEMORY_WC);
-    if (EFI_ERROR (Status)) {
-      DEBUG((EFI_D_ERROR, "[%a]:[%dL] SetMemorySpaceAttributes Fail. %r\n", __FUNCTION__, __LINE__, Status));
-    }
-  }
-
-  Map->HostAddress   = (UINTN)HostAddress;
-  Map->DeviceAddress = *DeviceAddress;
-  Map->NumberOfBytes = *NumberOfBytes;
-  Map->Operation     = Operation;
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EhciPciIoUnmap (
-  IN EFI_PCI_IO_PROTOCOL           *This,
-  IN  VOID                         *Mapping
-  )
-{
-  MEM_MAP_INFO_INSTANCE *Map;
-
-  if (Mapping == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Map = (MEM_MAP_INFO_INSTANCE *)Mapping;
-
-  if (Map->DoubleBuffer) {
-    if ((Map->Operation == EfiPciIoOperationBusMasterWrite) || (Map->Operation == EfiPciIoOperationBusMasterCommonBuffer)) {
-      CopyMem ((VOID *)(UINTN)Map->HostAddress, (VOID *)(UINTN)Map->DeviceAddress, Map->NumberOfBytes);
-    }
-
-    if((VOID *)(UINTN)Map->DeviceAddress != NULL) {
-      UncachedFreePages ((VOID *)(UINTN)Map->DeviceAddress, EFI_SIZE_TO_PAGES (Map->NumberOfBytes));
-    }
-
-
-  } else {
-    if (Map->Operation == EfiPciIoOperationBusMasterWrite) {
-      //
-      // Make sure we read buffer from uncached memory and not the cache
-      //
-      gCpu->FlushDataCache (gCpu, Map->HostAddress, Map->NumberOfBytes, EfiCpuFlushTypeInvalidate);
-    }
-  }
-
-  FreePool (Map);
-
-  return EFI_SUCCESS;
-}
-
-
-
-EFI_STATUS
-EhciPciIoAllocateBuffer (
-  IN EFI_PCI_IO_PROTOCOL  *This,
-  IN  EFI_ALLOCATE_TYPE   Type,
-  IN  EFI_MEMORY_TYPE     MemoryType,
-  IN  UINTN               Pages,
-  OUT VOID                **HostAddress,
-  IN  UINT64              Attributes
-  )
-{
-  UINT32 HcCapParams;
-
-  if (Attributes &
-      (~(EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE |
-         EFI_PCI_ATTRIBUTE_MEMORY_CACHED         ))) {
-    return EFI_UNSUPPORTED;
-  }
-
-  if (HostAddress == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (MemoryType == EfiBootServicesData) {
-    HcCapParams  = MmioRead32(mUsbMemBase + EHC_HCCPARAMS_OFFSET);
-    if ((BOOLEAN)(((HcCapParams) & (HCCP_64BIT)) == (HCCP_64BIT))){
-      *HostAddress = UncachedAllocatePages(Pages);
-    } else {
-      // TODO: We need support allocating UC memory below 4GB strictly
-      *HostAddress = UncachedAllocatePages(Pages);
-    }
-
-  }else{
-    return EFI_INVALID_PARAMETER;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-EhciPciIoFreeBuffer (
-  IN EFI_PCI_IO_PROTOCOL           *This,
-  IN  UINTN                        Pages,
-  IN  VOID                         *HostAddress
-  )
-{
-  UncachedFreePages (HostAddress, Pages);
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EhciPciIoFlush (
-  IN EFI_PCI_IO_PROTOCOL  *This
-  )
-{
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EhciPciIoGetLocation (
-  IN   EFI_PCI_IO_PROTOCOL  *This,
-  OUT  UINTN                *SegmentNumber,
-  OUT  UINTN                *BusNumber,
-  OUT  UINTN                *DeviceNumber,
-  OUT  UINTN                *FunctionNumber
-  )
-{
-
-  *SegmentNumber  = mSegmentNumber;
-  *BusNumber      = mBusNumber;
-  *DeviceNumber   = mDeviceNumber;
-  *FunctionNumber = mFunctionNumber;
-
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-EhciPciIoAttributes (
-  IN EFI_PCI_IO_PROTOCOL                       *This,
-  IN  EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION  Operation,
-  IN  UINT64                                   Attributes,
-  OUT UINT64                                   *Result OPTIONAL
-  )
-{
-  if (Result != NULL) {
-     *Result = 0;
-  }
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EhciPciIoGetBarAttributes (
-  IN EFI_PCI_IO_PROTOCOL             *This,
-  IN  UINT8                          BarIndex,
-  OUT UINT64                         *Supports, OPTIONAL
-  OUT VOID                           **Resources OPTIONAL
-  )
-{
-  ASSERT (FALSE);
-  return EFI_UNSUPPORTED;
-}
-
-EFI_STATUS
-EhciPciIoSetBarAttributes (
-  IN EFI_PCI_IO_PROTOCOL              *This,
-  IN     UINT64                       Attributes,
-  IN     UINT8                        BarIndex,
-  IN OUT UINT64                       *Offset,
-  IN OUT UINT64                       *Length
-  )
-{
-  ASSERT (FALSE);
-  return EFI_UNSUPPORTED;
-}
-
-//
-// Pci Io Protocol Interface
-//
-EFI_PCI_IO_PROTOCOL  mEhciPciIoInterface = {
-  EhciPciIoPollMem,
-  EhciPciIoPollIo,
-  {
-    EhciPciIoMemRead,
-    EhciPciIoMemWrite
-  },
-  {
-    EhciPciIoIoRead,
-    EhciPciIoIoWrite
-  },
-  {
-    EhciPciIoPciRead,
-    EhciPciIoPciWrite
-  },
-  EhciPciIoCopyMem,
-  EhciPciIoMap,
-  EhciPciIoUnmap,
-  EhciPciIoAllocateBuffer,
-  EhciPciIoFreeBuffer,
-  EhciPciIoFlush,
-  EhciPciIoGetLocation,
-  EhciPciIoAttributes,
-  EhciPciIoGetBarAttributes,
-  EhciPciIoSetBarAttributes,
-  0,
-  NULL
-};
-
+#include <PiDxe.h>
+#include <Library/NonDiscoverableDeviceRegistrationLib.h>
+#include <Library/PlatformSysCtrlLib.h>
 
 EFI_STATUS
 EFIAPI
@@ -626,57 +24,12 @@  EhciVirtualPciIoInitialize (
   IN EFI_SYSTEM_TABLE   *SystemTable
   )
 {
-  EFI_STATUS          Status;
-  EFI_HANDLE                    Handle;
-  EFI_DEV_PATH              EndNode;
-  EFI_DEV_PATH              Node;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath = NULL;
-
-  mUsbMemBase            = PlatformGetEhciBase ();
-
-    DEBUG ((EFI_D_ERROR, "mUsbMemBase: 0x%x\n", mUsbMemBase));
-
-  // Get the Cpu protocol for later use
-  Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&gCpu);
-
-  //
-  // Install the pciio protocol, device path protocol
-  //
-  Handle = NULL;
-
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &Handle,
-                  &gEfiPciIoProtocolGuid,
-                  &mEhciPciIoInterface,
-                  NULL
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  (void)ZeroMem (&Node, sizeof (Node));
-  Node.DevPath.Type = HARDWARE_DEVICE_PATH;
-  Node.DevPath.SubType = HW_PCI_DP;
-  (void)SetDevicePathNodeLength (&Node.DevPath, sizeof (PCI_DEVICE_PATH));
-  // Make USB controller device path different from built-in SATA controller
-  Node.Pci.Function = 1;
-  Node.Pci.Device = 0;
-
-  SetDevicePathEndNode (&EndNode.DevPath);
-
-  DevicePath = AppendDevicePathNode (&EndNode.DevPath, &Node.DevPath);
-
-  Status = gBS->InstallProtocolInterface (
-                  &Handle,
-                  &gEfiDevicePathProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  DevicePath
-                  );
-  if(EFI_ERROR(Status))
-  {
-      DEBUG((EFI_D_ERROR, "[%a]:[%dL] InstallProtocolInterface fail. %r\n", __FUNCTION__, __LINE__, Status));
-  }
-
-
-  return EFI_SUCCESS;
+  return RegisterNonDiscoverableMmioDevice (
+           NonDiscoverableDeviceTypeEhci,
+           NonDiscoverableDeviceDmaTypeNonCoherent,
+           NULL,
+           NULL,
+           1,
+           PlatformGetEhciBase (),
+           SIZE_4KB);
 }
diff --git a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.h b/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.h
deleted file mode 100644
index ae7a934a11e3..000000000000
--- a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.h
+++ /dev/null
@@ -1,82 +0,0 @@ 
-/** @file
-*
-*  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
-*  Copyright (c) 2016, Linaro Limited. All rights reserved.
-*
-*  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 _EHCI_PCIIO_H_
-#define _EHCI_PCIIO_H_
-
-#include <Uefi.h>
-#include <PiDxe.h>
-
-#include <Protocol/Usb2HostController.h>
-#include <Protocol/PciIo.h>
-#include <Protocol/Cpu.h>
-
-#include <Guid/EventGroup.h>
-
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/BaseLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/PcdLib.h>
-#include <Library/IoLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/ArmLib.h>
-#include <Library/UncachedMemoryAllocationLib.h>
-#include <Library/DxeServicesTableLib.h>
-#include <Library/TimerLib.h>
-#include <Library/CacheMaintenanceLib.h>
-
-#include <Library/ReportStatusCodeLib.h>
-
-#include <IndustryStandard/Pci.h>
-#include <Library/PlatformSysCtrlLib.h>
-
-#define PCI_CLASS_SERIAL              0x0C
-#define PCI_CLASS_SERIAL_FIREWIRE     0x00
-#define PCI_CLASS_SERIAL_ACCESS_BUS   0x01
-#define PCI_CLASS_SERIAL_SSA          0x02
-#define PCI_CLASS_SERIAL_USB          0x03
-#define PCI_IF_EHCI                   0x20
-#define PCI_CLASS_SERIAL_FIBRECHANNEL 0x04
-#define PCI_CLASS_SERIAL_SMB          0x05
-
-//
-// Capability register offset
-//
-#define EHC_CAPLENGTH_OFFSET    0    // Capability register length offset
-#define EHC_HCSPARAMS_OFFSET    0x04 // Structural Parameters 04-07h
-#define EHC_HCCPARAMS_OFFSET    0x08 // Capability parameters offset
-
-//
-// Capability register bit definition
-//
-#define HCSP_NPORTS             0x0F // Number of root hub port
-#define HCSP_PPC                0x10 // Port Power Control
-#define HCCP_64BIT              0x01 // 64-bit addressing capability
-
-
-typedef struct {
-  PCI_DEVICE_INDEPENDENT_REGION Hdr;
-  PCI_DEVICE_HEADER_TYPE_REGION Device;
-  UINT8 CapabilityID;
-  UINT8 NextItemPtr;
-  UINT16 DebugPort;
-} EHCI_PCI_CONFIG;
-
-
-#endif    // _EHCI_PCIIO_H_
diff --git a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf b/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf
index 4a5f5c30bcfa..c07a5b8aa250 100644
--- a/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf
+++ b/Silicon/Hisilicon/Drivers/VirtualEhciPciIo/VirtualEhciPciIo.inf
@@ -25,36 +25,14 @@ 
 
 
 [Sources]
-  VirtualEhciPciIo.h
   VirtualEhciPciIo.c
 
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
-  ArmPkg/ArmPkg.dec
   Silicon/Hisilicon/HisiPkg.dec
 
-[FeaturePcd]
-
-
 [LibraryClasses]
-  MemoryAllocationLib
-  BaseLib
-  UefiLib
-  UefiBootServicesTableLib
-  UefiDriverEntryPoint
-  BaseMemoryLib
-  DebugLib
-  PcdLib
-  IoLib
-  ReportStatusCodeLib
-  UncachedMemoryAllocationLib
-  ArmLib
-  DxeServicesTableLib
-  CacheMaintenanceLib
+  NonDiscoverableDeviceRegistrationLib
   PlatformSysCtrlLib
-
-[Guids]
-
-[Protocols]
-  gEfiPciIoProtocolGuid                         ## TO_START
+  UefiDriverEntryPoint