/*++
 
Copyright (c) 2006, Intel Corporation                                                         
All rights reserved. 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.             

Module Name:

  MiscDevicePath.h

Abstract:

  Misc class required EFI Device Path definitions (Ports, slots & 
  onboard devices)

--*/

#ifndef _MISC_DEVICE_PATH_H
#define _MISC_DEVICE_PATH_H


#pragma pack(1)
//
// USB
//

/* For reference:
#define USB1_1_STR  "ACPI(PNP0A03,0)/PCI(1D,0)."
#define USB1_2_STR  "ACPI(PNP0A03,0)/PCI(1D,1)."
#define USB1_3_STR  "ACPI(PNP0A03,0)/PCI(1D,2)."
#define USB2_1_STR  "ACPI(PNP0A03,0)/PCI(1D,7)." 
*/

//
// #define acpi { 0x02, 0x01, 0x00, 0x0C, 0x0a0341d0, 0x00000000 }
// #define pci( device,function)  { 0x01, 0x01, 0x00, 0x06, device, function }
// #define end  { 0xFF, 0xFF, 0x00, 0x04 }
//
#define ACPI \
  { \
    ACPI_DEVICE_PATH, ACPI_DP, (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), (UINT8) \
      ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8), EISA_PNP_ID (0x0A03), 0 \
  }
#define PCI(device, function) \
  { \
    HARDWARE_DEVICE_PATH, HW_PCI_DP, (UINT8) (sizeof (PCI_DEVICE_PATH)), (UINT8) \
      ((sizeof (PCI_DEVICE_PATH)) >> 8), function, device \
  }
#define END \
  { \
    END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, END_DEVICE_PATH_LENGTH, 0 \
  }

#define LPC(eisaid, function) \
  { \
    ACPI_DEVICE_PATH, ACPI_DP, (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), (UINT8) \
      ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8), EISA_PNP_ID (eisaid), function \
  }

//
// Shanmu >> moved to TianoDevicePath.h
//

/*
typedef struct _USB_PORT_DEVICE_PATH
{
  ACPI_HID_DEVICE_PATH    PciRootBridgeDevicePath;
  PCI_DEVICE_PATH      PciBusDevicePath;
  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
} USB_PORT_DEVICE_PATH;


//IDE ??I am not sure. Should this be ATAPI_DEVICE_PATH
typedef struct _IDE_DEVICE_PATH
{
  ACPI_HID_DEVICE_PATH    PciRootBridgeDevicePath;
  PCI_DEVICE_PATH      PciBusDevicePath;
  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
} IDE_DEVICE_PATH;

//RMC Connector
typedef struct _RMC_CONN_DEVICE_PATH
{
  ACPI_HID_DEVICE_PATH    PciRootBridgeDevicePath;
  PCI_DEVICE_PATH      PciBridgeDevicePath;
  PCI_DEVICE_PATH      PciBusDevicePath;
  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
} RMC_CONN_DEVICE_PATH;

//static RMC_CONN_DEVICE_PATH mRmcConnDevicePath = { acpi, pci( 0x1E,0x00 ),pci( 0x0A,0x00 ), end };

//RIDE
typedef struct _RIDE_DEVICE_PATH
{
  ACPI_HID_DEVICE_PATH    PciRootBridgeDevicePath;
  PCI_DEVICE_PATH      PciBridgeDevicePath;
  PCI_DEVICE_PATH      PciBusDevicePath;
  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
} RIDE_DEVICE_PATH;

//static RIDE_DEVICE_PATH mRideDevicePath = { acpi, pci( 0x1E,0x00 ),pci( 0x02,0x00 ), end };

//Gigabit NIC
//typedef struct _GB_NIC_DEVICE_PATH
//{
//  ACPI_HID_DEVICE_PATH      PciRootBridgeDevicePath;
//  PCI_DEVICE_PATH            PciBridgeDevicePath;
//  PCI_DEVICE_PATH            PciXBridgeDevicePath;
//  PCI_DEVICE_PATH            PciXBusDevicePath;
//  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
//} GB_NIC_DEVICE_PATH;

//static GB_NIC_DEVICE_PATH mGbNicDevicePath = { acpi, pci( 0x03,0x00 ),pci( 0x1F,0x00 ),pci( 0x07,0x00 ), end };


//P/S2 Connector
typedef struct _PS2_CONN_DEVICE_PATH
{
  ACPI_HID_DEVICE_PATH    PciRootBridgeDevicePath;
  PCI_DEVICE_PATH      LpcBridgeDevicePath;
  ACPI_HID_DEVICE_PATH    LpcBusDevicePath;
  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
} PS2_CONN_DEVICE_PATH;

//static PS2_CONN_DEVICE_PATH mPs2KeyboardDevicePath   = { acpi, pci( 0x1F,0x00 ),lpc( 0x0303,0 ), end };
//static PS2_CONN_DEVICE_PATH mPs2MouseDevicePath      = { acpi, pci( 0x1F,0x00 ),lpc( 0x0303,1 ), end };

//Serial Port Connector
typedef struct _SERIAL_CONN_DEVICE_PATH
{
  ACPI_HID_DEVICE_PATH    PciRootBridgeDevicePath;
  PCI_DEVICE_PATH      LpcBridgeDevicePath;
  ACPI_HID_DEVICE_PATH    LpcBusDevicePath;
  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
} SERIAL_CONN_DEVICE_PATH;

//static SERIAL_CONN_DEVICE_PATH mCom1DevicePath   = { acpi, pci( 0x1F,0x00 ),lpc( 0x0501,0 ), end };
//static SERIAL_CONN_DEVICE_PATH mCom2DevicePath   = { acpi, pci( 0x1F,0x00 ),lpc( 0x0501,1 ), end };

//Parallel Port Connector
typedef struct _PARALLEL_CONN_DEVICE_PATH
{
  ACPI_HID_DEVICE_PATH    PciRootBridgeDevicePath;
  PCI_DEVICE_PATH      LpcBridgeDevicePath;
  ACPI_HID_DEVICE_PATH    LpcBusDevicePath;
  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
} PARALLEL_CONN_DEVICE_PATH;

//static PARALLEL_CONN_DEVICE_PATH mLpt1DevicePath   = { acpi, pci( 0x1F,0x00 ),lpc( 0x0401,0 ), end };

//Floopy Connector
typedef struct _FLOOPY_CONN_DEVICE_PATH
{
  ACPI_HID_DEVICE_PATH    PciRootBridgeDevicePath;
  PCI_DEVICE_PATH      LpcBridgeDevicePath;
  ACPI_HID_DEVICE_PATH    LpcBusDevicePath;
  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
} FLOOPY_CONN_DEVICE_PATH;

//static FLOOPY_CONN_DEVICE_PATH mFloopyADevicePath   = { acpi, pci( 0x1F,0x00 ),lpc( 0x0604,0 ), end };
//static FLOOPY_CONN_DEVICE_PATH mFloopyBDevicePath   = { acpi, pci( 0x1F,0x00 ),lpc( 0x0604,1 ), end };

*/

//
// End Shanmu
//
#pragma pack()

#endif
