bdsplatform.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 1,208 行 · 第 1/3 页
C
1,208 行
Arguments:
DeviceHandle - Handle of PCIIO protocol.
Returns:
EFI_SUCCESS - LPC bridge is added to ConOut, ConIn, and ErrOut.
EFI_STATUS - No LPC bridge is added.
--*/
{
EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
DevicePath = NULL;
Status = gBS->HandleProtocol (
DeviceHandle,
&gEfiDevicePathProtocolGuid,
&DevicePath
);
if (EFI_ERROR (Status)) {
return Status;
}
TempDevicePath = DevicePath;
//
// Register Keyboard
//
DevicePath = EfiAppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gPnpPs2KeyboardDeviceNode);
BdsLibUpdateConsoleVariable (L"ConIn", DevicePath, NULL);
//
// Register COM1
//
DevicePath = TempDevicePath;
gPnp16550ComPortDeviceNode.UID = 0;
DevicePath = EfiAppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gPnp16550ComPortDeviceNode);
DevicePath = EfiAppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gUartDeviceNode);
DevicePath = EfiAppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gTerminalTypeDeviceNode);
BdsLibUpdateConsoleVariable (L"ConOut", DevicePath, NULL);
BdsLibUpdateConsoleVariable (L"ConIn", DevicePath, NULL);
BdsLibUpdateConsoleVariable (L"ErrOut", DevicePath, NULL);
//
// Register COM2
//
DevicePath = TempDevicePath;
gPnp16550ComPortDeviceNode.UID = 1;
DevicePath = EfiAppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gPnp16550ComPortDeviceNode);
DevicePath = EfiAppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gUartDeviceNode);
DevicePath = EfiAppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gTerminalTypeDeviceNode);
BdsLibUpdateConsoleVariable (L"ConOut", DevicePath, NULL);
BdsLibUpdateConsoleVariable (L"ConIn", DevicePath, NULL);
BdsLibUpdateConsoleVariable (L"ErrOut", DevicePath, NULL);
return EFI_SUCCESS;
}
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
EFI_STATUS
GetGopDevicePath (
IN EFI_DEVICE_PATH_PROTOCOL *PciDevicePath,
OUT EFI_DEVICE_PATH_PROTOCOL **GopDevicePath
)
{
UINTN Index;
EFI_STATUS Status;
EFI_HANDLE PciDeviceHandle;
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
EFI_DEVICE_PATH_PROTOCOL *TempPciDevicePath;
UINTN GopHandleCount;
EFI_HANDLE *GopHandleBuffer;
if (PciDevicePath == NULL || GopDevicePath == NULL) {
return EFI_INVALID_PARAMETER;
}
//
// Initialize the GopDevicePath to be PciDevicePath
//
*GopDevicePath = PciDevicePath;
TempPciDevicePath = PciDevicePath;
Status = gBS->LocateDevicePath (
&gEfiDevicePathProtocolGuid,
&TempPciDevicePath,
&PciDeviceHandle
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Try to connect this handle, so that GOP dirver could start on this
// device and create child handles with GraphicsOutput Protocol installed
// on them, then we get device paths of these child handles and select
// them as possible console device.
//
gBS->ConnectController (PciDeviceHandle, NULL, NULL, FALSE);
Status = gBS->LocateHandleBuffer (
ByProtocol,
&gEfiGraphicsOutputProtocolGuid,
NULL,
&GopHandleCount,
&GopHandleBuffer
);
if (!EFI_ERROR (Status)) {
//
// Add all the child handles as possible Console Device
//
for (Index = 0; Index < GopHandleCount; Index++) {
Status = gBS->HandleProtocol (GopHandleBuffer[Index], &gEfiDevicePathProtocolGuid, &TempDevicePath);
if (EFI_ERROR (Status)) {
continue;
}
if (EfiCompareMem (
PciDevicePath,
TempDevicePath,
EfiDevicePathSize (PciDevicePath) - END_DEVICE_PATH_LENGTH
) == 0) {
//
// In current implementation, we only enable one of the child handles
// as console device, i.e. sotre one of the child handle's device
// path to variable "ConOut"
// In futhure, we could select all child handles to be console device
//
*GopDevicePath = TempDevicePath;
//
// Delete the PCI device's path that added by GetPlugInPciVgaDevicePath()
// Add the integrity GOP device path.
//
BdsLibUpdateConsoleVariable (L"ConOutDev", NULL, PciDevicePath);
BdsLibUpdateConsoleVariable (L"ConOutDev", TempDevicePath, NULL);
}
}
gBS->FreePool (GopHandleBuffer);
}
return EFI_SUCCESS;
}
#endif
EFI_STATUS
PreparePciVgaDevicePath (
IN EFI_HANDLE DeviceHandle
)
/*++
Routine Description:
Add PCI VGA to ConOut.
PCI VGA: 03 00 00
Arguments:
DeviceHandle - Handle of PCIIO protocol.
Returns:
EFI_SUCCESS - PCI VGA is added to ConOut.
EFI_STATUS - No PCI VGA device is added.
--*/
{
EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
EFI_DEVICE_PATH_PROTOCOL *GopDevicePath;
#endif
DevicePath = NULL;
Status = gBS->HandleProtocol (
DeviceHandle,
&gEfiDevicePathProtocolGuid,
&DevicePath
);
if (EFI_ERROR (Status)) {
return Status;
}
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
GetGopDevicePath (DevicePath, &GopDevicePath);
DevicePath = GopDevicePath;
#endif
BdsLibUpdateConsoleVariable (L"ConOut", DevicePath, NULL);
return EFI_SUCCESS;
}
EFI_STATUS
PreparePciSerialDevicePath (
IN EFI_HANDLE DeviceHandle
)
/*++
Routine Description:
Add PCI Serial to ConOut, ConIn, ErrOut.
PCI Serial: 07 00 02
Arguments:
DeviceHandle - Handle of PCIIO protocol.
Returns:
EFI_SUCCESS - PCI Serial is added to ConOut, ConIn, and ErrOut.
EFI_STATUS - No PCI Serial device is added.
--*/
{
EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
DevicePath = NULL;
Status = gBS->HandleProtocol (
DeviceHandle,
&gEfiDevicePathProtocolGuid,
&DevicePath
);
if (EFI_ERROR (Status)) {
return Status;
}
DevicePath = EfiAppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gUartDeviceNode);
DevicePath = EfiAppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gTerminalTypeDeviceNode);
BdsLibUpdateConsoleVariable (L"ConOut", DevicePath, NULL);
BdsLibUpdateConsoleVariable (L"ConIn", DevicePath, NULL);
BdsLibUpdateConsoleVariable (L"ErrOut", DevicePath, NULL);
return EFI_SUCCESS;
}
EFI_STATUS
DetectAndPreparePlatformPciDevicePath (
VOID
)
/*++
Routine Description:
Do platform specific PCI Device check and add them to ConOut, ConIn, ErrOut
Arguments:
None.
Returns:
EFI_SUCCESS - PCI Device check and Console variable update successfully.
EFI_STATUS - PCI Device check or Console variable update fail.
--*/
{
EFI_STATUS Status;
UINTN HandleCount;
EFI_HANDLE *HandleBuffer;
UINTN Index;
EFI_PCI_IO_PROTOCOL *PciIo;
PCI_TYPE00 Pci;
//
// Start to check all the PciIo to find all possible device
//
HandleCount = 0;
HandleBuffer = NULL;
Status = gBS->LocateHandleBuffer (
ByProtocol,
&gEfiPciIoProtocolGuid,
NULL,
&HandleCount,
&HandleBuffer
);
if (EFI_ERROR (Status)) {
return Status;
}
for (Index = 0; Index < HandleCount; Index++) {
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiPciIoProtocolGuid, &PciIo);
if (EFI_ERROR (Status)) {
continue;
}
//
// Check for all PCI device
//
Status = PciIo->Pci.Read (
PciIo,
EfiPciIoWidthUint32,
0,
sizeof (Pci) / sizeof (UINT32),
&Pci
);
if (EFI_ERROR (Status)) {
continue;
}
//
// Here we decide whether it is LPC Bridge
//
if ((IS_PCI_LPC (&Pci)) ||
((IS_PCI_ISA_PDECODE (&Pci)) && (Pci.Hdr.VendorId == 0x8086) && (Pci.Hdr.DeviceId == 0x7110))) {
//
// Add IsaKeyboard to ConIn,
// add IsaSerial to ConOut, ConIn, ErrOut
//
PrepareLpcBridgeDevicePath (HandleBuffer[Index]);
continue;
}
//
// Here we decide which VGA device to enable in PCI bus
//
if (IS_PCI_VGA (&Pci)) {
//
// Add them to ConOut.
//
PreparePciVgaDevicePath (HandleBuffer[Index]);
continue;
}
//
// Here we decide which Serial device to enable in PCI bus
//
if (IS_PCI_16550SERIAL (&Pci)) {
//
// Add them to ConOut, ConIn, ErrOut.
//
PreparePciSerialDevicePath (HandleBuffer[Index]);
continue;
}
}
gBS->FreePool (HandleBuffer);
return EFI_SUCCESS;
}
EFI_STATUS
PlatformBdsConnectConsole (
IN BDS_CONSOLE_CONNECT_ENTRY *PlatformConsole
)
/*++
Routine Description:
Connect the predefined platform default console device. Always try to find
and enable the vga device if have.
Arguments:
PlatformConsole - Predfined platform default console device array.
Returns:
EFI_SUCCESS - Success connect at least one ConIn and ConOut
device, there must have one ConOut device is
active vga device.
EFI_STATUS - Return the status of
BdsLibConnectAllDefaultConsoles ()
--*/
{
EFI_STATUS Status;
UINTN Index;
Index = 0;
Status = EFI_SUCCESS;
//
// Connect RootBridge
//
ConnectRootBridge ();
//
// Do platform specific PCI Device check and add them to ConOut, ConIn, ErrOut
//
DetectAndPreparePlatformPciDevicePath ();
//
// Have chance to connect the platform default console,
// the platform default console is the minimue device group
// the platform should support
//
while (PlatformConsole[Index].DevicePath != NULL) {
//
// Update the console variable with the connect type
//
if ((PlatformConsole[Index].ConnectType & CONSOLE_IN) == CONSOLE_IN) {
BdsLibUpdateConsoleVariable (L"ConIn", PlatformConsole[Index].DevicePath, NULL);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?