On 05/10/16 07:53, Ruiyu Ni wrote:
> The patch re-factors the code without functionality impact.
> Next patch will add code to support OVMF above Xen.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ruiyu Ni <[email protected]>
> Cc: Gary Lin <[email protected]>
> Cc: Laszlo Ersek <[email protected]>
> ---
>  .../Library/PciHostBridgeLib/PciHostBridgeLib.c    | 131 
> +++++++++++++++------
>  1 file changed, 93 insertions(+), 38 deletions(-)
> 
> diff --git a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c 
> b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
> index 9e01498..aeb0bdf 100644
> --- a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
> +++ b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
> @@ -70,13 +70,20 @@ OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH 
> mRootBridgeDevicePathTemplate = {
>    }
>  };
>  
> +STATIC PCI_ROOT_BRIDGE_APERTURE mNonExistAperture = { MAX_UINT64, 0 };
>  
>  /**
>    Initialize a PCI_ROOT_BRIDGE structure.
>  
> -  param[in]  RootBusNumber     The bus number to store in RootBus.
> +  @param[in]  Supports         Supported attributes.
>  
> -  param[in]  MaxSubBusNumber   The inclusive maximum bus number that can be
> +  @param[in]  Attributes       Initial attributes.
> +
> +  @param[in]  AllocAttributes  Allocation attributes.
> +
> +  @param[in]  RootBusNumber    The bus number to store in RootBus.
> +
> +  @param[in]  MaxSubBusNumber  The inclusive maximum bus number that can be
>                                 assigned to any subordinate bus found behind 
> any
>                                 PCI bridge hanging off this root bus.
>  
> @@ -85,7 +92,17 @@ OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH 
> mRootBridgeDevicePathTemplate = {
>                                 RootBusNumber equals MaxSubBusNumber, then the
>                                 root bus has no room for subordinate buses.
>  
> -  param[out] RootBus           The PCI_ROOT_BRIDGE structure (allocated by 
> the
> +  @param[in]  Io               IO aperture.
> +
> +  @param[in]  Mem              MMIO aperture.
> +
> +  @param[in]  MemAbove4G       MMIO aperture above 4G.
> +
> +  @param[in]  PMem             Prefetchable MMIO aperture.
> +
> +  @param[in]  PMemAbove4G      Prefetchable MMIO aperture above 4G.
> +
> +  @param[out] RootBus          The PCI_ROOT_BRIDGE structure (allocated by 
> the
>                                 caller) that should be filled in by this
>                                 function.
>  
> @@ -99,9 +116,17 @@ OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH 
> mRootBridgeDevicePathTemplate = {
>  STATIC
>  EFI_STATUS
>  InitRootBridge (
> -  IN  UINT8           RootBusNumber,
> -  IN  UINT8           MaxSubBusNumber,
> -  OUT PCI_ROOT_BRIDGE *RootBus
> +  IN  UINT64                   Supports,
> +  IN  UINT64                   Attributes,
> +  IN  UINT64                   AllocAttributes,
> +  IN  UINT8                    RootBusNumber,
> +  IN  UINT8                    MaxSubBusNumber,
> +  IN  PCI_ROOT_BRIDGE_APERTURE *Io,
> +  IN  PCI_ROOT_BRIDGE_APERTURE *Mem,
> +  IN  PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
> +  IN  PCI_ROOT_BRIDGE_APERTURE *PMem,
> +  IN  PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G,
> +  OUT PCI_ROOT_BRIDGE          *RootBus
>    )
>  {
>    OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH *DevicePath;
> @@ -113,39 +138,19 @@ InitRootBridge (
>  
>    RootBus->Segment = 0;
>  
> -  RootBus->Supports   = EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO |
> -                        EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO |
> -                        EFI_PCI_ATTRIBUTE_ISA_IO_16 |
> -                        EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO |
> -                        EFI_PCI_ATTRIBUTE_VGA_MEMORY |
> -                        EFI_PCI_ATTRIBUTE_VGA_IO_16  |
> -                        EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16;
> -  RootBus->Attributes = RootBus->Supports;
> +  RootBus->Supports   = Supports;
> +  RootBus->Attributes = Attributes;
>  
>    RootBus->DmaAbove4G = FALSE;
>  
> -  RootBus->AllocationAttributes = EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM;
> -  RootBus->PMem.Base            = MAX_UINT64;
> -  RootBus->PMem.Limit           = 0;
> -  RootBus->PMemAbove4G.Base     = MAX_UINT64;
> -  RootBus->PMemAbove4G.Limit    = 0;
> -  RootBus->MemAbove4G.Base      = MAX_UINT64;
> -  RootBus->MemAbove4G.Limit     = 0;
> -
> -  if (PcdGet64 (PcdPciMmio64Size) > 0) {
> -    RootBus->AllocationAttributes |= EFI_PCI_HOST_BRIDGE_MEM64_DECODE;
> -    RootBus->MemAbove4G.Base       = PcdGet64 (PcdPciMmio64Base);
> -    RootBus->MemAbove4G.Limit      = PcdGet64 (PcdPciMmio64Base) +
> -                                     (PcdGet64 (PcdPciMmio64Size) - 1);
> -  }
> -
> +  RootBus->AllocationAttributes = AllocAttributes;
>    RootBus->Bus.Base  = RootBusNumber;
>    RootBus->Bus.Limit = MaxSubBusNumber;
> -  RootBus->Io.Base   = PcdGet64 (PcdPciIoBase);
> -  RootBus->Io.Limit  = PcdGet64 (PcdPciIoBase) + (PcdGet64 (PcdPciIoSize) - 
> 1);
> -  RootBus->Mem.Base  = PcdGet64 (PcdPciMmio32Base);
> -  RootBus->Mem.Limit = PcdGet64 (PcdPciMmio32Base) +
> -                       (PcdGet64 (PcdPciMmio32Size) - 1);
> +  CopyMem (&RootBus->Io, Io, sizeof (*Io));
> +  CopyMem (&RootBus->Mem, Mem, sizeof (*Mem));
> +  CopyMem (&RootBus->MemAbove4G, MemAbove4G, sizeof (*MemAbove4G));
> +  CopyMem (&RootBus->PMem, PMem, sizeof (*PMem));
> +  CopyMem (&RootBus->PMemAbove4G, PMemAbove4G, sizeof (*PMemAbove4G));
>  
>    RootBus->NoExtendedConfigSpace = (PcdGet16 (PcdOvmfHostBridgePciDevId) !=
>                                      INTEL_Q35_MCH_DEVICE_ID);
> @@ -206,6 +211,34 @@ PciHostBridgeGetRootBridges (
>    UINTN                Initialized;
>    UINTN                LastRootBridgeNumber;
>    UINTN                RootBridgeNumber;
> +  UINT64               Attributes;
> +  UINT64               AllocationAttributes;
> +  PCI_ROOT_BRIDGE_APERTURE Io;
> +  PCI_ROOT_BRIDGE_APERTURE Mem;
> +  PCI_ROOT_BRIDGE_APERTURE MemAbove4G;
> +
> +  Attributes = EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO |
> +    EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO |
> +    EFI_PCI_ATTRIBUTE_ISA_IO_16 |
> +    EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO |
> +    EFI_PCI_ATTRIBUTE_VGA_MEMORY |
> +    EFI_PCI_ATTRIBUTE_VGA_IO_16 |
> +    EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16;
> +
> +  AllocationAttributes = EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM;
> +  if (PcdGet64 (PcdPciMmio64Size) > 0) {
> +    AllocationAttributes |= EFI_PCI_HOST_BRIDGE_MEM64_DECODE;
> +    MemAbove4G.Base = PcdGet64 (PcdPciMmio64Base);
> +    MemAbove4G.Limit = PcdGet64 (PcdPciMmio64Base) +
> +                       PcdGet64 (PcdPciMmio64Size) - 1;
> +  } else {
> +    CopyMem (&MemAbove4G, &mNonExistAperture, sizeof (mNonExistAperture));
> +  }
> +
> +  Io.Base = PcdGet64 (PcdPciIoBase);
> +  Io.Limit = PcdGet64 (PcdPciIoBase) + (PcdGet64 (PcdPciIoSize) - 1);
> +  Mem.Base = PcdGet64 (PcdPciMmio32Base);
> +  Mem.Limit = PcdGet64 (PcdPciMmio32Base) + (PcdGet64 (PcdPciMmio32Size) - 
> 1);
>  
>    *Count = 0;
>  
> @@ -266,8 +299,19 @@ PciHostBridgeGetRootBridges (
>        // because now we know how big a bus number range *that* one has, for 
> any
>        // subordinate buses that might exist behind PCI bridges hanging off 
> it.
>        //
> -      Status = InitRootBridge ((UINT8)LastRootBridgeNumber,
> -                 (UINT8)(RootBridgeNumber - 1), &Bridges[Initialized]);
> +      Status = InitRootBridge (
> +        Attributes,
> +        Attributes,
> +        AllocationAttributes,
> +        (UINT8) LastRootBridgeNumber,
> +        (UINT8) (RootBridgeNumber - 1),
> +        &Io,
> +        &Mem,
> +        &MemAbove4G,
> +        &mNonExistAperture,
> +        &mNonExistAperture,
> +        &Bridges[Initialized]
> +        );
>        if (EFI_ERROR (Status)) {
>          goto FreeBridges;
>        }
> @@ -280,8 +324,19 @@ PciHostBridgeGetRootBridges (
>    // Install the last root bus (which might be the only, ie. main, root bus, 
> if
>    // we've found no extra root buses).
>    //
> -  Status = InitRootBridge ((UINT8)LastRootBridgeNumber, PCI_MAX_BUS,
> -             &Bridges[Initialized]);
> +  Status = InitRootBridge (
> +    Attributes,
> +    Attributes,
> +    AllocationAttributes,
> +    (UINT8) LastRootBridgeNumber,
> +    PCI_MAX_BUS,
> +    &Io,
> +    &Mem,
> +    &MemAbove4G,
> +    &mNonExistAperture,
> +    &mNonExistAperture,
> +    &Bridges[Initialized]
> +    );
>    if (EFI_ERROR (Status)) {
>      goto FreeBridges;
>    }
> 

Great, thanks!

Reviewed-by: Laszlo Ersek <[email protected]>

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to