/**@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.             

**/

#ifndef _EFI_PCI_RESOURCE_SUPPORT_H
#define _EFI_PCI_RESOURCE_SUPPORT_H

#define RESERVED_RESOURCE_SIGNATURE EFI_SIGNATURE_32 ('r', 's', 'v', 'd')

typedef struct {
  UINT64        Base;
  UINT64        Length;
  PCI_BAR_TYPE  ResType;
} PCI_RESERVED_RESOURCE_NODE;

typedef struct {
  UINT32                      Signature;
  LIST_ENTRY                  Link;
  PCI_RESERVED_RESOURCE_NODE  Node;
} PCI_RESERVED_RESOURCE_LIST;

#define RESOURCED_LIST_FROM_NODE(a) \
  CR (a, PCI_RESERVED_RESOURCE_LIST, Node, RESERVED_RESOURCE_SIGNATURE)

#define RESOURCED_LIST_FROM_LINK(a) \
  CR (a, PCI_RESERVED_RESOURCE_LIST, Link, RESERVED_RESOURCE_SIGNATURE)

typedef enum {
  PciResUsageTypical            = 0,
  PciResUsagePadding,
  PciResUsageOptionRomProcessing
} PCI_RESOURCE_USAGE;

#define PCI_RESOURCE_SIGNATURE  EFI_SIGNATURE_32 ('p', 'c', 'r', 'c')

typedef struct {
  UINT32              Signature;
  LIST_ENTRY          Link;
  LIST_ENTRY          ChildList;
  PCI_IO_DEVICE       *PciDev;
  UINT64              Alignment;
  UINT64              Offset;
  UINT8               Bar;
  PCI_BAR_TYPE        ResType;
  UINT64              Length;
  BOOLEAN             Reserved;
  PCI_RESOURCE_USAGE  ResourceUsage;
} PCI_RESOURCE_NODE;

#define RESOURCE_NODE_FROM_LINK(a) \
  CR (a, PCI_RESOURCE_NODE, Link, PCI_RESOURCE_SIGNATURE)

