/*++

  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
                                                                                   

  This program and the accompanying materials are licensed and made available under

  the terms and conditions of the BSD License that 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.    

                                                                                   


Module Name:
  UsbPolicy.h

Abstract:

--*/

#ifndef _USB_POLICY_H_
#define _USB_POLICY_H_

EFI_FORWARD_DECLARATION (EFI_USB_POLICY_PROTOCOL);

#define USB_POLICY_GUID \
  {\
    0xf617b358, 0x12cf, 0x414a, 0xa0, 0x69, 0x60, 0x67, 0x7b, 0xda, 0x13, 0xb4\
  }

#define TIANO_CODE_BASE           0x00
#define ICBD_CODE_BASE            0x01

#define ATUO_TYPE                 0x00
#define USB_FDD_TYPE              0x01
#define HDD_TYPE                  0x02
#define ZIP_TYPE                  0x03
#define CDROM_TYPE                0x04
#define SIZE_TYPE                 0x05

#define ZIP_FDD                 0x80

#define FDD_EMULATION             0x00
#define HDD_EMULATION             0x01

#define HIGH_SPEED                0x00
#define FULL_SPEED                0x01
#define SUPER_SPEED               0x02

#define LEGACY_KB_EN              0x01
#define LEGACY_KB_DIS             0x00
#define LEGACY_MS_EN              0x01
#define LEGACY_MS_DIS             0x00
#define LEGACY_USB_EN             0x00
#define LEGACY_USB_DIS            0x01
#define LEGACY_FREE_SUPP          0x01
#define LEGACY_FREE_UN_SUPP       0x00
#define LEGACY_PERIOD_SUPP        0x01
#define LEGACY_PERIOD_UN_SUPP     0x00

#define LEGACY_USB_TIME_TUE_ENABLE       0x01
#define LEGACY_USB_TIME_TUE_DISABLE      0x00
#define USB_HAVE_HUB_INTERNEL            0x01
#define USB_NOT_HAVE_HUB_INTERNEL        0x00

#define USB_POLICY_PROTOCOL_REVISION_1 1
#define USB_POLICY_PROTOCOL_REVISION_2 2

#ifndef __GNUC__
#pragma warning ( disable : 4306 )
#pragma warning ( disable : 4054 )
#endif

#define GET_USB_CFG (UsbCfg);\
 do{\
  UINT16                *pSegOfEbda;\
  UINT32                mToEbda;\
  pSegOfEbda = (UINT16 *)(UINTN)0x40E;\
  mToEbda    = (UINT32)(((UINTN)(*pSegOfEbda) << 4) + 0x80);\
  UsbCfg     = (USB_CFG *)(UINTN)mToEbda;\
 }while(0);

#pragma    pack(1)
typedef struct {
    UINT8   HasUSBKeyboard:1;
    UINT8   HasUSBMouse:1;
    UINT8   LegacyFreeSupport:1;
    UINT8   UsbOperationMode:1;
    UINT8   LegacyKBEnable:1;
    UINT8   LegacyMSEnable:1;
    UINT8   USBPeriodSupport:1;
    UINT8   Reserved:1;
} USB_DEVICE_INFOR;

typedef struct {
    UINT8               Codebase;
    UINT8               USBHDDForceType;
    UINT8               Configurated;
    UINT8               LpcAcpiBase;
    UINT8               AcpiTimerReg;
    UINT8               Reserved1[0x01];
    UINT8               LegacyUsbEnable;
    USB_DEVICE_INFOR    UsbDeviceInfor;
    UINT16              UsbEmulationSize;
    UINT8               Reserved2[0x06];
} USB_CFG;
#pragma pack()

typedef struct _EFI_USB_POLICY_PROTOCOL{
  UINT8   Version;
  UINT8   UsbMassStorageEmulationType;  // 1: FDD_Type; 2: HDD_Type; other:Auto_Type*
  UINT8   UsbOperationMode;             // 0: High_Speed; 1: Full_Speed;
  UINT8   LegacyKBEnable;               // 0: Disabled;   1: Enabled*
  UINT8   LegacyMSEnable;               // 0: Disabled;   1: Enabled*
  UINT8   USBPeriodSupport;             // 0; Unsupport;  1: Support
  UINT8   LegacyUsbEnable;              // 1: Disabled;   0: Enabled*
  UINT8   LegacyFreeSupport;            // 0: Unsupport;  1: Support
  UINT8   CodeBase;
  UINT8   LpcAcpiBase;                  // 40h(default)
  UINT8   AcpiTimerReg;
  UINT8   UsbTimeTue;
  UINT8   InternelHubExist;             // 1: Host have internel hub on board; 0: No internel hub on board
  UINT8   EnumWaitPortStableStall;      // Value for wait port stable when enum a new dev.
  UINT16  UsbEmulationSize;             // Mbytes.
  UINT8   UsbZipEmulationType;
  UINT8   Reserved[3];                  // Reserved fields for future expansion w/o protocol change
} EFI_USB_POLICY_PROTOCOL;

extern EFI_GUID gUsbPolicyGuid;

#endif