mirror of
https://github.com/acidanthera/audk.git
synced 2025-04-08 17:05:09 +02:00
UefiPayloadPkg: Add Serial IO device path according to related protocol
Current code follow some rules to check if the PCI device connected to a serial port device, but some platform or hardware doesn't follow such rule. By locating gEfiSerialIoProtocolGuid protocol, we can find the related device path. Reviewed-by: Guo Dong <guo.dong@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Cc: Maurice Ma <maurice.ma@intel.com> Cc: Benjamin You <benjamin.you@intel.com> Cc: Sean Rhodes <sean@starlabs.systems> Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
This commit is contained in:
parent
d0efa681b6
commit
57ebb2994d
@ -60,6 +60,7 @@
|
|||||||
gEfiDxeSmmReadyToLockProtocolGuid
|
gEfiDxeSmmReadyToLockProtocolGuid
|
||||||
gEfiSmmAccess2ProtocolGuid
|
gEfiSmmAccess2ProtocolGuid
|
||||||
gUniversalPayloadPlatformBootManagerOverrideProtocolGuid
|
gUniversalPayloadPlatformBootManagerOverrideProtocolGuid
|
||||||
|
gEfiSerialIoProtocolGuid
|
||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut
|
gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut
|
||||||
|
@ -47,36 +47,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define gPnpPs2Keyboard \
|
#define gPnpPs2Keyboard \
|
||||||
PNPID_DEVICE_PATH_NODE(0x0303)
|
PNPID_DEVICE_PATH_NODE(0x0303)
|
||||||
|
|
||||||
#define gUartVendor \
|
|
||||||
{ \
|
|
||||||
{ \
|
|
||||||
HARDWARE_DEVICE_PATH, \
|
|
||||||
HW_VENDOR_DP, \
|
|
||||||
{ \
|
|
||||||
(UINT8) (sizeof (VENDOR_DEVICE_PATH)), \
|
|
||||||
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) \
|
|
||||||
} \
|
|
||||||
}, \
|
|
||||||
EDKII_SERIAL_PORT_LIB_VENDOR_GUID \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gUart \
|
|
||||||
{ \
|
|
||||||
{ \
|
|
||||||
MESSAGING_DEVICE_PATH, \
|
|
||||||
MSG_UART_DP, \
|
|
||||||
{ \
|
|
||||||
(UINT8) (sizeof (UART_DEVICE_PATH)), \
|
|
||||||
(UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) \
|
|
||||||
} \
|
|
||||||
}, \
|
|
||||||
0, \
|
|
||||||
115200, \
|
|
||||||
8, \
|
|
||||||
1, \
|
|
||||||
1 \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gPcAnsiTerminal \
|
#define gPcAnsiTerminal \
|
||||||
{ \
|
{ \
|
||||||
{ \
|
{ \
|
||||||
@ -92,9 +62,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode = gPnpPs2Keyboard;
|
ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode = gPnpPs2Keyboard;
|
||||||
ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode = gPnp16550ComPort;
|
ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode = gPnp16550ComPort;
|
||||||
UART_DEVICE_PATH gUartDeviceNode = gUart;
|
|
||||||
VENDOR_DEVICE_PATH gTerminalTypeDeviceNode = gPcAnsiTerminal;
|
VENDOR_DEVICE_PATH gTerminalTypeDeviceNode = gPcAnsiTerminal;
|
||||||
VENDOR_DEVICE_PATH gUartDeviceVendorNode = gUartVendor;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Predefined platform root bridge
|
// Predefined platform root bridge
|
||||||
@ -112,13 +80,11 @@ EFI_DEVICE_PATH_PROTOCOL *gPlatformRootBridges[] = {
|
|||||||
BOOLEAN mDetectDisplayOnly;
|
BOOLEAN mDetectDisplayOnly;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Add IsaKeyboard to ConIn; add IsaSerial to ConOut, ConIn, ErrOut.
|
Add IsaKeyboard to ConIn.
|
||||||
|
|
||||||
@param[in] DeviceHandle Handle of the LPC Bridge device.
|
@param[in] DeviceHandle Handle of the LPC Bridge device.
|
||||||
|
|
||||||
@retval EFI_SUCCESS Console devices on the LPC bridge have been added to
|
@retval EFI_SUCCESS IsaKeyboard on the LPC bridge have been added to ConIn.
|
||||||
ConOut, ConIn, and ErrOut.
|
|
||||||
|
|
||||||
@return Error codes, due to EFI_DEVICE_PATH_PROTOCOL missing
|
@return Error codes, due to EFI_DEVICE_PATH_PROTOCOL missing
|
||||||
from DeviceHandle.
|
from DeviceHandle.
|
||||||
**/
|
**/
|
||||||
@ -129,7 +95,6 @@ PrepareLpcBridgeDevicePath (
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
|
||||||
|
|
||||||
DevicePath = NULL;
|
DevicePath = NULL;
|
||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
@ -141,26 +106,11 @@ PrepareLpcBridgeDevicePath (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempDevicePath = DevicePath;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Register Keyboard
|
// Register Keyboard
|
||||||
//
|
//
|
||||||
DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gPnpPs2KeyboardDeviceNode);
|
DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gPnpPs2KeyboardDeviceNode);
|
||||||
EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL);
|
EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL);
|
||||||
|
|
||||||
//
|
|
||||||
// Register COM1
|
|
||||||
//
|
|
||||||
DevicePath = TempDevicePath;
|
|
||||||
DevicePath = AppendDevicePathNode ((EFI_DEVICE_PATH_PROTOCOL *)NULL, (EFI_DEVICE_PATH_PROTOCOL *)&gUartDeviceVendorNode);
|
|
||||||
DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gUartDeviceNode);
|
|
||||||
DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gTerminalTypeDeviceNode);
|
|
||||||
|
|
||||||
EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL);
|
|
||||||
EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL);
|
|
||||||
EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL);
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,43 +241,6 @@ PreparePciVgaDevicePath (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Add PCI Serial to ConOut, ConIn, ErrOut.
|
|
||||||
|
|
||||||
@param[in] DeviceHandle - Handle of PciIo protocol.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS - PCI Serial is added to ConOut, ConIn, and ErrOut.
|
|
||||||
@retval EFI_STATUS - No PCI Serial device is added.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
PreparePciSerialDevicePath (
|
|
||||||
IN EFI_HANDLE DeviceHandle
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
|
||||||
|
|
||||||
DevicePath = NULL;
|
|
||||||
Status = gBS->HandleProtocol (
|
|
||||||
DeviceHandle,
|
|
||||||
&gEfiDevicePathProtocolGuid,
|
|
||||||
(VOID *)&DevicePath
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gUartDeviceNode);
|
|
||||||
DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gTerminalTypeDeviceNode);
|
|
||||||
|
|
||||||
EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL);
|
|
||||||
EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL);
|
|
||||||
EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL);
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
For every PCI instance execute a callback function.
|
For every PCI instance execute a callback function.
|
||||||
|
|
||||||
@ -447,18 +360,6 @@ DetectAndPreparePlatformPciDevicePath (
|
|||||||
PrepareLpcBridgeDevicePath (Handle);
|
PrepareLpcBridgeDevicePath (Handle);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Here we decide which Serial device to enable in PCI bus
|
|
||||||
//
|
|
||||||
if (IS_PCI_16550SERIAL (&Pci)) {
|
|
||||||
//
|
|
||||||
// Add them to ConOut, ConIn, ErrOut.
|
|
||||||
//
|
|
||||||
DEBUG ((DEBUG_INFO, "Found PCI 16550 SERIAL device\n"));
|
|
||||||
PreparePciSerialDevicePath (Handle);
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -476,6 +377,39 @@ DetectAndPreparePlatformPciDevicePath (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
For every Serial Io instance, add it to ConOut, ConIn, ErrOut.
|
||||||
|
|
||||||
|
@param[in] Handle - The Serial Io device handle
|
||||||
|
@param[in] Instance - The instance of the SerialIo protocol
|
||||||
|
|
||||||
|
@retval EFI_STATUS - Callback function failed.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AddDevicePathForOneSerialIoInstance (
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
IN VOID *Instance
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
|
|
||||||
|
DevicePath = NULL;
|
||||||
|
Status = gBS->HandleProtocol (
|
||||||
|
Handle,
|
||||||
|
&gEfiDevicePathProtocolGuid,
|
||||||
|
(VOID *)&DevicePath
|
||||||
|
);
|
||||||
|
DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&gTerminalTypeDeviceNode);
|
||||||
|
|
||||||
|
EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL);
|
||||||
|
EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL);
|
||||||
|
EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Do platform specific PCI Device check and add them to ConOut, ConIn, ErrOut
|
Do platform specific PCI Device check and add them to ConOut, ConIn, ErrOut
|
||||||
|
|
||||||
@ -500,6 +434,11 @@ DetectAndPreparePlatformPciDevicePaths (
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VisitAllInstancesOfProtocol (
|
||||||
|
&gEfiSerialIoProtocolGuid,
|
||||||
|
AddDevicePathForOneSerialIoInstance
|
||||||
|
);
|
||||||
|
|
||||||
Status = VisitAllInstancesOfProtocol (
|
Status = VisitAllInstancesOfProtocol (
|
||||||
&gEfiPciIoProtocolGuid,
|
&gEfiPciIoProtocolGuid,
|
||||||
DetectAndPreparePlatformPciDevicePath
|
DetectAndPreparePlatformPciDevicePath
|
||||||
@ -552,11 +491,6 @@ PlatformConsoleInit (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
gUartDeviceNode.BaudRate = PcdGet64 (PcdUartDefaultBaudRate);
|
|
||||||
gUartDeviceNode.DataBits = PcdGet8 (PcdUartDefaultDataBits);
|
|
||||||
gUartDeviceNode.Parity = PcdGet8 (PcdUartDefaultParity);
|
|
||||||
gUartDeviceNode.StopBits = PcdGet8 (PcdUartDefaultStopBits);
|
|
||||||
|
|
||||||
ConnectRootBridge ();
|
ConnectRootBridge ();
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -21,7 +21,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Protocol/PciIo.h>
|
#include <Protocol/PciIo.h>
|
||||||
|
|
||||||
#define IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
|
#define IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
|
||||||
#define IS_PCI_16550SERIAL(_p) IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Type definitions
|
// Type definitions
|
||||||
|
Loading…
x
Reference in New Issue
Block a user