diff options
author | Maurice Ma <maurice.ma@intel.com> | 2016-05-16 08:29:40 -0700 |
---|---|---|
committer | Maurice Ma <maurice.ma@intel.com> | 2016-05-17 07:20:06 -0700 |
commit | b41ef32518095f783d0c2343b496cc857c6f3dff (patch) | |
tree | 8bdca9f82185535e621fb1b41a9936f3a48ec922 | |
parent | 1fed57ab5d6961c43866b98c6ef56e1740373b1c (diff) | |
download | edk2-b41ef32518095f783d0c2343b496cc857c6f3dff.tar.gz edk2-b41ef32518095f783d0c2343b496cc857c6f3dff.tar.bz2 edk2-b41ef32518095f783d0c2343b496cc857c6f3dff.zip |
CorebootModulePkg: Remove PciSioSerialDxe and SerialDxe driver
CorebootPayloadPkg has been changed to use generic SerialDxe driver
from MdeModulePkg. As part of the clean-up, the overridden SerialDxe
and PciSioSerialDxe drivers in CorebootModulePkg need to be removed.
Cc: Prince Agyeman <prince.agyeman@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Maurice Ma <maurice.ma@intel.com>
Reviewed-by: Lee Leahy <leroy.p.leahy@intel.com>
-rw-r--r-- | CorebootModulePkg/PciSioSerialDxe/ComponentName.c | 288 | ||||
-rw-r--r-- | CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxe.inf | 82 | ||||
-rw-r--r-- | CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxe.uni | 21 | ||||
-rw-r--r-- | CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxeExtra.uni | 18 | ||||
-rw-r--r-- | CorebootModulePkg/PciSioSerialDxe/Serial.c | 1248 | ||||
-rw-r--r-- | CorebootModulePkg/PciSioSerialDxe/Serial.h | 789 | ||||
-rw-r--r-- | CorebootModulePkg/PciSioSerialDxe/SerialIo.c | 1320 | ||||
-rw-r--r-- | CorebootModulePkg/SerialDxe/SerialDxe.inf | 55 | ||||
-rw-r--r-- | CorebootModulePkg/SerialDxe/SerialDxe.uni | 21 | ||||
-rw-r--r-- | CorebootModulePkg/SerialDxe/SerialDxeExtra.uni | 19 | ||||
-rw-r--r-- | CorebootModulePkg/SerialDxe/SerialIo.c | 528 |
11 files changed, 0 insertions, 4389 deletions
diff --git a/CorebootModulePkg/PciSioSerialDxe/ComponentName.c b/CorebootModulePkg/PciSioSerialDxe/ComponentName.c deleted file mode 100644 index ca8b1bdb4e..0000000000 --- a/CorebootModulePkg/PciSioSerialDxe/ComponentName.c +++ /dev/null @@ -1,288 +0,0 @@ -/** @file - UEFI Component Name and Name2 protocol for Isa serial driver. - -Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Serial.h" - -// -// EFI Component Name Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gPciSioSerialComponentName = { - SerialComponentNameGetDriverName, - SerialComponentNameGetControllerName, - "eng" -}; - -// -// EFI Component Name 2 Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPciSioSerialComponentName2 = { - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) SerialComponentNameGetDriverName, - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) SerialComponentNameGetControllerName, - "en" -}; - - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mSerialDriverNameTable[] = { - { - "eng;en", - L"PCI SIO Serial Driver" - }, - { - NULL, - NULL - } -}; - -GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 mSioSerialPortName[] = L"SIO Serial Port #%d"; -GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 mPciSerialPortName[] = L"PCI Serial Port #%d"; - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param DriverName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -SerialComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -{ - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mSerialDriverNameTable, - DriverName, - (BOOLEAN)(This == &gPciSioSerialComponentName) - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -SerialComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -{ - EFI_STATUS Status; - EFI_SERIAL_IO_PROTOCOL *SerialIo; - SERIAL_DEV *SerialDevice; - EFI_UNICODE_STRING_TABLE *ControllerNameTable; - EFI_GUID *IoProtocolGuid; - - // - // Make sure this driver is currently managing ControllerHandle - // - IoProtocolGuid = &gEfiSioProtocolGuid; - Status = EfiTestManagedDevice ( - ControllerHandle, - gSerialControllerDriver.DriverBindingHandle, - IoProtocolGuid - ); - if (EFI_ERROR (Status)) { - IoProtocolGuid = &gEfiPciIoProtocolGuid; - Status = EfiTestManagedDevice ( - ControllerHandle, - gSerialControllerDriver.DriverBindingHandle, - IoProtocolGuid - ); - } - - if (EFI_ERROR (Status)) { - return Status; - } - - ControllerNameTable = NULL; - if (ChildHandle != NULL) { - Status = EfiTestChildHandle ( - ControllerHandle, - ChildHandle, - IoProtocolGuid - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Get the Serial I/O Protocol from the child handle - // - Status = gBS->OpenProtocol ( - ChildHandle, - &gEfiSerialIoProtocolGuid, - (VOID **) &SerialIo, - gSerialControllerDriver.DriverBindingHandle, - ChildHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Get the Serial Controller's Device structure - // - SerialDevice = SERIAL_DEV_FROM_THIS (SerialIo); - ControllerNameTable = SerialDevice->ControllerNameTable; - } - - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - ControllerNameTable, - ControllerName, - (BOOLEAN)(This == &gPciSioSerialComponentName) - ); -} - -/** - Add the ISO639-2 and RFC4646 component name both for the Serial IO device - - @param SerialDevice A pointer to the SERIAL_DEV instance. - @param Instance Instance ID for the serial device. -**/ -VOID -AddName ( - IN SERIAL_DEV *SerialDevice, - IN UINT32 Instance - ) -{ - CHAR16 SerialPortName[SERIAL_PORT_NAME_LEN]; - UnicodeSPrint ( - SerialPortName, - sizeof (SerialPortName), - (SerialDevice->PciDeviceInfo != NULL) ? PCI_SERIAL_PORT_NAME : SIO_SERIAL_PORT_NAME, - Instance - ); - AddUnicodeString2 ( - "eng", - gPciSioSerialComponentName.SupportedLanguages, - &SerialDevice->ControllerNameTable, - SerialPortName, - TRUE - ); - AddUnicodeString2 ( - "en", - gPciSioSerialComponentName2.SupportedLanguages, - &SerialDevice->ControllerNameTable, - SerialPortName, - FALSE - ); - -} diff --git a/CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxe.inf b/CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxe.inf deleted file mode 100644 index 6bbd414626..0000000000 --- a/CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxe.inf +++ /dev/null @@ -1,82 +0,0 @@ -## @file -# Serial driver for standard UARTS on a SIO chip or PCI/PCIE card. -# -# Produces the Serial I/O protocol for standard UARTS using Super I/O or PCI I/O. -# -# Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR> -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = PciSioSerialDxe - MODULE_UNI_FILE = PciSioSerialDxe.uni - FILE_GUID = BD81CC8D-B89F-422d-BDB8-9331ACE732E8 - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = InitializePciSioSerial - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 IPF EBC -# -# DRIVER_BINDING = gSerialControllerDriver -# COMPONENT_NAME = gPciSioSerialComponentName -# COMPONENT_NAME2 = gPciSioSerialComponentName2 -# - -[Sources] - ComponentName.c - SerialIo.c - Serial.h - Serial.c - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - -[LibraryClasses] - PcdLib - PlatformHookLib - ReportStatusCodeLib - UefiBootServicesTableLib - MemoryAllocationLib - BaseMemoryLib - DevicePathLib - UefiLib - UefiDriverEntryPoint - DebugLib - IoLib - -[Guids] - gEfiUartDevicePathGuid ## SOMETIMES_CONSUMES ## GUID - -[Protocols] - gEfiSioProtocolGuid ## TO_START - gEfiDevicePathProtocolGuid ## TO_START - gEfiPciIoProtocolGuid ## TO_START - gEfiSerialIoProtocolGuid ## BY_START - gEfiDevicePathProtocolGuid ## BY_START - -[FeaturePcd] - gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseHalfHandshake|FALSE ## CONSUMES - -[Pcd] - gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate ## CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits ## CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity ## CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits ## CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate ## CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdPciSerialParameters ## CONSUMES - -[UserExtensions.TianoCore."ExtraFiles"] - PciSioSerialDxeExtra.uni diff --git a/CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxe.uni b/CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxe.uni deleted file mode 100644 index 50d3bd43be..0000000000 --- a/CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxe.uni +++ /dev/null @@ -1,21 +0,0 @@ -// /** @file -// Serial driver for standard UARTS on a SIO chip or PCI/PCIE card. -// -// Produces the Serial I/O protocol for standard UARTS using Super I/O or PCI I/O. -// -// Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "Serial driver for standard UARTS on a SIO chip or PCI/PCIE card." - -#string STR_MODULE_DESCRIPTION #language en-US "Produces the Serial I/O protocol for standard UARTS using Super I/O or PCI I/O." diff --git a/CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxeExtra.uni b/CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxeExtra.uni deleted file mode 100644 index 36b62ac865..0000000000 --- a/CorebootModulePkg/PciSioSerialDxe/PciSioSerialDxeExtra.uni +++ /dev/null @@ -1,18 +0,0 @@ -// /** @file -// PciSioSerialDxe Localized Strings and Content -// -// Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"PCI SIO UART Serial Bus DXE Driver" diff --git a/CorebootModulePkg/PciSioSerialDxe/Serial.c b/CorebootModulePkg/PciSioSerialDxe/Serial.c deleted file mode 100644 index 2f1a9a000b..0000000000 --- a/CorebootModulePkg/PciSioSerialDxe/Serial.c +++ /dev/null @@ -1,1248 +0,0 @@ -/** @file - Serial driver for PCI or SIO UARTS. - -Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Serial.h" - -// -// ISA Serial Driver Global Variables -// - -EFI_DRIVER_BINDING_PROTOCOL gSerialControllerDriver = { - SerialControllerDriverSupported, - SerialControllerDriverStart, - SerialControllerDriverStop, - 0xa, - NULL, - NULL -}; - -CONTROLLER_DEVICE_PATH mControllerDevicePathTemplate = { - { - HARDWARE_DEVICE_PATH, - HW_CONTROLLER_DP, - { - (UINT8) (sizeof (CONTROLLER_DEVICE_PATH)), - (UINT8) ((sizeof (CONTROLLER_DEVICE_PATH)) >> 8) - } - }, - 0 -}; - -SERIAL_DEV gSerialDevTemplate = { - SERIAL_DEV_SIGNATURE, - NULL, - { - SERIAL_IO_INTERFACE_REVISION, - SerialReset, - SerialSetAttributes, - SerialSetControl, - SerialGetControl, - SerialWrite, - SerialRead, - NULL - }, // SerialIo - { - SERIAL_PORT_SUPPORT_CONTROL_MASK, - SERIAL_PORT_DEFAULT_TIMEOUT, - 0, - 16, - 0, - 0, - 0 - }, // SerialMode - NULL, // DevicePath - NULL, // ParentDevicePath - { - { - MESSAGING_DEVICE_PATH, - MSG_UART_DP, - { - (UINT8) (sizeof (UART_DEVICE_PATH)), - (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) - } - }, - 0, 0, 0, 0, 0 - }, // UartDevicePath - 0, // BaseAddress - FALSE, // MmioAccess - 1, // RegisterStride - 0, // ClockRate - 16, // ReceiveFifoDepth - { 0, 0 }, // Receive; - 16, // TransmitFifoDepth - { 0, 0 }, // Transmit; - FALSE, // SoftwareLoopbackEnable; - FALSE, // HardwareFlowControl; - NULL, // *ControllerNameTable; - FALSE, // ContainsControllerNode; - 0, // Instance; - NULL // *PciDeviceInfo; -}; - -/** - Check the device path node whether it's the Flow Control node or not. - - @param[in] FlowControl The device path node to be checked. - - @retval TRUE It's the Flow Control node. - @retval FALSE It's not. - -**/ -BOOLEAN -IsUartFlowControlDevicePathNode ( - IN UART_FLOW_CONTROL_DEVICE_PATH *FlowControl - ) -{ - return (BOOLEAN) ( - (DevicePathType (FlowControl) == MESSAGING_DEVICE_PATH) && - (DevicePathSubType (FlowControl) == MSG_VENDOR_DP) && - (CompareGuid (&FlowControl->Guid, &gEfiUartDevicePathGuid)) - ); -} - -/** - The user Entry Point for module PciSioSerial. The user code starts with this function. - - @param[in] ImageHandle The firmware allocated handle for the EFI image. - @param[in] SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The entry point is executed successfully. - @retval other Some error occurs when executing this entry point. - -**/ -EFI_STATUS -EFIAPI -InitializePciSioSerial ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - - // - // Install driver model protocol(s). - // - Status = EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &gSerialControllerDriver, - ImageHandle, - &gPciSioSerialComponentName, - &gPciSioSerialComponentName2 - ); - ASSERT_EFI_ERROR (Status); - - // - // Initialize UART default setting in gSerialDevTempate - // - gSerialDevTemplate.SerialMode.BaudRate = PcdGet64 (PcdUartDefaultBaudRate); - gSerialDevTemplate.SerialMode.DataBits = PcdGet8 (PcdUartDefaultDataBits); - gSerialDevTemplate.SerialMode.Parity = PcdGet8 (PcdUartDefaultParity); - gSerialDevTemplate.SerialMode.StopBits = PcdGet8 (PcdUartDefaultStopBits); - gSerialDevTemplate.UartDevicePath.BaudRate = PcdGet64 (PcdUartDefaultBaudRate); - gSerialDevTemplate.UartDevicePath.DataBits = PcdGet8 (PcdUartDefaultDataBits); - gSerialDevTemplate.UartDevicePath.Parity = PcdGet8 (PcdUartDefaultParity); - gSerialDevTemplate.UartDevicePath.StopBits = PcdGet8 (PcdUartDefaultStopBits); - gSerialDevTemplate.ClockRate = PcdGet32 (PcdSerialClockRate); - - return Status; -} - -/** - Return whether the controller is a SIO serial controller. - - @param Controller The controller handle. - - @retval EFI_SUCCESS The controller is a SIO serial controller. - @retval others The controller is not a SIO serial controller. -**/ -EFI_STATUS -IsSioSerialController ( - EFI_HANDLE Controller - ) -{ - EFI_STATUS Status; - EFI_SIO_PROTOCOL *Sio; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - ACPI_HID_DEVICE_PATH *Acpi; - - // - // Open the IO Abstraction(s) needed to perform the supported test - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiSioProtocolGuid, - (VOID **) &Sio, - gSerialControllerDriver.DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (Status == EFI_ALREADY_STARTED) { - return EFI_SUCCESS; - } - - if (!EFI_ERROR (Status)) { - // - // Close the I/O Abstraction(s) used to perform the supported test - // - gBS->CloseProtocol ( - Controller, - &gEfiSioProtocolGuid, - gSerialControllerDriver.DriverBindingHandle, - Controller - ); - - Status = gBS->OpenProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - (VOID **) &DevicePath, - gSerialControllerDriver.DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - ASSERT (Status != EFI_ALREADY_STARTED); - - if (!EFI_ERROR (Status)) { - do { - Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath; - DevicePath = NextDevicePathNode (DevicePath); - } while (!IsDevicePathEnd (DevicePath)); - - if (DevicePathType (Acpi) != ACPI_DEVICE_PATH || - (DevicePathSubType (Acpi) != ACPI_DP && DevicePathSubType (Acpi) != ACPI_EXTENDED_DP) || - Acpi->HID != EISA_PNP_ID (0x501) - ) { - Status = EFI_UNSUPPORTED; - } - } - - // - // Close protocol, don't use device path protocol in the Support() function - // - gBS->CloseProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - gSerialControllerDriver.DriverBindingHandle, - Controller - ); - } - return Status; -} - -/** - Return whether the controller is a PCI serial controller. - - @param Controller The controller handle. - - @retval EFI_SUCCESS The controller is a PCI serial controller. - @retval others The controller is not a PCI serial controller. -**/ -EFI_STATUS -IsPciSerialController ( - EFI_HANDLE Controller - ) -{ - EFI_STATUS Status; - EFI_PCI_IO_PROTOCOL *PciIo; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - PCI_TYPE00 Pci; - PCI_SERIAL_PARAMETER *PciSerialParameter; - - // - // Open the IO Abstraction(s) needed to perform the supported test - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiPciIoProtocolGuid, - (VOID **) &PciIo, - gSerialControllerDriver.DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (Status == EFI_ALREADY_STARTED) { - return EFI_SUCCESS; - } - - if (!EFI_ERROR (Status)) { - Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0, sizeof (Pci), &Pci); - if (!EFI_ERROR (Status)) { - if (!IS_PCI_16550_SERIAL (&Pci)) { - for (PciSerialParameter = (PCI_SERIAL_PARAMETER *) PcdGetPtr (PcdPciSerialParameters) - ; PciSerialParameter->VendorId != 0xFFFF - ; PciSerialParameter++ - ) { - if ((Pci.Hdr.VendorId == PciSerialParameter->VendorId) && - (Pci.Hdr.DeviceId == PciSerialParameter->DeviceId) - ) { - break; - } - } - if (PciSerialParameter->VendorId == 0xFFFF) { - Status = EFI_UNSUPPORTED; - } else { - Status = EFI_SUCCESS; - } - } - } - - // - // Close the I/O Abstraction(s) used to perform the supported test - // - gBS->CloseProtocol ( - Controller, - &gEfiPciIoProtocolGuid, - gSerialControllerDriver.DriverBindingHandle, - Controller - ); - } - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Open the EFI Device Path protocol needed to perform the supported test - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - (VOID **) &DevicePath, - gSerialControllerDriver.DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - ASSERT (Status != EFI_ALREADY_STARTED); - - // - // Close protocol, don't use device path protocol in the Support() function - // - gBS->CloseProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - gSerialControllerDriver.DriverBindingHandle, - Controller - ); - - return Status; -} - -/** - Check to see if this driver supports the given controller - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param Controller The handle of the controller to test. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - - @return EFI_SUCCESS This driver can support the given controller - -**/ -EFI_STATUS -EFIAPI -SerialControllerDriverSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) - -{ - EFI_STATUS Status; - UART_DEVICE_PATH *Uart; - UART_FLOW_CONTROL_DEVICE_PATH *FlowControl; - - // - // Test RemainingDevicePath - // - if ((RemainingDevicePath != NULL) && !IsDevicePathEnd (RemainingDevicePath)) { - Status = EFI_UNSUPPORTED; - - Uart = SkipControllerDevicePathNode (RemainingDevicePath, NULL, NULL); - if (DevicePathType (Uart) != MESSAGING_DEVICE_PATH || - DevicePathSubType (Uart) != MSG_UART_DP || - DevicePathNodeLength (Uart) != sizeof (UART_DEVICE_PATH) - ) { - return EFI_UNSUPPORTED; - } - - // - // Do a rough check because Clock Rate is unknown until DriverBindingStart() - // - if (!VerifyUartParameters (0, Uart->BaudRate, Uart->DataBits, Uart->Parity, Uart->StopBits, NULL, NULL)) { - return EFI_UNSUPPORTED; - } - - FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Uart); - if (IsUartFlowControlDevicePathNode (FlowControl)) { - // - // If the second node is Flow Control Node, - // return error when it request other than hardware flow control. - // - if ((ReadUnaligned32 (&FlowControl->FlowControlMap) & ~UART_FLOW_CONTROL_HARDWARE) != 0) { - return EFI_UNSUPPORTED; - } - } - } - - Status = IsSioSerialController (Controller); - if (EFI_ERROR (Status)) { - Status = IsPciSerialController (Controller); - } - return Status; -} - -/** - Create the child serial device instance. - - @param Controller The parent controller handle. - @param Uart Pointer to the UART device path node in RemainingDevicePath, - or NULL if RemainingDevicePath is NULL. - @param ParentDevicePath Pointer to the parent device path. - @param CreateControllerNode TRUE to create the controller node. - @param Instance Instance number of the serial device. - The value will be set to the controller node - if CreateControllerNode is TRUE. - @param ParentIo A union type pointer to either Sio or PciIo. - @param PciSerialParameter The PCI serial parameter to be used by current serial device. - NULL for SIO serial device. - @param PciDeviceInfo The PCI device info for the current serial device. - NULL for SIO serial device. - - @retval EFI_SUCCESS The serial device was created successfully. - @retval others The serial device wasn't created. -**/ -EFI_STATUS -CreateSerialDevice ( - IN EFI_HANDLE Controller, - IN UART_DEVICE_PATH *Uart, - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, - IN BOOLEAN CreateControllerNode, - IN UINT32 Instance, - IN PARENT_IO_PROTOCOL_PTR ParentIo, - IN PCI_SERIAL_PARAMETER *PciSerialParameter, OPTIONAL - IN PCI_DEVICE_INFO *PciDeviceInfo OPTIONAL - ) -{ - EFI_STATUS Status; - SERIAL_DEV *SerialDevice; - UINT8 BarIndex; - UINT64 Offset; - UART_FLOW_CONTROL_DEVICE_PATH *FlowControl; - UINT32 FlowControlMap; - ACPI_RESOURCE_HEADER_PTR Resources; - EFI_ACPI_IO_PORT_DESCRIPTOR *Io; - EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR *FixedIo; - EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *AddressSpace; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - - BarIndex = 0; - Offset = 0; - FlowControl = NULL; - FlowControlMap = 0; - - // - // Initialize the serial device instance - // - SerialDevice = AllocateCopyPool (sizeof (SERIAL_DEV), &gSerialDevTemplate); - ASSERT (SerialDevice != NULL); - - SerialDevice->SerialIo.Mode = &(SerialDevice->SerialMode); - SerialDevice->ParentDevicePath = ParentDevicePath; - SerialDevice->PciDeviceInfo = PciDeviceInfo; - SerialDevice->Instance = Instance; - - if (Uart != NULL) { - CopyMem (&SerialDevice->UartDevicePath, Uart, sizeof (UART_DEVICE_PATH)); - FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Uart); - if (IsUartFlowControlDevicePathNode (FlowControl)) { - FlowControlMap = ReadUnaligned32 (&FlowControl->FlowControlMap); - } else { - FlowControl = NULL; - } - } - - // - // For PCI serial device, use the information from PCD - // - if (PciSerialParameter != NULL) { - BarIndex = (PciSerialParameter->BarIndex == PCI_BAR_ALL) ? 0 : PciSerialParameter->BarIndex; - Offset = PciSerialParameter->Offset; - if (PciSerialParameter->RegisterStride != 0) { - SerialDevice->RegisterStride = PciSerialParameter->RegisterStride; - } - if (PciSerialParameter->ClockRate != 0) { - SerialDevice->ClockRate = PciSerialParameter->ClockRate; - } - if (PciSerialParameter->ReceiveFifoDepth != 0) { - SerialDevice->ReceiveFifoDepth = PciSerialParameter->ReceiveFifoDepth; - } - if (PciSerialParameter->TransmitFifoDepth != 0) { - SerialDevice->TransmitFifoDepth = PciSerialParameter->TransmitFifoDepth; - } - } - - // - // Pass NULL ActualBaudRate to VerifyUartParameters to disallow baudrate degrade. - // DriverBindingStart() shouldn't create a handle with different UART device path. - // - if (!VerifyUartParameters (SerialDevice->ClockRate, SerialDevice->UartDevicePath.BaudRate, SerialDevice->UartDevicePath.DataBits, - SerialDevice->UartDevicePath.Parity, SerialDevice->UartDevicePath.StopBits, NULL, NULL - )) { - Status = EFI_INVALID_PARAMETER; - goto CreateError; - } - - if (PciSerialParameter == NULL) { - Status = ParentIo.Sio->GetResources (ParentIo.Sio, &Resources); - } else { - Status = ParentIo.PciIo->GetBarAttributes (ParentIo.PciIo, BarIndex, NULL, (VOID **) &Resources); - } - - if (!EFI_ERROR (Status)) { - // - // Get the base address information from ACPI resource descriptor. - // ACPI_IO_PORT_DESCRIPTOR and ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR are returned from Sio; - // ACPI_ADDRESS_SPACE_DESCRIPTOR is returned from PciIo. - // - while ((Resources.SmallHeader->Byte != ACPI_END_TAG_DESCRIPTOR) && (SerialDevice->BaseAddress == 0)) { - switch (Resources.SmallHeader->Byte) { - case ACPI_IO_PORT_DESCRIPTOR: - Io = (EFI_ACPI_IO_PORT_DESCRIPTOR *) Resources.SmallHeader; - if (Io->Length != 0) { - SerialDevice->BaseAddress = Io->BaseAddressMin; - } - break; - - case ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR: - FixedIo = (EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR *) Resources.SmallHeader; - if (FixedIo->Length != 0) { - SerialDevice->BaseAddress = FixedIo->BaseAddress; - } - break; - - case ACPI_ADDRESS_SPACE_DESCRIPTOR: - AddressSpace = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Resources.SmallHeader; - if (AddressSpace->AddrLen != 0) { - if (AddressSpace->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) { - SerialDevice->MmioAccess = TRUE; - } - SerialDevice->BaseAddress = AddressSpace->AddrRangeMin + Offset; - } - break; - } - - if (Resources.SmallHeader->Bits.Type == 0) { - Resources.SmallHeader = (ACPI_SMALL_RESOURCE_HEADER *) ((UINT8 *) Resources.SmallHeader - + Resources.SmallHeader->Bits.Length - + sizeof (*Resources.SmallHeader)); - } else { - Resources.LargeHeader = (ACPI_LARGE_RESOURCE_HEADER *) ((UINT8 *) Resources.LargeHeader - + Resources.LargeHeader->Length - + sizeof (*Resources.LargeHeader)); - } - } - } - - if (SerialDevice->BaseAddress == 0) { - Status = EFI_INVALID_PARAMETER; - goto CreateError; - } - - SerialDevice->HardwareFlowControl = (BOOLEAN) (FlowControlMap == UART_FLOW_CONTROL_HARDWARE); - - // - // Report status code the serial present - // - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_PROGRESS_CODE, - EFI_P_PC_PRESENCE_DETECT | EFI_PERIPHERAL_SERIAL_PORT, - SerialDevice->ParentDevicePath - ); - - if (!SerialPresent (SerialDevice)) { - Status = EFI_DEVICE_ERROR; - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_ERROR_CODE, - EFI_P_EC_NOT_DETECTED | EFI_PERIPHERAL_SERIAL_PORT, - SerialDevice->ParentDevicePath - ); - goto CreateError; - } - - // - // 1. Append Controller device path node. - // - if (CreateControllerNode) { - mControllerDevicePathTemplate.ControllerNumber = SerialDevice->Instance; - SerialDevice->DevicePath = AppendDevicePathNode ( - SerialDevice->ParentDevicePath, - (EFI_DEVICE_PATH_PROTOCOL *) &mControllerDevicePathTemplate - ); - SerialDevice->ContainsControllerNode = TRUE; - } - - // - // 2. Append UART device path node. - // The Uart setings are zero here. - // SetAttribute() will update them to match the default setings. - // - TempDevicePath = SerialDevice->DevicePath; - if (TempDevicePath != NULL) { - SerialDevice->DevicePath = AppendDevicePathNode ( - TempDevicePath, - (EFI_DEVICE_PATH_PROTOCOL *) &SerialDevice->UartDevicePath - ); - FreePool (TempDevicePath); - } else { - SerialDevice->DevicePath = AppendDevicePathNode ( - SerialDevice->ParentDevicePath, - (EFI_DEVICE_PATH_PROTOCOL *) &SerialDevice->UartDevicePath - ); - } - // - // 3. Append the Flow Control device path node. - // Only produce the Flow Control node when remaining device path has it - // - if (FlowControl != NULL) { - TempDevicePath = SerialDevice->DevicePath; - if (TempDevicePath != NULL) { - SerialDevice->DevicePath = AppendDevicePathNode ( - TempDevicePath, - (EFI_DEVICE_PATH_PROTOCOL *) FlowControl - ); - FreePool (TempDevicePath); - } - } - ASSERT (SerialDevice->DevicePath != NULL); - - // - // Fill in Serial I/O Mode structure based on either the RemainingDevicePath or defaults. - // - SerialDevice->SerialMode.BaudRate = SerialDevice->UartDevicePath.BaudRate; - SerialDevice->SerialMode.DataBits = SerialDevice->UartDevicePath.DataBits; - SerialDevice->SerialMode.Parity = SerialDevice->UartDevicePath.Parity; - SerialDevice->SerialMode.StopBits = SerialDevice->UartDevicePath.StopBits; - - // - // Issue a reset to initialize the COM port - // - Status = SerialDevice->SerialIo.Reset (&SerialDevice->SerialIo); - if (EFI_ERROR (Status)) { - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_ERROR_CODE, - EFI_P_EC_CONTROLLER_ERROR | EFI_PERIPHERAL_SERIAL_PORT, - SerialDevice->DevicePath - ); - goto CreateError; - } - - AddName (SerialDevice, Instance); - // - // Install protocol interfaces for the serial device. - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &SerialDevice->Handle, - &gEfiDevicePathProtocolGuid, SerialDevice->DevicePath, - &gEfiSerialIoProtocolGuid, &SerialDevice->SerialIo, - NULL - ); - if (EFI_ERROR (Status)) { - goto CreateError; - } - // - // Open For Child Device - // - Status = gBS->OpenProtocol ( - Controller, - PciSerialParameter != NULL ? &gEfiPciIoProtocolGuid : &gEfiSioProtocolGuid, - (VOID **) &ParentIo, - gSerialControllerDriver.DriverBindingHandle, - SerialDevice->Handle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - - if (EFI_ERROR (Status)) { - gBS->UninstallMultipleProtocolInterfaces ( - &SerialDevice->Handle, - &gEfiDevicePathProtocolGuid, SerialDevice->DevicePath, - &gEfiSerialIoProtocolGuid, &SerialDevice->SerialIo, - NULL - ); - } - -CreateError: - if (EFI_ERROR (Status)) { - if (SerialDevice->DevicePath != NULL) { - FreePool (SerialDevice->DevicePath); - } - if (SerialDevice->ControllerNameTable != NULL) { - FreeUnicodeStringTable (SerialDevice->ControllerNameTable); - } - FreePool (SerialDevice); - } - return Status; -} - -/** - Returns an array of pointers containing all the child serial device pointers. - - @param Controller The parent controller handle. - @param IoProtocolGuid The protocol GUID, either equals to gEfiSioProtocolGuid - or equals to gEfiPciIoProtocolGuid. - @param Count Count of the serial devices. - - @return An array of pointers containing all the child serial device pointers. -**/ -SERIAL_DEV ** -GetChildSerialDevices ( - IN EFI_HANDLE Controller, - IN EFI_GUID *IoProtocolGuid, - OUT UINTN *Count - ) -{ - EFI_STATUS Status; - UINTN Index; - EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer; - UINTN EntryCount; - SERIAL_DEV **SerialDevices; - EFI_SERIAL_IO_PROTOCOL *SerialIo; - BOOLEAN OpenByDriver; - - *Count = 0; - // - // If the SerialIo instance specified by RemainingDevicePath is already created, - // update the attributes/control. - // - Status = gBS->OpenProtocolInformation ( - Controller, - IoProtocolGuid, - &OpenInfoBuffer, - &EntryCount - ); - if (EFI_ERROR (Status)) { - return NULL; - } - - SerialDevices = AllocatePool (EntryCount * sizeof (SERIAL_DEV *)); - ASSERT (SerialDevices != NULL); - - *Count = 0; - OpenByDriver = FALSE; - for (Index = 0; Index < EntryCount; Index++) { - if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { - Status = gBS->OpenProtocol ( - OpenInfoBuffer[Index].ControllerHandle, - &gEfiSerialIoProtocolGuid, - (VOID **) &SerialIo, - gSerialControllerDriver.DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - SerialDevices[(*Count)++] = SERIAL_DEV_FROM_THIS (SerialIo); - } - } - - - if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) { - ASSERT (OpenInfoBuffer[Index].AgentHandle == gSerialControllerDriver.DriverBindingHandle); - OpenByDriver = TRUE; - } - } - if (OpenInfoBuffer != NULL) { - FreePool (OpenInfoBuffer); - } - - ASSERT ((*Count == 0) || (OpenByDriver)); - - return SerialDevices; -} - -/** - Start to management the controller passed in - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param Controller The handle of the controller to test. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - - @return EFI_SUCCESS Driver is started successfully -**/ -EFI_STATUS -EFIAPI -SerialControllerDriverStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -{ - EFI_STATUS Status; - UINTN Index; - EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; - EFI_DEVICE_PATH_PROTOCOL *Node; - EFI_SERIAL_IO_PROTOCOL *SerialIo; - UINT32 ControllerNumber; - UART_DEVICE_PATH *Uart; - UART_FLOW_CONTROL_DEVICE_PATH *FlowControl; - UINT32 Control; - PARENT_IO_PROTOCOL_PTR ParentIo; - ACPI_HID_DEVICE_PATH *Acpi; - EFI_GUID *IoProtocolGuid; - PCI_SERIAL_PARAMETER *PciSerialParameter; - PCI_SERIAL_PARAMETER DefaultPciSerialParameter; - PCI_TYPE00 Pci; - UINT32 PciSerialCount; - SERIAL_DEV **SerialDevices; - UINTN SerialDeviceCount; - PCI_DEVICE_INFO *PciDeviceInfo; - UINT64 Supports; - BOOLEAN ContainsControllerNode; - - // - // Get the Parent Device Path - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - (VOID **) &ParentDevicePath, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { - return Status; - } - // - // Report status code enable the serial - // - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_PROGRESS_CODE, - EFI_P_PC_ENABLE | EFI_PERIPHERAL_SERIAL_PORT, - ParentDevicePath - ); - - // - // Grab the IO abstraction we need to get any work done - // - IoProtocolGuid = &gEfiSioProtocolGuid; - Status = gBS->OpenProtocol ( - Controller, - IoProtocolGuid, - (VOID **) &ParentIo, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { - IoProtocolGuid = &gEfiPciIoProtocolGuid; - Status = gBS->OpenProtocol ( - Controller, - IoProtocolGuid, - (VOID **) &ParentIo, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - } - ASSERT (!EFI_ERROR (Status) || Status == EFI_ALREADY_STARTED); - - // - // Do nothing for END device path node - // - if ((RemainingDevicePath != NULL) && IsDevicePathEnd (RemainingDevicePath)) { - return EFI_SUCCESS; - } - - ControllerNumber = 0; - ContainsControllerNode = FALSE; - SerialDevices = GetChildSerialDevices (Controller, IoProtocolGuid, &SerialDeviceCount); - // - // If the SerialIo instance specified by RemainingDevicePath is already created, - // update the attributes/control. - // - if ((SerialDeviceCount != 0) && (RemainingDevicePath != NULL)) { - Uart = (UART_DEVICE_PATH *) SkipControllerDevicePathNode (RemainingDevicePath, &ContainsControllerNode, &ControllerNumber); - for (Index = 0; Index < SerialDeviceCount; Index++) { - ASSERT ((SerialDevices != NULL) && (SerialDevices[Index] != NULL)); - if ((!SerialDevices[Index]->ContainsControllerNode && !ContainsControllerNode) || - (SerialDevices[Index]->ContainsControllerNode && ContainsControllerNode && SerialDevices[Index]->Instance == ControllerNumber) - ) { - SerialIo = &SerialDevices[Index]->SerialIo; - Status = EFI_INVALID_PARAMETER; - // - // Pass NULL ActualBaudRate to VerifyUartParameters to disallow baudrate degrade. - // DriverBindingStart() shouldn't create a handle with different UART device path. - // - if (VerifyUartParameters (SerialDevices[Index]->ClockRate, Uart->BaudRate, Uart->DataBits, - (EFI_PARITY_TYPE) Uart->Parity, (EFI_STOP_BITS_TYPE) Uart->StopBits, NULL, NULL)) { - Status = SerialIo->SetAttributes ( - SerialIo, - Uart->BaudRate, - SerialIo->Mode->ReceiveFifoDepth, - SerialIo->Mode->Timeout, - (EFI_PARITY_TYPE) Uart->Parity, - Uart->DataBits, - (EFI_STOP_BITS_TYPE) Uart->StopBits - ); - } - FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Uart); - if (!EFI_ERROR (Status) && IsUartFlowControlDevicePathNode (FlowControl)) { - Status = SerialIo->GetControl (SerialIo, &Control); - if (!EFI_ERROR (Status)) { - if (ReadUnaligned32 (&FlowControl->FlowControlMap) == UART_FLOW_CONTROL_HARDWARE) { - Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE; - } else { - Control &= ~EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE; - } - // - // Clear the bits that are not allowed to pass to SetControl - // - Control &= (EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY | - EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | - EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE); - Status = SerialIo->SetControl (SerialIo, Control); - } - } - break; - } - } - if (Index != SerialDeviceCount) { - // - // Directly return if the SerialIo instance specified by RemainingDevicePath is found and updated. - // Otherwise continue to create the instance specified by RemainingDevicePath. - // - if (SerialDevices != NULL) { - FreePool (SerialDevices); - } - return Status; - } - } - - if (RemainingDevicePath != NULL) { - Uart = (UART_DEVICE_PATH *) SkipControllerDevicePathNode (RemainingDevicePath, &ContainsControllerNode, &ControllerNumber); - } else { - Uart = NULL; - } - - PciDeviceInfo = NULL; - if (IoProtocolGuid == &gEfiSioProtocolGuid) { - Status = EFI_NOT_FOUND; - if (RemainingDevicePath == NULL || !ContainsControllerNode) { - Node = ParentDevicePath; - do { - Acpi = (ACPI_HID_DEVICE_PATH *) Node; - Node = NextDevicePathNode (Node); - } while (!IsDevicePathEnd (Node)); - Status = CreateSerialDevice (Controller, Uart, ParentDevicePath, FALSE, Acpi->UID, ParentIo, NULL, NULL); - DEBUG ((EFI_D_INFO, "PciSioSerial: Create SIO child serial device - %r\n", Status)); - } - } else { - Status = ParentIo.PciIo->Pci.Read (ParentIo.PciIo, EfiPciIoWidthUint8, 0, sizeof (Pci), &Pci); - if (!EFI_ERROR (Status)) { - // - // PcdPciSerialParameters takes the higher priority. - // - PciSerialCount = 0; - for (PciSerialParameter = PcdGetPtr (PcdPciSerialParameters); PciSerialParameter->VendorId != 0xFFFF; PciSerialParameter++) { - if ((PciSerialParameter->VendorId == Pci.Hdr.VendorId) && - (PciSerialParameter->DeviceId == Pci.Hdr.DeviceId) - ) { - PciSerialCount++; - } - } - - if (SerialDeviceCount == 0) { - // - // Enable the IO & MEM decoding when creating the first child. - // Restore the PCI attributes when all children is destroyed (PciDeviceInfo->ChildCount == 0). - // - PciDeviceInfo = AllocatePool (sizeof (PCI_DEVICE_INFO)); - ASSERT (PciDeviceInfo != NULL); - PciDeviceInfo->ChildCount = 0; - PciDeviceInfo->PciIo = ParentIo.PciIo; - Status = ParentIo.PciIo->Attributes ( - ParentIo.PciIo, - EfiPciIoAttributeOperationGet, - 0, - &PciDeviceInfo->PciAttributes - ); - - if (!EFI_ERROR (Status)) { - Status = ParentIo.PciIo->Attributes ( - ParentIo.PciIo, - EfiPciIoAttributeOperationSupported, - 0, - &Supports - ); - if (!EFI_ERROR (Status)) { - Supports &= (UINT64)(EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY); - Status = ParentIo.PciIo->Attributes ( - ParentIo.PciIo, - EfiPciIoAttributeOperationEnable, - Supports, - NULL - ); - } - } - } else { - // - // Re-use the PciDeviceInfo stored in existing children. - // - ASSERT ((SerialDevices != NULL) && (SerialDevices[0] != NULL)); - PciDeviceInfo = SerialDevices[0]->PciDeviceInfo; - ASSERT (PciDeviceInfo != NULL); - } - - Status = EFI_NOT_FOUND; - if (PciSerialCount <= 1) { - // - // PCI serial device contains only one UART - // - if (RemainingDevicePath == NULL || !ContainsControllerNode) { - // - // This PCI serial device is matched by class code in Supported() - // - if (PciSerialCount == 0) { - DefaultPciSerialParameter.VendorId = Pci.Hdr.VendorId; - DefaultPciSerialParameter.DeviceId = Pci.Hdr.DeviceId; - DefaultPciSerialParameter.BarIndex = 0; - DefaultPciSerialParameter.Offset = 0; - DefaultPciSerialParameter.RegisterStride = 0; - DefaultPciSerialParameter.ClockRate = 0; - PciSerialParameter = &DefaultPciSerialParameter; - } else if (PciSerialCount == 1) { - PciSerialParameter = PcdGetPtr (PcdPciSerialParameters); - } - - Status = CreateSerialDevice (Controller, Uart, ParentDevicePath, FALSE, 0, ParentIo, PciSerialParameter, PciDeviceInfo); - DEBUG ((EFI_D_INFO, "PciSioSerial: Create PCI child serial device (single) - %r\n", Status)); - if (!EFI_ERROR (Status)) { - PciDeviceInfo->ChildCount++; - } - } - } else { - // - // PCI serial device contains multiple UARTs - // - if (RemainingDevicePath == NULL || ContainsControllerNode) { - PciSerialCount = 0; - for (PciSerialParameter = PcdGetPtr (PcdPciSerialParameters); PciSerialParameter->VendorId != 0xFFFF; PciSerialParameter++) { - if ((PciSerialParameter->VendorId == Pci.Hdr.VendorId) && - (PciSerialParameter->DeviceId == Pci.Hdr.DeviceId) && - ((RemainingDevicePath == NULL) || (ControllerNumber == PciSerialCount)) - ) { - // - // Create controller node when PCI serial device contains multiple UARTs - // - Status = CreateSerialDevice (Controller, Uart, ParentDevicePath, TRUE, PciSerialCount, ParentIo, PciSerialParameter, PciDeviceInfo); - PciSerialCount++; - DEBUG ((EFI_D_INFO, "PciSioSerial: Create PCI child serial device (multiple) - %r\n", Status)); - if (!EFI_ERROR (Status)) { - PciDeviceInfo->ChildCount++; - } - } - } - } - } - } - } - - if (SerialDevices != NULL) { - FreePool (SerialDevices); - } - - // - // For multiple PCI serial devices, set Status to SUCCESS if one child is created successfully - // - if ((PciDeviceInfo != NULL) && (PciDeviceInfo->ChildCount != 0)) { - Status = EFI_SUCCESS; - } - - if (EFI_ERROR (Status) && (SerialDeviceCount == 0)) { - if (PciDeviceInfo != NULL) { - Status = ParentIo.PciIo->Attributes ( - ParentIo.PciIo, - EfiPciIoAttributeOperationSet, - PciDeviceInfo->PciAttributes, - NULL - ); - ASSERT_EFI_ERROR (Status); - FreePool (PciDeviceInfo); - } - gBS->CloseProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - This->DriverBindingHandle, - Controller - ); - gBS->CloseProtocol ( - Controller, - IoProtocolGuid, - This->DriverBindingHandle, - Controller - ); - } - - return Status; -} - -/** - Disconnect this driver with the controller, uninstall related protocol instance - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param Controller The handle of the controller to test. - @param NumberOfChildren Number of child device. - @param ChildHandleBuffer A pointer to the remaining portion of a device path. - - @retval EFI_SUCCESS Operation successfully - @retval EFI_DEVICE_ERROR Cannot stop the driver successfully - -**/ -EFI_STATUS -EFIAPI -SerialControllerDriverStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ) - -{ - EFI_STATUS Status; - UINTN Index; - BOOLEAN AllChildrenStopped; - EFI_SERIAL_IO_PROTOCOL *SerialIo; - SERIAL_DEV *SerialDevice; - VOID *IoProtocol; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - PCI_DEVICE_INFO *PciDeviceInfo; - - PciDeviceInfo = NULL; - - Status = gBS->HandleProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - (VOID **) &DevicePath - ); - - // - // Report the status code disable the serial - // - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_PROGRESS_CODE, - EFI_P_PC_DISABLE | EFI_PERIPHERAL_SERIAL_PORT, - DevicePath - ); - - if (NumberOfChildren == 0) { - // - // Close the bus driver - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiPciIoProtocolGuid, - &IoProtocol, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - gBS->CloseProtocol ( - Controller, - !EFI_ERROR (Status) ? &gEfiPciIoProtocolGuid : &gEfiSioProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - gBS->CloseProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - This->DriverBindingHandle, - Controller - ); - return EFI_SUCCESS; - } - - AllChildrenStopped = TRUE; - - for (Index = 0; Index < NumberOfChildren; Index++) { - - Status = gBS->OpenProtocol ( - ChildHandleBuffer[Index], - &gEfiSerialIoProtocolGuid, - (VOID **) &SerialIo, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - - SerialDevice = SERIAL_DEV_FROM_THIS (SerialIo); - ASSERT ((PciDeviceInfo == NULL) || (PciDeviceInfo == SerialDevice->PciDeviceInfo)); - PciDeviceInfo = SerialDevice->PciDeviceInfo; - - Status = gBS->CloseProtocol ( - Controller, - PciDeviceInfo != NULL ? &gEfiPciIoProtocolGuid : &gEfiSioProtocolGuid, - This->DriverBindingHandle, - ChildHandleBuffer[Index] - ); - - Status = gBS->UninstallMultipleProtocolInterfaces ( - ChildHandleBuffer[Index], - &gEfiDevicePathProtocolGuid, SerialDevice->DevicePath, - &gEfiSerialIoProtocolGuid, &SerialDevice->SerialIo, - NULL - ); - if (EFI_ERROR (Status)) { - gBS->OpenProtocol ( - Controller, - PciDeviceInfo != NULL ? &gEfiPciIoProtocolGuid : &gEfiSioProtocolGuid, - &IoProtocol, - This->DriverBindingHandle, - ChildHandleBuffer[Index], - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - } else { - FreePool (SerialDevice->DevicePath); - FreeUnicodeStringTable (SerialDevice->ControllerNameTable); - FreePool (SerialDevice); - - if (PciDeviceInfo != NULL) { - ASSERT (PciDeviceInfo->ChildCount != 0); - PciDeviceInfo->ChildCount--; - } - } - } - - if (EFI_ERROR (Status)) { - AllChildrenStopped = FALSE; - } - } - - if (!AllChildrenStopped) { - return EFI_DEVICE_ERROR; - } else { - // - // If all children are destroyed, restore the PCI attributes. - // - if ((PciDeviceInfo != NULL) && (PciDeviceInfo->ChildCount == 0)) { - ASSERT (PciDeviceInfo->PciIo != NULL); - Status = PciDeviceInfo->PciIo->Attributes ( - PciDeviceInfo->PciIo, - EfiPciIoAttributeOperationSet, - PciDeviceInfo->PciAttributes, - NULL - ); - ASSERT_EFI_ERROR (Status); - FreePool (PciDeviceInfo); - } - return EFI_SUCCESS; - } -} diff --git a/CorebootModulePkg/PciSioSerialDxe/Serial.h b/CorebootModulePkg/PciSioSerialDxe/Serial.h deleted file mode 100644 index 239c944af2..0000000000 --- a/CorebootModulePkg/PciSioSerialDxe/Serial.h +++ /dev/null @@ -1,789 +0,0 @@ -/** @file - Header file for PciSioSerial Driver - -Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _SERIAL_H_ -#define _SERIAL_H_ - - -#include <Uefi.h> - -#include <IndustryStandard/Pci.h> - -#include <Protocol/SuperIo.h> -#include <Protocol/PciIo.h> -#include <Protocol/SerialIo.h> -#include <Protocol/DevicePath.h> - -#include <Library/DebugLib.h> -#include <Library/UefiDriverEntryPoint.h> -#include <Library/UefiLib.h> -#include <Library/DevicePathLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/ReportStatusCodeLib.h> -#include <Library/PcdLib.h> -#include <Library/IoLib.h> -#include <Library/PrintLib.h> - -// -// Driver Binding Externs -// -extern EFI_DRIVER_BINDING_PROTOCOL gSerialControllerDriver; -extern EFI_COMPONENT_NAME_PROTOCOL gPciSioSerialComponentName; -extern EFI_COMPONENT_NAME2_PROTOCOL gPciSioSerialComponentName2; - -#define SIO_SERIAL_PORT_NAME L"SIO Serial Port #%d" -#define PCI_SERIAL_PORT_NAME L"PCI Serial Port #%d" -#define SERIAL_PORT_NAME_LEN (sizeof (SIO_SERIAL_PORT_NAME) / sizeof (CHAR16) + MAXIMUM_VALUE_CHARACTERS) - -// -// Internal Data Structures -// -#define TIMEOUT_STALL_INTERVAL 10 - -#pragma pack(1) -/// -/// PcdPciSerialParameters contains zero or more instances of the below structure. -/// If a PCI device contains multiple UARTs, PcdPciSerialParameters needs to contain -/// two instances of the below structure, with the VendorId and DeviceId equals to the -/// device ID and vendor ID of the device. If the PCI device uses the first two BARs -/// to support multiple UARTs, BarIndex of first instance equals to 0 and BarIndex of -/// second one equals to 1; if the PCI device uses the first BAR to support multiple -/// UARTs, BarIndex of both instance equals to 0 and Offset of first instance equals -/// to 0 while Offset of second one equals to some value bigger or equal to 8. -/// For certain UART whose register needs to be accessed in DWORD aligned address, -/// RegisterStride equals to 4. -/// -typedef struct { - UINT16 VendorId; ///< Vendor ID to match the PCI device. The value 0xFFFF terminates the list of entries. - UINT16 DeviceId; ///< Device ID to match the PCI device - UINT32 ClockRate; ///< UART clock rate. Set to 0 for default clock rate of 1843200 Hz - UINT64 Offset; ///< The byte offset into to the BAR - UINT8 BarIndex; ///< Which BAR to get the UART base address - UINT8 RegisterStride; ///< UART register stride in bytes. Set to 0 for default register stride of 1 byte. - UINT16 ReceiveFifoDepth; ///< UART receive FIFO depth in bytes. Set to 0 for a default FIFO depth of 16 bytes. - UINT16 TransmitFifoDepth; ///< UART transmit FIFO depth in bytes. Set to 0 for a default FIFO depth of 16 bytes. - UINT8 Reserved[2]; -} PCI_SERIAL_PARAMETER; -#pragma pack() - -#define SERIAL_MAX_FIFO_SIZE 17 ///< Actual FIFO size is 16. FIFO based on circular wastes one unit. -typedef struct { - UINT16 Head; ///< Head pointer of the FIFO. Empty when (Head == Tail). - UINT16 Tail; ///< Tail pointer of the FIFO. Full when ((Tail + 1) % SERIAL_MAX_FIFO_SIZE == Head). - UINT8 Data[SERIAL_MAX_FIFO_SIZE]; ///< Store the FIFO data. -} SERIAL_DEV_FIFO; - -typedef union { - EFI_PCI_IO_PROTOCOL *PciIo; - EFI_SIO_PROTOCOL *Sio; -} PARENT_IO_PROTOCOL_PTR; - -typedef struct { - EFI_PCI_IO_PROTOCOL *PciIo; // Pointer to parent PciIo instance. - UINTN ChildCount; // Count of child SerialIo instance. - UINT64 PciAttributes; // Original PCI attributes. -} PCI_DEVICE_INFO; - -typedef struct { - UINT32 Signature; - EFI_HANDLE Handle; - EFI_SERIAL_IO_PROTOCOL SerialIo; - EFI_SERIAL_IO_MODE SerialMode; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - - EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; - UART_DEVICE_PATH UartDevicePath; - - EFI_PHYSICAL_ADDRESS BaseAddress; ///< UART base address - BOOLEAN MmioAccess; ///< TRUE for MMIO, FALSE for IO - UINT8 RegisterStride; ///< UART Register Stride - UINT32 ClockRate; ///< UART clock rate - - UINT16 ReceiveFifoDepth; ///< UART receive FIFO depth in bytes. - SERIAL_DEV_FIFO Receive; ///< The FIFO used to store received data - - UINT16 TransmitFifoDepth; ///< UART transmit FIFO depth in bytes. - SERIAL_DEV_FIFO Transmit; ///< The FIFO used to store to-transmit data - - BOOLEAN SoftwareLoopbackEnable; - BOOLEAN HardwareFlowControl; - EFI_UNICODE_STRING_TABLE *ControllerNameTable; - BOOLEAN ContainsControllerNode; ///< TRUE if the device produced contains Controller node - UINT32 Instance; - PCI_DEVICE_INFO *PciDeviceInfo; -} SERIAL_DEV; - -#define SERIAL_DEV_SIGNATURE SIGNATURE_32 ('s', 'e', 'r', 'd') -#define SERIAL_DEV_FROM_THIS(a) CR (a, SERIAL_DEV, SerialIo, SERIAL_DEV_SIGNATURE) - -// -// Serial Driver Defaults -// -#define SERIAL_PORT_DEFAULT_TIMEOUT 1000000 -#define SERIAL_PORT_SUPPORT_CONTROL_MASK (EFI_SERIAL_CLEAR_TO_SEND | \ - EFI_SERIAL_DATA_SET_READY | \ - EFI_SERIAL_RING_INDICATE | \ - EFI_SERIAL_CARRIER_DETECT | \ - EFI_SERIAL_REQUEST_TO_SEND | \ - EFI_SERIAL_DATA_TERMINAL_READY | \ - EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | \ - EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \ - EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE | \ - EFI_SERIAL_OUTPUT_BUFFER_EMPTY | \ - EFI_SERIAL_INPUT_BUFFER_EMPTY) - -#define SERIAL_PORT_MIN_TIMEOUT 1 // 1 uS -#define SERIAL_PORT_MAX_TIMEOUT 100000000 // 100 seconds -// -// UART Registers -// -#define SERIAL_REGISTER_THR 0 ///< WO Transmit Holding Register -#define SERIAL_REGISTER_RBR 0 ///< RO Receive Buffer Register -#define SERIAL_REGISTER_DLL 0 ///< R/W Divisor Latch LSB -#define SERIAL_REGISTER_DLM 1 ///< R/W Divisor Latch MSB -#define SERIAL_REGISTER_IER 1 ///< R/W Interrupt Enable Register -#define SERIAL_REGISTER_IIR 2 ///< RO Interrupt Identification Register -#define SERIAL_REGISTER_FCR 2 ///< WO FIFO Cotrol Register -#define SERIAL_REGISTER_LCR 3 ///< R/W Line Control Register -#define SERIAL_REGISTER_MCR 4 ///< R/W Modem Control Register -#define SERIAL_REGISTER_LSR 5 ///< R/W Line Status Register -#define SERIAL_REGISTER_MSR 6 ///< R/W Modem Status Register -#define SERIAL_REGISTER_SCR 7 ///< R/W Scratch Pad Register -#pragma pack(1) - -/// -/// Interrupt Enable Register -/// -typedef union { - struct { - UINT8 Ravie : 1; ///< Receiver Data Available Interrupt Enable - UINT8 Theie : 1; ///< Transmistter Holding Register Empty Interrupt Enable - UINT8 Rie : 1; ///< Receiver Interrupt Enable - UINT8 Mie : 1; ///< Modem Interrupt Enable - UINT8 Reserved : 4; - } Bits; - UINT8 Data; -} SERIAL_PORT_IER; - -/// -/// FIFO Control Register -/// -typedef union { - struct { - UINT8 TrFIFOE : 1; ///< Transmit and Receive FIFO Enable - UINT8 ResetRF : 1; ///< Reset Reciever FIFO - UINT8 ResetTF : 1; ///< Reset Transmistter FIFO - UINT8 Dms : 1; ///< DMA Mode Select - UINT8 Reserved : 1; - UINT8 TrFIFO64 : 1; ///< Enable 64 byte FIFO - UINT8 Rtb : 2; ///< Receive Trigger Bits - } Bits; - UINT8 Data; -} SERIAL_PORT_FCR; - -/// -/// Line Control Register -/// -typedef union { - struct { - UINT8 SerialDB : 2; ///< Number of Serial Data Bits - UINT8 StopB : 1; ///< Number of Stop Bits - UINT8 ParEn : 1; ///< Parity Enable - UINT8 EvenPar : 1; ///< Even Parity Select - UINT8 SticPar : 1; ///< Sticky Parity - UINT8 BrCon : 1; ///< Break Control - UINT8 DLab : 1; ///< Divisor Latch Access Bit - } Bits; - UINT8 Data; -} SERIAL_PORT_LCR; - -/// -/// Modem Control Register -/// -typedef union { - struct { - UINT8 DtrC : 1; ///< Data Terminal Ready Control - UINT8 Rts : 1; ///< Request To Send Control - UINT8 Out1 : 1; ///< Output1 - UINT8 Out2 : 1; ///< Output2, used to disable interrupt - UINT8 Lme : 1; ///< Loopback Mode Enable - UINT8 Reserved : 3; - } Bits; - UINT8 Data; -} SERIAL_PORT_MCR; - -/// -/// Line Status Register -/// -typedef union { - struct { - UINT8 Dr : 1; ///< Receiver Data Ready Status - UINT8 Oe : 1; ///< Overrun Error Status - UINT8 Pe : 1; ///< Parity Error Status - UINT8 Fe : 1; ///< Framing Error Status - UINT8 Bi : 1; ///< Break Interrupt Status - UINT8 Thre : 1; ///< Transmistter Holding Register Status - UINT8 Temt : 1; ///< Transmitter Empty Status - UINT8 FIFOe : 1; ///< FIFO Error Status - } Bits; - UINT8 Data; -} SERIAL_PORT_LSR; - -/// -/// Modem Status Register -/// -typedef union { - struct { - UINT8 DeltaCTS : 1; ///< Delta Clear To Send Status - UINT8 DeltaDSR : 1; ///< Delta Data Set Ready Status - UINT8 TrailingEdgeRI : 1; ///< Trailing Edge of Ring Indicator Status - UINT8 DeltaDCD : 1; ///< Delta Data Carrier Detect Status - UINT8 Cts : 1; ///< Clear To Send Status - UINT8 Dsr : 1; ///< Data Set Ready Status - UINT8 Ri : 1; ///< Ring Indicator Status - UINT8 Dcd : 1; ///< Data Carrier Detect Status - } Bits; - UINT8 Data; -} SERIAL_PORT_MSR; - -#pragma pack() -// -// Define serial register I/O macros -// -#define READ_RBR(S) SerialReadRegister (S, SERIAL_REGISTER_RBR) -#define READ_DLL(S) SerialReadRegister (S, SERIAL_REGISTER_DLL) -#define READ_DLM(S) SerialReadRegister (S, SERIAL_REGISTER_DLM) -#define READ_IER(S) SerialReadRegister (S, SERIAL_REGISTER_IER) -#define READ_IIR(S) SerialReadRegister (S, SERIAL_REGISTER_IIR) -#define READ_LCR(S) SerialReadRegister (S, SERIAL_REGISTER_LCR) -#define READ_MCR(S) SerialReadRegister (S, SERIAL_REGISTER_MCR) -#define READ_LSR(S) SerialReadRegister (S, SERIAL_REGISTER_LSR) -#define READ_MSR(S) SerialReadRegister (S, SERIAL_REGISTER_MSR) -#define READ_SCR(S) SerialReadRegister (S, SERIAL_REGISTER_SCR) - -#define WRITE_THR(S, D) SerialWriteRegister (S, SERIAL_REGISTER_THR, D) -#define WRITE_DLL(S, D) SerialWriteRegister (S, SERIAL_REGISTER_DLL, D) -#define WRITE_DLM(S, D) SerialWriteRegister (S, SERIAL_REGISTER_DLM, D) -#define WRITE_IER(S, D) SerialWriteRegister (S, SERIAL_REGISTER_IER, D) -#define WRITE_FCR(S, D) SerialWriteRegister (S, SERIAL_REGISTER_FCR, D) -#define WRITE_LCR(S, D) SerialWriteRegister (S, SERIAL_REGISTER_LCR, D) -#define WRITE_MCR(S, D) SerialWriteRegister (S, SERIAL_REGISTER_MCR, D) -#define WRITE_LSR(S, D) SerialWriteRegister (S, SERIAL_REGISTER_LSR, D) -#define WRITE_MSR(S, D) SerialWriteRegister (S, SERIAL_REGISTER_MSR, D) -#define WRITE_SCR(S, D) SerialWriteRegister (S, SERIAL_REGISTER_SCR, D) - -// -// Prototypes -// Driver model protocol interface -// -/** - Check to see if this driver supports the given controller - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param Controller The handle of the controller to test. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - - @return EFI_SUCCESS This driver can support the given controller - -**/ -EFI_STATUS -EFIAPI -SerialControllerDriverSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ); - -/** - Start to management the controller passed in - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param Controller The handle of the controller to test. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - - @return EFI_SUCCESS Driver is started successfully -**/ -EFI_STATUS -EFIAPI -SerialControllerDriverStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ); - -/** - Disconnect this driver with the controller, uninstall related protocol instance - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param Controller The handle of the controller to test. - @param NumberOfChildren Number of child device. - @param ChildHandleBuffer A pointer to the remaining portion of a device path. - - @retval EFI_SUCCESS Operation successfully - @retval EFI_DEVICE_ERROR Cannot stop the driver successfully - -**/ -EFI_STATUS -EFIAPI -SerialControllerDriverStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -// -// Serial I/O Protocol Interface -// -/** - Reset serial device. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - - @retval EFI_SUCCESS Reset successfully - @retval EFI_DEVICE_ERROR Failed to reset - -**/ -EFI_STATUS -EFIAPI -SerialReset ( - IN EFI_SERIAL_IO_PROTOCOL *This - ); - -/** - Set new attributes to a serial device. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - @param BaudRate The baudrate of the serial device - @param ReceiveFifoDepth The depth of receive FIFO buffer - @param Timeout The request timeout for a single char - @param Parity The type of parity used in serial device - @param DataBits Number of databits used in serial device - @param StopBits Number of stopbits used in serial device - - @retval EFI_SUCCESS The new attributes were set - @retval EFI_INVALID_PARAMETERS One or more attributes have an unsupported value - @retval EFI_UNSUPPORTED Data Bits can not set to 5 or 6 - @retval EFI_DEVICE_ERROR The serial device is not functioning correctly (no return) - -**/ -EFI_STATUS -EFIAPI -SerialSetAttributes ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN UINT64 BaudRate, - IN UINT32 ReceiveFifoDepth, - IN UINT32 Timeout, - IN EFI_PARITY_TYPE Parity, - IN UINT8 DataBits, - IN EFI_STOP_BITS_TYPE StopBits - ); - -/** - Set Control Bits. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - @param Control Control bits that can be settable - - @retval EFI_SUCCESS New Control bits were set successfully - @retval EFI_UNSUPPORTED The Control bits wanted to set are not supported - -**/ -EFI_STATUS -EFIAPI -SerialSetControl ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN UINT32 Control - ); - -/** - Get ControlBits. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - @param Control Control signals of the serial device - - @retval EFI_SUCCESS Get Control signals successfully - -**/ -EFI_STATUS -EFIAPI -SerialGetControl ( - IN EFI_SERIAL_IO_PROTOCOL *This, - OUT UINT32 *Control - ); - -/** - Write the specified number of bytes to serial device. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - @param BufferSize On input the size of Buffer, on output the amount of - data actually written - @param Buffer The buffer of data to write - - @retval EFI_SUCCESS The data were written successfully - @retval EFI_DEVICE_ERROR The device reported an error - @retval EFI_TIMEOUT The write operation was stopped due to timeout - -**/ -EFI_STATUS -EFIAPI -SerialWrite ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ); - -/** - Read the specified number of bytes from serial device. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - @param BufferSize On input the size of Buffer, on output the amount of - data returned in buffer - @param Buffer The buffer to return the data into - - @retval EFI_SUCCESS The data were read successfully - @retval EFI_DEVICE_ERROR The device reported an error - @retval EFI_TIMEOUT The read operation was stopped due to timeout - -**/ -EFI_STATUS -EFIAPI -SerialRead ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -// -// Internal Functions -// -/** - Use scratchpad register to test if this serial port is present. - - @param SerialDevice Pointer to serial device structure - - @return if this serial port is present -**/ -BOOLEAN -SerialPresent ( - IN SERIAL_DEV *SerialDevice - ); - -/** - Detect whether specific FIFO is full or not. - - @param Fifo A pointer to the Data Structure SERIAL_DEV_FIFO - - @return whether specific FIFO is full or not - -**/ -BOOLEAN -SerialFifoFull ( - IN SERIAL_DEV_FIFO *Fifo - ); - -/** - Detect whether specific FIFO is empty or not. - - @param Fifo A pointer to the Data Structure SERIAL_DEV_FIFO - - @return whether specific FIFO is empty or not - -**/ -BOOLEAN -SerialFifoEmpty ( - IN SERIAL_DEV_FIFO *Fifo - ); - -/** - Add data to specific FIFO. - - @param Fifo A pointer to the Data Structure SERIAL_DEV_FIFO - @param Data the data added to FIFO - - @retval EFI_SUCCESS Add data to specific FIFO successfully - @retval EFI_OUT_OF_RESOURCE Failed to add data because FIFO is already full - -**/ -EFI_STATUS -SerialFifoAdd ( - IN SERIAL_DEV_FIFO *Fifo, - IN UINT8 Data - ); - -/** - Remove data from specific FIFO. - - @param Fifo A pointer to the Data Structure SERIAL_DEV_FIFO - @param Data the data removed from FIFO - - @retval EFI_SUCCESS Remove data from specific FIFO successfully - @retval EFI_OUT_OF_RESOURCE Failed to remove data because FIFO is empty - -**/ -EFI_STATUS -SerialFifoRemove ( - IN SERIAL_DEV_FIFO *Fifo, - OUT UINT8 *Data - ); - -/** - Reads and writes all avaliable data. - - @param SerialDevice The device to flush - - @retval EFI_SUCCESS Data was read/written successfully. - @retval EFI_OUT_OF_RESOURCE Failed because software receive FIFO is full. Note, when - this happens, pending writes are not done. - -**/ -EFI_STATUS -SerialReceiveTransmit ( - IN SERIAL_DEV *SerialDevice - ); - -/** - Read serial port. - - @param SerialDev Pointer to serial device - @param Offset Offset in register group - - @return Data read from serial port -**/ -UINT8 -SerialReadRegister ( - IN SERIAL_DEV *SerialDev, - IN UINT32 Offset - ); - -/** - Write serial port. - - @param SerialDev Pointer to serial device - @param Offset Offset in register group - @param Data data which is to be written to some serial port register -**/ -VOID -SerialWriteRegister ( - IN SERIAL_DEV *SerialDev, - IN UINT32 Offset, - IN UINT8 Data - ); - - -// -// EFI Component Name Functions -// -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param DriverName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -SerialComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ); - - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -SerialComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ); - -/** - Add the component name for the serial io device - - @param SerialDevice A pointer to the SERIAL_DEV instance. - @param Uid Unique ID for the serial device. -**/ -VOID -AddName ( - IN SERIAL_DEV *SerialDevice, - IN UINT32 Uid - ); - -/** - Checks whether the UART parameters are valid and computes the Divisor. - - @param ClockRate The clock rate of the serial device used to verify - the BaudRate. Do not verify the BaudRate if it's 0. - @param BaudRate The requested baudrate of the serial device. - @param DataBits Number of databits used in serial device. - @param Parity The type of parity used in serial device. - @param StopBits Number of stopbits used in serial device. - @param Divisor Return the divisor if ClockRate is not 0. - @param ActualBaudRate Return the actual supported baudrate without - exceeding BaudRate. NULL means baudrate degradation - is not allowed. - If the requested BaudRate is not supported, the routine - returns TRUE and the Actual Baud Rate when ActualBaudRate - is not NULL, returns FALSE when ActualBaudRate is NULL. - - @retval TRUE The UART parameters are valid. - @retval FALSE The UART parameters are not valid. -**/ -BOOLEAN -VerifyUartParameters ( - IN UINT32 ClockRate, - IN UINT64 BaudRate, - IN UINT8 DataBits, - IN EFI_PARITY_TYPE Parity, - IN EFI_STOP_BITS_TYPE StopBits, - OUT UINT64 *Divisor, - OUT UINT64 *ActualBaudRate - ); - -/** - Skip the optional Controller device path node and return the - pointer to the next device path node. - - @param DevicePath Pointer to the device path. - @param ContainsControllerNode Returns TRUE if the Controller device path exists. - @param ControllerNumber Returns the Controller Number if Controller device path exists. - - @return Pointer to the next device path node. -**/ -UART_DEVICE_PATH * -SkipControllerDevicePathNode ( - EFI_DEVICE_PATH_PROTOCOL *DevicePath, - BOOLEAN *ContainsControllerNode, - UINT32 *ControllerNumber - ); - -/** - Check the device path node whether it's the Flow Control node or not. - - @param[in] FlowControl The device path node to be checked. - - @retval TRUE It's the Flow Control node. - @retval FALSE It's not. - -**/ -BOOLEAN -IsUartFlowControlDevicePathNode ( - IN UART_FLOW_CONTROL_DEVICE_PATH *FlowControl - ); -#endif diff --git a/CorebootModulePkg/PciSioSerialDxe/SerialIo.c b/CorebootModulePkg/PciSioSerialDxe/SerialIo.c deleted file mode 100644 index 85d537315c..0000000000 --- a/CorebootModulePkg/PciSioSerialDxe/SerialIo.c +++ /dev/null @@ -1,1320 +0,0 @@ -/** @file - SerialIo implementation for PCI or SIO UARTs. - -Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Serial.h" - -/** - Skip the optional Controller device path node and return the - pointer to the next device path node. - - @param DevicePath Pointer to the device path. - @param ContainsControllerNode Returns TRUE if the Controller device path exists. - @param ControllerNumber Returns the Controller Number if Controller device path exists. - - @return Pointer to the next device path node. -**/ -UART_DEVICE_PATH * -SkipControllerDevicePathNode ( - EFI_DEVICE_PATH_PROTOCOL *DevicePath, - BOOLEAN *ContainsControllerNode, - UINT32 *ControllerNumber - ) -{ - if ((DevicePathType (DevicePath) == HARDWARE_DEVICE_PATH) && - (DevicePathSubType (DevicePath) == HW_CONTROLLER_DP) - ) { - if (ContainsControllerNode != NULL) { - *ContainsControllerNode = TRUE; - } - if (ControllerNumber != NULL) { - *ControllerNumber = ((CONTROLLER_DEVICE_PATH *) DevicePath)->ControllerNumber; - } - DevicePath = NextDevicePathNode (DevicePath); - } else { - if (ContainsControllerNode != NULL) { - *ContainsControllerNode = FALSE; - } - } - return (UART_DEVICE_PATH *) DevicePath; -} - -/** - Checks whether the UART parameters are valid and computes the Divisor. - - @param ClockRate The clock rate of the serial device used to verify - the BaudRate. Do not verify the BaudRate if it's 0. - @param BaudRate The requested baudrate of the serial device. - @param DataBits Number of databits used in serial device. - @param Parity The type of parity used in serial device. - @param StopBits Number of stopbits used in serial device. - @param Divisor Return the divisor if ClockRate is not 0. - @param ActualBaudRate Return the actual supported baudrate without - exceeding BaudRate. NULL means baudrate degradation - is not allowed. - If the requested BaudRate is not supported, the routine - returns TRUE and the Actual Baud Rate when ActualBaudRate - is not NULL, returns FALSE when ActualBaudRate is NULL. - - @retval TRUE The UART parameters are valid. - @retval FALSE The UART parameters are not valid. -**/ -BOOLEAN -VerifyUartParameters ( - IN UINT32 ClockRate, - IN UINT64 BaudRate, - IN UINT8 DataBits, - IN EFI_PARITY_TYPE Parity, - IN EFI_STOP_BITS_TYPE StopBits, - OUT UINT64 *Divisor, - OUT UINT64 *ActualBaudRate - ) -{ - UINT64 Remainder; - UINT32 ComputedBaudRate; - UINT64 ComputedDivisor; - UINT64 Percent; - - if ((DataBits < 5) || (DataBits > 8) || - (Parity < NoParity) || (Parity > SpaceParity) || - (StopBits < OneStopBit) || (StopBits > TwoStopBits) || - ((DataBits == 5) && (StopBits == TwoStopBits)) || - ((DataBits >= 6) && (DataBits <= 8) && (StopBits == OneFiveStopBits)) - ) { - return FALSE; - } - - // - // Do not verify the baud rate if clock rate is unknown (0). - // - if (ClockRate == 0) { - return TRUE; - } - - // - // Compute divisor use to program the baud rate using a round determination - // Divisor = ClockRate / 16 / BaudRate = ClockRate / (16 * BaudRate) - // = ClockRate / (BaudRate << 4) - // - ComputedDivisor = DivU64x64Remainder (ClockRate, LShiftU64 (BaudRate, 4), &Remainder); - // - // Round Divisor up by 1 if the Remainder is more than half (16 * BaudRate) - // BaudRate * 16 / 2 = BaudRate * 8 = (BaudRate << 3) - // - if (Remainder >= LShiftU64 (BaudRate, 3)) { - ComputedDivisor++; - } - // - // If the computed divisor is larger than the maximum value that can be programmed - // into the UART, then the requested baud rate can not be supported. - // - if (ComputedDivisor > MAX_UINT16) { - return FALSE; - } - - // - // If the computed divisor is 0, then use a computed divisor of 1, which will select - // the maximum supported baud rate. - // - if (ComputedDivisor == 0) { - ComputedDivisor = 1; - } - - // - // Actual baud rate that the serial port will be programmed for - // should be with in 4% of requested one. - // - ComputedBaudRate = ClockRate / ((UINT16) ComputedDivisor << 4); - if (ComputedBaudRate == 0) { - return FALSE; - } - - Percent = DivU64x32 (MultU64x32 (BaudRate, 100), ComputedBaudRate); - DEBUG ((EFI_D_INFO, "ClockRate = %d\n", ClockRate)); - DEBUG ((EFI_D_INFO, "Divisor = %ld\n", ComputedDivisor)); - DEBUG ((EFI_D_INFO, "BaudRate/Actual (%ld/%d) = %d%%\n", BaudRate, ComputedBaudRate, Percent)); - - // - // If the requested BaudRate is not supported: - // Returns TRUE and the Actual Baud Rate when ActualBaudRate is not NULL; - // Returns FALSE when ActualBaudRate is NULL. - // - if ((Percent >= 96) && (Percent <= 104)) { - if (ActualBaudRate != NULL) { - *ActualBaudRate = BaudRate; - } - if (Divisor != NULL) { - *Divisor = ComputedDivisor; - } - return TRUE; - } - if (ComputedBaudRate < BaudRate) { - if (ActualBaudRate != NULL) { - *ActualBaudRate = ComputedBaudRate; - } - if (Divisor != NULL) { - *Divisor = ComputedDivisor; - } - return TRUE; - } - - // - // ActualBaudRate is higher than requested baud rate and more than 4% - // higher than the requested value. Increment Divisor if it is less - // than MAX_UINT16 and computed baud rate with new divisor. - // - if (ComputedDivisor == MAX_UINT16) { - return FALSE; - } - ComputedDivisor++; - ComputedBaudRate = ClockRate / ((UINT16) ComputedDivisor << 4); - if (ComputedBaudRate == 0) { - return FALSE; - } - - DEBUG ((EFI_D_INFO, "ClockRate = %d\n", ClockRate)); - DEBUG ((EFI_D_INFO, "Divisor = %ld\n", ComputedDivisor)); - DEBUG ((EFI_D_INFO, "BaudRate/Actual (%ld/%d) = %d%%\n", BaudRate, ComputedBaudRate, Percent)); - - if (ActualBaudRate != NULL) { - *ActualBaudRate = ComputedBaudRate; - } - if (Divisor != NULL) { - *Divisor = ComputedDivisor; - } - return TRUE; -} - -/** - Detect whether specific FIFO is full or not. - - @param Fifo A pointer to the Data Structure SERIAL_DEV_FIFO - - @return whether specific FIFO is full or not -**/ -BOOLEAN -SerialFifoFull ( - IN SERIAL_DEV_FIFO *Fifo - ) -{ - return (BOOLEAN) (((Fifo->Tail + 1) % SERIAL_MAX_FIFO_SIZE) == Fifo->Head); -} - -/** - Detect whether specific FIFO is empty or not. - - @param Fifo A pointer to the Data Structure SERIAL_DEV_FIFO - - @return whether specific FIFO is empty or not -**/ -BOOLEAN -SerialFifoEmpty ( - IN SERIAL_DEV_FIFO *Fifo - ) - -{ - return (BOOLEAN) (Fifo->Head == Fifo->Tail); -} - -/** - Add data to specific FIFO. - - @param Fifo A pointer to the Data Structure SERIAL_DEV_FIFO - @param Data the data added to FIFO - - @retval EFI_SUCCESS Add data to specific FIFO successfully - @retval EFI_OUT_OF_RESOURCE Failed to add data because FIFO is already full -**/ -EFI_STATUS -SerialFifoAdd ( - IN OUT SERIAL_DEV_FIFO *Fifo, - IN UINT8 Data - ) -{ - // - // if FIFO full can not add data - // - if (SerialFifoFull (Fifo)) { - return EFI_OUT_OF_RESOURCES; - } - // - // FIFO is not full can add data - // - Fifo->Data[Fifo->Tail] = Data; - Fifo->Tail = (Fifo->Tail + 1) % SERIAL_MAX_FIFO_SIZE; - return EFI_SUCCESS; -} - -/** - Remove data from specific FIFO. - - @param Fifo A pointer to the Data Structure SERIAL_DEV_FIFO - @param Data the data removed from FIFO - - @retval EFI_SUCCESS Remove data from specific FIFO successfully - @retval EFI_OUT_OF_RESOURCE Failed to remove data because FIFO is empty - -**/ -EFI_STATUS -SerialFifoRemove ( - IN OUT SERIAL_DEV_FIFO *Fifo, - OUT UINT8 *Data - ) -{ - // - // if FIFO is empty, no data can remove - // - if (SerialFifoEmpty (Fifo)) { - return EFI_OUT_OF_RESOURCES; - } - // - // FIFO is not empty, can remove data - // - *Data = Fifo->Data[Fifo->Head]; - Fifo->Head = (Fifo->Head + 1) % SERIAL_MAX_FIFO_SIZE; - return EFI_SUCCESS; -} - -/** - Reads and writes all avaliable data. - - @param SerialDevice The device to transmit. - - @retval EFI_SUCCESS Data was read/written successfully. - @retval EFI_OUT_OF_RESOURCE Failed because software receive FIFO is full. Note, when - this happens, pending writes are not done. - -**/ -EFI_STATUS -SerialReceiveTransmit ( - IN SERIAL_DEV *SerialDevice - ) - -{ - SERIAL_PORT_LSR Lsr; - UINT8 Data; - BOOLEAN ReceiveFifoFull; - SERIAL_PORT_MSR Msr; - SERIAL_PORT_MCR Mcr; - UINTN TimeOut; - - Data = 0; - - // - // Begin the read or write - // - if (SerialDevice->SoftwareLoopbackEnable) { - do { - ReceiveFifoFull = SerialFifoFull (&SerialDevice->Receive); - if (!SerialFifoEmpty (&SerialDevice->Transmit)) { - SerialFifoRemove (&SerialDevice->Transmit, &Data); - if (ReceiveFifoFull) { - return EFI_OUT_OF_RESOURCES; - } - - SerialFifoAdd (&SerialDevice->Receive, Data); - } - } while (!SerialFifoEmpty (&SerialDevice->Transmit)); - } else { - ReceiveFifoFull = SerialFifoFull (&SerialDevice->Receive); - // - // For full handshake flow control, tell the peer to send data - // if receive buffer is available. - // - if (SerialDevice->HardwareFlowControl && - !FeaturePcdGet(PcdSerialUseHalfHandshake)&& - !ReceiveFifoFull - ) { - Mcr.Data = READ_MCR (SerialDevice); - Mcr.Bits.Rts = 1; - WRITE_MCR (SerialDevice, Mcr.Data); - } - do { - Lsr.Data = READ_LSR (SerialDevice); - - // - // Flush incomming data to prevent a an overrun during a long write - // - if ((Lsr.Bits.Dr == 1) && !ReceiveFifoFull) { - ReceiveFifoFull = SerialFifoFull (&SerialDevice->Receive); - if (!ReceiveFifoFull) { - if (Lsr.Bits.FIFOe == 1 || Lsr.Bits.Oe == 1 || Lsr.Bits.Pe == 1 || Lsr.Bits.Fe == 1 || Lsr.Bits.Bi == 1) { - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_ERROR_CODE, - EFI_P_EC_INPUT_ERROR | EFI_PERIPHERAL_SERIAL_PORT, - SerialDevice->DevicePath - ); - if (Lsr.Bits.FIFOe == 1 || Lsr.Bits.Pe == 1|| Lsr.Bits.Fe == 1 || Lsr.Bits.Bi == 1) { - Data = READ_RBR (SerialDevice); - continue; - } - } - - Data = READ_RBR (SerialDevice); - - SerialFifoAdd (&SerialDevice->Receive, Data); - - // - // For full handshake flow control, if receive buffer full - // tell the peer to stop sending data. - // - if (SerialDevice->HardwareFlowControl && - !FeaturePcdGet(PcdSerialUseHalfHandshake) && - SerialFifoFull (&SerialDevice->Receive) - ) { - Mcr.Data = READ_MCR (SerialDevice); - Mcr.Bits.Rts = 0; - WRITE_MCR (SerialDevice, Mcr.Data); - } - - - continue; - } else { - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_PROGRESS_CODE, - EFI_P_SERIAL_PORT_PC_CLEAR_BUFFER | EFI_PERIPHERAL_SERIAL_PORT, - SerialDevice->DevicePath - ); - } - } - // - // Do the write - // - if (Lsr.Bits.Thre == 1 && !SerialFifoEmpty (&SerialDevice->Transmit)) { - // - // Make sure the transmit data will not be missed - // - if (SerialDevice->HardwareFlowControl) { - // - // For half handshake flow control assert RTS before sending. - // - if (FeaturePcdGet(PcdSerialUseHalfHandshake)) { - Mcr.Data = READ_MCR (SerialDevice); - Mcr.Bits.Rts= 0; - WRITE_MCR (SerialDevice, Mcr.Data); - } - // - // Wait for CTS - // - TimeOut = 0; - Msr.Data = READ_MSR (SerialDevice); - while ((Msr.Bits.Dcd == 1) && ((Msr.Bits.Cts == 0) ^ FeaturePcdGet(PcdSerialUseHalfHandshake))) { - gBS->Stall (TIMEOUT_STALL_INTERVAL); - TimeOut++; - if (TimeOut > 5) { - break; - } - - Msr.Data = READ_MSR (SerialDevice); - } - - if ((Msr.Bits.Dcd == 0) || ((Msr.Bits.Cts == 1) ^ FeaturePcdGet(PcdSerialUseHalfHandshake))) { - SerialFifoRemove (&SerialDevice->Transmit, &Data); - WRITE_THR (SerialDevice, Data); - } - - // - // For half handshake flow control, tell DCE we are done. - // - if (FeaturePcdGet(PcdSerialUseHalfHandshake)) { - Mcr.Data = READ_MCR (SerialDevice); - Mcr.Bits.Rts = 1; - WRITE_MCR (SerialDevice, Mcr.Data); - } - } else { - SerialFifoRemove (&SerialDevice->Transmit, &Data); - WRITE_THR (SerialDevice, Data); - } - } - } while (Lsr.Bits.Thre == 1 && !SerialFifoEmpty (&SerialDevice->Transmit)); - } - - return EFI_SUCCESS; -} - -/** - Flush the serial hardware transmit FIFO and shift register. - - @param SerialDevice The device to flush. -**/ -VOID -SerialFlushTransmitFifo ( - SERIAL_DEV *SerialDevice - ) -{ - SERIAL_PORT_LSR Lsr; - - // - // Wait for the serial port to be ready, to make sure both the transmit FIFO - // and shift register empty. - // - do { - Lsr.Data = READ_LSR (SerialDevice); - } while (Lsr.Bits.Temt == 0); -} - -// -// Interface Functions -// -/** - Reset serial device. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - - @retval EFI_SUCCESS Reset successfully - @retval EFI_DEVICE_ERROR Failed to reset - -**/ -EFI_STATUS -EFIAPI -SerialReset ( - IN EFI_SERIAL_IO_PROTOCOL *This - ) -{ - EFI_STATUS Status; - SERIAL_DEV *SerialDevice; - SERIAL_PORT_LCR Lcr; - SERIAL_PORT_IER Ier; - SERIAL_PORT_MCR Mcr; - SERIAL_PORT_FCR Fcr; - EFI_TPL Tpl; - UINT32 Control; - - SerialDevice = SERIAL_DEV_FROM_THIS (This); - - // - // Report the status code reset the serial - // - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_PROGRESS_CODE, - EFI_P_PC_RESET | EFI_PERIPHERAL_SERIAL_PORT, - SerialDevice->DevicePath - ); - - Tpl = gBS->RaiseTPL (TPL_NOTIFY); - - SerialFlushTransmitFifo (SerialDevice); - - // - // Make sure DLAB is 0. - // - Lcr.Data = READ_LCR (SerialDevice); - Lcr.Bits.DLab = 0; - WRITE_LCR (SerialDevice, Lcr.Data); - - // - // Turn off all interrupts - // - Ier.Data = READ_IER (SerialDevice); - Ier.Bits.Ravie = 0; - Ier.Bits.Theie = 0; - Ier.Bits.Rie = 0; - Ier.Bits.Mie = 0; - WRITE_IER (SerialDevice, Ier.Data); - - // - // Reset the FIFO - // - Fcr.Data = 0; - Fcr.Bits.TrFIFOE = 0; - WRITE_FCR (SerialDevice, Fcr.Data); - - // - // Turn off loopback and disable device interrupt. - // - Mcr.Data = READ_MCR (SerialDevice); - Mcr.Bits.Out1 = 0; - Mcr.Bits.Out2 = 0; - Mcr.Bits.Lme = 0; - WRITE_MCR (SerialDevice, Mcr.Data); - - // - // Clear the scratch pad register - // - WRITE_SCR (SerialDevice, 0); - - // - // Enable FIFO - // - Fcr.Bits.TrFIFOE = 1; - if (SerialDevice->ReceiveFifoDepth > 16) { - Fcr.Bits.TrFIFO64 = 1; - } - Fcr.Bits.ResetRF = 1; - Fcr.Bits.ResetTF = 1; - WRITE_FCR (SerialDevice, Fcr.Data); - - // - // Go set the current attributes - // - Status = This->SetAttributes ( - This, - This->Mode->BaudRate, - This->Mode->ReceiveFifoDepth, - This->Mode->Timeout, - (EFI_PARITY_TYPE) This->Mode->Parity, - (UINT8) This->Mode->DataBits, - (EFI_STOP_BITS_TYPE) This->Mode->StopBits - ); - - if (EFI_ERROR (Status)) { - gBS->RestoreTPL (Tpl); - return EFI_DEVICE_ERROR; - } - // - // Go set the current control bits - // - Control = EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY; - if (SerialDevice->HardwareFlowControl) { - Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE; - } - if (SerialDevice->SoftwareLoopbackEnable) { - Control |= EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE; - } - Status = This->SetControl ( - This, - Control - ); - - if (EFI_ERROR (Status)) { - gBS->RestoreTPL (Tpl); - return EFI_DEVICE_ERROR; - } - - // - // Reset the software FIFO - // - SerialDevice->Receive.Head = SerialDevice->Receive.Tail = 0; - SerialDevice->Transmit.Head = SerialDevice->Transmit.Tail = 0; - gBS->RestoreTPL (Tpl); - - // - // Device reset is complete - // - return EFI_SUCCESS; -} - -/** - Set new attributes to a serial device. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - @param BaudRate The baudrate of the serial device - @param ReceiveFifoDepth The depth of receive FIFO buffer - @param Timeout The request timeout for a single char - @param Parity The type of parity used in serial device - @param DataBits Number of databits used in serial device - @param StopBits Number of stopbits used in serial device - - @retval EFI_SUCCESS The new attributes were set - @retval EFI_INVALID_PARAMETERS One or more attributes have an unsupported value - @retval EFI_UNSUPPORTED Data Bits can not set to 5 or 6 - @retval EFI_DEVICE_ERROR The serial device is not functioning correctly (no return) - -**/ -EFI_STATUS -EFIAPI -SerialSetAttributes ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN UINT64 BaudRate, - IN UINT32 ReceiveFifoDepth, - IN UINT32 Timeout, - IN EFI_PARITY_TYPE Parity, - IN UINT8 DataBits, - IN EFI_STOP_BITS_TYPE StopBits - ) -{ - EFI_STATUS Status; - SERIAL_DEV *SerialDevice; - UINT64 Divisor; - SERIAL_PORT_LCR Lcr; - UART_DEVICE_PATH *Uart; - EFI_TPL Tpl; - - SerialDevice = SERIAL_DEV_FROM_THIS (This); - - // - // Check for default settings and fill in actual values. - // - if (BaudRate == 0) { - BaudRate = PcdGet64 (PcdUartDefaultBaudRate); - } - - if (ReceiveFifoDepth == 0) { - ReceiveFifoDepth = SerialDevice->ReceiveFifoDepth; - } - - if (Timeout == 0) { - Timeout = SERIAL_PORT_DEFAULT_TIMEOUT; - } - - if (Parity == DefaultParity) { - Parity = (EFI_PARITY_TYPE) PcdGet8 (PcdUartDefaultParity); - } - - if (DataBits == 0) { - DataBits = PcdGet8 (PcdUartDefaultDataBits); - } - - if (StopBits == DefaultStopBits) { - StopBits = (EFI_STOP_BITS_TYPE) PcdGet8 (PcdUartDefaultStopBits); - } - - if (!VerifyUartParameters (SerialDevice->ClockRate, BaudRate, DataBits, Parity, StopBits, &Divisor, &BaudRate)) { - return EFI_INVALID_PARAMETER; - } - - if ((ReceiveFifoDepth == 0) || (ReceiveFifoDepth > SerialDevice->ReceiveFifoDepth)) { - return EFI_INVALID_PARAMETER; - } - - if ((Timeout < SERIAL_PORT_MIN_TIMEOUT) || (Timeout > SERIAL_PORT_MAX_TIMEOUT)) { - return EFI_INVALID_PARAMETER; - } - - Tpl = gBS->RaiseTPL (TPL_NOTIFY); - - SerialFlushTransmitFifo (SerialDevice); - - // - // Put serial port on Divisor Latch Mode - // - Lcr.Data = READ_LCR (SerialDevice); - Lcr.Bits.DLab = 1; - WRITE_LCR (SerialDevice, Lcr.Data); - - // - // Write the divisor to the serial port - // - WRITE_DLL (SerialDevice, (UINT8) Divisor); - WRITE_DLM (SerialDevice, (UINT8) ((UINT16) Divisor >> 8)); - - // - // Put serial port back in normal mode and set remaining attributes. - // - Lcr.Bits.DLab = 0; - - switch (Parity) { - case NoParity: - Lcr.Bits.ParEn = 0; - Lcr.Bits.EvenPar = 0; - Lcr.Bits.SticPar = 0; - break; - - case EvenParity: - Lcr.Bits.ParEn = 1; - Lcr.Bits.EvenPar = 1; - Lcr.Bits.SticPar = 0; - break; - - case OddParity: - Lcr.Bits.ParEn = 1; - Lcr.Bits.EvenPar = 0; - Lcr.Bits.SticPar = 0; - break; - - case SpaceParity: - Lcr.Bits.ParEn = 1; - Lcr.Bits.EvenPar = 1; - Lcr.Bits.SticPar = 1; - break; - - case MarkParity: - Lcr.Bits.ParEn = 1; - Lcr.Bits.EvenPar = 0; - Lcr.Bits.SticPar = 1; - break; - - default: - break; - } - - switch (StopBits) { - case OneStopBit: - Lcr.Bits.StopB = 0; - break; - - case OneFiveStopBits: - case TwoStopBits: - Lcr.Bits.StopB = 1; - break; - - default: - break; - } - // - // DataBits - // - Lcr.Bits.SerialDB = (UINT8) ((DataBits - 5) & 0x03); - WRITE_LCR (SerialDevice, Lcr.Data); - - // - // Set the Serial I/O mode - // - This->Mode->BaudRate = BaudRate; - This->Mode->ReceiveFifoDepth = ReceiveFifoDepth; - This->Mode->Timeout = Timeout; - This->Mode->Parity = Parity; - This->Mode->DataBits = DataBits; - This->Mode->StopBits = StopBits; - - // - // See if Device Path Node has actually changed - // - if (SerialDevice->UartDevicePath.BaudRate == BaudRate && - SerialDevice->UartDevicePath.DataBits == DataBits && - SerialDevice->UartDevicePath.Parity == Parity && - SerialDevice->UartDevicePath.StopBits == StopBits - ) { - gBS->RestoreTPL (Tpl); - return EFI_SUCCESS; - } - // - // Update the device path - // - SerialDevice->UartDevicePath.BaudRate = BaudRate; - SerialDevice->UartDevicePath.DataBits = DataBits; - SerialDevice->UartDevicePath.Parity = (UINT8) Parity; - SerialDevice->UartDevicePath.StopBits = (UINT8) StopBits; - - Status = EFI_SUCCESS; - if (SerialDevice->Handle != NULL) { - - // - // Skip the optional Controller device path node - // - Uart = SkipControllerDevicePathNode ( - (EFI_DEVICE_PATH_PROTOCOL *) ( - (UINT8 *) SerialDevice->DevicePath + GetDevicePathSize (SerialDevice->ParentDevicePath) - END_DEVICE_PATH_LENGTH - ), - NULL, - NULL - ); - CopyMem (Uart, &SerialDevice->UartDevicePath, sizeof (UART_DEVICE_PATH)); - Status = gBS->ReinstallProtocolInterface ( - SerialDevice->Handle, - &gEfiDevicePathProtocolGuid, - SerialDevice->DevicePath, - SerialDevice->DevicePath - ); - } - - gBS->RestoreTPL (Tpl); - - return Status; -} - -/** - Set Control Bits. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - @param Control Control bits that can be settable - - @retval EFI_SUCCESS New Control bits were set successfully - @retval EFI_UNSUPPORTED The Control bits wanted to set are not supported - -**/ -EFI_STATUS -EFIAPI -SerialSetControl ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN UINT32 Control - ) -{ - SERIAL_DEV *SerialDevice; - SERIAL_PORT_MCR Mcr; - EFI_TPL Tpl; - UART_FLOW_CONTROL_DEVICE_PATH *FlowControl; - EFI_STATUS Status; - - // - // The control bits that can be set are : - // EFI_SERIAL_DATA_TERMINAL_READY: 0x0001 // WO - // EFI_SERIAL_REQUEST_TO_SEND: 0x0002 // WO - // EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE: 0x1000 // RW - // EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE: 0x2000 // RW - // EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE: 0x4000 // RW - // - SerialDevice = SERIAL_DEV_FROM_THIS (This); - - // - // first determine the parameter is invalid - // - if ((Control & (~(EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY | - EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | - EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE))) != 0) { - return EFI_UNSUPPORTED; - } - - Tpl = gBS->RaiseTPL (TPL_NOTIFY); - - Mcr.Data = READ_MCR (SerialDevice); - Mcr.Bits.DtrC = 0; - Mcr.Bits.Rts = 0; - Mcr.Bits.Lme = 0; - SerialDevice->SoftwareLoopbackEnable = FALSE; - SerialDevice->HardwareFlowControl = FALSE; - - if ((Control & EFI_SERIAL_DATA_TERMINAL_READY) == EFI_SERIAL_DATA_TERMINAL_READY) { - Mcr.Bits.DtrC = 1; - } - - if ((Control & EFI_SERIAL_REQUEST_TO_SEND) == EFI_SERIAL_REQUEST_TO_SEND) { - Mcr.Bits.Rts = 1; - } - - if ((Control & EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) == EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) { - Mcr.Bits.Lme = 1; - } - - if ((Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) == EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) { - SerialDevice->HardwareFlowControl = TRUE; - } - - WRITE_MCR (SerialDevice, Mcr.Data); - - if ((Control & EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE) == EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE) { - SerialDevice->SoftwareLoopbackEnable = TRUE; - } - - Status = EFI_SUCCESS; - if (SerialDevice->Handle != NULL) { - FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) ( - (UINTN) SerialDevice->DevicePath - + GetDevicePathSize (SerialDevice->ParentDevicePath) - - END_DEVICE_PATH_LENGTH - + sizeof (UART_DEVICE_PATH) - ); - if (IsUartFlowControlDevicePathNode (FlowControl) && - ((BOOLEAN) (ReadUnaligned32 (&FlowControl->FlowControlMap) == UART_FLOW_CONTROL_HARDWARE) != SerialDevice->HardwareFlowControl)) { - // - // Flow Control setting is changed, need to reinstall device path protocol - // - WriteUnaligned32 (&FlowControl->FlowControlMap, SerialDevice->HardwareFlowControl ? UART_FLOW_CONTROL_HARDWARE : 0); - Status = gBS->ReinstallProtocolInterface ( - SerialDevice->Handle, - &gEfiDevicePathProtocolGuid, - SerialDevice->DevicePath, - SerialDevice->DevicePath - ); - } - } - - gBS->RestoreTPL (Tpl); - - return Status; -} - -/** - Get ControlBits. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - @param Control Control signals of the serial device - - @retval EFI_SUCCESS Get Control signals successfully - -**/ -EFI_STATUS -EFIAPI -SerialGetControl ( - IN EFI_SERIAL_IO_PROTOCOL *This, - OUT UINT32 *Control - ) -{ - SERIAL_DEV *SerialDevice; - SERIAL_PORT_MSR Msr; - SERIAL_PORT_MCR Mcr; - EFI_TPL Tpl; - - Tpl = gBS->RaiseTPL (TPL_NOTIFY); - - SerialDevice = SERIAL_DEV_FROM_THIS (This); - - *Control = 0; - - // - // Read the Modem Status Register - // - Msr.Data = READ_MSR (SerialDevice); - - if (Msr.Bits.Cts == 1) { - *Control |= EFI_SERIAL_CLEAR_TO_SEND; - } - - if (Msr.Bits.Dsr == 1) { - *Control |= EFI_SERIAL_DATA_SET_READY; - } - - if (Msr.Bits.Ri == 1) { - *Control |= EFI_SERIAL_RING_INDICATE; - } - - if (Msr.Bits.Dcd == 1) { - *Control |= EFI_SERIAL_CARRIER_DETECT; - } - // - // Read the Modem Control Register - // - Mcr.Data = READ_MCR (SerialDevice); - - if (Mcr.Bits.DtrC == 1) { - *Control |= EFI_SERIAL_DATA_TERMINAL_READY; - } - - if (Mcr.Bits.Rts == 1) { - *Control |= EFI_SERIAL_REQUEST_TO_SEND; - } - - if (Mcr.Bits.Lme == 1) { - *Control |= EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE; - } - - if (SerialDevice->HardwareFlowControl) { - *Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE; - } - // - // Update FIFO status - // - SerialReceiveTransmit (SerialDevice); - - // - // See if the Transmit FIFO is empty - // - if (SerialFifoEmpty (&SerialDevice->Transmit)) { - *Control |= EFI_SERIAL_OUTPUT_BUFFER_EMPTY; - } - - // - // See if the Receive FIFO is empty. - // - if (SerialFifoEmpty (&SerialDevice->Receive)) { - *Control |= EFI_SERIAL_INPUT_BUFFER_EMPTY; - } - - if (SerialDevice->SoftwareLoopbackEnable) { - *Control |= EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE; - } - - gBS->RestoreTPL (Tpl); - - return EFI_SUCCESS; -} - -/** - Write the specified number of bytes to serial device. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - @param BufferSize On input the size of Buffer, on output the amount of - data actually written - @param Buffer The buffer of data to write - - @retval EFI_SUCCESS The data were written successfully - @retval EFI_DEVICE_ERROR The device reported an error - @retval EFI_TIMEOUT The write operation was stopped due to timeout - -**/ -EFI_STATUS -EFIAPI -SerialWrite ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ) -{ - SERIAL_DEV *SerialDevice; - UINT8 *CharBuffer; - UINT32 Index; - UINTN Elapsed; - UINTN ActualWrite; - EFI_TPL Tpl; - UINTN Timeout; - UINTN BitsPerCharacter; - - SerialDevice = SERIAL_DEV_FROM_THIS (This); - Elapsed = 0; - ActualWrite = 0; - - if (*BufferSize == 0) { - return EFI_SUCCESS; - } - - if (Buffer == NULL) { - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_ERROR_CODE, - EFI_P_EC_OUTPUT_ERROR | EFI_PERIPHERAL_SERIAL_PORT, - SerialDevice->DevicePath - ); - - return EFI_DEVICE_ERROR; - } - - Tpl = gBS->RaiseTPL (TPL_NOTIFY); - - CharBuffer = (UINT8 *) Buffer; - - // - // Compute the number of bits in a single character. This is a start bit, - // followed by the number of data bits, followed by the number of stop bits. - // The number of stop bits is specified by an enumeration that includes - // support for 1.5 stop bits. Treat 1.5 stop bits as 2 stop bits. - // - BitsPerCharacter = - 1 + - This->Mode->DataBits + - ((This->Mode->StopBits == TwoStopBits) ? 2 : This->Mode->StopBits); - - // - // Compute the timeout in microseconds to wait for a single byte to be - // transmitted. The Mode structure contans a Timeout field that is the - // maximum time to transmit or receive a character. However, many UARTs - // have a FIFO for transmits, so the time required to add one new character - // to the transmit FIFO may be the time required to flush a full FIFO. If - // the Timeout in the Mode structure is smaller than the time required to - // flush a full FIFO at the current baud rate, then use a timeout value that - // is required to flush a full transmit FIFO. - // - Timeout = MAX ( - This->Mode->Timeout, - (UINTN)DivU64x64Remainder ( - BitsPerCharacter * (SerialDevice->TransmitFifoDepth + 1) * 1000000, - This->Mode->BaudRate, - NULL - ) - ); - - for (Index = 0; Index < *BufferSize; Index++) { - SerialFifoAdd (&SerialDevice->Transmit, CharBuffer[Index]); - - while (SerialReceiveTransmit (SerialDevice) != EFI_SUCCESS || !SerialFifoEmpty (&SerialDevice->Transmit)) { - // - // Unsuccessful write so check if timeout has expired, if not, - // stall for a bit, increment time elapsed, and try again - // - if (Elapsed >= Timeout) { - *BufferSize = ActualWrite; - gBS->RestoreTPL (Tpl); - return EFI_TIMEOUT; - } - - gBS->Stall (TIMEOUT_STALL_INTERVAL); - - Elapsed += TIMEOUT_STALL_INTERVAL; - } - - ActualWrite++; - // - // Successful write so reset timeout - // - Elapsed = 0; - } - - gBS->RestoreTPL (Tpl); - - return EFI_SUCCESS; -} - -/** - Read the specified number of bytes from serial device. - - @param This Pointer to EFI_SERIAL_IO_PROTOCOL - @param BufferSize On input the size of Buffer, on output the amount of - data returned in buffer - @param Buffer The buffer to return the data into - - @retval EFI_SUCCESS The data were read successfully - @retval EFI_DEVICE_ERROR The device reported an error - @retval EFI_TIMEOUT The read operation was stopped due to timeout - -**/ -EFI_STATUS -EFIAPI -SerialRead ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - SERIAL_DEV *SerialDevice; - UINT32 Index; - UINT8 *CharBuffer; - UINTN Elapsed; - EFI_STATUS Status; - EFI_TPL Tpl; - - SerialDevice = SERIAL_DEV_FROM_THIS (This); - Elapsed = 0; - - if (*BufferSize == 0) { - return EFI_SUCCESS; - } - - if (Buffer == NULL) { - return EFI_DEVICE_ERROR; - } - - Tpl = gBS->RaiseTPL (TPL_NOTIFY); - - Status = SerialReceiveTransmit (SerialDevice); - - if (EFI_ERROR (Status)) { - *BufferSize = 0; - - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_ERROR_CODE, - EFI_P_EC_INPUT_ERROR | EFI_PERIPHERAL_SERIAL_PORT, - SerialDevice->DevicePath - ); - - gBS->RestoreTPL (Tpl); - - return EFI_DEVICE_ERROR; - } - - CharBuffer = (UINT8 *) Buffer; - for (Index = 0; Index < *BufferSize; Index++) { - while (SerialFifoRemove (&SerialDevice->Receive, &(CharBuffer[Index])) != EFI_SUCCESS) { - // - // Unsuccessful read so check if timeout has expired, if not, - // stall for a bit, increment time elapsed, and try again - // Need this time out to get conspliter to work. - // - if (Elapsed >= This->Mode->Timeout) { - *BufferSize = Index; - gBS->RestoreTPL (Tpl); - return EFI_TIMEOUT; - } - - gBS->Stall (TIMEOUT_STALL_INTERVAL); - Elapsed += TIMEOUT_STALL_INTERVAL; - - Status = SerialReceiveTransmit (SerialDevice); - if (Status == EFI_DEVICE_ERROR) { - *BufferSize = Index; - gBS->RestoreTPL (Tpl); - return EFI_DEVICE_ERROR; - } - } - // - // Successful read so reset timeout - // - Elapsed = 0; - } - - SerialReceiveTransmit (SerialDevice); - - gBS->RestoreTPL (Tpl); - - return EFI_SUCCESS; -} - -/** - Use scratchpad register to test if this serial port is present. - - @param SerialDevice Pointer to serial device structure - - @return if this serial port is present -**/ -BOOLEAN -SerialPresent ( - IN SERIAL_DEV *SerialDevice - ) - -{ - UINT8 Temp; - BOOLEAN Status; - - Status = TRUE; - - // - // Save SCR reg - // - Temp = READ_SCR (SerialDevice); - WRITE_SCR (SerialDevice, 0xAA); - - if (READ_SCR (SerialDevice) != 0xAA) { - Status = FALSE; - } - - WRITE_SCR (SerialDevice, 0x55); - - if (READ_SCR (SerialDevice) != 0x55) { - Status = FALSE; - } - // - // Restore SCR - // - WRITE_SCR (SerialDevice, Temp); - return Status; -} - -/** - Read serial port. - - @param SerialDev Pointer to serial device - @param Offset Offset in register group - - @return Data read from serial port - -**/ -UINT8 -SerialReadRegister ( - IN SERIAL_DEV *SerialDev, - IN UINT32 Offset - ) -{ - UINT8 Data; - EFI_STATUS Status; - - if (SerialDev->PciDeviceInfo == NULL) { - return IoRead8 ((UINTN) SerialDev->BaseAddress + Offset * SerialDev->RegisterStride); - } else { - if (SerialDev->MmioAccess) { - Status = SerialDev->PciDeviceInfo->PciIo->Mem.Read (SerialDev->PciDeviceInfo->PciIo, EfiPciIoWidthUint8, EFI_PCI_IO_PASS_THROUGH_BAR, - SerialDev->BaseAddress + Offset * SerialDev->RegisterStride, 1, &Data); - } else { - Status = SerialDev->PciDeviceInfo->PciIo->Io.Read (SerialDev->PciDeviceInfo->PciIo, EfiPciIoWidthUint8, EFI_PCI_IO_PASS_THROUGH_BAR, - SerialDev->BaseAddress + Offset * SerialDev->RegisterStride, 1, &Data); - } - ASSERT_EFI_ERROR (Status); - return Data; - } -} - -/** - Write serial port. - - @param SerialDev Pointer to serial device - @param Offset Offset in register group - @param Data data which is to be written to some serial port register -**/ -VOID -SerialWriteRegister ( - IN SERIAL_DEV *SerialDev, - IN UINT32 Offset, - IN UINT8 Data - ) -{ - EFI_STATUS Status; - - if (SerialDev->PciDeviceInfo == NULL) { - IoWrite8 ((UINTN) SerialDev->BaseAddress + Offset * SerialDev->RegisterStride, Data); - } else { - if (SerialDev->MmioAccess) { - Status = SerialDev->PciDeviceInfo->PciIo->Mem.Write (SerialDev->PciDeviceInfo->PciIo, EfiPciIoWidthUint8, EFI_PCI_IO_PASS_THROUGH_BAR, - SerialDev->BaseAddress + Offset * SerialDev->RegisterStride, 1, &Data); - } else { - Status = SerialDev->PciDeviceInfo->PciIo->Io.Write (SerialDev->PciDeviceInfo->PciIo, EfiPciIoWidthUint8, EFI_PCI_IO_PASS_THROUGH_BAR, - SerialDev->BaseAddress + Offset * SerialDev->RegisterStride, 1, &Data); - } - ASSERT_EFI_ERROR (Status); - } -} diff --git a/CorebootModulePkg/SerialDxe/SerialDxe.inf b/CorebootModulePkg/SerialDxe/SerialDxe.inf deleted file mode 100644 index 1133d4fd37..0000000000 --- a/CorebootModulePkg/SerialDxe/SerialDxe.inf +++ /dev/null @@ -1,55 +0,0 @@ -## @file -# Serial driver that layers on top of a Serial Port Library instance. -# -# Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR> -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = SerialDxe - MODULE_UNI_FILE = SerialDxe.uni - FILE_GUID = D3987D4B-971A-435F-8CAF-4967EB627241 - MODULE_TYPE = DXE_DRIVER - VERSION_STRING = 1.0 - - ENTRY_POINT = SerialDxeInitialize - -[Sources.common] - SerialIo.c - -[Packages] - MdePkg/MdePkg.dec - CorebootModulePkg/CorebootModulePkg.dec - -[LibraryClasses] - UefiDriverEntryPoint - UefiBootServicesTableLib - DebugLib - PcdLib - PlatformHookLib - SerialPortLib - -[Protocols] - gEfiSerialIoProtocolGuid ## PRODUCES - gEfiDevicePathProtocolGuid ## PRODUCES - -[Pcd] - gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate ## CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits ## CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity ## CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits ## CONSUMES - -[Depex] - TRUE - -[UserExtensions.TianoCore."ExtraFiles"] - SerialDxeExtra.uni diff --git a/CorebootModulePkg/SerialDxe/SerialDxe.uni b/CorebootModulePkg/SerialDxe/SerialDxe.uni deleted file mode 100644 index 6fbe0eaa44..0000000000 --- a/CorebootModulePkg/SerialDxe/SerialDxe.uni +++ /dev/null @@ -1,21 +0,0 @@ -// /** @file -// Serial driver that layers on top of a Serial Port Library instance. -// -// Serial driver that layers on top of a Serial Port Library instance. -// -// Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "Serial driver that layers on top of a Serial Port Library instance" - -#string STR_MODULE_DESCRIPTION #language en-US "Serial driver that layers on top of a Serial Port Library instance." - diff --git a/CorebootModulePkg/SerialDxe/SerialDxeExtra.uni b/CorebootModulePkg/SerialDxe/SerialDxeExtra.uni deleted file mode 100644 index a0127fbf41..0000000000 --- a/CorebootModulePkg/SerialDxe/SerialDxeExtra.uni +++ /dev/null @@ -1,19 +0,0 @@ -// /** @file -// SerialDxe Localized Strings and Content -// -// Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"SerialDxe Driver" - - diff --git a/CorebootModulePkg/SerialDxe/SerialIo.c b/CorebootModulePkg/SerialDxe/SerialIo.c deleted file mode 100644 index 380e19b734..0000000000 --- a/CorebootModulePkg/SerialDxe/SerialIo.c +++ /dev/null @@ -1,528 +0,0 @@ -/** @file - Serial driver that layers on top of a Serial Port Library instance. - - Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> - Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR> - Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include <Library/UefiBootServicesTableLib.h> -#include <Library/SerialPortLib.h> -#include <Library/DebugLib.h> -#include <Library/PcdLib.h> -#include <Protocol/SerialIo.h> -#include <Protocol/DevicePath.h> - -typedef struct { - VENDOR_DEVICE_PATH Guid; - UART_DEVICE_PATH Uart; - EFI_DEVICE_PATH_PROTOCOL End; -} SERIAL_DEVICE_PATH; - -/** - Reset the serial device. - - @param This Protocol instance pointer. - - @retval EFI_SUCCESS The device was reset. - @retval EFI_DEVICE_ERROR The serial device could not be reset. - -**/ -EFI_STATUS -EFIAPI -SerialReset ( - IN EFI_SERIAL_IO_PROTOCOL *This - ); - -/** - Sets the baud rate, receive FIFO depth, transmit/receive time out, parity, - data bits, and stop bits on a serial device. - - @param This Protocol instance pointer. - @param BaudRate The requested baud rate. A BaudRate value of 0 will use the the - device's default interface speed. - @param ReceiveFifoDepth The requested depth of the FIFO on the receive side of the - serial interface. A ReceiveFifoDepth value of 0 will use - the device's default FIFO depth. - @param Timeout The requested time out for a single character in microseconds. - This timeout applies to both the transmit and receive side of the - interface. A Timeout value of 0 will use the device's default time - out value. - @param Parity The type of parity to use on this serial device. A Parity value of - DefaultParity will use the device's default parity value. - @param DataBits The number of data bits to use on the serial device. A DataBits - value of 0 will use the device's default data bit setting. - @param StopBits The number of stop bits to use on this serial device. A StopBits - value of DefaultStopBits will use the device's default number of - stop bits. - - @retval EFI_SUCCESS The device was reset. - @retval EFI_DEVICE_ERROR The serial device could not be reset. - -**/ -EFI_STATUS -EFIAPI -SerialSetAttributes ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN UINT64 BaudRate, - IN UINT32 ReceiveFifoDepth, - IN UINT32 Timeout, - IN EFI_PARITY_TYPE Parity, - IN UINT8 DataBits, - IN EFI_STOP_BITS_TYPE StopBits - ); - -/** - Set the control bits on a serial device - - @param This Protocol instance pointer. - @param Control Set the bits of Control that are settable. - - @retval EFI_SUCCESS The new control bits were set on the serial device. - @retval EFI_UNSUPPORTED The serial device does not support this operation. - @retval EFI_DEVICE_ERROR The serial device is not functioning correctly. - -**/ -EFI_STATUS -EFIAPI -SerialSetControl ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN UINT32 Control - ); - -/** - Retrieves the status of the control bits on a serial device - - @param This Protocol instance pointer. - @param Control A pointer to return the current Control signals from the serial device. - - @retval EFI_SUCCESS The control bits were read from the serial device. - @retval EFI_DEVICE_ERROR The serial device is not functioning correctly. - -**/ -EFI_STATUS -EFIAPI -SerialGetControl ( - IN EFI_SERIAL_IO_PROTOCOL *This, - OUT UINT32 *Control - ); - -/** - Writes data to a serial device. - - @param This Protocol instance pointer. - @param BufferSize On input, the size of the Buffer. On output, the amount of - data actually written. - @param Buffer The buffer of data to write - - @retval EFI_SUCCESS The data was written. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_TIMEOUT The data write was stopped due to a timeout. - -**/ -EFI_STATUS -EFIAPI -SerialWrite ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ); - -/** - Reads data from a serial device. - - @param This Protocol instance pointer. - @param BufferSize On input, the size of the Buffer. On output, the amount of - data returned in Buffer. - @param Buffer The buffer to return the data into. - - @retval EFI_SUCCESS The data was read. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_TIMEOUT The data write was stopped due to a timeout. - -**/ -EFI_STATUS -EFIAPI -SerialRead ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -EFI_HANDLE mSerialHandle = NULL; - -SERIAL_DEVICE_PATH mSerialDevicePath = { - { - { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0} }, - EFI_CALLER_ID_GUID // Use the driver's GUID - }, - { - { MESSAGING_DEVICE_PATH, MSG_UART_DP, { sizeof (UART_DEVICE_PATH), 0} }, - 0, // Reserved - 0, // BaudRate - 0, // DataBits - 0, // Parity - 0 // StopBits - }, - { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } } -}; - -// -// Template used to initialize the Serial IO protocols. -// -EFI_SERIAL_IO_MODE mSerialIoMode = { - // - // value field set in SerialDxeInitialize()? - //--------- ------------------- ----------------------------- - 0, // ControlMask - 1000 * 1000, // Timeout - 0, // BaudRate yes - 1, // ReceiveFifoDepth - 0, // DataBits yes - 0, // Parity yes - 0 // StopBits yes -}; - -EFI_SERIAL_IO_PROTOCOL mSerialIoTemplate = { - SERIAL_IO_INTERFACE_REVISION, - SerialReset, - SerialSetAttributes, - SerialSetControl, - SerialGetControl, - SerialWrite, - SerialRead, - &mSerialIoMode -}; - -/** - Reset the serial device. - - @param This Protocol instance pointer. - - @retval EFI_SUCCESS The device was reset. - @retval EFI_DEVICE_ERROR The serial device could not be reset. - -**/ -EFI_STATUS -EFIAPI -SerialReset ( - IN EFI_SERIAL_IO_PROTOCOL *This - ) -{ - EFI_STATUS Status; - EFI_TPL Tpl; - - Status = SerialPortInitialize (); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Set the Serial I/O mode and update the device path - // - - Tpl = gBS->RaiseTPL (TPL_NOTIFY); - - // - // Set the Serial I/O mode - // - This->Mode->ReceiveFifoDepth = 1; - This->Mode->Timeout = 1000 * 1000; - This->Mode->BaudRate = PcdGet64 (PcdUartDefaultBaudRate); - This->Mode->DataBits = (UINT32) PcdGet8 (PcdUartDefaultDataBits); - This->Mode->Parity = (UINT32) PcdGet8 (PcdUartDefaultParity); - This->Mode->StopBits = (UINT32) PcdGet8 (PcdUartDefaultStopBits); - - // - // Check if the device path has actually changed - // - if (mSerialDevicePath.Uart.BaudRate == This->Mode->BaudRate && - mSerialDevicePath.Uart.DataBits == (UINT8) This->Mode->DataBits && - mSerialDevicePath.Uart.Parity == (UINT8) This->Mode->Parity && - mSerialDevicePath.Uart.StopBits == (UINT8) This->Mode->StopBits - ) { - gBS->RestoreTPL (Tpl); - return EFI_SUCCESS; - } - - // - // Update the device path - // - mSerialDevicePath.Uart.BaudRate = This->Mode->BaudRate; - mSerialDevicePath.Uart.DataBits = (UINT8) This->Mode->DataBits; - mSerialDevicePath.Uart.Parity = (UINT8) This->Mode->Parity; - mSerialDevicePath.Uart.StopBits = (UINT8) This->Mode->StopBits; - - Status = gBS->ReinstallProtocolInterface ( - mSerialHandle, - &gEfiDevicePathProtocolGuid, - &mSerialDevicePath, - &mSerialDevicePath - ); - - gBS->RestoreTPL (Tpl); - - return Status; -} - -/** - Sets the baud rate, receive FIFO depth, transmit/receive time out, parity, - data bits, and stop bits on a serial device. - - @param This Protocol instance pointer. - @param BaudRate The requested baud rate. A BaudRate value of 0 will use the the - device's default interface speed. - @param ReceiveFifoDepth The requested depth of the FIFO on the receive side of the - serial interface. A ReceiveFifoDepth value of 0 will use - the device's default FIFO depth. - @param Timeout The requested time out for a single character in microseconds. - This timeout applies to both the transmit and receive side of the - interface. A Timeout value of 0 will use the device's default time - out value. - @param Parity The type of parity to use on this serial device. A Parity value of - DefaultParity will use the device's default parity value. - @param DataBits The number of data bits to use on the serial device. A DataBits - value of 0 will use the device's default data bit setting. - @param StopBits The number of stop bits to use on this serial device. A StopBits - value of DefaultStopBits will use the device's default number of - stop bits. - - @retval EFI_SUCCESS The device was reset. - @retval EFI_DEVICE_ERROR The serial device could not be reset. - -**/ -EFI_STATUS -EFIAPI -SerialSetAttributes ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN UINT64 BaudRate, - IN UINT32 ReceiveFifoDepth, - IN UINT32 Timeout, - IN EFI_PARITY_TYPE Parity, - IN UINT8 DataBits, - IN EFI_STOP_BITS_TYPE StopBits - ) -{ - EFI_STATUS Status; - EFI_TPL Tpl; - - Status = SerialPortSetAttributes (&BaudRate, &ReceiveFifoDepth, &Timeout, &Parity, &DataBits, &StopBits); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Set the Serial I/O mode and update the device path - // - - Tpl = gBS->RaiseTPL (TPL_NOTIFY); - - // - // Set the Serial I/O mode - // - This->Mode->ReceiveFifoDepth = ReceiveFifoDepth; - This->Mode->Timeout = Timeout; - This->Mode->BaudRate = BaudRate; - This->Mode->DataBits = (UINT32) DataBits; - This->Mode->Parity = (UINT32) Parity; - This->Mode->StopBits = (UINT32) StopBits; - - // - // Check if the device path has actually changed - // - if (mSerialDevicePath.Uart.BaudRate == BaudRate && - mSerialDevicePath.Uart.DataBits == DataBits && - mSerialDevicePath.Uart.Parity == (UINT8) Parity && - mSerialDevicePath.Uart.StopBits == (UINT8) StopBits - ) { - gBS->RestoreTPL (Tpl); - return EFI_SUCCESS; - } - - // - // Update the device path - // - mSerialDevicePath.Uart.BaudRate = BaudRate; - mSerialDevicePath.Uart.DataBits = DataBits; - mSerialDevicePath.Uart.Parity = (UINT8) Parity; - mSerialDevicePath.Uart.StopBits = (UINT8) StopBits; - - Status = gBS->ReinstallProtocolInterface ( - mSerialHandle, - &gEfiDevicePathProtocolGuid, - &mSerialDevicePath, - &mSerialDevicePath - ); - - gBS->RestoreTPL (Tpl); - - return Status; -} - -/** - Set the control bits on a serial device - - @param This Protocol instance pointer. - @param Control Set the bits of Control that are settable. - - @retval EFI_SUCCESS The new control bits were set on the serial device. - @retval EFI_UNSUPPORTED The serial device does not support this operation. - @retval EFI_DEVICE_ERROR The serial device is not functioning correctly. - -**/ -EFI_STATUS -EFIAPI -SerialSetControl ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN UINT32 Control - ) -{ - return SerialPortSetControl (Control); -} - -/** - Retrieves the status of the control bits on a serial device - - @param This Protocol instance pointer. - @param Control A pointer to return the current Control signals from the serial device. - - @retval EFI_SUCCESS The control bits were read from the serial device. - @retval EFI_DEVICE_ERROR The serial device is not functioning correctly. - -**/ -EFI_STATUS -EFIAPI -SerialGetControl ( - IN EFI_SERIAL_IO_PROTOCOL *This, - OUT UINT32 *Control - ) -{ - return SerialPortGetControl (Control); -} - -/** - Writes data to a serial device. - - @param This Protocol instance pointer. - @param BufferSize On input, the size of the Buffer. On output, the amount of - data actually written. - @param Buffer The buffer of data to write - - @retval EFI_SUCCESS The data was written. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_TIMEOUT The data write was stopped due to a timeout. - -**/ -EFI_STATUS -EFIAPI -SerialWrite ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ) -{ - UINTN Count; - - Count = SerialPortWrite (Buffer, *BufferSize); - - if (Count != *BufferSize) { - *BufferSize = Count; - return EFI_TIMEOUT; - } - - return EFI_SUCCESS; -} - -/** - Reads data from a serial device. - - @param This Protocol instance pointer. - @param BufferSize On input, the size of the Buffer. On output, the amount of - data returned in Buffer. - @param Buffer The buffer to return the data into. - - @retval EFI_SUCCESS The data was read. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_TIMEOUT The data write was stopped due to a timeout. - -**/ -EFI_STATUS -EFIAPI -SerialRead ( - IN EFI_SERIAL_IO_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - UINTN Count; - - Count = 0; - - if (SerialPortPoll ()) { - Count = SerialPortRead (Buffer, *BufferSize); - } - - if (Count != *BufferSize) { - *BufferSize = Count; - return EFI_TIMEOUT; - } - - return EFI_SUCCESS; -} - -/** - Initialization for the Serial Io Protocol. - - @param[in] ImageHandle The firmware allocated handle for the EFI image. - @param[in] SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The entry point is executed successfully. - @retval other Some error occurs when executing this entry point. - -**/ -EFI_STATUS -EFIAPI -SerialDxeInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - - Status = SerialPortInitialize (); - if (EFI_ERROR (Status)) { - return Status; - } - - mSerialIoMode.BaudRate = PcdGet64 (PcdUartDefaultBaudRate); - mSerialIoMode.DataBits = (UINT32) PcdGet8 (PcdUartDefaultDataBits); - mSerialIoMode.Parity = (UINT32) PcdGet8 (PcdUartDefaultParity); - mSerialIoMode.StopBits = (UINT32) PcdGet8 (PcdUartDefaultStopBits); - mSerialDevicePath.Uart.BaudRate = PcdGet64 (PcdUartDefaultBaudRate); - mSerialDevicePath.Uart.DataBits = PcdGet8 (PcdUartDefaultDataBits); - mSerialDevicePath.Uart.Parity = PcdGet8 (PcdUartDefaultParity); - mSerialDevicePath.Uart.StopBits = PcdGet8 (PcdUartDefaultStopBits); - - // - // Make a new handle with Serial IO protocol and its device path on it. - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &mSerialHandle, - &gEfiSerialIoProtocolGuid, &mSerialIoTemplate, - &gEfiDevicePathProtocolGuid, &mSerialDevicePath, - NULL - ); - ASSERT_EFI_ERROR (Status); - - return Status; -} - |