mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/PciBus: Restrict one VGA per HostBridge not Segment
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1109 Today's restriction of VGA device is to have only one VGA device enabled per PCI segment. It's not correct because several segments may share one IO / MMIO address space. We should restrict to have one VGA per Host Bridge because each Host Bridge has its only IO / MMIO address space. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
parent
06da1e310b
commit
983f5abb9a
|
@ -979,33 +979,33 @@ PciDeviceExisted (
|
|||
}
|
||||
|
||||
/**
|
||||
Get the active VGA device on the same segment.
|
||||
Get the active VGA device on the specified Host Bridge.
|
||||
|
||||
@param VgaDevice PCI IO instance for the VGA device.
|
||||
@param HostBridgeHandle Host Bridge handle.
|
||||
|
||||
@return The active VGA device on the same segment.
|
||||
@return The active VGA device on the specified Host Bridge.
|
||||
|
||||
**/
|
||||
PCI_IO_DEVICE *
|
||||
ActiveVGADeviceOnTheSameSegment (
|
||||
IN PCI_IO_DEVICE *VgaDevice
|
||||
LocateVgaDeviceOnHostBridge (
|
||||
IN EFI_HANDLE HostBridgeHandle
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *CurrentLink;
|
||||
PCI_IO_DEVICE *Temp;
|
||||
PCI_IO_DEVICE *PciIoDevice;
|
||||
|
||||
CurrentLink = mPciDevicePool.ForwardLink;
|
||||
|
||||
while (CurrentLink != NULL && CurrentLink != &mPciDevicePool) {
|
||||
|
||||
Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
|
||||
PciIoDevice = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
|
||||
|
||||
if (Temp->PciRootBridgeIo->SegmentNumber == VgaDevice->PciRootBridgeIo->SegmentNumber) {
|
||||
if (PciIoDevice->PciRootBridgeIo->ParentHandle== HostBridgeHandle) {
|
||||
|
||||
Temp = LocateVgaDevice (Temp);
|
||||
PciIoDevice = LocateVgaDevice (PciIoDevice);
|
||||
|
||||
if (Temp != NULL) {
|
||||
return Temp;
|
||||
if (PciIoDevice != NULL) {
|
||||
return PciIoDevice;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -230,16 +230,16 @@ PciDeviceExisted (
|
|||
);
|
||||
|
||||
/**
|
||||
Get the active VGA device on the same segment.
|
||||
Get the active VGA device on the specified Host Bridge.
|
||||
|
||||
@param VgaDevice PCI IO instance for the VGA device.
|
||||
@param HostBridgeHandle Host Bridge handle.
|
||||
|
||||
@return The active VGA device on the same segment.
|
||||
@return The active VGA device on the specified Host Bridge.
|
||||
|
||||
**/
|
||||
PCI_IO_DEVICE *
|
||||
ActiveVGADeviceOnTheSameSegment (
|
||||
IN PCI_IO_DEVICE *VgaDevice
|
||||
LocateVgaDeviceOnHostBridge (
|
||||
IN EFI_HANDLE HostBridgeHandle
|
||||
);
|
||||
|
||||
/**
|
||||
|
|
|
@ -1413,9 +1413,9 @@ SupportPaletteSnoopAttributes (
|
|||
}
|
||||
|
||||
//
|
||||
// Get the boot VGA on the same segement
|
||||
// Get the boot VGA on the same Host Bridge
|
||||
//
|
||||
Temp = ActiveVGADeviceOnTheSameSegment (PciIoDevice);
|
||||
Temp = LocateVgaDeviceOnHostBridge (PciIoDevice->PciRootBridgeIo->ParentHandle);
|
||||
|
||||
if (Temp == NULL) {
|
||||
//
|
||||
|
@ -1668,9 +1668,9 @@ PciIoAttributes (
|
|||
//
|
||||
if (Operation == EfiPciIoAttributeOperationEnable) {
|
||||
//
|
||||
// Check if there have been an active VGA device on the same segment
|
||||
// Check if there have been an active VGA device on the same Host Bridge
|
||||
//
|
||||
Temp = ActiveVGADeviceOnTheSameSegment (PciIoDevice);
|
||||
Temp = LocateVgaDeviceOnHostBridge (PciIoDevice->PciRootBridgeIo->ParentHandle);
|
||||
if (Temp != NULL && Temp != PciIoDevice) {
|
||||
//
|
||||
// An active VGA has been detected, so can not enable another
|
||||
|
|
Loading…
Reference in New Issue