mirror of https://github.com/acidanthera/audk.git
Update ConPlatform driver to support GOP driver which creates multiple children.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10936 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
5dec0c688e
commit
5b7183efb1
|
@ -450,22 +450,25 @@ ConPlatformTextOutDriverBindingStart (
|
|||
}
|
||||
} else {
|
||||
//
|
||||
// If it is not a hot-plug device, first append the device path to the
|
||||
// ConOutDev environment variable
|
||||
// If it is not a hot-plug device, append the device path to
|
||||
// the ConOutDev and ErrOutDev environment variable.
|
||||
// For GOP device path, append the sibling device path as well.
|
||||
//
|
||||
ConPlatformUpdateDeviceVariable (
|
||||
L"ConOutDev",
|
||||
DevicePath,
|
||||
Append
|
||||
);
|
||||
//
|
||||
// Then append the device path to the ErrOutDev environment variable
|
||||
//
|
||||
ConPlatformUpdateDeviceVariable (
|
||||
L"ErrOutDev",
|
||||
DevicePath,
|
||||
Append
|
||||
);
|
||||
if (!ConPlatformUpdateGopCandidate (DevicePath)) {
|
||||
ConPlatformUpdateDeviceVariable (
|
||||
L"ConOutDev",
|
||||
DevicePath,
|
||||
Append
|
||||
);
|
||||
//
|
||||
// Then append the device path to the ErrOutDev environment variable
|
||||
//
|
||||
ConPlatformUpdateDeviceVariable (
|
||||
L"ErrOutDev",
|
||||
DevicePath,
|
||||
Append
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// If the device path is an instance in the ConOut environment variable,
|
||||
|
@ -1022,3 +1025,79 @@ IsHotPlugDevice (
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
Update ConOutDev and ErrOutDev variables to add the device path of
|
||||
GOP controller itself and the sibling controllers.
|
||||
|
||||
@param DevicePath Pointer to device's device path.
|
||||
|
||||
@retval TRUE The devcie is a GOP device.
|
||||
@retval FALSE The devcie is not a GOP device.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
ConPlatformUpdateGopCandidate (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE PciHandle;
|
||||
EFI_HANDLE GopHandle;
|
||||
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
|
||||
UINTN EntryCount;
|
||||
UINTN Index;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ChildDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
||||
|
||||
//
|
||||
// Check whether it's a GOP device.
|
||||
//
|
||||
TempDevicePath = DevicePath;
|
||||
Status = gBS->LocateDevicePath (&gEfiGraphicsOutputProtocolGuid, &TempDevicePath, &GopHandle);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return FALSE;
|
||||
}
|
||||
//
|
||||
// Get the parent PciIo handle in order to find all the children
|
||||
//
|
||||
Status = gBS->LocateDevicePath (&gEfiPciIoProtocolGuid, &DevicePath, &PciHandle);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Status = gBS->OpenProtocolInformation (
|
||||
PciHandle,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
&OpenInfoBuffer,
|
||||
&EntryCount
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < EntryCount; Index++) {
|
||||
//
|
||||
// Query all the children created by the GOP driver
|
||||
//
|
||||
if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
|
||||
Status = gBS->OpenProtocol (
|
||||
OpenInfoBuffer[Index].ControllerHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ChildDevicePath,
|
||||
NULL,
|
||||
NULL,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
// Append the device path to ConOutDev and ErrOutDev
|
||||
//
|
||||
ConPlatformUpdateDeviceVariable (L"ConOutDev", ChildDevicePath, Append);
|
||||
ConPlatformUpdateDeviceVariable (L"ErrOutDev", ChildDevicePath, Append);
|
||||
}
|
||||
}
|
||||
}
|
||||
FreePool (OpenInfoBuffer);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||
#include <Protocol/SimpleTextOut.h>
|
||||
#include <Protocol/DevicePath.h>
|
||||
#include <Protocol/SimpleTextIn.h>
|
||||
#include <Protocol/PciIo.h>
|
||||
#include <Protocol/GraphicsOutput.h>
|
||||
|
||||
#include <Guid/GlobalVariable.h>
|
||||
#include <Guid/ConsoleInDevice.h>
|
||||
|
@ -422,5 +424,19 @@ ConPlatformComponentNameGetControllerName (
|
|||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
/**
|
||||
Update ConOutDev and ErrOutDev variables to add the device path of
|
||||
GOP controller itself and the sibling controllers.
|
||||
|
||||
@param DevicePath Pointer to device's device path.
|
||||
|
||||
@retval TRUE The devcie is a GOP device.
|
||||
@retval FALSE The devcie is not a GOP device.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
ConPlatformUpdateGopCandidate (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -87,4 +87,5 @@
|
|||
gEfiDevicePathProtocolGuid ## TO_START
|
||||
gEfiSimpleTextInProtocolGuid ## TO_START
|
||||
gEfiSimpleTextOutProtocolGuid ## TO_START
|
||||
|
||||
gEfiPciIoProtocolGuid ## TO_START
|
||||
gEfiGraphicsOutputProtocolGuid ## TO_START
|
Loading…
Reference in New Issue