]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / OvmfPkg / Library / XenConsoleSerialPortLib / XenConsoleSerialPortLib.c
index 4ccb38d585fd82a8c64097945a677471d7e97f6b..b29ed3e58e7ae54ee3ad37ba273760360694a83f 100644 (file)
@@ -2,19 +2,13 @@
   Xen console SerialPortLib instance\r
 \r
   Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include <Base.h>\r
-#include <Uefi/UefiBaseType.h>\r
 \r
 #include <Library/BaseLib.h>\r
 #include <Library/SerialPortLib.h>\r
@@ -42,8 +36,8 @@
 // in general, it is actually fine for the Xen domU (guest) environment that\r
 // this module is intended for, as UEFI always executes from DRAM in that case.\r
 //\r
-STATIC evtchn_send_t              mXenConsoleEventChain;\r
-STATIC struct xencons_interface   *mXenConsoleInterface;\r
+STATIC evtchn_send_t             mXenConsoleEventChain;\r
+STATIC struct xencons_interface  *mXenConsoleInterface;\r
 \r
 /**\r
   Initialize the serial device hardware.\r
@@ -62,19 +56,20 @@ SerialPortInitialize (
   VOID\r
   )\r
 {\r
-  if (! XenHypercallIsAvailable ()) {\r
+  if (!XenHypercallIsAvailable ()) {\r
     return RETURN_DEVICE_ERROR;\r
   }\r
 \r
   if (!mXenConsoleInterface) {\r
     mXenConsoleEventChain.port = (UINT32)XenHypercallHvmGetParam (HVM_PARAM_CONSOLE_EVTCHN);\r
-    mXenConsoleInterface = (struct xencons_interface *)(UINTN)\r
-      (XenHypercallHvmGetParam (HVM_PARAM_CONSOLE_PFN) << EFI_PAGE_SHIFT);\r
+    mXenConsoleInterface       = (struct xencons_interface *)(UINTN)\r
+                                 (XenHypercallHvmGetParam (HVM_PARAM_CONSOLE_PFN) << EFI_PAGE_SHIFT);\r
 \r
     //\r
     // No point in ASSERT'ing here as we won't be seeing the output\r
     //\r
   }\r
+\r
   return RETURN_SUCCESS;\r
 }\r
 \r
@@ -98,8 +93,8 @@ SerialPortInitialize (
 UINTN\r
 EFIAPI\r
 SerialPortWrite (\r
-  IN UINT8     *Buffer,\r
-  IN UINTN     NumberOfBytes\r
+  IN UINT8  *Buffer,\r
+  IN UINTN  NumberOfBytes\r
   )\r
 {\r
   XENCONS_RING_IDX  Consumer, Producer;\r
@@ -122,15 +117,15 @@ SerialPortWrite (
 \r
     MemoryFence ();\r
 \r
-    while (Sent < NumberOfBytes && ((Producer - Consumer) < sizeof (mXenConsoleInterface->out)))\r
-      mXenConsoleInterface->out[MASK_XENCONS_IDX(Producer++, mXenConsoleInterface->out)] = Buffer[Sent++];\r
+    while (Sent < NumberOfBytes && ((Producer - Consumer) < sizeof (mXenConsoleInterface->out))) {\r
+      mXenConsoleInterface->out[MASK_XENCONS_IDX (Producer++, mXenConsoleInterface->out)] = Buffer[Sent++];\r
+    }\r
 \r
     MemoryFence ();\r
 \r
     mXenConsoleInterface->out_prod = Producer;\r
 \r
     XenHypercallEventChannelOp (EVTCHNOP_send, &mXenConsoleEventChain);\r
-\r
   } while (Sent < NumberOfBytes);\r
 \r
   return Sent;\r
@@ -154,9 +149,9 @@ SerialPortWrite (
 UINTN\r
 EFIAPI\r
 SerialPortRead (\r
-  OUT UINT8     *Buffer,\r
-  IN  UINTN     NumberOfBytes\r
-)\r
+  OUT UINT8  *Buffer,\r
+  IN  UINTN  NumberOfBytes\r
+  )\r
 {\r
   XENCONS_RING_IDX  Consumer, Producer;\r
   UINTN             Received;\r
@@ -177,8 +172,9 @@ SerialPortRead (
   MemoryFence ();\r
 \r
   Received = 0;\r
-  while (Received < NumberOfBytes && Consumer < Producer)\r
-     Buffer[Received++] = mXenConsoleInterface->in[MASK_XENCONS_IDX(Consumer++, mXenConsoleInterface->in)];\r
+  while (Received < NumberOfBytes && Consumer < Producer) {\r
+    Buffer[Received++] = mXenConsoleInterface->in[MASK_XENCONS_IDX (Consumer++, mXenConsoleInterface->in)];\r
+  }\r
 \r
   MemoryFence ();\r
 \r
@@ -203,5 +199,99 @@ SerialPortPoll (
   )\r
 {\r
   return mXenConsoleInterface &&\r
-    mXenConsoleInterface->in_cons != mXenConsoleInterface->in_prod;\r
+         mXenConsoleInterface->in_cons != mXenConsoleInterface->in_prod;\r
+}\r
+\r
+/**\r
+  Sets the control bits on a serial device.\r
+\r
+  @param Control                Sets the bits of Control that are settable.\r
+\r
+  @retval RETURN_SUCCESS        The new control bits were set on the serial device.\r
+  @retval RETURN_UNSUPPORTED    The serial device does not support this operation.\r
+  @retval RETURN_DEVICE_ERROR   The serial device is not functioning correctly.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+SerialPortSetControl (\r
+  IN UINT32  Control\r
+  )\r
+{\r
+  return RETURN_UNSUPPORTED;\r
+}\r
+\r
+/**\r
+  Retrieve the status of the control bits on a serial device.\r
+\r
+  @param Control                A pointer to return the current control signals from the serial device.\r
+\r
+  @retval RETURN_SUCCESS        The control bits were read from the serial device.\r
+  @retval RETURN_UNSUPPORTED    The serial device does not support this operation.\r
+  @retval RETURN_DEVICE_ERROR   The serial device is not functioning correctly.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+SerialPortGetControl (\r
+  OUT UINT32  *Control\r
+  )\r
+{\r
+  if (!mXenConsoleInterface) {\r
+    return RETURN_UNSUPPORTED;\r
+  }\r
+\r
+  *Control = 0;\r
+  if (!SerialPortPoll ()) {\r
+    *Control = EFI_SERIAL_INPUT_BUFFER_EMPTY;\r
+  }\r
+\r
+  return RETURN_SUCCESS;\r
+}\r
+\r
+/**\r
+  Sets the baud rate, receive FIFO depth, transmit/receive time out, parity,\r
+  data bits, and stop bits on a serial device.\r
+\r
+  @param BaudRate           The requested baud rate. A BaudRate value of 0 will use the\r
+                            device's default interface speed.\r
+                            On output, the value actually set.\r
+  @param ReceiveFifoDepth   The requested depth of the FIFO on the receive side of the\r
+                            serial interface. A ReceiveFifoDepth value of 0 will use\r
+                            the device's default FIFO depth.\r
+                            On output, the value actually set.\r
+  @param Timeout            The requested time out for a single character in microseconds.\r
+                            This timeout applies to both the transmit and receive side of the\r
+                            interface. A Timeout value of 0 will use the device's default time\r
+                            out value.\r
+                            On output, the value actually set.\r
+  @param Parity             The type of parity to use on this serial device. A Parity value of\r
+                            DefaultParity will use the device's default parity value.\r
+                            On output, the value actually set.\r
+  @param DataBits           The number of data bits to use on the serial device. A DataBits\r
+                            value of 0 will use the device's default data bit setting.\r
+                            On output, the value actually set.\r
+  @param StopBits           The number of stop bits to use on this serial device. A StopBits\r
+                            value of DefaultStopBits will use the device's default number of\r
+                            stop bits.\r
+                            On output, the value actually set.\r
+\r
+  @retval RETURN_SUCCESS            The new attributes were set on the serial device.\r
+  @retval RETURN_UNSUPPORTED        The serial device does not support this operation.\r
+  @retval RETURN_INVALID_PARAMETER  One or more of the attributes has an unsupported value.\r
+  @retval RETURN_DEVICE_ERROR       The serial device is not functioning correctly.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+SerialPortSetAttributes (\r
+  IN OUT UINT64              *BaudRate,\r
+  IN OUT UINT32              *ReceiveFifoDepth,\r
+  IN OUT UINT32              *Timeout,\r
+  IN OUT EFI_PARITY_TYPE     *Parity,\r
+  IN OUT UINT8               *DataBits,\r
+  IN OUT EFI_STOP_BITS_TYPE  *StopBits\r
+  )\r
+{\r
+  return RETURN_UNSUPPORTED;\r
 }\r