Omap35xxPkg/PciEmulation: port to new non-discoverable device infrastructure

Move to the new non-discoverable device protocols for wiring the PCI based
EHCI controller driver to the non-discoverable EHCI controller found on the
OMAP 3530.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
diff --git a/BeagleBoardPkg/BeagleBoardPkg.dsc b/BeagleBoardPkg/BeagleBoardPkg.dsc
index 69d3c5f..b24db6c 100644
--- a/BeagleBoardPkg/BeagleBoardPkg.dsc
+++ b/BeagleBoardPkg/BeagleBoardPkg.dsc
@@ -185,6 +185,7 @@
   DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf

   SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf

   PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf

+  NonDiscoverableDeviceRegistrationLib|MdeModulePkg/Library/NonDiscoverableDeviceRegistrationLib/NonDiscoverableDeviceRegistrationLib.inf

 

 [LibraryClasses.common.UEFI_APPLICATION]

   ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf

@@ -447,6 +448,7 @@
   # USB

   #

   Omap35xxPkg/PciEmulation/PciEmulation.inf

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

 

   MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf {

     <PcdsFixedAtBuild>

diff --git a/BeagleBoardPkg/BeagleBoardPkg.fdf b/BeagleBoardPkg/BeagleBoardPkg.fdf
index 42e097f..f140d90 100644
--- a/BeagleBoardPkg/BeagleBoardPkg.fdf
+++ b/BeagleBoardPkg/BeagleBoardPkg.fdf
@@ -2,6 +2,7 @@
 #

 # Copyright (c) 2009, Apple Inc. All rights reserved.<BR>

 # Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>

+# Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR>

 #

 #    This program and the accompanying materials

 #    are licensed and made available under the terms and conditions of the BSD License

@@ -167,6 +168,7 @@
   #

 

   INF Omap35xxPkg/PciEmulation/PciEmulation.inf

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

 

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

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

diff --git a/Omap35xxPkg/Omap35xxPkg.dsc b/Omap35xxPkg/Omap35xxPkg.dsc
index 436c10b..9395570 100644
--- a/Omap35xxPkg/Omap35xxPkg.dsc
+++ b/Omap35xxPkg/Omap35xxPkg.dsc
@@ -80,7 +80,7 @@
 

 [LibraryClasses.common.DXE_DRIVER]

   DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf

-

+  NonDiscoverableDeviceRegistrationLib|MdeModulePkg/Library/NonDiscoverableDeviceRegistrationLib/NonDiscoverableDeviceRegistrationLib.inf

 

 [LibraryClasses.ARM]

   NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf

diff --git a/Omap35xxPkg/PciEmulation/PciEmulation.c b/Omap35xxPkg/PciEmulation/PciEmulation.c
index 17ea03c..d17646a 100644
--- a/Omap35xxPkg/PciEmulation/PciEmulation.c
+++ b/Omap35xxPkg/PciEmulation/PciEmulation.c
@@ -1,6 +1,7 @@
 /** @file

 

   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>

+  Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR>

 

   This program and the accompanying materials

   are licensed and made available under the terms and conditions of the BSD License

@@ -12,49 +13,27 @@
 

 **/

 

-#include "PciEmulation.h"

+#include <PiDxe.h>

+

+#include <Library/BaseLib.h>

+#include <Library/DebugLib.h>

+#include <Library/IoLib.h>

+#include <Library/NonDiscoverableDeviceRegistrationLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+

+#include <Protocol/EmbeddedExternalDevice.h>

+

+#include <TPS65950.h>

+#include <Omap3530/Omap3530.h>

 

 EMBEDDED_EXTERNAL_DEVICE   *gTPS65950;

 

 #define HOST_CONTROLLER_OPERATION_REG_SIZE  0x44

 

-typedef struct {

-  ACPI_HID_DEVICE_PATH      AcpiDevicePath;

-  PCI_DEVICE_PATH           PciDevicePath;

-  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;

-} EFI_PCI_IO_DEVICE_PATH;

-

-typedef struct {

-  UINT32                  Signature;

-  EFI_PCI_IO_DEVICE_PATH  DevicePath;

-  EFI_PCI_IO_PROTOCOL     PciIoProtocol;

-  PCI_TYPE00              *ConfigSpace;

-  PCI_ROOT_BRIDGE         RootBridge;

-  UINTN                   Segment;

-} EFI_PCI_IO_PRIVATE_DATA;

-

-#define EFI_PCI_IO_PRIVATE_DATA_SIGNATURE     SIGNATURE_32('p', 'c', 'i', 'o')

-#define EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(a)  CR(a, EFI_PCI_IO_PRIVATE_DATA, PciIoProtocol, EFI_PCI_IO_PRIVATE_DATA_SIGNATURE)

-

-EFI_PCI_IO_DEVICE_PATH PciIoDevicePathTemplate =

-{

-  {

-    { ACPI_DEVICE_PATH, ACPI_DP, { sizeof (ACPI_HID_DEVICE_PATH), 0 } },

-    EISA_PNP_ID(0x0A03),  // HID

-    0                     // UID

-  },

-  {

-    { HARDWARE_DEVICE_PATH, HW_PCI_DP, { sizeof (PCI_DEVICE_PATH), 0 } },

-    0,

-    0

-  },

-  { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0} }

-};