EFI_STATUS
SkipVGAAperture (
  OUT UINT64   *Start,
  IN  UINT64   Length
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Start   - TODO: add argument description
  Length  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
SkipIsaAliasAperture (
  OUT UINT64   *Start,
  IN  UINT64   Length
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Start   - TODO: add argument description
  Length  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
InsertResourceNode (
  PCI_RESOURCE_NODE *Bridge,
  PCI_RESOURCE_NODE *ResNode
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Bridge  - TODO: add argument description
  ResNode - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
MergeResourceTree (
  PCI_RESOURCE_NODE *Dst,
  PCI_RESOURCE_NODE *Res,
  BOOLEAN           TypeMerge
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Dst       - TODO: add argument description
  Res       - TODO: add argument description
  TypeMerge - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
CalculateApertureIo16 (
  IN PCI_RESOURCE_NODE *Bridge
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Bridge  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
CalculateResourceAperture (
  IN PCI_RESOURCE_NODE *Bridge
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Bridge  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
GetResourceFromDevice (
  PCI_IO_DEVICE     *PciDev,
  PCI_RESOURCE_NODE *IoNode,
  PCI_RESOURCE_NODE *Mem32Node,
  PCI_RESOURCE_NODE *PMem32Node,
  PCI_RESOURCE_NODE *Mem64Node,
  PCI_RESOURCE_NODE *PMem64Node
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  PciDev      - TODO: add argument description
  IoNode      - TODO: add argument description
  Mem32Node   - TODO: add argument description
  PMem32Node  - TODO: add argument description
  Mem64Node   - TODO: add argument description
  PMem64Node  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

PCI_RESOURCE_NODE *
CreateResourceNode (
  IN PCI_IO_DEVICE         *PciDev,
  IN UINT64                Length,
  IN UINT64                Alignment,
  IN UINT8                 Bar,
  IN PCI_BAR_TYPE          ResType,
  IN PCI_RESOURCE_USAGE    ResUsage
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  PciDev    - TODO: add argument description
  Length    - TODO: add argument description
  Alignment - TODO: add argument description
  Bar       - TODO: add argument description
  ResType   - TODO: add argument description
  ResUsage  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
CreateResourceMap (
  IN PCI_IO_DEVICE     *Bridge,
  IN PCI_RESOURCE_NODE *IoNode,
  IN PCI_RESOURCE_NODE *Mem32Node,
  IN PCI_RESOURCE_NODE *PMem32Node,
  IN PCI_RESOURCE_NODE *Mem64Node,
  IN PCI_RESOURCE_NODE *PMem64Node
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Bridge      - TODO: add argument description
  IoNode      - TODO: add argument description
  Mem32Node   - TODO: add argument description
  PMem32Node  - TODO: add argument description
  Mem64Node   - TODO: add argument description
  PMem64Node  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
ResourcePaddingPolicy (
  PCI_IO_DEVICE     *PciDev,
  PCI_RESOURCE_NODE *IoNode,
  PCI_RESOURCE_NODE *Mem32Node,
  PCI_RESOURCE_NODE *PMem32Node,
  PCI_RESOURCE_NODE *Mem64Node,
  PCI_RESOURCE_NODE *PMem64Node
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  PciDev      - TODO: add argument description
  IoNode      - TODO: add argument description
  Mem32Node   - TODO: add argument description
  PMem32Node  - TODO: add argument description
  Mem64Node   - TODO: add argument description
  PMem64Node  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
DegradeResource (
  IN PCI_IO_DEVICE     *Bridge,
  IN PCI_RESOURCE_NODE *Mem32Node,
  IN PCI_RESOURCE_NODE *PMem32Node,
  IN PCI_RESOURCE_NODE *Mem64Node,
  IN PCI_RESOURCE_NODE *PMem64Node
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Bridge      - TODO: add argument description
  Mem32Node   - TODO: add argument description
  PMem32Node  - TODO: add argument description
  Mem64Node   - TODO: add argument description
  PMem64Node  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

BOOLEAN
BridgeSupportResourceDecode (
  IN PCI_IO_DEVICE *Bridge,
  IN UINT32        Decode
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Bridge  - TODO: add argument description
  Decode  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
ProgramResource (
  IN UINT64            Base,
  IN PCI_RESOURCE_NODE *Bridge
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Base    - TODO: add argument description
  Bridge  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
ProgramBar (
  IN UINT64            Base,
  IN PCI_RESOURCE_NODE *Node
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Base  - TODO: add argument description
  Node  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
ProgramPpbApperture (
  IN UINT64            Base,
  IN PCI_RESOURCE_NODE *Node
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Base  - TODO: add argument description
  Node  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
ProgrameUpstreamBridgeForRom (
  IN PCI_IO_DEVICE   *PciDevice,
  IN UINT32          OptionRomBase,
  IN BOOLEAN         Enable
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  PciDevice     - TODO: add argument description
  OptionRomBase - TODO: add argument description
  Enable        - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

BOOLEAN
ResourceRequestExisted (
  IN PCI_RESOURCE_NODE *Bridge
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Bridge  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
InitializeResourcePool (
  PCI_RESOURCE_NODE   *ResourcePool,
  PCI_BAR_TYPE        ResourceType
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  ResourcePool  - TODO: add argument description
  ResourceType  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
GetResourceMap (
  PCI_IO_DEVICE      *PciDev,
  PCI_RESOURCE_NODE  **IoBridge,
  PCI_RESOURCE_NODE  **Mem32Bridge,
  PCI_RESOURCE_NODE  **PMem32Bridge,
  PCI_RESOURCE_NODE  **Mem64Bridge,
  PCI_RESOURCE_NODE  **PMem64Bridge,
  PCI_RESOURCE_NODE  *IoPool,
  PCI_RESOURCE_NODE  *Mem32Pool,
  PCI_RESOURCE_NODE  *PMem32Pool,
  PCI_RESOURCE_NODE  *Mem64Pool,
  PCI_RESOURCE_NODE  *PMem64Pool
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  PciDev        - TODO: add argument description
  IoBridge      - TODO: add argument description
  Mem32Bridge   - TODO: add argument description
  PMem32Bridge  - TODO: add argument description
  Mem64Bridge   - TODO: add argument description
  PMem64Bridge  - TODO: add argument description
  IoPool        - TODO: add argument description
  Mem32Pool     - TODO: add argument description
  PMem32Pool    - TODO: add argument description
  Mem64Pool     - TODO: add argument description
  PMem64Pool    - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
DestroyResourceTree (
  IN PCI_RESOURCE_NODE *Bridge
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Bridge  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
RecordReservedResource (
  IN UINT64         Base,
  IN UINT64         Length,
  IN PCI_BAR_TYPE   ResType,
  IN PCI_IO_DEVICE  *Bridge
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Base    - TODO: add argument description
  Length  - TODO: add argument description
  ResType - TODO: add argument description
  Bridge  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
ResourcePaddingForCardBusBridge (
  PCI_IO_DEVICE     *PciDev,
  PCI_RESOURCE_NODE *IoNode,
  PCI_RESOURCE_NODE *Mem32Node,
  PCI_RESOURCE_NODE *PMem32Node,
  PCI_RESOURCE_NODE *Mem64Node,
  PCI_RESOURCE_NODE *PMem64Node
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  PciDev      - TODO: add argument description
  IoNode      - TODO: add argument description
  Mem32Node   - TODO: add argument description
  PMem32Node  - TODO: add argument description
  Mem64Node   - TODO: add argument description
  PMem64Node  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
ProgramP2C (
  IN UINT64            Base,
  IN PCI_RESOURCE_NODE *Node
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  Base  - TODO: add argument description
  Node  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
ApplyResourcePadding (
  PCI_IO_DEVICE     *PciDev,
  PCI_RESOURCE_NODE *IoNode,
  PCI_RESOURCE_NODE *Mem32Node,
  PCI_RESOURCE_NODE *PMem32Node,
  PCI_RESOURCE_NODE *Mem64Node,
  PCI_RESOURCE_NODE *PMem64Node
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  PciDev      - TODO: add argument description
  IoNode      - TODO: add argument description
  Mem32Node   - TODO: add argument description
  PMem32Node  - TODO: add argument description
  Mem64Node   - TODO: add argument description
  PMem64Node  - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

VOID
GetResourcePaddingPpb (
  IN  PCI_IO_DEVICE                  *PciIoDevice
  )
/*++

Routine Description:

  TODO: Add function description

Arguments:

  PciIoDevice - TODO: add argument description

Returns:

  TODO: add return values

--*/
;

EFI_STATUS
ResetAllPpbBusReg (
  IN PCI_IO_DEVICE                      *Bridge,
  IN UINT8                              StartBusNumber
  )
/*++

Routine Description:

  Reset bus register

Arguments:

  Bridge          - a pointer to the PCI_IO_DEVICE
  StartBusNumber  - the number of bus

Returns:

  None

--*/
;

#endif