// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#ifndef ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_USB_IO_H_
#define ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_USB_IO_H_

#include <efi/types.h>

#define EFI_USB_IO_PROTOCOL_GUID                                                   \
  {                                                                                \
    0x2b2f68d6, 0x0cd2, 0x44cf, { 0x8e, 0x8b, 0xbb, 0xa2, 0x0b, 0x1b, 0x5b, 0x75 } \
  }
extern efi_guid UsbIoProtocol;

typedef enum { EfiUsbDataIn, EfiUsbDataOut, EfiUsbNoData } efi_usb_data_direction;

#define EFI_USB_NOERROR 0x0000
#define EFI_USB_ERR_NOTEXECUTE 0x0001
#define EFI_USB_ERR_STALL 0x0002
#define EFI_USB_ERR_BUFFER 0x0004
#define EFI_USB_ERR_BABBLE 0x0008
#define EFI_USB_ERR_NAK 0x0010
#define EFI_USB_ERR_CRC 0x0020
#define EFI_USB_ERR_TIMEOUT 0x0040
#define EFI_USB_ERR_BITSTUFF 0x0080
#define EFI_USB_ERR_SYSTEM 0x0100

typedef struct {
  uint8_t RequestType;
  uint8_t Request;
  uint16_t Value;
  uint16_t Index;
  uint16_t Length;
} efi_usb_device_request;

typedef efi_status (*efi_async_usb_transfer_callback)(void* Data, size_t DataLength, void* Context,
                                                      uint32_t Status) EFIAPI;

typedef struct {
  uint8_t Length;
  uint8_t DescriptorType;
  uint16_t BcdUSB;
  uint8_t DeviceClass;
  uint8_t DeviceSubClass;
  uint8_t DeviceProtocol;
  uint8_t MaxPacketSize0;
  uint16_t IdVendor;
  uint16_t IdProduct;
  uint16_t BcdDevice;
  uint8_t StrManufacturer;
  uint8_t StrProduct;
  uint8_t StrSerialNumber;
  uint8_t NumConfigurations;
} efi_usb_device_descriptor;

typedef struct {
  uint8_t Length;
  uint8_t DescriptorType;
  uint16_t TotalLength;
  uint8_t NumInterfaces;
  uint8_t ConfigurationValue;
  uint8_t Configuration;
  uint8_t Attributes;
  uint8_t MaxPower;
} efi_usb_config_descriptor;

typedef struct {
  uint8_t Length;
  uint8_t DescriptorType;
  uint8_t InterfaceNumber;
  uint8_t AlternateSetting;
  uint8_t NumEndpoints;
  uint8_t InterfaceClass;
  uint8_t InterfaceSubClass;
  uint8_t InterfaceProtocol;
  uint8_t Interface;
} efi_usb_interface_descriptor;

typedef struct {
  uint8_t Length;
  uint8_t DescriptorType;
  uint8_t EndpointAddress;
  uint8_t Attributes;
  uint16_t MaxPacketSize;
  uint8_t Interval;
} efi_usb_endpoint_descriptor;

typedef struct efi_usb_io_protocol {
  efi_status (*UsbControlTransfer)(struct efi_usb_io_protocol* self,
                                   efi_usb_device_request* request,
                                   efi_usb_data_direction direction, uint32_t timeout, void* data,
                                   size_t data_len, uint32_t* status) EFIAPI;

  efi_status (*UsbBulkTransfer)(struct efi_usb_io_protocol* self, uint8_t endpoint, void* data,
                                size_t data_len, size_t timeout, uint32_t* status) EFIAPI;

  efi_status (*UsbAsyncInterruptTransfer)(struct efi_usb_io_protocol* self, uint8_t endpoint,
                                          bool is_new_transfer, size_t polling_interval,
                                          size_t data_len,
                                          efi_async_usb_transfer_callback interrupt_cb,
                                          void* context) EFIAPI;

  efi_status (*UsbSyncInterruptTransfer)(struct efi_usb_io_protocol* self, uint8_t endpoint,
                                         void* data, size_t* data_len, size_t timeout,
                                         uint32_t* status) EFIAPI;

  efi_status (*UsbIsochronousTransfer)(struct efi_usb_io_protocol* self, uint8_t endpoint,
                                       void* data, size_t data_len, uint32_t* status) EFIAPI;

  efi_status (*UsbAsyncIsochronousTransfer)(struct efi_usb_io_protocol* self, uint8_t endpoint,
                                            void* data, size_t data_len,
                                            efi_async_usb_transfer_callback isoc_cb,
                                            void* context) EFIAPI;

  efi_status (*UsbGetDeviceDescriptor)(struct efi_usb_io_protocol* self,
                                       efi_usb_device_descriptor* descriptor) EFIAPI;

  efi_status (*UsbGetConfigDescriptor)(struct efi_usb_io_protocol* self,
                                       efi_usb_config_descriptor* descriptor) EFIAPI;

  efi_status (*UsbGetInterfaceDescriptor)(struct efi_usb_io_protocol* self,
                                          efi_usb_interface_descriptor* descriptor) EFIAPI;

  efi_status (*UsbGetEndpointDescriptor)(struct efi_usb_io_protocol* self, uint8_t endpt_index,
                                         efi_usb_endpoint_descriptor* descriptor) EFIAPI;

  efi_status (*UsbGetStringDescriptor)(struct efi_usb_io_protocol* self, uint16_t langid,
                                       uint8_t stringid, char16_t** str) EFIAPI;

  efi_status (*UsbGetSupportedLanguages)(struct efi_usb_io_protocol* self, uint16_t** langid_table,
                                         uint16_t* table_size) EFIAPI;

  efi_status (*UsbPortReset)(struct efi_usb_io_protocol* self) EFIAPI;
} efi_usb_io_protocol;

#endif  // ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_USB_IO_H_
