Leif suggested to split the patch. -----Original Message----- From: Andrew Fish [mailto:af...@apple.com] Sent: Tuesday, November 3, 2015 10:35 AM To: niru...@users.sourceforge.net Cc: edk2-commits@lists.sourceforge.net Subject: Re: edk2[18717] Revert "MdeModulePkg: Fix a PciBusDxe hot plug bug"
> On Nov 2, 2015, at 6:33 PM, niru...@users.sourceforge.net wrote: > > Revision: 18717 > http://sourceforge.net/p/edk2/code/18717 > Author: niruiyu > Date: 2015-11-03 02:33:05 +0000 (Tue, 03 Nov 2015) > Log Message: > ----------- > Revert "MdeModulePkg: Fix a PciBusDxe hot plug bug" > > This reverts commit 73b7f115c653c807b9d0be97bf516871d8aff7ba. > Why was it reverted? Thanks, Andrew Fish > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ruiyu Ni <ruiyu...@intel.com> > Reviewed-by: Feng Tian <feng.t...@intel.com> > > Modified Paths: > -------------- > trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c > trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h > trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c > trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c > > Modified: trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c > =================================================================== > --- trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c > 2015-11-03 02:06:57 UTC (rev 18716) > +++ trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c > 2015-11-03 02:33:05 UTC (rev 18717) > @@ -325,81 +325,6 @@ > } > > /** > - Dump the PPB padding resource information. > - > - @param PciIoDevice PCI IO instance. > - @param ResourceType The desired resource type to dump. > - PciBarTypeUnknown means to dump all types of > resources. > -**/ > -VOID > -DumpPpbPaddingResource ( > - IN PCI_IO_DEVICE *PciIoDevice, > - IN PCI_BAR_TYPE ResourceType > - ) > -{ > - EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor; > - PCI_BAR_TYPE Type; > - > - if (PciIoDevice->ResourcePaddingDescriptors == NULL) { > - return; > - } > - > - if (ResourceType == PciBarTypeIo16 || ResourceType == PciBarTypeIo32) { > - ResourceType = PciBarTypeIo; > - } > - > - for (Descriptor = PciIoDevice->ResourcePaddingDescriptors; > Descriptor->Desc != ACPI_END_TAG_DESCRIPTOR; Descriptor++) { > - > - Type = PciBarTypeUnknown; > - if (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR && > Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_IO) { > - Type = PciBarTypeIo; > - } else if (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR && > Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) { > - > - if (Descriptor->AddrSpaceGranularity == 32) { > - // > - // prefechable > - // > - if (Descriptor->SpecificFlag == > EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE) { > - Type = PciBarTypePMem32; > - } > - > - // > - // Non-prefechable > - // > - if (Descriptor->SpecificFlag == 0) { > - Type = PciBarTypeMem32; > - } > - } > - > - if (Descriptor->AddrSpaceGranularity == 64) { > - // > - // prefechable > - // > - if (Descriptor->SpecificFlag == > EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE) { > - Type = PciBarTypePMem64; > - } > - > - // > - // Non-prefechable > - // > - if (Descriptor->SpecificFlag == 0) { > - Type = PciBarTypeMem64; > - } > - } > - } > - > - if ((Type != PciBarTypeUnknown) && ((ResourceType == PciBarTypeUnknown) > || (ResourceType == Type))) { > - DEBUG (( > - EFI_D_INFO, > - " Padding: Type = %s; Alignment = 0x%lx;\tLength = 0x%lx\n", > - mBarTypeStr[Type], Descriptor->AddrRangeMax, Descriptor->AddrLen > - )); > - } > - } > - > -} > - > -/** > Dump the PCI BAR information. > > @param PciIoDevice PCI IO instance. > @@ -661,10 +586,7 @@ > > GetResourcePaddingPpb (PciIoDevice); > > - DEBUG_CODE ( > - DumpPpbPaddingResource (PciIoDevice, PciBarTypeUnknown); > - DumpPciBars (PciIoDevice); > - ); > + DEBUG_CODE (DumpPciBars (PciIoDevice);); > > return PciIoDevice; > } > > Modified: trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h > =================================================================== > --- trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h > 2015-11-03 02:06:57 UTC (rev 18716) > +++ trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h > 2015-11-03 02:33:05 UTC (rev 18717) > @@ -460,17 +460,4 @@ > IN UINT8 StartBusNumber > ); > > -/** > - Dump the PPB padding resource information. > - > - @param PciIoDevice PCI IO instance. > - @param ResourceType The desired resource type to dump. > - PciBarTypeUnknown means to dump all types of > resources. > -**/ > -VOID > -DumpPpbPaddingResource ( > - IN PCI_IO_DEVICE *PciIoDevice, > - IN PCI_BAR_TYPE ResourceType > - ); > - > #endif > > Modified: trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c > =================================================================== > --- trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c 2015-11-03 > 02:06:57 UTC (rev 18716) > +++ trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c 2015-11-03 > 02:33:05 UTC (rev 18717) > @@ -188,21 +188,19 @@ > BridgeResource->PciDev->PciBar[BridgeResource->Bar].BaseAddress, > BridgeResource->Length, BridgeResource->Alignment > )); > - for ( Link = GetFirstNode (&BridgeResource->ChildList) > - ; !IsNull (&BridgeResource->ChildList, Link) > - ; Link = GetNextNode (&BridgeResource->ChildList, Link) > + for ( Link = BridgeResource->ChildList.ForwardLink > + ; Link != &BridgeResource->ChildList > + ; Link = Link->ForwardLink > ) { > Resource = RESOURCE_NODE_FROM_LINK (Link); > if (Resource->ResourceUsage == PciResUsageTypical) { > Bar = Resource->Virtual ? Resource->PciDev->VfPciBar : > Resource->PciDev->PciBar; > DEBUG (( > - EFI_D_INFO, " Base = 0x%lx;\tLength = 0x%lx;\tAlignment = > 0x%lx;\tOwner = %s [%02x|%02x|%02x:", > + EFI_D_INFO, " Base = 0x%lx;\tLength = 0x%lx;\tAlignment = > 0x%lx;\tOwner = %s ", > Bar[Resource->Bar].BaseAddress, Resource->Length, > Resource->Alignment, > IS_PCI_BRIDGE (&Resource->PciDev->Pci) ? L"PPB" : > IS_CARDBUS_BRIDGE (&Resource->PciDev->Pci) ? L"P2C" : > - L"PCI", > - Resource->PciDev->BusNumber, Resource->PciDev->DeviceNumber, > - Resource->PciDev->FunctionNumber > + L"PCI" > )); > > if ((!IS_PCI_BRIDGE (&Resource->PciDev->Pci) && !IS_CARDBUS_BRIDGE > (&Resource->PciDev->Pci)) || > @@ -212,20 +210,24 @@ > // > // The resource requirement comes from the device itself. > // > - DEBUG ((EFI_D_INFO, "%02x]", Bar[Resource->Bar].Offset)); > + DEBUG (( > + EFI_D_INFO, " [%02x|%02x|%02x:%02x]\n", > + Resource->PciDev->BusNumber, Resource->PciDev->DeviceNumber, > + Resource->PciDev->FunctionNumber, Bar[Resource->Bar].Offset > + )); > } else { > // > // The resource requirement comes from the subordinate devices. > // > - DEBUG ((EFI_D_INFO, "**]")); > + DEBUG (( > + EFI_D_INFO, " [%02x|%02x|%02x:**]\n", > + Resource->PciDev->BusNumber, Resource->PciDev->DeviceNumber, > + Resource->PciDev->FunctionNumber > + )); > } > } else { > - DEBUG ((EFI_D_INFO, " Base = Padding;\tLength = 0x%lx;\tAlignment > = 0x%lx", Resource->Length, Resource->Alignment)); > + DEBUG ((EFI_D_INFO, " Padding:Length = 0x%lx;\tAlignment = 0x%lx\n", > Resource->Length, Resource->Alignment)); > } > - if (BridgeResource->ResType != Resource->ResType) { > - DEBUG ((EFI_D_INFO, "; Type = %s", mBarTypeStr[MIN > (Resource->ResType, PciBarTypeMaxType)])); > - } > - DEBUG ((EFI_D_INFO, "\n")); > } > } > } > @@ -233,61 +235,63 @@ > /** > Find the corresponding resource node for the Device in child list of > BridgeResource. > > - @param[in] Device Pointer to PCI_IO_DEVICE. > - @param[in] BridgeResource Pointer to PCI_RESOURCE_NODE. > - @param[out] DeviceResources Pointer to a buffer to receive resources for > the Device. > + @param[in] Device Pointer to PCI_IO_DEVICE. > + @param[in] BridgeResource Pointer to PCI_RESOURCE_NODE. > > - @return Count of the resource descriptors returned. > + @return !NULL The corresponding resource node for the Device. > + @return NULL No corresponding resource node for the Device. > **/ > -UINTN > +PCI_RESOURCE_NODE * > FindResourceNode ( > - IN PCI_IO_DEVICE *Device, > - IN PCI_RESOURCE_NODE *BridgeResource, > - OUT PCI_RESOURCE_NODE **DeviceResources OPTIONAL > + IN PCI_IO_DEVICE *Device, > + IN PCI_RESOURCE_NODE *BridgeResource > ) > { > LIST_ENTRY *Link; > PCI_RESOURCE_NODE *Resource; > - UINTN Count; > > - Count = 0; > for ( Link = BridgeResource->ChildList.ForwardLink > ; Link != &BridgeResource->ChildList > ; Link = Link->ForwardLink > ) { > Resource = RESOURCE_NODE_FROM_LINK (Link); > if (Resource->PciDev == Device) { > - if (DeviceResources != NULL) { > - DeviceResources[Count] = Resource; > - } > - Count++; > + return Resource; > } > } > > - return Count; > + return NULL; > } > > /** > Dump the resource map of all the devices under Bridge. > > - @param[in] Bridge Bridge device instance. > - @param[in] Resources Resource descriptors for the bridge device. > - @param[in] ResourceCount Count of resource descriptors. > + @param[in] Bridge Bridge device instance. > + @param[in] IoNode IO resource descriptor for the bridge device. > + @param[in] Mem32Node Mem32 resource descriptor for the bridge device. > + @param[in] PMem32Node PMem32 resource descriptor for the bridge device. > + @param[in] Mem64Node Mem64 resource descriptor for the bridge device. > + @param[in] PMem64Node PMem64 resource descriptor for the bridge device. > **/ > VOID > DumpResourceMap ( > IN PCI_IO_DEVICE *Bridge, > - IN PCI_RESOURCE_NODE **Resources, > - IN UINTN ResourceCount > + IN PCI_RESOURCE_NODE *IoNode, > + IN PCI_RESOURCE_NODE *Mem32Node, > + IN PCI_RESOURCE_NODE *PMem32Node, > + IN PCI_RESOURCE_NODE *Mem64Node, > + IN PCI_RESOURCE_NODE *PMem64Node > ) > { > - EFI_STATUS Status; > - LIST_ENTRY *Link; > - PCI_IO_DEVICE *Device; > - UINTN Index; > - CHAR16 *Str; > - PCI_RESOURCE_NODE **ChildResources; > - UINTN ChildResourceCount; > + EFI_STATUS Status; > + LIST_ENTRY *Link; > + PCI_IO_DEVICE *Device; > + PCI_RESOURCE_NODE *ChildIoNode; > + PCI_RESOURCE_NODE *ChildMem32Node; > + PCI_RESOURCE_NODE *ChildPMem32Node; > + PCI_RESOURCE_NODE *ChildMem64Node; > + PCI_RESOURCE_NODE *ChildPMem64Node; > + CHAR16 *Str; > > DEBUG ((EFI_D_INFO, "PciBus: Resource Map for ")); > > @@ -316,9 +320,11 @@ > } > } > > - for (Index = 0; Index < ResourceCount; Index++) { > - DumpBridgeResource (Resources[Index]); > - } > + DumpBridgeResource (IoNode); > + DumpBridgeResource (Mem32Node); > + DumpBridgeResource (PMem32Node); > + DumpBridgeResource (Mem64Node); > + DumpBridgeResource (PMem64Node); > DEBUG ((EFI_D_INFO, "\n")); > > for ( Link = Bridge->ChildList.ForwardLink > @@ -328,19 +334,20 @@ > Device = PCI_IO_DEVICE_FROM_LINK (Link); > if (IS_PCI_BRIDGE (&Device->Pci)) { > > - ChildResourceCount = 0; > - for (Index = 0; Index < ResourceCount; Index++) { > - ChildResourceCount += FindResourceNode (Device, Resources[Index], > NULL); > - } > - ChildResources = AllocatePool (sizeof (PCI_RESOURCE_NODE *) * > ChildResourceCount); > - ASSERT (ChildResources != NULL); > - ChildResourceCount = 0; > - for (Index = 0; Index < ResourceCount; Index++) { > - ChildResourceCount += FindResourceNode (Device, Resources[Index], > &ChildResources[ChildResourceCount]); > - } > + ChildIoNode = (IoNode == NULL ? NULL : FindResourceNode > (Device, IoNode)); > + ChildMem32Node = (Mem32Node == NULL ? NULL : FindResourceNode > (Device, Mem32Node)); > + ChildPMem32Node = (PMem32Node == NULL ? NULL : FindResourceNode > (Device, PMem32Node)); > + ChildMem64Node = (Mem64Node == NULL ? NULL : FindResourceNode > (Device, Mem64Node)); > + ChildPMem64Node = (PMem64Node == NULL ? NULL : FindResourceNode > (Device, PMem64Node)); > > - DumpResourceMap (Device, ChildResources, ChildResourceCount); > - FreePool (ChildResources); > + DumpResourceMap ( > + Device, > + ChildIoNode, > + ChildMem32Node, > + ChildPMem32Node, > + ChildMem64Node, > + ChildPMem64Node > + ); > } > } > } > @@ -800,11 +807,11 @@ > // Create the entire system resource map from the information collected by > // enumerator. Several resource tree was created > // > - FindResourceNode (RootBridgeDev, &IoPool, &IoBridge); > - FindResourceNode (RootBridgeDev, &Mem32Pool, &Mem32Bridge); > - FindResourceNode (RootBridgeDev, &PMem32Pool, &PMem32Bridge); > - FindResourceNode (RootBridgeDev, &Mem64Pool, &Mem64Bridge); > - FindResourceNode (RootBridgeDev, &PMem64Pool, &PMem64Bridge); > + IoBridge = FindResourceNode (RootBridgeDev, &IoPool); > + Mem32Bridge = FindResourceNode (RootBridgeDev, &Mem32Pool); > + PMem32Bridge = FindResourceNode (RootBridgeDev, &PMem32Pool); > + Mem64Bridge = FindResourceNode (RootBridgeDev, &Mem64Pool); > + PMem64Bridge = FindResourceNode (RootBridgeDev, &PMem64Pool); > > ASSERT (IoBridge != NULL); > ASSERT (Mem32Bridge != NULL); > @@ -862,13 +869,14 @@ > // Dump the resource map for current root bridge > // > DEBUG_CODE ( > - PCI_RESOURCE_NODE *Resources[5]; > - Resources[0] = IoBridge; > - Resources[1] = Mem32Bridge; > - Resources[2] = PMem32Bridge; > - Resources[3] = Mem64Bridge; > - Resources[4] = PMem64Bridge; > - DumpResourceMap (RootBridgeDev, Resources, sizeof (Resources) / sizeof > (Resources[0])); > + DumpResourceMap ( > + RootBridgeDev, > + IoBridge, > + Mem32Bridge, > + PMem32Bridge, > + Mem64Bridge, > + PMem64Bridge > + ); > ); > > FreePool (AcpiConfig); > @@ -976,8 +984,7 @@ > UINT8 Device; > UINT8 Func; > UINT64 Address; > - UINT8 SecondBus; > - UINT8 PaddedSubBus; > + UINTN SecondBus; > UINT16 Register; > UINTN HpIndex; > PCI_IO_DEVICE *PciDevice; > @@ -1211,7 +1218,7 @@ > > Status = PciScanBus ( > PciDevice, > - SecondBus, > + (UINT8) (SecondBus), > SubBusNumber, > PaddedBusRange > ); > @@ -1227,16 +1234,12 @@ > if ((Attributes == EfiPaddingPciRootBridge) && > (State & EFI_HPC_STATE_ENABLED) != 0 && > (State & EFI_HPC_STATE_INITIALIZED) != 0) { > - *PaddedBusRange = (UINT8) ((UINT8) (BusRange) + *PaddedBusRange); > + *PaddedBusRange = (UINT8) ((UINT8) (BusRange) +*PaddedBusRange); > } else { > - // > - // Reserve the larger one between the actual occupied bus number > and padded bus number > - // > - Status = PciAllocateBusNumber (PciDevice, StartBusNumber, > (UINT8) (BusRange), &PaddedSubBus); > + Status = PciAllocateBusNumber (PciDevice, *SubBusNumber, (UINT8) > (BusRange), SubBusNumber); > if (EFI_ERROR (Status)) { > return Status; > } > - *SubBusNumber = MAX (PaddedSubBus, *SubBusNumber); > } > } > > > Modified: trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c > =================================================================== > --- trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c > 2015-11-03 02:06:57 UTC (rev 18716) > +++ trunk/edk2/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c > 2015-11-03 02:33:05 UTC (rev 18717) > @@ -196,7 +196,6 @@ > PCI_RESOURCE_NODE *Node; > UINT64 Offset; > EFI_PCI_PLATFORM_POLICY PciPolicy; > - UINT64 PaddingAperture; > > if (!mPolicyDetermined) { > // > @@ -229,27 +228,21 @@ > mPolicyDetermined = TRUE; > } > > - Aperture = 0; > - PaddingAperture = 0; > + Aperture = 0; > > if (Bridge == NULL) { > return ; > } > > + CurrentLink = Bridge->ChildList.ForwardLink; > + > // > // Assume the bridge is aligned > // > - for ( CurrentLink = GetFirstNode (&Bridge->ChildList) > - ; !IsNull (&Bridge->ChildList, CurrentLink) > - ; CurrentLink = GetNextNode (&Bridge->ChildList, CurrentLink) > - ) { > + while (CurrentLink != &Bridge->ChildList) { > > Node = RESOURCE_NODE_FROM_LINK (CurrentLink); > - if (Node->ResourceUsage == PciResUsagePadding) { > - ASSERT (PaddingAperture == 0); > - PaddingAperture = Node->Length; > - continue; > - } > + > // > // Consider the aperture alignment > // > @@ -300,10 +293,13 @@ > // Increment aperture by the length of node > // > Aperture += Node->Length; > + > + CurrentLink = CurrentLink->ForwardLink; > } > > // > - // Adjust the aperture with the bridge's alignment > + // At last, adjust the aperture with the bridge's > + // alignment > // > Offset = Aperture & (Bridge->Alignment); > > @@ -323,12 +319,6 @@ > Bridge->Alignment = Node->Alignment; > } > } > - > - // > - // Hotplug controller needs padding resources. > - // Use the larger one between the padding resource and actual occupied > resource. > - // > - Bridge->Length = MAX (Bridge->Length, PaddingAperture); > } > > /** > @@ -346,11 +336,10 @@ > UINT64 Aperture; > LIST_ENTRY *CurrentLink; > PCI_RESOURCE_NODE *Node; > - UINT64 PaddingAperture; > + > UINT64 Offset; > > - Aperture = 0; > - PaddingAperture = 0; > + Aperture = 0; > > if (Bridge == NULL) { > return ; > @@ -362,20 +351,14 @@ > return ; > } > > + CurrentLink = Bridge->ChildList.ForwardLink; > + > // > // Assume the bridge is aligned > // > - for ( CurrentLink = GetFirstNode (&Bridge->ChildList) > - ; !IsNull (&Bridge->ChildList, CurrentLink) > - ; CurrentLink = GetNextNode (&Bridge->ChildList, CurrentLink) > - ) { > + while (CurrentLink != &Bridge->ChildList) { > > Node = RESOURCE_NODE_FROM_LINK (CurrentLink); > - if (Node->ResourceUsage == PciResUsagePadding) { > - ASSERT (PaddingAperture == 0); > - PaddingAperture = Node->Length; > - continue; > - } > > // > // Apply padding resource if available > @@ -398,6 +381,11 @@ > // Increment aperture by the length of node > // > Aperture += Node->Length; > + > + // > + // Consider the aperture alignment > + // > + CurrentLink = CurrentLink->ForwardLink; > } > > // > @@ -419,7 +407,7 @@ > } > > // > - // Adjust the bridge's alignment to the first child's alignment > + // At last, adjust the bridge's alignment to the first child's alignment > // if the bridge has at least one child > // > CurrentLink = Bridge->ChildList.ForwardLink; > @@ -429,12 +417,6 @@ > Bridge->Alignment = Node->Alignment; > } > } > - > - // > - // Hotplug controller needs padding resources. > - // Use the larger one between the padding resource and actual occupied > resource. > - // > - Bridge->Length = MAX (Bridge->Length, PaddingAperture); > } > > /** > > > ------------------------------------------------------------------------------ > _______________________________________________ > edk2-commits mailing list > edk2-commits@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-commits ------------------------------------------------------------------------------ _______________________________________________ edk2-commits mailing list edk2-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-commits ------------------------------------------------------------------------------ _______________________________________________ edk2-commits mailing list edk2-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-commits