-

 STATIC

-VOID

+EFI_STATUS

 ConfigureUSBHost (

-  VOID

+  NON_DISCOVERABLE_DEVICE   *Device

   )

 {

   EFI_STATUS Status;

@@ -103,454 +82,10 @@
 

   Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID3, LEDEN), 1, &Data);

   ASSERT_EFI_ERROR (Status);

-}

-

-

-EFI_STATUS

-PciIoPollMem (

-  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

-PciIoPollIo (

-  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

-PciIoMemRead (

-  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

-  )

-{

-  EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This);

-

-  return PciRootBridgeIoMemRead (&Private->RootBridge.Io,

-                                (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,

-                                Private->ConfigSpace->Device.Bar[BarIndex] + Offset,

-                                Count,

-                                Buffer

-                                );

-}

-

-EFI_STATUS

-PciIoMemWrite (

-  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

-  )

-{

-  EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This);

-

-  return PciRootBridgeIoMemWrite (&Private->RootBridge.Io,

-                                 (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,

-                                 Private->ConfigSpace->Device.Bar[BarIndex] + Offset,

-                                 Count,

-                                 Buffer

-                                 );

-}

-

-EFI_STATUS

-PciIoIoRead (

-  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

-PciIoIoWrite (

-  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;

-}

-

-/**

-  Enable a PCI driver to read PCI controller registers in PCI configuration space.

-

-  @param[in]      This    A pointer to the EFI_PCI_IO_PROTOCOL instance.

-  @param[in]      Width   Signifies the width of the memory operations.

-  @param[in]      Offset  The offset within the PCI configuration space for

-                          the PCI controller.

-  @param[in]      Count   The number of PCI configuration operations to

-                          perform. Bytes moved is Width size * Count,

-                          starting at Offset.

-

-  @param[in out]  Buffer  The destination buffer to store the results.

-

-  @retval  EFI_SUCCESS            The data was read from the PCI controller.

-  @retval  EFI_INVALID_PARAMETER  "Width" is invalid.

-  @retval  EFI_INVALID_PARAMETER  "Buffer" is NULL.

-

-**/

-EFI_STATUS

-PciIoPciRead (

-  IN     EFI_PCI_IO_PROTOCOL       *This,

-  IN     EFI_PCI_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT32                     Offset,

-  IN     UINTN                      Count,

-  IN OUT VOID                      *Buffer

-  )

-{

-  EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS (This);

-  EFI_STATUS Status;

-

-  if ((Width < 0) || (Width >= EfiPciIoWidthMaximum) || (Buffer == NULL)) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  Status = PciRootBridgeIoMemRW (

-             (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH)Width,

-             Count,

-             TRUE,

-             (PTR)(UINTN)Buffer,

-             TRUE,

-             (PTR)(UINTN)(((UINT8 *)Private->ConfigSpace) + Offset)  //Fix me ConfigSpace

-             );

-

-  return Status;

-}

-

-/**

-  Enable a PCI driver to write PCI controller registers in PCI configuration space.

-

-  @param[in]      This    A pointer to the EFI_PCI_IO_PROTOCOL instance.

-  @param[in]      Width   Signifies the width of the memory operations.

-  @param[in]      Offset  The offset within the PCI configuration space for

-                          the PCI controller.

-  @param[in]      Count   The number of PCI configuration operations to

-                          perform. Bytes moved is Width size * Count,

-                          starting at Offset.

-

-  @param[in out]  Buffer  The source buffer to write data from.

-

-  @retval  EFI_SUCCESS            The data was read from the PCI controller.

-  @retval  EFI_INVALID_PARAMETER  "Width" is invalid.

-  @retval  EFI_INVALID_PARAMETER  "Buffer" is NULL.

-

-**/

-EFI_STATUS

-PciIoPciWrite (

-  IN EFI_PCI_IO_PROTOCOL              *This,

-  IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,

-  IN     UINT32                       Offset,

-  IN     UINTN                        Count,

-  IN OUT VOID                         *Buffer

-  )

-{

-  EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS (This);

-

-  if ((Width < 0) || (Width >= EfiPciIoWidthMaximum) || (Buffer == NULL)) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  return PciRootBridgeIoMemRW ((EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,

-                               Count,

-                               TRUE,

-                               (PTR)(UINTN)(((UINT8 *)Private->ConfigSpace) + Offset),

-                               TRUE,

-                               (PTR)(UINTN)Buffer

-                               );

-}

-

-EFI_STATUS

-PciIoCopyMem (

-  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

-PciIoMap (

-  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

-  )

-{

-  DMA_MAP_OPERATION   DmaOperation;

-

-  if (Operation == EfiPciIoOperationBusMasterRead) {

-    DmaOperation = MapOperationBusMasterRead;

-  } else if (Operation == EfiPciIoOperationBusMasterWrite) {

-    DmaOperation = MapOperationBusMasterWrite;

-  } else if (Operation == EfiPciIoOperationBusMasterCommonBuffer) {

-    DmaOperation = MapOperationBusMasterCommonBuffer;

-  } else {

-    return EFI_INVALID_PARAMETER;

-  }

-  return DmaMap (DmaOperation, HostAddress, NumberOfBytes, DeviceAddress, Mapping);

-}

-

-EFI_STATUS

-PciIoUnmap (

-  IN EFI_PCI_IO_PROTOCOL           *This,

-  IN  VOID                         *Mapping

-  )

-{

-  return DmaUnmap (Mapping);

-}

-

-/**

-  Allocate pages that are suitable for an EfiPciIoOperationBusMasterCommonBuffer

-  mapping.

-

-  @param[in]   This         A pointer to the EFI_PCI_IO_PROTOCOL instance.

-  @param[in]   Type         This parameter is not used and must be ignored.

-  @param[in]   MemoryType   The type of memory to allocate, EfiBootServicesData or

-                            EfiRuntimeServicesData.

-  @param[in]   Pages        The number of pages to allocate.

-  @param[out]  HostAddress  A pointer to store the base system memory address of

-                            the allocated range.

-  @param[in]   Attributes   The requested bit mask of attributes for the allocated

-                            range. Only the attributes,

-                            EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE and

-                            EFI_PCI_ATTRIBUTE_MEMORY_CACHED may be used with this

-                            function. If any other bits are set, then EFI_UNSUPPORTED

-                            is returned. This function ignores this bit mask.

-

-  @retval  EFI_SUCCESS            The requested memory pages were allocated.

-  @retval  EFI_INVALID_PARAMETER  HostAddress is NULL.

-  @retval  EFI_INVALID_PARAMETER  MemoryType is invalid.

-  @retval  EFI_UNSUPPORTED        Attributes is unsupported.

-  @retval  EFI_OUT_OF_RESOURCES   The memory pages could not be allocated.

-

-**/

-EFI_STATUS

-PciIoAllocateBuffer (

-  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

-  )

-{

-  if (Attributes &

-      (~(EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE |

-         EFI_PCI_ATTRIBUTE_MEMORY_CACHED         ))) {

-    return EFI_UNSUPPORTED;

-  }

-

-  return DmaAllocateBuffer (MemoryType, Pages, HostAddress);

-}

-

-

-EFI_STATUS

-PciIoFreeBuffer (

-  IN EFI_PCI_IO_PROTOCOL           *This,

-  IN  UINTN                        Pages,

-  IN  VOID                         *HostAddress

-  )

-{

-  return DmaFreeBuffer (Pages, HostAddress);

-}

-

-

-EFI_STATUS

-PciIoFlush (

-  IN EFI_PCI_IO_PROTOCOL  *This

-  )

-{

-  return EFI_SUCCESS;

-}

-

-/**

-  Retrieves this PCI controller's current PCI bus number, device number, and function number.

-

-  @param[in]   This            A pointer to the EFI_PCI_IO_PROTOCOL instance.

-  @param[out]  SegmentNumber   The PCI controller's current PCI segment number.

-  @param[out]  BusNumber       The PCI controller's current PCI bus number.

-  @param[out]  DeviceNumber    The PCI controller's current PCI device number.

-  @param[out]  FunctionNumber  The PCI controller’s current PCI function number.

-

-  @retval  EFI_SUCCESS            The PCI controller location was returned.

-  @retval  EFI_INVALID_PARAMETER  At least one out of the four output parameters is

-                                  a NULL pointer.

-**/

-EFI_STATUS

-PciIoGetLocation (

-  IN   EFI_PCI_IO_PROTOCOL  *This,

-  OUT  UINTN                *SegmentNumber,

-  OUT  UINTN                *BusNumber,

-  OUT  UINTN                *DeviceNumber,

-  OUT  UINTN                *FunctionNumber

-  )

-{

-  EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS (This);

-

-  if ((SegmentNumber == NULL) || (BusNumber      == NULL) ||

-      (DeviceNumber  == NULL) || (FunctionNumber == NULL)    ) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  *SegmentNumber  = Private->Segment;

-  *BusNumber      = 0xff;

-  *DeviceNumber   = 0;

-  *FunctionNumber = 0;

 

   return EFI_SUCCESS;

 }

 

-/**

-  Performs an operation on the attributes that this PCI controller supports.

-

-  The operations include getting the set of supported attributes, retrieving

-  the current attributes, setting the current attributes, enabling attributes,

-  and disabling attributes.

-

-  @param[in]   This        A pointer to the EFI_PCI_IO_PROTOCOL instance.

-  @param[in]   Operation   The operation to perform on the attributes for this

-                           PCI controller.

-  @param[in]   Attributes  The mask of attributes that are used for Set,

-                           Enable and Disable operations.

-  @param[out]  Result      A pointer to the result mask of attributes that are

-                           returned for the Get and Supported operations. This

-                           is an optional parameter that may be NULL for the

-                           Set, Enable, and Disable operations.

-

-  @retval  EFI_SUCCESS            The operation on the PCI controller's

-                                  attributes was completed. If the operation

-                                  was Get or Supported, then the attribute mask

-                                  is returned in Result.

-  @retval  EFI_INVALID_PARAMETER  Operation is greater than or equal to

-                                  EfiPciIoAttributeOperationMaximum.

-  @retval  EFI_INVALID_PARAMETER  Operation is Get and Result is NULL.

-  @retval  EFI_INVALID_PARAMETER  Operation is Supported and Result is NULL.

-

-**/

-EFI_STATUS

-PciIoAttributes (

-  IN EFI_PCI_IO_PROTOCOL                       *This,

-  IN  EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION  Operation,

-  IN  UINT64                                   Attributes,

-  OUT UINT64                                   *Result OPTIONAL

-  )

-{

-  switch (Operation) {

-  case EfiPciIoAttributeOperationGet:

-  case EfiPciIoAttributeOperationSupported:

-    if (Result == NULL) {

-      return EFI_INVALID_PARAMETER;

-    }

-    //

-    // We are not a real PCI device so just say things we kind of do

-    //

-    *Result = EFI_PCI_DEVICE_ENABLE;

-    break;

-

-  case EfiPciIoAttributeOperationSet:

-  case EfiPciIoAttributeOperationEnable:

-  case EfiPciIoAttributeOperationDisable:

-    if (Attributes & (~EFI_PCI_DEVICE_ENABLE)) {

-      return EFI_UNSUPPORTED;

-    }

-    // Since we are not a real PCI device no enable/set or disable operations exist.

-    return EFI_SUCCESS;

-

-  default:

-    return EFI_INVALID_PARAMETER;

-  };

-  return EFI_SUCCESS;

-}

-

-EFI_STATUS

-PciIoGetBarAttributes (

-  IN EFI_PCI_IO_PROTOCOL             *This,

-  IN  UINT8                          BarIndex,

-  OUT UINT64                         *Supports, OPTIONAL

-  OUT VOID                           **Resources OPTIONAL

-  )

-{

-  ASSERT (FALSE);

-  return EFI_UNSUPPORTED;

-}

-

-EFI_STATUS

-PciIoSetBarAttributes (

-  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;

-}

-

-EFI_PCI_IO_PROTOCOL PciIoTemplate =

-{

-  PciIoPollMem,

-  PciIoPollIo,

-  { PciIoMemRead, PciIoMemWrite },

-  { PciIoIoRead,  PciIoIoWrite },

-  { PciIoPciRead, PciIoPciWrite },

-  PciIoCopyMem,

-  PciIoMap,

-  PciIoUnmap,

-  PciIoAllocateBuffer,

-  PciIoFreeBuffer,

-  PciIoFlush,

-  PciIoGetLocation,

-  PciIoAttributes,

-  PciIoGetBarAttributes,

-  PciIoSetBarAttributes,

-  0,

-  0

-};

-

 EFI_STATUS

 EFIAPI

 PciEmulationEntryPoint (

@@ -558,76 +93,21 @@
   IN EFI_SYSTEM_TABLE *SystemTable

   )

 {

-  EFI_STATUS              Status;

-  EFI_HANDLE              Handle;

-  EFI_PCI_IO_PRIVATE_DATA *Private;

   UINT8                   CapabilityLength;

   UINT8                   PhysicalPorts;

-  UINTN                   Count;

+  UINTN                   MemorySize;

 

+  CapabilityLength = MmioRead8 (USB_EHCI_HCCAPBASE);

+  PhysicalPorts    = MmioRead32 (USB_EHCI_HCCAPBASE + 0x4) & 0x0000000F;

+  MemorySize       = CapabilityLength + HOST_CONTROLLER_OPERATION_REG_SIZE +

+                     4 * PhysicalPorts - 1;

 

-  //Configure USB host for OMAP3530.

-  ConfigureUSBHost();

-

-  // Create a private structure

-  Private = AllocatePool(sizeof(EFI_PCI_IO_PRIVATE_DATA));

-  if (Private == NULL) {

-    Status = EFI_OUT_OF_RESOURCES;

-    return Status;

-  }

-

-  Private->Signature              = EFI_PCI_IO_PRIVATE_DATA_SIGNATURE;  // Fill in signature

-  Private->RootBridge.Signature   = PCI_ROOT_BRIDGE_SIGNATURE;          // Fake Root Bridge structure needs a signature too

-  Private->RootBridge.MemoryStart = USB_EHCI_HCCAPBASE;                 // Get the USB capability register base

-  Private->Segment                = 0;                                  // Default to segment zero

-

-  // Find out the capability register length and number of physical ports.

-  CapabilityLength = MmioRead8(Private->RootBridge.MemoryStart);

-  PhysicalPorts    = (MmioRead32 (Private->RootBridge.MemoryStart + 0x4)) & 0x0000000F;

-

-  // Calculate the total size of the USB registers.

-  Private->RootBridge.MemorySize = CapabilityLength + (HOST_CONTROLLER_OPERATION_REG_SIZE + ((4 * PhysicalPorts) - 1));

-

-  // Enable Port Power bit in Port status and control registers in EHCI register space.

-  // Port Power Control (PPC) bit in the HCSPARAMS register is already set which indicates

-  // host controller implementation includes port power control.

-  for (Count = 0; Count < PhysicalPorts; Count++) {

-    MmioOr32 ((Private->RootBridge.MemoryStart + CapabilityLength + HOST_CONTROLLER_OPERATION_REG_SIZE + 4*Count), 0x00001000);

-  }

-

-  // Create fake PCI config space.

-  Private->ConfigSpace = AllocateZeroPool(sizeof(PCI_TYPE00));

-  if (Private->ConfigSpace == NULL) {

-    Status = EFI_OUT_OF_RESOURCES;

-    FreePool(Private);

-    return Status;

-  }

-

-  // Configure PCI config space

-  Private->ConfigSpace->Hdr.VendorId = 0xFFFF; // Invalid vendor Id as it is not an actual device.

-  Private->ConfigSpace->Hdr.DeviceId = 0x0000; // Not relevant as the vendor id is not valid.

-  Private->ConfigSpace->Hdr.ClassCode[0] = 0x20;

-  Private->ConfigSpace->Hdr.ClassCode[1] = 0x03;

-  Private->ConfigSpace->Hdr.ClassCode[2] = 0x0C;

-  Private->ConfigSpace->Device.Bar[0] = Private->RootBridge.MemoryStart;

-

-  Handle = NULL;

-

-  // Unique device path.

-  CopyMem(&Private->DevicePath, &PciIoDevicePathTemplate, sizeof(PciIoDevicePathTemplate));

-  Private->DevicePath.AcpiDevicePath.UID = 0;

-

-  // Copy protocol structure

-  CopyMem(&Private->PciIoProtocol, &PciIoTemplate, sizeof(PciIoTemplate));

-

-  Status = gBS->InstallMultipleProtocolInterfaces(&Handle,

-                                                  &gEfiPciIoProtocolGuid,       &Private->PciIoProtocol,

-                                                  &gEfiDevicePathProtocolGuid,  &Private->DevicePath,

-                                                  NULL);

-  if (EFI_ERROR(Status)) {

-    DEBUG((EFI_D_ERROR, "PciEmulationEntryPoint InstallMultipleProtocolInterfaces() failed.\n"));

-  }

-

-  return Status;

+  return RegisterNonDiscoverableMmioDevice (

+           NonDiscoverableDeviceTypeEhci,

+           NonDiscoverableDeviceDmaTypeNonCoherent,

+           ConfigureUSBHost,

+           NULL,

+           1,

+           USB_EHCI_HCCAPBASE, MemorySize

+           );

 }

-

diff --git a/Omap35xxPkg/PciEmulation/PciEmulation.h b/Omap35xxPkg/PciEmulation/PciEmulation.h
deleted file mode 100644
index d5ee043..0000000
--- a/Omap35xxPkg/PciEmulation/PciEmulation.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/** @file

-

-  Copyright (c) 2008 - 2009, Apple Inc. 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_ROOT_BRIDGE_H_

-#define _PCI_ROOT_BRIDGE_H_

-

-#include <PiDxe.h>

-

-#include <TPS65950.h>

-

-#include <Library/BaseLib.h>

-#include <Library/BaseMemoryLib.h>

-#include <Library/DebugLib.h>

-#include <Library/DxeServicesTableLib.h>

-#include <Library/IoLib.h>

-#include <Library/MemoryAllocationLib.h>

-#include <Library/PciLib.h>

-#include <Library/UefiLib.h>

-#include <Library/UefiBootServicesTableLib.h>

-#include <Library/OmapDmaLib.h>

-#include <Library/DmaLib.h>

-

-#include <Protocol/EmbeddedExternalDevice.h>

-#include <Protocol/DevicePath.h>

-#include <Protocol/PciIo.h>

-#include <Protocol/PciRootBridgeIo.h>

-#include <Protocol/PciHostBridgeResourceAllocation.h>

-

-#include <IndustryStandard/Pci22.h>

-#include <IndustryStandard/Acpi.h>

-

-#include <Omap3530/Omap3530.h>

-

-

-

-#define EFI_RESOURCE_NONEXISTENT  0xFFFFFFFFFFFFFFFFULL

-#define EFI_RESOURCE_LESS         0xFFFFFFFFFFFFFFFEULL

-#define EFI_RESOURCE_SATISFIED    0x0000000000000000ULL

-

-

-typedef struct {

-  ACPI_HID_DEVICE_PATH      AcpiDevicePath;

-  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;

-} EFI_PCI_ROOT_BRIDGE_DEVICE_PATH;

-

-

-#define ACPI_CONFIG_IO    0

-#define ACPI_CONFIG_MMIO  1

-#define ACPI_CONFIG_BUS   2

-

-typedef struct {

-  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR Desc[3];

-  EFI_ACPI_END_TAG_DESCRIPTOR       EndDesc;

-} ACPI_CONFIG_INFO;

-

-

-#define PCI_ROOT_BRIDGE_SIGNATURE SIGNATURE_32 ('P', 'c', 'i', 'F')

-

-typedef struct {

-  UINT32                                            Signature;

-  EFI_HANDLE                                        Handle;

-  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL                   Io;

-  EFI_PCI_ROOT_BRIDGE_DEVICE_PATH                   DevicePath;

-

-  UINT8   StartBus;

-  UINT8   EndBus;

-  UINT16  Type;

-  UINT32  MemoryStart;

-  UINT32  MemorySize;

-  UINTN   IoOffset;

-  UINT32  IoStart;

-  UINT32  IoSize;

-  UINT64  PciAttributes;

-

-  ACPI_CONFIG_INFO  *Config;

-

-} PCI_ROOT_BRIDGE;

-

-

-#define INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS(a) CR (a, PCI_ROOT_BRIDGE, Io, PCI_ROOT_BRIDGE_SIGNATURE)

-

-

-typedef union {

-  UINT8   volatile  *buf;

-  UINT8   volatile  *ui8;

-  UINT16  volatile  *ui16;

-  UINT32  volatile  *ui32;

-  UINT64  volatile  *ui64;

-  UINTN   volatile  ui;

-} PTR;

-

-

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoPollMem (

-  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN  UINT64                                 Address,

-  IN  UINT64                                 Mask,

-  IN  UINT64                                 Value,

-  IN  UINT64                                 Delay,

-  OUT UINT64                                 *Result

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoPollIo (

-  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN  UINT64                                 Address,

-  IN  UINT64                                 Mask,

-  IN  UINT64                                 Value,

-  IN  UINT64                                 Delay,

-  OUT UINT64                                 *Result

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoMemRead (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT64                                 Address,

-  IN     UINTN                                  Count,

-  IN OUT VOID                                   *Buffer

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoMemWrite (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT64                                 Address,

-  IN     UINTN                                  Count,

-  IN OUT VOID                                   *Buffer

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoIoRead (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT64                                 UserAddress,

-  IN     UINTN                                  Count,

-  IN OUT VOID                                   *UserBuffer

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoIoWrite (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT64                                 UserAddress,

-  IN     UINTN                                  Count,

-  IN OUT VOID                                   *UserBuffer

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoCopyMem (

-  IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN UINT64                                 DestAddress,

-  IN UINT64                                 SrcAddress,

-  IN UINTN                                  Count

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoPciRead (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT64                                 Address,

-  IN     UINTN                                  Count,

-  IN OUT VOID                                   *Buffer

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoPciWrite (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT64                                 Address,

-  IN     UINTN                                  Count,

-  IN OUT VOID                                   *Buffer

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoMap (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL            *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION  Operation,

-  IN     VOID                                       *HostAddress,

-  IN OUT UINTN                                      *NumberOfBytes,

-  OUT    EFI_PHYSICAL_ADDRESS                       *DeviceAddress,

-  OUT    VOID                                       **Mapping

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoUnmap (

-  IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,

-  IN VOID                             *Mapping

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoAllocateBuffer (

-  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,

-  IN  EFI_ALLOCATE_TYPE                Type,

-  IN  EFI_MEMORY_TYPE                  MemoryType,

-  IN  UINTN                            Pages,

-  OUT VOID                             **HostAddress,

-  IN  UINT64                           Attributes

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoFreeBuffer (

-  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,

-  IN  UINTN                            Pages,

-  OUT VOID                             *HostAddress

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoFlush (

-  IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoGetAttributes (

-  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,

-  OUT UINT64                           *Supported,

-  OUT UINT64                           *Attributes

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoSetAttributes (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,

-  IN     UINT64                           Attributes,

-  IN OUT UINT64                           *ResourceBase,

-  IN OUT UINT64                           *ResourceLength

-  );

-

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoConfiguration (

-  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,

-  OUT VOID                             **Resources

-  );

-

-//

-// Private Function Prototypes

-//

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoMemRW (

-  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN  UINTN                                  Count,

-  IN  BOOLEAN                                InStrideFlag,

-  IN  PTR                                    In,

-  IN  BOOLEAN                                OutStrideFlag,

-  OUT PTR                                    Out

-  );

-

-BOOLEAN

-PciIoMemAddressValid (

-  IN EFI_PCI_IO_PROTOCOL  *This,

-  IN UINT64               Address

-  );

-

-EFI_STATUS

-EmulatePciIoForEhci (

-  INTN    MvPciIfMaxIf

-  );

-

-#endif

-

diff --git a/Omap35xxPkg/PciEmulation/PciEmulation.inf b/Omap35xxPkg/PciEmulation/PciEmulation.inf
index 2180bb4..9410602 100644
--- a/Omap35xxPkg/PciEmulation/PciEmulation.inf
+++ b/Omap35xxPkg/PciEmulation/PciEmulation.inf
@@ -1,6 +1,7 @@
 /** @file

 

   Copyright (c) 2009, Apple Inc. All rights reserved.<BR>

+  Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR>

 

   This program and the accompanying materials

   are licensed and made available under the terms and conditions of the BSD License

@@ -22,33 +23,23 @@
   ENTRY_POINT                     = PciEmulationEntryPoint

 

 [Sources.common]

-  PciRootBridgeIo.c

   PciEmulation.c

 

 [Packages]

   MdePkg/MdePkg.dec

   MdeModulePkg/MdeModulePkg.dec

-  IntelFrameworkPkg/IntelFrameworkPkg.dec

-  ArmPkg/ArmPkg.dec

   EmbeddedPkg/EmbeddedPkg.dec

   Omap35xxPkg/Omap35xxPkg.dec

 

 [LibraryClasses]

   BaseLib

-  DxeServicesTableLib

-  UefiLib

+  DebugLib

+  IoLib

+  NonDiscoverableDeviceRegistrationLib

   UefiBootServicesTableLib

   UefiDriverEntryPoint

-  UefiRuntimeServicesTableLib

-  IoLib

-  OmapDmaLib

-  DmaLib

 

 [Protocols]

-  gEfiPciRootBridgeIoProtocolGuid

-  gEfiDevicePathProtocolGuid

-  gEfiPciHostBridgeResourceAllocationProtocolGuid

-  gEfiPciIoProtocolGuid

   gEmbeddedExternalDeviceProtocolGuid

 

 [Depex]

diff --git a/Omap35xxPkg/PciEmulation/PciRootBridgeIo.c b/Omap35xxPkg/PciEmulation/PciRootBridgeIo.c
deleted file mode 100644
index e8635ed..0000000
--- a/Omap35xxPkg/PciEmulation/PciRootBridgeIo.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/** @file

-

-  Copyright (c) 2008 - 2009, Apple Inc. 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.

-

-**/

-

-#include "PciEmulation.h"

-

-BOOLEAN

-PciRootBridgeMemAddressValid (

-  IN PCI_ROOT_BRIDGE  *Private,

-  IN UINT64           Address

-  )

-{

-  if ((Address >= Private->MemoryStart) && (Address < (Private->MemoryStart + Private->MemorySize))) {

-    return TRUE;

-  }

-

-  return FALSE;

-}

-

-

-EFI_STATUS

-PciRootBridgeIoMemRW (

-  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN  UINTN                                  Count,

-  IN  BOOLEAN                                InStrideFlag,

-  IN  PTR                                    In,

-  IN  BOOLEAN                                OutStrideFlag,

-  OUT PTR                                    Out

-  )

-{

-  UINTN  Stride;

-  UINTN  InStride;

-  UINTN  OutStride;

-

-

-  Width     = (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) (Width & 0x03);

-  Stride    = (UINTN)1 << Width;

-  InStride  = InStrideFlag  ? Stride : 0;

-  OutStride = OutStrideFlag ? Stride : 0;

-

-  //

-  // Loop for each iteration and move the data

-  //

-  switch (Width) {

-  case EfiPciWidthUint8:

-    for (;Count > 0; Count--, In.buf += InStride, Out.buf += OutStride) {

-      *In.ui8 = *Out.ui8;

-    }

-    break;

-  case EfiPciWidthUint16:

-    for (;Count > 0; Count--, In.buf += InStride, Out.buf += OutStride) {

-      *In.ui16 = *Out.ui16;

-    }

-    break;

-  case EfiPciWidthUint32:

-    for (;Count > 0; Count--, In.buf += InStride, Out.buf += OutStride) {

-      *In.ui32 = *Out.ui32;

-    }

-    break;

-  default:

-    return EFI_INVALID_PARAMETER;

-  }

-

-  return EFI_SUCCESS;

-}

-

-EFI_STATUS

-PciRootBridgeIoPciRW (

-  IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN BOOLEAN                                Write,

-  IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN UINT64                                 UserAddress,

-  IN UINTN                                  Count,

-  IN OUT VOID                               *UserBuffer

-  )

-{

-  return EFI_SUCCESS;

-}

-

-/**

-  Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space.

-

-  @param  This                  A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.

-  @param  Width                 Signifies the width of the memory operations.

-  @param  Address               The base address of the memory operations.

-  @param  Count                 The number of memory operations to perform.

-  @param  Buffer                For read operations, the destination buffer to store the results. For write

-                                operations, the source buffer to write data from.

-

-  @retval EFI_SUCCESS           The data was read from or written to the PCI root bridge.

-  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.

-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.

-

-**/

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoMemRead (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT64                                 Address,

-  IN     UINTN                                  Count,

-  IN OUT VOID                                   *Buffer

-  )

-{

-  PCI_ROOT_BRIDGE   *Private;

-  UINTN             AlignMask;

-  PTR               In;

-  PTR               Out;

-

-  if ( Buffer == NULL ) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  Private = INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS (This);

-

-  if (!PciRootBridgeMemAddressValid (Private, Address)) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  AlignMask = (1 << (Width & 0x03)) - 1;

-  if (Address & AlignMask) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  In.buf  = Buffer;

-  Out.buf = (VOID *)(UINTN) Address;

-

-  switch (Width) {

-  case EfiPciWidthUint8:

-  case EfiPciWidthUint16:

-  case EfiPciWidthUint32:

-  case EfiPciWidthUint64:

-    return PciRootBridgeIoMemRW (Width, Count, TRUE, In, TRUE, Out);

-

-  case EfiPciWidthFifoUint8:

-  case EfiPciWidthFifoUint16:

-  case EfiPciWidthFifoUint32:

-  case EfiPciWidthFifoUint64:

-    return PciRootBridgeIoMemRW (Width, Count, TRUE, In, FALSE, Out);

-

-  case EfiPciWidthFillUint8:

-  case EfiPciWidthFillUint16:

-  case EfiPciWidthFillUint32:

-  case EfiPciWidthFillUint64:

-    return PciRootBridgeIoMemRW (Width, Count, FALSE, In, TRUE, Out);

-

-  default:

-    break;

-  }

-

-  return EFI_INVALID_PARAMETER;

-}

-

-

-

-/**

-  Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space.

-

-  @param  This                  A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.

-  @param  Width                 Signifies the width of the memory operations.

-  @param  Address               The base address of the memory operations.

-  @param  Count                 The number of memory operations to perform.

-  @param  Buffer                For read operations, the destination buffer to store the results. For write

-                                operations, the source buffer to write data from.

-

-  @retval EFI_SUCCESS           The data was read from or written to the PCI root bridge.

-  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.

-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.

-

-**/

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoMemWrite (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT64                                 Address,

-  IN     UINTN                                  Count,

-  IN OUT VOID                                   *Buffer

-  )

-{

-  PCI_ROOT_BRIDGE *Private;

-  UINTN  AlignMask;

-  PTR    In;

-  PTR    Out;

-

-  if ( Buffer == NULL ) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  Private = INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS (This);

-

-  if (!PciRootBridgeMemAddressValid (Private, Address)) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  AlignMask = (1 << (Width & 0x03)) - 1;

-  if (Address & AlignMask) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  In.buf  = (VOID *)(UINTN) Address;

-  Out.buf = Buffer;

-

-  switch (Width) {

-  case EfiPciWidthUint8:

-  case EfiPciWidthUint16:

-  case EfiPciWidthUint32:

-  case EfiPciWidthUint64:

-    return PciRootBridgeIoMemRW (Width, Count, TRUE, In, TRUE, Out);

-

-  case EfiPciWidthFifoUint8:

-  case EfiPciWidthFifoUint16:

-  case EfiPciWidthFifoUint32:

-  case EfiPciWidthFifoUint64:

-    return PciRootBridgeIoMemRW (Width, Count, FALSE, In, TRUE, Out);

-

-  case EfiPciWidthFillUint8:

-  case EfiPciWidthFillUint16:

-  case EfiPciWidthFillUint32:

-  case EfiPciWidthFillUint64:

-    return PciRootBridgeIoMemRW (Width, Count, TRUE, In, FALSE, Out);

-

-  default:

-    break;

-  }

-

-  return EFI_INVALID_PARAMETER;

-}

-

-/**

-  Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space.

-

-  @param  This                  A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.

-  @param  Width                 Signifies the width of the memory operations.

-  @param  Address               The base address of the memory operations.

-  @param  Count                 The number of memory operations to perform.

-  @param  Buffer                For read operations, the destination buffer to store the results. For write

-                                operations, the source buffer to write data from.

-

-  @retval EFI_SUCCESS           The data was read from or written to the PCI root bridge.

-  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.

-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.

-

-**/

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoPciRead (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT64                                 Address,

-  IN     UINTN                                  Count,

-  IN OUT VOID                                   *Buffer

-  )

-{

-  if (Buffer == NULL) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  return PciRootBridgeIoPciRW (This, FALSE, Width, Address, Count, Buffer);

-}

-

-

-

-/**

-  Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space.

-

-  @param  This                  A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.

-  @param  Width                 Signifies the width of the memory operations.

-  @param  Address               The base address of the memory operations.

-  @param  Count                 The number of memory operations to perform.

-  @param  Buffer                For read operations, the destination buffer to store the results. For write

-                                operations, the source buffer to write data from.

-

-  @retval EFI_SUCCESS           The data was read from or written to the PCI root bridge.

-  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.

-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.

-

-**/

-EFI_STATUS

-EFIAPI

-PciRootBridgeIoPciWrite (

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,

-  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,

-  IN     UINT64                                 Address,

-  IN     UINTN                                  Count,

-  IN OUT VOID                                   *Buffer

-  )

-{

-  if (Buffer == NULL) {

-    return EFI_INVALID_PARAMETER;

-  }

-

-  return PciRootBridgeIoPciRW (This, TRUE, Width, Address, Count, Buffer);

-}

-

-