Home | History | Annotate | Download | only in Include
      1 
      2 /*++
      3 
      4 Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
      5 
      6   This program and the accompanying materials are licensed and made available under
      7   the terms and conditions of the BSD License that accompanies this distribution.
      8   The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php.
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 
     15 
     16 Module Name:
     17 
     18   VlvCommonDefinitions.h
     19 
     20 Abstract:
     21 
     22   Macros to simplify and abstract the interface to PCI configuration.
     23 
     24 --*/
     25 
     26 ///
     27 /// PCI CONFIGURATION MAP REGISTER OFFSETS
     28 ///
     29 #ifndef PCI_VID
     30 #define PCI_VID             0x0000  ///< Vendor ID Register
     31 #define PCI_DID             0x0002  ///< Device ID Register
     32 #define PCI_CMD             0x0004  ///< PCI Command Register
     33 #define PCI_STS             0x0006  ///< PCI Status Register
     34 #define PCI_RID             0x0008  ///< Revision ID Register
     35 #define PCI_IFT             0x0009  ///< Interface Type
     36 #define PCI_SCC             0x000A  ///< Sub Class Code Register
     37 #define PCI_BCC             0x000B  ///< Base Class Code Register
     38 #define PCI_CLS             0x000C  ///< Cache Line Size
     39 #define PCI_PMLT            0x000D  ///< Primary Master Latency Timer
     40 #define PCI_HDR             0x000E  ///< Header Type Register
     41 #define PCI_BIST            0x000F  ///< Built in Self Test Register
     42 #define PCI_BAR0            0x0010  ///< Base Address Register 0
     43 #define PCI_BAR1            0x0014  ///< Base Address Register 1
     44 #define PCI_BAR2            0x0018  ///< Base Address Register 2
     45 #define PCI_PBUS            0x0018  ///< Primary Bus Number Register
     46 #define PCI_SBUS            0x0019  ///< Secondary Bus Number Register
     47 #define PCI_SUBUS           0x001A  ///< Subordinate Bus Number Register
     48 #define PCI_SMLT            0x001B  ///< Secondary Master Latency Timer
     49 #define PCI_BAR3            0x001C  ///< Base Address Register 3
     50 #define PCI_IOBASE          0x001C  ///< I/O base Register
     51 #define PCI_IOLIMIT         0x001D  ///< I/O Limit Register
     52 #define PCI_SECSTATUS       0x001E  ///< Secondary Status Register
     53 #define PCI_BAR4            0x0020  ///< Base Address Register 4
     54 #define PCI_MEMBASE         0x0020  ///< Memory Base Register
     55 #define PCI_MEMLIMIT        0x0022  ///< Memory Limit Register
     56 #define PCI_BAR5            0x0024  ///< Base Address Register 5
     57 #define PCI_PRE_MEMBASE     0x0024  ///< Prefetchable memory Base register
     58 #define PCI_PRE_MEMLIMIT    0x0026  ///< Prefetchable memory Limit register
     59 #define PCI_PRE_MEMBASE_U   0x0028  ///< Prefetchable memory base upper 32 bits
     60 #define PCI_PRE_MEMLIMIT_U  0x002C  ///< Prefetchable memory limit upper 32 bits
     61 #define PCI_SVID            0x002C  ///< Subsystem Vendor ID
     62 #define PCI_SID             0x002E  ///< Subsystem ID
     63 #define PCI_IOBASE_U        0x0030  ///< I/O base Upper Register
     64 #define PCI_IOLIMIT_U       0x0032  ///< I/O Limit Upper Register
     65 #define PCI_CAPP            0x0034  ///< Capabilities Pointer
     66 #define PCI_EROM            0x0038  ///< Expansion ROM Base Address
     67 #define PCI_INTLINE         0x003C  ///< Interrupt Line Register
     68 #define PCI_INTPIN          0x003D  ///< Interrupt Pin Register
     69 #define PCI_MAXGNT          0x003E  ///< Max Grant Register
     70 #define PCI_BRIDGE_CNTL     0x003E  ///< Bridge Control Register
     71 #define PCI_MAXLAT          0x003F  ///< Max Latency Register
     72 #endif
     73 //
     74 // Bit Difinitions
     75 //
     76 #ifndef BIT0
     77 #define BIT0                     0x0001
     78 #define BIT1                     0x0002
     79 #define BIT2                     0x0004
     80 #define BIT3                     0x0008
     81 #define BIT4                     0x0010
     82 #define BIT5                     0x0020
     83 #define BIT6                     0x0040
     84 #define BIT7                     0x0080
     85 #define BIT8                     0x0100
     86 #define BIT9                     0x0200
     87 #define BIT10                    0x0400
     88 #define BIT11                    0x0800
     89 #define BIT12                    0x1000
     90 #define BIT13                    0x2000
     91 #define BIT14                    0x4000
     92 #define BIT15                    0x8000
     93 #define BIT16                    0x00010000
     94 #define BIT17                    0x00020000
     95 #define BIT18                    0x00040000
     96 #define BIT19                    0x00080000
     97 #define BIT20                    0x00100000
     98 #define BIT21                    0x00200000
     99 #define BIT22                    0x00400000
    100 #define BIT23                    0x00800000
    101 #define BIT24                    0x01000000
    102 #define BIT25                    0x02000000
    103 #define BIT26                    0x04000000
    104 #define BIT27                    0x08000000
    105 #define BIT28                    0x10000000
    106 #define BIT29                    0x20000000
    107 #define BIT30                    0x40000000
    108 #define BIT31                    0x80000000
    109 #endif
    110 
    111 #ifndef _PCIACCESS_H_INCLUDED_
    112 #define _PCIACCESS_H_INCLUDED_
    113 #ifndef PCI_EXPRESS_BASE_ADDRESS
    114  #define PCI_EXPRESS_BASE_ADDRESS 0xE0000000
    115 #endif
    116 
    117 #ifndef MmPciAddress
    118 #define MmPciAddress( Segment, Bus, Device, Function, Register ) \
    119   ( (UINTN)PCI_EXPRESS_BASE_ADDRESS + \
    120     (UINTN)(Bus << 20) + \
    121     (UINTN)(Device << 15) + \
    122     (UINTN)(Function << 12) + \
    123     (UINTN)(Register) \
    124   )
    125 #endif
    126 
    127 //
    128 // UINT64
    129 //
    130 #define MmPci64Ptr( Segment, Bus, Device, Function, Register ) \
    131   ( (volatile UINT64 *)MmPciAddress( Segment, Bus, Device, Function, Register ) )
    132 
    133 #define MmPci64( Segment, Bus, Device, Function, Register ) \
    134   *MmPci64Ptr( Segment, Bus, Device, Function, Register )
    135 
    136 #define MmPci64Or( Segment, Bus, Device, Function, Register, OrData ) \
    137   MmPci64( Segment, Bus, Device, Function, Register ) = \
    138     (UINT64) ( \
    139       MmPci64( Segment, Bus, Device, Function, Register ) | \
    140       (UINT64)(OrData) \
    141     )
    142 
    143 #define MmPci64And( Segment, Bus, Device, Function, Register, AndData ) \
    144   MmPci64( Segment, Bus, Device, Function, Register ) = \
    145     (UINT64) ( \
    146       MmPci64( Segment, Bus, Device, Function, Register ) & \
    147       (UINT64)(AndData) \
    148     )
    149 
    150 #define MmPci64AndThenOr( Segment, Bus, Device, Function, Register, AndData, OrData ) \
    151   MmPci64( Segment, Bus, Device, Function, Register ) = \
    152     (UINT64) ( \
    153       ( MmPci64( Segment, Bus, Device, Function, Register ) & \
    154           (UINT64)(AndData) \
    155       ) | \
    156       (UINT64)(OrData) \
    157     )
    158 
    159 //
    160 // UINT32
    161 //
    162 
    163 #define MmPci32Ptr( Segment, Bus, Device, Function, Register ) \
    164   ( (volatile UINT32 *) MmPciAddress( Segment, Bus, Device, Function, Register ) )
    165 
    166 #define MmPci32( Segment, Bus, Device, Function, Register ) \
    167   *MmPci32Ptr( Segment, Bus, Device, Function, Register )
    168 
    169 #define MmPci32Or( Segment, Bus, Device, Function, Register, OrData ) \
    170   MmPci32( Segment, Bus, Device, Function, Register ) = \
    171     (UINT32) ( \
    172       MmPci32( Segment, Bus, Device, Function, Register ) | \
    173       (UINT32)(OrData) \
    174     )
    175 
    176 #define MmPci32And( Segment, Bus, Device, Function, Register, AndData ) \
    177   MmPci32( Segment, Bus, Device, Function, Register ) = \
    178     (UINT32) ( \
    179       MmPci32( Segment, Bus, Device, Function, Register ) & \
    180       (UINT32)(AndData) \
    181     )
    182 
    183 #define MmPci32AndThenOr( Segment, Bus, Device, Function, Register, AndData, OrData ) \
    184   MmPci32( Segment, Bus, Device, Function, Register ) = \
    185     (UINT32) ( \
    186       ( MmPci32( Segment, Bus, Device, Function, Register ) & \
    187           (UINT32)(AndData) \
    188       ) | \
    189       (UINT32)(OrData) \
    190     )
    191 
    192 //
    193 // UINT16
    194 //
    195 
    196 #define MmPci16Ptr( Segment, Bus, Device, Function, Register ) \
    197   ( (volatile UINT16 *)MmPciAddress( Segment, Bus, Device, Function, Register ) )
    198 
    199 #define MmPci16( Segment, Bus, Device, Function, Register ) \
    200   *MmPci16Ptr( Segment, Bus, Device, Function, Register )
    201 
    202 #define MmPci16Or( Segment, Bus, Device, Function, Register, OrData ) \
    203   MmPci16( Segment, Bus, Device, Function, Register ) = \
    204     (UINT16) ( \
    205       MmPci16( Segment, Bus, Device, Function, Register ) | \
    206       (UINT16)(OrData) \
    207     )
    208 
    209 #define MmPci16And( Segment, Bus, Device, Function, Register, AndData ) \
    210   MmPci16( Segment, Bus, Device, Function, Register ) = \
    211     (UINT16) ( \
    212       MmPci16( Segment, Bus, Device, Function, Register ) & \
    213       (UINT16)(AndData) \
    214     )
    215 
    216 #define MmPci16AndThenOr( Segment, Bus, Device, Function, Register, AndData, OrData ) \
    217   MmPci16( Segment, Bus, Device, Function, Register ) = \
    218     (UINT16) ( \
    219       ( MmPci16( Segment, Bus, Device, Function, Register ) & \
    220           (UINT16)(AndData) \
    221       ) | \
    222       (UINT16)(OrData) \
    223     )
    224 
    225 //
    226 // UINT8
    227 //
    228 
    229 #define MmPci8Ptr( Segment, Bus, Device, Function, Register ) \
    230   ( (volatile UINT8 *)MmPciAddress( Segment, Bus, Device, Function, Register ) )
    231 
    232 #define MmPci8( Segment, Bus, Device, Function, Register ) \
    233   *MmPci8Ptr( Segment, Bus, Device, Function, Register )
    234 
    235 #define MmPci8Or( Segment, Bus, Device, Function, Register, OrData ) \
    236   MmPci8( Segment, Bus, Device, Function, Register ) = \
    237     (UINT8) ( \
    238       MmPci8( Segment, Bus, Device, Function, Register ) | \
    239       (UINT8)(OrData) \
    240     )
    241 
    242 #define MmPci8And( Segment, Bus, Device, Function, Register, AndData ) \
    243   MmPci8( Segment, Bus, Device, Function, Register ) = \
    244     (UINT8) ( \
    245       MmPci8( Segment, Bus, Device, Function, Register ) & \
    246       (UINT8)(AndData) \
    247     )
    248 
    249 #define MmPci8AndThenOr( Segment, Bus, Device, Function, Register, AndData, OrData ) \
    250   MmPci8( Segment, Bus, Device, Function, Register ) = \
    251     (UINT8) ( \
    252       ( MmPci8( Segment, Bus, Device, Function, Register ) & \
    253           (UINT8)(AndData) \
    254         ) | \
    255       (UINT8)(OrData) \
    256     )
    257 
    258 #endif
    259