| /** @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 |