/**@file
 
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 DP_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 DP_PCI(device, function) \
  { \
    HARDWARE_DEVICE_PATH, HW_PCI_DP, (UINT8) (sizeof (PCI_DEVICE_PATH)), (UINT8) \
      ((sizeof (PCI_DEVICE_PATH)) >> 8), function, device \
  }
#define DP_END \
  { \
    END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, END_DEVICE_PATH_LENGTH, 0 \
  }

#define DP_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
