Signed-off-by: Roman Kagan <rka...@virtuozzo.com> --- .../ipxe/efi/Protocol/HypervVmbusDevice.h | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 src/include/ipxe/efi/Protocol/HypervVmbusDevice.h
diff --git a/src/include/ipxe/efi/Protocol/HypervVmbusDevice.h b/src/include/ipxe/efi/Protocol/HypervVmbusDevice.h new file mode 100644 index 00000000..ef4f9df6 --- /dev/null +++ b/src/include/ipxe/efi/Protocol/HypervVmbusDevice.h @@ -0,0 +1,168 @@ +/**@file + + VMBus device protocol definition + Copyright (c) 2018 Virtuozzo International GmbH. + + 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 __HYPERV_VMBUS_DEVICE_PROTOCOL_H__ +#define __HYPERV_VMBUS_DEVICE_PROTOCOL_H__ + +typedef struct _HYPERV_VMBUS_DEVICE_PROTOCOL HYPERV_VMBUS_DEVICE_PROTOCOL; + +typedef +EFI_STATUS +(EFIAPI *HV_VMBUS_ESTABLISH_GPADL)( + IN HYPERV_VMBUS_DEVICE_PROTOCOL *Self, + IN VOID *Buffer, + IN UINT32 Size, + OUT UINT32 *Gpadl + ); + +typedef +EFI_STATUS +(EFIAPI *HV_VMBUS_TEARDOWN_GPADL)( + IN HYPERV_VMBUS_DEVICE_PROTOCOL *Self, + IN UINT32 Gpadl + ); + +/** + Open device channel + Vmbus devices use channels as means of communication between host and guest + + @param Self Vmbus device protocol instance + + @param RingbufferSizePages Requested channel ring buffer size in pages + Two ringbuffers are created for each channel: + inbound and outbound. Both will have this size, + so memory consumption is doubled. + + @retval EFI_INVALID_PARAMETER Self is NULL or RingbufferSizePages is 0 + @retval EFI_OUT_OF_RESOURCES No memory for channel ringbuffers + @retval EFI_DEVICE_ERROR Hypervisor host error + @retval EFI_SUCCESS Channel successfully opened and is ready for IO +**/ +typedef +EFI_STATUS +(EFIAPI *HV_VMBUS_OPEN_CHANNEL)( + IN HYPERV_VMBUS_DEVICE_PROTOCOL *Self, + IN UINT32 RbOutPages, + IN UINT32 RbInPages + ); + +/** + Close device channel + + @param Self Vmbus device protocol instance + + #retval EFI_INVALID_PARAMETER Self is NULL + @retval EFI_DEVICE_ERROR Hypervisor host error + @retval EFI_SUCCESS Channel successfully closed +**/ +typedef +EFI_STATUS +(EFIAPI *HV_VMBUS_CLOSE_CHANNEL)( + IN HYPERV_VMBUS_DEVICE_PROTOCOL *Self + ); + +/** + Read next message from channel + This call will block until new message is available + + @param Self Vmbus device protocol instance + @param Buffer Data buffer + @param Size Data buffer size in bytes + @param Msglen Size of actual message that was read from channel. + In case buffer size is insufficient, size of + required buffer + + @retval EFI_INVALID_PARAMETER Self or Buffer is NULL + @retval EFI_BUFFER_TOO_SMALL Supplied buffer size is insufficient to hold message data + Required size is returned in Msglen if it is not NULL + @retval EFI_DEVICE_ERROR Hypervisor host error + @retval EFI_SUCCESS Message successfully read, check size in Msglen +**/ +typedef struct _HV_VMBUS_BUF_RANGE { + UINT32 Length; + UINT32 Offset; +} HV_VMBUS_BUF_RANGE; + +typedef +EFI_STATUS +(EFIAPI *HV_VMBUS_READ_CHANNEL)( + IN HYPERV_VMBUS_DEVICE_PROTOCOL *Self, + OUT UINT16 *Type OPTIONAL, + OUT UINT64 *TransactionId OPTIONAL, + OUT VOID *Message OPTIONAL, + OUT UINT32 *MessageSize OPTIONAL, + OUT UINT16 *BufferId OPTIONAL, + OUT HV_VMBUS_BUF_RANGE *Ranges OPTIONAL, + OUT UINT32 *NumRanges OPTIONAL + ); + +/** + Write message to channel + + @param Self Vmbus device protocol instance + @param Type Vmbus packet type + @param TransactionId Transaction ID + @param Message Packet message + @param MessageSize Packet message size + @param Data Packet data (out-of-band) + @param DataSize Packet data size + + @retval EFI_INVALID_PARAMETER Self or Buffer is NULL + @retval EFI_BUFFER_TOO_SMALL There is not enough space in channel ringbuffer for new message + @retval EFI_DEVICE_ERROR Hypervisor host error + @retval EFI_SUCCESS Message successfully written +**/ +typedef +EFI_STATUS +(EFIAPI *HV_VMBUS_WRITE_CHANNEL)( + IN HYPERV_VMBUS_DEVICE_PROTOCOL *Self, + IN UINT16 Type, + IN UINT64 TransactionId, + IN CONST VOID *Message, + IN UINT32 MessageSize, + IN VOID *Data, + IN UINT32 DataSize + ); + +/** + VMBus device protocol + + VMbus DXE driver will enumerate paravirtualized device bus and produce + a handle with this protocol and device path protocol installed for + each device offered by host hypervisor + + Specific device driver can use this protocol as generic vmbus device + communication channel +**/ +struct _HYPERV_VMBUS_DEVICE_PROTOCOL { + EFI_GUID TypeGUID; + EFI_GUID InstanceGUID; + UINT32 Channel; + + HV_VMBUS_ESTABLISH_GPADL EstablishGpadl; + HV_VMBUS_TEARDOWN_GPADL TeardownGpadl; + HV_VMBUS_OPEN_CHANNEL OpenChannel; + HV_VMBUS_CLOSE_CHANNEL CloseChannel; + HV_VMBUS_READ_CHANNEL ReadChannel; + HV_VMBUS_WRITE_CHANNEL WriteChannel; +}; + + +#define EFI_HYPERV_VMBUS_DEVICE_PROTOCOL_GUID \ +{0x37c2cad1, 0x5e84, 0x488e, {0xaa, 0x24, 0x0b, 0xcd, 0x09, 0x47, 0x65, 0x13}} + +extern EFI_GUID gHypervVmbusDeviceProtocolGuid; + +#endif -- 2.17.1 _______________________________________________ ipxe-devel mailing list ipxe-devel@lists.ipxe.org https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel