/** @file
Constants definitions for Usb Hub Peim

Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>

SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _PEI_HUB_PEIM_H_
#define _PEI_HUB_PEIM_H_


//
// Hub feature numbers
//
#define C_HUB_LOCAL_POWER   0
#define C_HUB_OVER_CURRENT  1

//
// Hub class code & sub class code
//
#define CLASS_CODE_HUB      0x09
#define SUB_CLASS_CODE_HUB  0

//
// Hub Status & Hub Change bit masks
//
#define HUB_STATUS_LOCAL_POWER  0x0001
#define HUB_STATUS_OVERCURRENT  0x0002

#define HUB_CHANGE_LOCAL_POWER  0x0001
#define HUB_CHANGE_OVERCURRENT  0x0002

//
// Hub Characteristics
//
#define HUB_CHAR_LPSM     0x0003
#define HUB_CHAR_COMPOUND 0x0004
#define HUB_CHAR_OCPM     0x0018

//
// Standard hub request and request type
// By [Spec-USB20/Chapter-11.24]
//
#define USB_HUB_CLEAR_FEATURE               0x01
#define USB_HUB_CLEAR_FEATURE_REQ_TYPE      0x20

#define USB_HUB_CLEAR_FEATURE_PORT          0x01
#define USB_HUB_CLEAR_FEATURE_PORT_REQ_TYPE 0x23

#define USB_HUB_GET_BUS_STATE               0x02
#define USB_HUB_GET_BUS_STATE_REQ_TYPE      0xA3

#define USB_HUB_GET_DESCRIPTOR              0x06
#define USB_HUB_GET_DESCRIPTOR_REQ_TYPE     0xA0

#define USB_HUB_GET_HUB_STATUS              0x00
#define USB_HUB_GET_HUB_STATUS_REQ_TYPE     0xA0

#define USB_HUB_GET_PORT_STATUS             0x00
#define USB_HUB_GET_PORT_STATUS_REQ_TYPE    0xA3

#define USB_HUB_SET_DESCRIPTOR              0x07
#define USB_HUB_SET_DESCRIPTOR_REQ_TYPE     0x20

#define USB_HUB_SET_HUB_FEATURE             0x03
#define USB_HUB_SET_HUB_FEATURE_REQ_TYPE    0x20

#define USB_HUB_SET_PORT_FEATURE            0x03
#define USB_HUB_SET_PORT_FEATURE_REQ_TYPE   0x23

#define USB_RT_HUB        (USB_TYPE_CLASS | USB_RECIP_DEVICE)
#define USB_RT_PORT       (USB_TYPE_CLASS | USB_RECIP_OTHER)

#define USB_HUB_REQ_SET_DEPTH               12

#define MAXBYTES  8
#pragma pack(1)
//
// Hub descriptor, the last two fields are of variable lenght.
//
typedef struct {
  UINT8 Length;
  UINT8 DescriptorType;
  UINT8 NbrPorts;
  UINT8 HubCharacteristics[2];
  UINT8 PwrOn2PwrGood;
  UINT8 HubContrCurrent;
  UINT8 Filler[MAXBYTES];
} EFI_USB_HUB_DESCRIPTOR;

typedef struct {
  UINT16  HubStatus;
  UINT16  HubChangeStatus;
} EFI_USB_HUB_STATUS;

#pragma pack()
/**
  Get a given hub port status.

  @param  PeiServices   General-purpose services that are available to every PEIM.
  @param  UsbIoPpi      Indicates the PEI_USB_IO_PPI instance.
  @param  Port          Usb hub port number (starting from 1).
  @param  PortStatus    Current Hub port status and change status.

  @retval EFI_SUCCESS       Port status is obtained successfully.
  @retval EFI_DEVICE_ERROR  Cannot get the port status due to a hardware error.
  @retval Others            Other failure occurs.

**/
EFI_STATUS
PeiHubGetPortStatus (
  IN EFI_PEI_SERVICES       **PeiServices,
  IN PEI_USB_IO_PPI         *UsbIoPpi,
  IN  UINT8                 Port,
  OUT UINT32                *PortStatus
  );

/**
  Set specified feature to a given hub port.

  @param  PeiServices   General-purpose services that are available to every PEIM.
  @param  UsbIoPpi      Indicates the PEI_USB_IO_PPI instance.
  @param  Port          Usb hub port number (starting from 1).
  @param  Value         New feature value.

  @retval EFI_SUCCESS       Port feature is set successfully.
  @retval EFI_DEVICE_ERROR  Cannot set the port feature due to a hardware error.
  @retval Others            Other failure occurs.

**/
EFI_STATUS
PeiHubSetPortFeature (
  IN EFI_PEI_SERVICES       **PeiServices,
  IN PEI_USB_IO_PPI         *UsbIoPpi,
  IN  UINT8                 Port,
  IN  UINT8                 Value
  );


/**
  Get a given hub status.

  @param  PeiServices   General-purpose services that are available to every PEIM.
  @param  UsbIoPpi      Indicates the PEI_USB_IO_PPI instance.
  @param  HubStatus     Current Hub status and change status.

  @retval EFI_SUCCESS       Hub status is obtained successfully.
  @retval EFI_DEVICE_ERROR  Cannot get the hub status due to a hardware error.
  @retval Others            Other failure occurs.

**/
EFI_STATUS
PeiHubGetHubStatus (
  IN EFI_PEI_SERVICES       **PeiServices,
  IN PEI_USB_IO_PPI         *UsbIoPpi,
  OUT UINT32                *HubStatus
  );

/**
  Clear specified feature on a given hub port.

  @param  PeiServices   General-purpose services that are available to every PEIM.
  @param  UsbIoPpi      Indicates the PEI_USB_IO_PPI instance.
  @param  Port          Usb hub port number (starting from 1).
  @param  Value         Feature value that will be cleared from the hub port.

  @retval EFI_SUCCESS       Port feature is cleared successfully.
  @retval EFI_DEVICE_ERROR  Cannot clear the port feature due to a hardware error.
  @retval Others            Other failure occurs.

**/
EFI_STATUS
PeiHubClearPortFeature (
  IN EFI_PEI_SERVICES       **PeiServices,
  IN PEI_USB_IO_PPI         *UsbIoPpi,
  IN  UINT8                 Port,
  IN  UINT8                 Value
  );

/**
  Clear specified feature on a given hub.

  @param  PeiServices   General-purpose services that are available to every PEIM.
  @param  UsbIoPpi      Indicates the PEI_USB_IO_PPI instance.
  @param  Value         Feature value that will be cleared from the hub port.

  @retval EFI_SUCCESS       Hub feature is cleared successfully.
  @retval EFI_DEVICE_ERROR  Cannot clear the hub feature due to a hardware error.
  @retval Others            Other failure occurs.

**/
EFI_STATUS
PeiHubClearHubFeature (
  IN EFI_PEI_SERVICES       **PeiServices,
  IN PEI_USB_IO_PPI         *UsbIoPpi,
  IN  UINT8                 Value
  );

/**
  Get a given hub descriptor.

  @param  PeiServices    General-purpose services that are available to every PEIM.
  @param  PeiUsbDevice   Indicates the hub controller device.
  @param  UsbIoPpi       Indicates the PEI_USB_IO_PPI instance.
  @param  DescriptorSize The length of Hub Descriptor buffer.
  @param  HubDescriptor  Caller allocated buffer to store the hub descriptor if
                         successfully returned.

  @retval EFI_SUCCESS       Hub descriptor is obtained successfully.
  @retval EFI_DEVICE_ERROR  Cannot get the hub descriptor due to a hardware error.
  @retval Others            Other failure occurs.

**/
EFI_STATUS
PeiGetHubDescriptor (
  IN EFI_PEI_SERVICES         **PeiServices,
  IN PEI_USB_DEVICE           *PeiUsbDevice,
  IN PEI_USB_IO_PPI           *UsbIoPpi,
  IN UINTN                    DescriptorSize,
  OUT EFI_USB_HUB_DESCRIPTOR  *HubDescriptor
  );

/**
  Configure a given hub.

  @param  PeiServices    General-purpose services that are available to every PEIM.
  @param  PeiUsbDevice   Indicating the hub controller device that will be configured

  @retval EFI_SUCCESS       Hub configuration is done successfully.
  @retval EFI_DEVICE_ERROR  Cannot configure the hub due to a hardware error.

**/
EFI_STATUS
PeiDoHubConfig (
  IN EFI_PEI_SERVICES         **PeiServices,
  IN PEI_USB_DEVICE           *PeiUsbDevice
  );

/**
  Send reset signal over the given root hub port.

  @param  PeiServices    General-purpose services that are available to every PEIM.
  @param  UsbIoPpi       Indicates the PEI_USB_IO_PPI instance.
  @param  PortNum        Usb hub port number (starting from 1).

**/
VOID
PeiResetHubPort (
  IN EFI_PEI_SERVICES    **PeiServices,
  IN PEI_USB_IO_PPI      *UsbIoPpi,
  IN UINT8               PortNum
  );

#endif


