summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/VirtioSerialDxe/VirtioSerial.h
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2023-05-04 15:11:59 +0200
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-05-04 14:26:58 +0000
commit4d1452c59979b9fcc762db692688b5b3b6573106 (patch)
tree49e68515d4d4a85653edddf2c0e1ab9cbc0c2134 /OvmfPkg/VirtioSerialDxe/VirtioSerial.h
parent1694b0051138dc121740e47896d165b8b12382c6 (diff)
downloadedk2-4d1452c59979b9fcc762db692688b5b3b6573106.tar.gz
OvmfPkg/VirtioSerialDxe: add driver
Add a driver for the virtio serial device. The virtio serial device also known as virtio console device because initially it had only support for a single tty, intended to be used as console. Support for multiple streams and named data ports has been added later on. The driver supports tty ports only, they are registered as SerialIo UART in the system. Named ports are detected and logged, but not exposed as devices. They are usually used by guest agents to communicate with the host. It's not clear whenever it makes sense for the firmware to run such agents and if so which efi protocol could be to expose the ports. So leaving that for another day. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'OvmfPkg/VirtioSerialDxe/VirtioSerial.h')
-rw-r--r--OvmfPkg/VirtioSerialDxe/VirtioSerial.h226
1 files changed, 226 insertions, 0 deletions
diff --git a/OvmfPkg/VirtioSerialDxe/VirtioSerial.h b/OvmfPkg/VirtioSerialDxe/VirtioSerial.h
new file mode 100644
index 0000000000..e626fdf430
--- /dev/null
+++ b/OvmfPkg/VirtioSerialDxe/VirtioSerial.h
@@ -0,0 +1,226 @@
+/** @file
+
+ Private definitions of the VirtioRng RNG driver
+
+ Copyright (C) 2016, Linaro Ltd.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _VIRTIO_SERIAL_DXE_H_
+#define _VIRTIO_SERIAL_DXE_H_
+
+#include <Protocol/ComponentName.h>
+#include <Protocol/DriverBinding.h>
+#include <Protocol/SerialIo.h>
+
+#include <IndustryStandard/Virtio.h>
+#include <IndustryStandard/VirtioSerial.h>
+
+#define VIRTIO_SERIAL_SIG SIGNATURE_32 ('V', 'S', 'I', 'O')
+
+#define MAX_PORTS 8
+#define MAX_RINGS (MAX_PORTS * 2 + 2)
+
+#define CTRL_RX_BUFSIZE 128
+#define CTRL_TX_BUFSIZE sizeof(VIRTIO_SERIAL_CONTROL)
+#define PORT_RX_BUFSIZE 128
+#define PORT_TX_BUFSIZE 128
+
+//
+// Data structures
+//
+
+typedef struct _VIRTIO_SERIAL_DEV VIRTIO_SERIAL_DEV;
+typedef struct _VIRTIO_SERIAL_RING VIRTIO_SERIAL_RING;
+typedef struct _VIRTIO_SERIAL_PORT VIRTIO_SERIAL_PORT;
+typedef struct _VIRTIO_SERIAL_IO_PROTOCOL VIRTIO_SERIAL_IO_PROTOCOL;
+
+struct _VIRTIO_SERIAL_RING {
+ VRING Ring;
+ VOID *RingMap;
+ DESC_INDICES Indices; /* Avail Ring */
+ UINT16 LastUsedIdx; /* Used Ring */
+
+ UINT32 BufferSize;
+ UINT32 BufferCount;
+ UINT32 BufferPages;
+ UINT8 *Buffers;
+ VOID *BufferMap;
+ EFI_PHYSICAL_ADDRESS DeviceAddress;
+
+ BOOLEAN Ready;
+};
+
+struct _VIRTIO_SERIAL_PORT {
+ BOOLEAN Ready;
+ BOOLEAN Console;
+ BOOLEAN DeviceOpen;
+
+ CHAR16 Name[32];
+
+ VIRTIO_SERIAL_IO_PROTOCOL *SerialIo;
+};
+
+struct _VIRTIO_SERIAL_DEV {
+ UINT32 Signature;
+ LIST_ENTRY Link;
+
+ EFI_HANDLE DriverBindingHandle;
+ EFI_HANDLE DeviceHandle;
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;
+
+ VIRTIO_DEVICE_PROTOCOL *VirtIo;
+ EFI_EVENT ExitBoot;
+ VIRTIO_SERIAL_CONFIG Config;
+ VIRTIO_SERIAL_PORT Ports[MAX_PORTS];
+ VIRTIO_SERIAL_RING Rings[MAX_RINGS];
+ EFI_EVENT Timer;
+
+ UINT32 NumPorts;
+ UINT32 NumConsoles;
+ UINT32 NumNamedPorts;
+};
+
+struct _VIRTIO_SERIAL_IO_PROTOCOL {
+ EFI_SERIAL_IO_PROTOCOL SerialIo;
+ EFI_SERIAL_IO_MODE SerialIoMode;
+
+ EFI_HANDLE DeviceHandle;
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;
+
+ VIRTIO_SERIAL_DEV *Dev;
+ UINT32 PortId;
+
+ UINT8 ReadBuffer[PORT_RX_BUFSIZE];
+ UINT32 ReadOffset;
+ UINT32 ReadSize;
+
+ UINT8 WriteBuffer[PORT_TX_BUFSIZE];
+ UINT32 WriteOffset;
+};
+
+//
+// VirtioSerial.c
+//
+
+VOID
+EFIAPI
+LogDevicePath (
+ UINT32 Level,
+ const CHAR8 *Func,
+ CHAR16 *Note,
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath
+ );
+
+EFI_STATUS
+EFIAPI
+VirtioSerialTxControl (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT32 Id,
+ IN UINT16 Event,
+ IN UINT16 Value
+ );
+
+//
+// VirtioSerialRing.c
+//
+
+EFI_STATUS
+EFIAPI
+VirtioSerialInitRing (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT16 Index,
+ IN UINT32 BufferSize
+ );
+
+VOID
+EFIAPI
+VirtioSerialUninitRing (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT16 Index
+ );
+
+VOID
+EFIAPI
+VirtioSerialRingFillRx (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT16 Index
+ );
+
+VOID
+EFIAPI
+VirtioSerialRingClearTx (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT16 Index
+ );
+
+EFI_STATUS
+EFIAPI
+VirtioSerialRingSendBuffer (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT16 Index,
+ IN VOID *Data,
+ IN UINT32 DataSize,
+ IN BOOLEAN Notify
+ );
+
+BOOLEAN
+EFIAPI
+VirtioSerialRingHasBuffer (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT16 Index
+ );
+
+BOOLEAN
+EFIAPI
+VirtioSerialRingGetBuffer (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT16 Index,
+ OUT VOID *Data,
+ OUT UINT32 *DataSize
+ );
+
+//
+// VirtioSerialPort.c
+//
+
+EFI_STATUS
+EFIAPI
+VirtioSerialPortAdd (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT32 PortId
+ );
+
+VOID
+EFIAPI
+VirtioSerialPortSetConsole (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT32 PortId
+ );
+
+VOID
+EFIAPI
+VirtioSerialPortSetName (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT32 PortId,
+ IN UINT8 *Name
+ );
+
+VOID
+EFIAPI
+VirtioSerialPortSetDeviceOpen (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT32 PortId,
+ IN UINT16 Value
+ );
+
+VOID
+EFIAPI
+VirtioSerialPortRemove (
+ IN OUT VIRTIO_SERIAL_DEV *Dev,
+ IN UINT32 PortId
+ );
+
+#endif