/** @file
  Define APIs to retrieve USB Host Controller Info such as controller type and
  I/O Port Base Address.

Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>

SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

///
/// Global ID for the PEI_USB_CONTROLLER_PPI.
///
#define PEI_USB_CONTROLLER_PPI_GUID \
  { \
    0x3bc1f6de, 0x693e, 0x4547,{ 0xa3, 0x0, 0x21, 0x82, 0x3c, 0xa4, 0x20, 0xb2} \
  }

///
/// Forward declaration for the PEI_USB_CONTROLLER_PPI.
///
typedef struct _PEI_USB_CONTROLLER_PPI PEI_USB_CONTROLLER_PPI;

///
/// This bit is used in the ControllerType return parameter of GetUsbController()
/// to identify the USB Host Controller type as UHCI
///
#define PEI_UHCI_CONTROLLER  0x01

///
/// This bit is used in the ControllerType return parameter of GetUsbController()
/// to identify the USB Host Controller type as OHCI
///
#define PEI_OHCI_CONTROLLER  0x02

///
/// This bit is used in the ControllerType return parameter of GetUsbController()
/// to identify the USB Host Controller type as EHCI
///
#define PEI_EHCI_CONTROLLER  0x03

///
/// This bit is used in the ControllerType return parameter of GetUsbController()
/// to identify the USB Host Controller type as XHCI
///
#define PEI_XHCI_CONTROLLER  0x04

/**
  Retrieve USB Host Controller Info such as controller type and I/O Base Address.

  @param[in]  PeiServices      The pointer to the PEI Services Table.
  @param[in]  This             The pointer to this instance of the PEI_USB_CONTROLLER_PPI.
  @param[in]  ControllerId     The ID of the USB controller.
  @param[out] ControllerType   On output, returns the type of the USB controller.
  @param[out] BaseAddress      On output, returns the base address of UHCI's I/O ports
                               if UHCI is enabled or the base address of EHCI's MMIO
                               if EHCI is enabled.

  @retval EFI_SUCCESS             USB controller attributes were returned successfully.
  @retval EFI_INVALID_PARAMETER   ControllerId is greater than the maximum number
                                  of USB controller supported by this platform.

**/
typedef
EFI_STATUS
(EFIAPI *PEI_GET_USB_CONTROLLER)(
  IN  EFI_PEI_SERVICES        **PeiServices,
  IN  PEI_USB_CONTROLLER_PPI  *This,
  IN  UINT8                   UsbControllerId,
  OUT UINTN                   *ControllerType,
  OUT UINTN                   *BaseAddress
  );

///
/// This PPI contains a single service to retrieve the USB Host Controller type
/// and the base address of the I/O ports used to access the USB Host Controller.
///
struct _PEI_USB_CONTROLLER_PPI {
  PEI_GET_USB_CONTROLLER    GetUsbController;
};

extern EFI_GUID  gPeiUsbControllerPpiGuid;
