1*c609719bSwdenk /* 2*c609719bSwdenk * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com> 3*c609719bSwdenk * Andreas Heppel <aheppel@sysgo.de> 4*c609719bSwdenk * 5*c609719bSwdenk * (C) Copyright 2002 6*c609719bSwdenk * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 7*c609719bSwdenk * 8*c609719bSwdenk * See file CREDITS for list of people who contributed to this 9*c609719bSwdenk * project. 10*c609719bSwdenk * 11*c609719bSwdenk * This program is free software; you can redistribute it and/or 12*c609719bSwdenk * modify it under the terms of the GNU General Public License as 13*c609719bSwdenk * published by the Free Software Foundation; either version 2 of 14*c609719bSwdenk * the License, or (at your option) any later version. 15*c609719bSwdenk * 16*c609719bSwdenk * This program is distributed in the hope that it will be useful, 17*c609719bSwdenk * but WITHOUT ANY WARRANTY; without even the implied warranty of 18*c609719bSwdenk * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19*c609719bSwdenk * GNU General Public License for more details. 20*c609719bSwdenk * 21*c609719bSwdenk * You should have received a copy of the GNU General Public License 22*c609719bSwdenk * aloong with this program; if not, write to the Free Software 23*c609719bSwdenk * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 24*c609719bSwdenk * MA 02111-1307 USA 25*c609719bSwdenk */ 26*c609719bSwdenk 27*c609719bSwdenk #ifndef _PCI_H 28*c609719bSwdenk #define _PCI_H 29*c609719bSwdenk 30*c609719bSwdenk /* 31*c609719bSwdenk * Under PCI, each device has 256 bytes of configuration address space, 32*c609719bSwdenk * of which the first 64 bytes are standardized as follows: 33*c609719bSwdenk */ 34*c609719bSwdenk #define PCI_VENDOR_ID 0x00 /* 16 bits */ 35*c609719bSwdenk #define PCI_DEVICE_ID 0x02 /* 16 bits */ 36*c609719bSwdenk #define PCI_COMMAND 0x04 /* 16 bits */ 37*c609719bSwdenk #define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */ 38*c609719bSwdenk #define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */ 39*c609719bSwdenk #define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */ 40*c609719bSwdenk #define PCI_COMMAND_SPECIAL 0x8 /* Enable response to special cycles */ 41*c609719bSwdenk #define PCI_COMMAND_INVALIDATE 0x10 /* Use memory write and invalidate */ 42*c609719bSwdenk #define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */ 43*c609719bSwdenk #define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */ 44*c609719bSwdenk #define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */ 45*c609719bSwdenk #define PCI_COMMAND_SERR 0x100 /* Enable SERR */ 46*c609719bSwdenk #define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */ 47*c609719bSwdenk 48*c609719bSwdenk #define PCI_STATUS 0x06 /* 16 bits */ 49*c609719bSwdenk #define PCI_STATUS_CAP_LIST 0x10 /* Support Capability List */ 50*c609719bSwdenk #define PCI_STATUS_66MHZ 0x20 /* Support 66 Mhz PCI 2.1 bus */ 51*c609719bSwdenk #define PCI_STATUS_UDF 0x40 /* Support User Definable Features [obsolete] */ 52*c609719bSwdenk #define PCI_STATUS_FAST_BACK 0x80 /* Accept fast-back to back */ 53*c609719bSwdenk #define PCI_STATUS_PARITY 0x100 /* Detected parity error */ 54*c609719bSwdenk #define PCI_STATUS_DEVSEL_MASK 0x600 /* DEVSEL timing */ 55*c609719bSwdenk #define PCI_STATUS_DEVSEL_FAST 0x000 56*c609719bSwdenk #define PCI_STATUS_DEVSEL_MEDIUM 0x200 57*c609719bSwdenk #define PCI_STATUS_DEVSEL_SLOW 0x400 58*c609719bSwdenk #define PCI_STATUS_SIG_TARGET_ABORT 0x800 /* Set on target abort */ 59*c609719bSwdenk #define PCI_STATUS_REC_TARGET_ABORT 0x1000 /* Master ack of " */ 60*c609719bSwdenk #define PCI_STATUS_REC_MASTER_ABORT 0x2000 /* Set on master abort */ 61*c609719bSwdenk #define PCI_STATUS_SIG_SYSTEM_ERROR 0x4000 /* Set when we drive SERR */ 62*c609719bSwdenk #define PCI_STATUS_DETECTED_PARITY 0x8000 /* Set on parity error */ 63*c609719bSwdenk 64*c609719bSwdenk #define PCI_CLASS_REVISION 0x08 /* High 24 bits are class, low 8 65*c609719bSwdenk revision */ 66*c609719bSwdenk #define PCI_REVISION_ID 0x08 /* Revision ID */ 67*c609719bSwdenk #define PCI_CLASS_PROG 0x09 /* Reg. Level Programming Interface */ 68*c609719bSwdenk #define PCI_CLASS_DEVICE 0x0a /* Device class */ 69*c609719bSwdenk #define PCI_CLASS_CODE 0x0b /* Device class code */ 70*c609719bSwdenk #define PCI_CLASS_SUB_CODE 0x0a /* Device sub-class code */ 71*c609719bSwdenk 72*c609719bSwdenk #define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */ 73*c609719bSwdenk #define PCI_LATENCY_TIMER 0x0d /* 8 bits */ 74*c609719bSwdenk #define PCI_HEADER_TYPE 0x0e /* 8 bits */ 75*c609719bSwdenk #define PCI_HEADER_TYPE_NORMAL 0 76*c609719bSwdenk #define PCI_HEADER_TYPE_BRIDGE 1 77*c609719bSwdenk #define PCI_HEADER_TYPE_CARDBUS 2 78*c609719bSwdenk 79*c609719bSwdenk #define PCI_BIST 0x0f /* 8 bits */ 80*c609719bSwdenk #define PCI_BIST_CODE_MASK 0x0f /* Return result */ 81*c609719bSwdenk #define PCI_BIST_START 0x40 /* 1 to start BIST, 2 secs or less */ 82*c609719bSwdenk #define PCI_BIST_CAPABLE 0x80 /* 1 if BIST capable */ 83*c609719bSwdenk 84*c609719bSwdenk /* 85*c609719bSwdenk * Base addresses specify locations in memory or I/O space. 86*c609719bSwdenk * Decoded size can be determined by writing a value of 87*c609719bSwdenk * 0xffffffff to the register, and reading it back. Only 88*c609719bSwdenk * 1 bits are decoded. 89*c609719bSwdenk */ 90*c609719bSwdenk #define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */ 91*c609719bSwdenk #define PCI_BASE_ADDRESS_1 0x14 /* 32 bits [htype 0,1 only] */ 92*c609719bSwdenk #define PCI_BASE_ADDRESS_2 0x18 /* 32 bits [htype 0 only] */ 93*c609719bSwdenk #define PCI_BASE_ADDRESS_3 0x1c /* 32 bits */ 94*c609719bSwdenk #define PCI_BASE_ADDRESS_4 0x20 /* 32 bits */ 95*c609719bSwdenk #define PCI_BASE_ADDRESS_5 0x24 /* 32 bits */ 96*c609719bSwdenk #define PCI_BASE_ADDRESS_SPACE 0x01 /* 0 = memory, 1 = I/O */ 97*c609719bSwdenk #define PCI_BASE_ADDRESS_SPACE_IO 0x01 98*c609719bSwdenk #define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00 99*c609719bSwdenk #define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06 100*c609719bSwdenk #define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */ 101*c609719bSwdenk #define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */ 102*c609719bSwdenk #define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */ 103*c609719bSwdenk #define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */ 104*c609719bSwdenk #define PCI_BASE_ADDRESS_MEM_MASK (~0x0fUL) 105*c609719bSwdenk #define PCI_BASE_ADDRESS_IO_MASK (~0x03UL) 106*c609719bSwdenk /* bit 1 is reserved if address_space = 1 */ 107*c609719bSwdenk 108*c609719bSwdenk /* Header type 0 (normal devices) */ 109*c609719bSwdenk #define PCI_CARDBUS_CIS 0x28 110*c609719bSwdenk #define PCI_SUBSYSTEM_VENDOR_ID 0x2c 111*c609719bSwdenk #define PCI_SUBSYSTEM_ID 0x2e 112*c609719bSwdenk #define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */ 113*c609719bSwdenk #define PCI_ROM_ADDRESS_ENABLE 0x01 114*c609719bSwdenk #define PCI_ROM_ADDRESS_MASK (~0x7ffUL) 115*c609719bSwdenk 116*c609719bSwdenk #define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list entry */ 117*c609719bSwdenk 118*c609719bSwdenk /* 0x35-0x3b are reserved */ 119*c609719bSwdenk #define PCI_INTERRUPT_LINE 0x3c /* 8 bits */ 120*c609719bSwdenk #define PCI_INTERRUPT_PIN 0x3d /* 8 bits */ 121*c609719bSwdenk #define PCI_MIN_GNT 0x3e /* 8 bits */ 122*c609719bSwdenk #define PCI_MAX_LAT 0x3f /* 8 bits */ 123*c609719bSwdenk 124*c609719bSwdenk /* Header type 1 (PCI-to-PCI bridges) */ 125*c609719bSwdenk #define PCI_PRIMARY_BUS 0x18 /* Primary bus number */ 126*c609719bSwdenk #define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */ 127*c609719bSwdenk #define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */ 128*c609719bSwdenk #define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */ 129*c609719bSwdenk #define PCI_IO_BASE 0x1c /* I/O range behind the bridge */ 130*c609719bSwdenk #define PCI_IO_LIMIT 0x1d 131*c609719bSwdenk #define PCI_IO_RANGE_TYPE_MASK 0x0f /* I/O bridging type */ 132*c609719bSwdenk #define PCI_IO_RANGE_TYPE_16 0x00 133*c609719bSwdenk #define PCI_IO_RANGE_TYPE_32 0x01 134*c609719bSwdenk #define PCI_IO_RANGE_MASK ~0x0f 135*c609719bSwdenk #define PCI_SEC_STATUS 0x1e /* Secondary status register, only bit 14 used */ 136*c609719bSwdenk #define PCI_MEMORY_BASE 0x20 /* Memory range behind */ 137*c609719bSwdenk #define PCI_MEMORY_LIMIT 0x22 138*c609719bSwdenk #define PCI_MEMORY_RANGE_TYPE_MASK 0x0f 139*c609719bSwdenk #define PCI_MEMORY_RANGE_MASK ~0x0f 140*c609719bSwdenk #define PCI_PREF_MEMORY_BASE 0x24 /* Prefetchable memory range behind */ 141*c609719bSwdenk #define PCI_PREF_MEMORY_LIMIT 0x26 142*c609719bSwdenk #define PCI_PREF_RANGE_TYPE_MASK 0x0f 143*c609719bSwdenk #define PCI_PREF_RANGE_TYPE_32 0x00 144*c609719bSwdenk #define PCI_PREF_RANGE_TYPE_64 0x01 145*c609719bSwdenk #define PCI_PREF_RANGE_MASK ~0x0f 146*c609719bSwdenk #define PCI_PREF_BASE_UPPER32 0x28 /* Upper half of prefetchable memory range */ 147*c609719bSwdenk #define PCI_PREF_LIMIT_UPPER32 0x2c 148*c609719bSwdenk #define PCI_IO_BASE_UPPER16 0x30 /* Upper half of I/O addresses */ 149*c609719bSwdenk #define PCI_IO_LIMIT_UPPER16 0x32 150*c609719bSwdenk /* 0x34 same as for htype 0 */ 151*c609719bSwdenk /* 0x35-0x3b is reserved */ 152*c609719bSwdenk #define PCI_ROM_ADDRESS1 0x38 /* Same as PCI_ROM_ADDRESS, but for htype 1 */ 153*c609719bSwdenk /* 0x3c-0x3d are same as for htype 0 */ 154*c609719bSwdenk #define PCI_BRIDGE_CONTROL 0x3e 155*c609719bSwdenk #define PCI_BRIDGE_CTL_PARITY 0x01 /* Enable parity detection on secondary interface */ 156*c609719bSwdenk #define PCI_BRIDGE_CTL_SERR 0x02 /* The same for SERR forwarding */ 157*c609719bSwdenk #define PCI_BRIDGE_CTL_NO_ISA 0x04 /* Disable bridging of ISA ports */ 158*c609719bSwdenk #define PCI_BRIDGE_CTL_VGA 0x08 /* Forward VGA addresses */ 159*c609719bSwdenk #define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */ 160*c609719bSwdenk #define PCI_BRIDGE_CTL_BUS_RESET 0x40 /* Secondary bus reset */ 161*c609719bSwdenk #define PCI_BRIDGE_CTL_FAST_BACK 0x80 /* Fast Back2Back enabled on secondary interface */ 162*c609719bSwdenk 163*c609719bSwdenk /* Header type 2 (CardBus bridges) */ 164*c609719bSwdenk #define PCI_CB_CAPABILITY_LIST 0x14 165*c609719bSwdenk /* 0x15 reserved */ 166*c609719bSwdenk #define PCI_CB_SEC_STATUS 0x16 /* Secondary status */ 167*c609719bSwdenk #define PCI_CB_PRIMARY_BUS 0x18 /* PCI bus number */ 168*c609719bSwdenk #define PCI_CB_CARD_BUS 0x19 /* CardBus bus number */ 169*c609719bSwdenk #define PCI_CB_SUBORDINATE_BUS 0x1a /* Subordinate bus number */ 170*c609719bSwdenk #define PCI_CB_LATENCY_TIMER 0x1b /* CardBus latency timer */ 171*c609719bSwdenk #define PCI_CB_MEMORY_BASE_0 0x1c 172*c609719bSwdenk #define PCI_CB_MEMORY_LIMIT_0 0x20 173*c609719bSwdenk #define PCI_CB_MEMORY_BASE_1 0x24 174*c609719bSwdenk #define PCI_CB_MEMORY_LIMIT_1 0x28 175*c609719bSwdenk #define PCI_CB_IO_BASE_0 0x2c 176*c609719bSwdenk #define PCI_CB_IO_BASE_0_HI 0x2e 177*c609719bSwdenk #define PCI_CB_IO_LIMIT_0 0x30 178*c609719bSwdenk #define PCI_CB_IO_LIMIT_0_HI 0x32 179*c609719bSwdenk #define PCI_CB_IO_BASE_1 0x34 180*c609719bSwdenk #define PCI_CB_IO_BASE_1_HI 0x36 181*c609719bSwdenk #define PCI_CB_IO_LIMIT_1 0x38 182*c609719bSwdenk #define PCI_CB_IO_LIMIT_1_HI 0x3a 183*c609719bSwdenk #define PCI_CB_IO_RANGE_MASK ~0x03 184*c609719bSwdenk /* 0x3c-0x3d are same as for htype 0 */ 185*c609719bSwdenk #define PCI_CB_BRIDGE_CONTROL 0x3e 186*c609719bSwdenk #define PCI_CB_BRIDGE_CTL_PARITY 0x01 /* Similar to standard bridge control register */ 187*c609719bSwdenk #define PCI_CB_BRIDGE_CTL_SERR 0x02 188*c609719bSwdenk #define PCI_CB_BRIDGE_CTL_ISA 0x04 189*c609719bSwdenk #define PCI_CB_BRIDGE_CTL_VGA 0x08 190*c609719bSwdenk #define PCI_CB_BRIDGE_CTL_MASTER_ABORT 0x20 191*c609719bSwdenk #define PCI_CB_BRIDGE_CTL_CB_RESET 0x40 /* CardBus reset */ 192*c609719bSwdenk #define PCI_CB_BRIDGE_CTL_16BIT_INT 0x80 /* Enable interrupt for 16-bit cards */ 193*c609719bSwdenk #define PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 0x100 /* Prefetch enable for both memory regions */ 194*c609719bSwdenk #define PCI_CB_BRIDGE_CTL_PREFETCH_MEM1 0x200 195*c609719bSwdenk #define PCI_CB_BRIDGE_CTL_POST_WRITES 0x400 196*c609719bSwdenk #define PCI_CB_SUBSYSTEM_VENDOR_ID 0x40 197*c609719bSwdenk #define PCI_CB_SUBSYSTEM_ID 0x42 198*c609719bSwdenk #define PCI_CB_LEGACY_MODE_BASE 0x44 /* 16-bit PC Card legacy mode base address (ExCa) */ 199*c609719bSwdenk /* 0x48-0x7f reserved */ 200*c609719bSwdenk 201*c609719bSwdenk /* Capability lists */ 202*c609719bSwdenk 203*c609719bSwdenk #define PCI_CAP_LIST_ID 0 /* Capability ID */ 204*c609719bSwdenk #define PCI_CAP_ID_PM 0x01 /* Power Management */ 205*c609719bSwdenk #define PCI_CAP_ID_AGP 0x02 /* Accelerated Graphics Port */ 206*c609719bSwdenk #define PCI_CAP_ID_VPD 0x03 /* Vital Product Data */ 207*c609719bSwdenk #define PCI_CAP_ID_SLOTID 0x04 /* Slot Identification */ 208*c609719bSwdenk #define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */ 209*c609719bSwdenk #define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */ 210*c609719bSwdenk #define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */ 211*c609719bSwdenk #define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */ 212*c609719bSwdenk #define PCI_CAP_SIZEOF 4 213*c609719bSwdenk 214*c609719bSwdenk /* Power Management Registers */ 215*c609719bSwdenk 216*c609719bSwdenk #define PCI_PM_CAP_VER_MASK 0x0007 /* Version */ 217*c609719bSwdenk #define PCI_PM_CAP_PME_CLOCK 0x0008 /* PME clock required */ 218*c609719bSwdenk #define PCI_PM_CAP_AUX_POWER 0x0010 /* Auxilliary power support */ 219*c609719bSwdenk #define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization */ 220*c609719bSwdenk #define PCI_PM_CAP_D1 0x0200 /* D1 power state support */ 221*c609719bSwdenk #define PCI_PM_CAP_D2 0x0400 /* D2 power state support */ 222*c609719bSwdenk #define PCI_PM_CAP_PME 0x0800 /* PME pin supported */ 223*c609719bSwdenk #define PCI_PM_CTRL 4 /* PM control and status register */ 224*c609719bSwdenk #define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */ 225*c609719bSwdenk #define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */ 226*c609719bSwdenk #define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* Data select (??) */ 227*c609719bSwdenk #define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* Data scale (??) */ 228*c609719bSwdenk #define PCI_PM_CTRL_PME_STATUS 0x8000 /* PME pin status */ 229*c609719bSwdenk #define PCI_PM_PPB_EXTENSIONS 6 /* PPB support extensions (??) */ 230*c609719bSwdenk #define PCI_PM_PPB_B2_B3 0x40 /* Stop clock when in D3hot (??) */ 231*c609719bSwdenk #define PCI_PM_BPCC_ENABLE 0x80 /* Bus power/clock control enable (??) */ 232*c609719bSwdenk #define PCI_PM_DATA_REGISTER 7 /* (??) */ 233*c609719bSwdenk #define PCI_PM_SIZEOF 8 234*c609719bSwdenk 235*c609719bSwdenk /* AGP registers */ 236*c609719bSwdenk 237*c609719bSwdenk #define PCI_AGP_VERSION 2 /* BCD version number */ 238*c609719bSwdenk #define PCI_AGP_RFU 3 /* Rest of capability flags */ 239*c609719bSwdenk #define PCI_AGP_STATUS 4 /* Status register */ 240*c609719bSwdenk #define PCI_AGP_STATUS_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */ 241*c609719bSwdenk #define PCI_AGP_STATUS_SBA 0x0200 /* Sideband addressing supported */ 242*c609719bSwdenk #define PCI_AGP_STATUS_64BIT 0x0020 /* 64-bit addressing supported */ 243*c609719bSwdenk #define PCI_AGP_STATUS_FW 0x0010 /* FW transfers supported */ 244*c609719bSwdenk #define PCI_AGP_STATUS_RATE4 0x0004 /* 4x transfer rate supported */ 245*c609719bSwdenk #define PCI_AGP_STATUS_RATE2 0x0002 /* 2x transfer rate supported */ 246*c609719bSwdenk #define PCI_AGP_STATUS_RATE1 0x0001 /* 1x transfer rate supported */ 247*c609719bSwdenk #define PCI_AGP_COMMAND 8 /* Control register */ 248*c609719bSwdenk #define PCI_AGP_COMMAND_RQ_MASK 0xff000000 /* Master: Maximum number of requests */ 249*c609719bSwdenk #define PCI_AGP_COMMAND_SBA 0x0200 /* Sideband addressing enabled */ 250*c609719bSwdenk #define PCI_AGP_COMMAND_AGP 0x0100 /* Allow processing of AGP transactions */ 251*c609719bSwdenk #define PCI_AGP_COMMAND_64BIT 0x0020 /* Allow processing of 64-bit addresses */ 252*c609719bSwdenk #define PCI_AGP_COMMAND_FW 0x0010 /* Force FW transfers */ 253*c609719bSwdenk #define PCI_AGP_COMMAND_RATE4 0x0004 /* Use 4x rate */ 254*c609719bSwdenk #define PCI_AGP_COMMAND_RATE2 0x0002 /* Use 4x rate */ 255*c609719bSwdenk #define PCI_AGP_COMMAND_RATE1 0x0001 /* Use 4x rate */ 256*c609719bSwdenk #define PCI_AGP_SIZEOF 12 257*c609719bSwdenk 258*c609719bSwdenk /* Slot Identification */ 259*c609719bSwdenk 260*c609719bSwdenk #define PCI_SID_ESR 2 /* Expansion Slot Register */ 261*c609719bSwdenk #define PCI_SID_ESR_NSLOTS 0x1f /* Number of expansion slots available */ 262*c609719bSwdenk #define PCI_SID_ESR_FIC 0x20 /* First In Chassis Flag */ 263*c609719bSwdenk #define PCI_SID_CHASSIS_NR 3 /* Chassis Number */ 264*c609719bSwdenk 265*c609719bSwdenk /* Message Signalled Interrupts registers */ 266*c609719bSwdenk 267*c609719bSwdenk #define PCI_MSI_FLAGS 2 /* Various flags */ 268*c609719bSwdenk #define PCI_MSI_FLAGS_64BIT 0x80 /* 64-bit addresses allowed */ 269*c609719bSwdenk #define PCI_MSI_FLAGS_QSIZE 0x70 /* Message queue size configured */ 270*c609719bSwdenk #define PCI_MSI_FLAGS_QMASK 0x0e /* Maximum queue size available */ 271*c609719bSwdenk #define PCI_MSI_FLAGS_ENABLE 0x01 /* MSI feature enabled */ 272*c609719bSwdenk #define PCI_MSI_RFU 3 /* Rest of capability flags */ 273*c609719bSwdenk #define PCI_MSI_ADDRESS_LO 4 /* Lower 32 bits */ 274*c609719bSwdenk #define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */ 275*c609719bSwdenk #define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */ 276*c609719bSwdenk #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ 277*c609719bSwdenk 278*c609719bSwdenk #define PCI_MAX_PCI_DEVICES 32 279*c609719bSwdenk #define PCI_MAX_PCI_FUNCTIONS 8 280*c609719bSwdenk 281*c609719bSwdenk /* Include the ID list */ 282*c609719bSwdenk 283*c609719bSwdenk #include <pci_ids.h> 284*c609719bSwdenk 285*c609719bSwdenk struct pci_region { 286*c609719bSwdenk unsigned long bus_start; /* Start on the bus */ 287*c609719bSwdenk unsigned long phys_start; /* Start in physical address space */ 288*c609719bSwdenk unsigned long size; /* Size */ 289*c609719bSwdenk unsigned long flags; /* Resource flags */ 290*c609719bSwdenk 291*c609719bSwdenk unsigned long bus_lower; 292*c609719bSwdenk }; 293*c609719bSwdenk 294*c609719bSwdenk #define PCI_REGION_MEM 0x00000000 /* PCI memory space */ 295*c609719bSwdenk #define PCI_REGION_IO 0x00000001 /* PCI IO space */ 296*c609719bSwdenk #define PCI_REGION_TYPE 0x00000001 297*c609719bSwdenk 298*c609719bSwdenk #define PCI_REGION_MEMORY 0x00000100 /* System memory */ 299*c609719bSwdenk #define PCI_REGION_RO 0x00000200 /* Read-only memory */ 300*c609719bSwdenk 301*c609719bSwdenk extern __inline__ void pci_set_region(struct pci_region *reg, 302*c609719bSwdenk unsigned long bus_start, 303*c609719bSwdenk unsigned long phys_start, 304*c609719bSwdenk unsigned long size, 305*c609719bSwdenk unsigned long flags) { 306*c609719bSwdenk reg->bus_start = bus_start; 307*c609719bSwdenk reg->phys_start = phys_start; 308*c609719bSwdenk reg->size = size; 309*c609719bSwdenk reg->flags = flags; 310*c609719bSwdenk } 311*c609719bSwdenk 312*c609719bSwdenk typedef int pci_dev_t; 313*c609719bSwdenk 314*c609719bSwdenk #define PCI_BUS(d) (((d) >> 16) & 0xff) 315*c609719bSwdenk #define PCI_DEV(d) (((d) >> 11) & 0x1f) 316*c609719bSwdenk #define PCI_FUNC(d) (((d) >> 8) & 0x7) 317*c609719bSwdenk #define PCI_BDF(b,d,f) ((b) << 16 | (d) << 11 | (f) << 8) 318*c609719bSwdenk 319*c609719bSwdenk #define PCI_ANY_ID (~0) 320*c609719bSwdenk 321*c609719bSwdenk struct pci_device_id { 322*c609719bSwdenk unsigned int vendor, device; /* Vendor and device ID or PCI_ANY_ID */ 323*c609719bSwdenk }; 324*c609719bSwdenk 325*c609719bSwdenk struct pci_controller; 326*c609719bSwdenk 327*c609719bSwdenk struct pci_config_table { 328*c609719bSwdenk unsigned int vendor, device; /* Vendor and device ID or PCI_ANY_ID */ 329*c609719bSwdenk unsigned int class; /* Class ID, or PCI_ANY_ID */ 330*c609719bSwdenk unsigned int bus; /* Bus number, or PCI_ANY_ID */ 331*c609719bSwdenk unsigned int dev; /* Device number, or PCI_ANY_ID */ 332*c609719bSwdenk unsigned int func; /* Function number, or PCI_ANY_ID */ 333*c609719bSwdenk 334*c609719bSwdenk void (*config_device)(struct pci_controller* hose, pci_dev_t dev, 335*c609719bSwdenk struct pci_config_table *); 336*c609719bSwdenk unsigned long priv[3]; 337*c609719bSwdenk }; 338*c609719bSwdenk 339*c609719bSwdenk extern void pci_cfgfunc_nothing(struct pci_controller* hose, pci_dev_t dev, 340*c609719bSwdenk struct pci_config_table *); 341*c609719bSwdenk extern void pci_cfgfunc_config_device(struct pci_controller* hose, pci_dev_t dev, 342*c609719bSwdenk struct pci_config_table *); 343*c609719bSwdenk 344*c609719bSwdenk #define MAX_PCI_REGIONS 7 345*c609719bSwdenk 346*c609719bSwdenk /* 347*c609719bSwdenk * Structure of a PCI controller (host bridge) 348*c609719bSwdenk */ 349*c609719bSwdenk struct pci_controller { 350*c609719bSwdenk struct pci_controller *next; 351*c609719bSwdenk 352*c609719bSwdenk int first_busno; 353*c609719bSwdenk int last_busno; 354*c609719bSwdenk 355*c609719bSwdenk volatile unsigned int *cfg_addr; 356*c609719bSwdenk volatile unsigned char *cfg_data; 357*c609719bSwdenk 358*c609719bSwdenk struct pci_region regions[MAX_PCI_REGIONS]; 359*c609719bSwdenk int region_count; 360*c609719bSwdenk 361*c609719bSwdenk struct pci_config_table *config_table; 362*c609719bSwdenk 363*c609719bSwdenk void (*fixup_irq)(struct pci_controller *, pci_dev_t); 364*c609719bSwdenk 365*c609719bSwdenk /* Low-level architecture-dependent routines */ 366*c609719bSwdenk int (*read_byte)(struct pci_controller*, pci_dev_t, int where, u8 *); 367*c609719bSwdenk int (*read_word)(struct pci_controller*, pci_dev_t, int where, u16 *); 368*c609719bSwdenk int (*read_dword)(struct pci_controller*, pci_dev_t, int where, u32 *); 369*c609719bSwdenk int (*write_byte)(struct pci_controller*, pci_dev_t, int where, u8); 370*c609719bSwdenk int (*write_word)(struct pci_controller*, pci_dev_t, int where, u16); 371*c609719bSwdenk int (*write_dword)(struct pci_controller*, pci_dev_t, int where, u32); 372*c609719bSwdenk 373*c609719bSwdenk /* Used by auto config */ 374*c609719bSwdenk struct pci_region *pci_mem, *pci_io; 375*c609719bSwdenk 376*c609719bSwdenk /* Used by ppc405 autoconfig*/ 377*c609719bSwdenk struct pci_region *pci_fb; 378*c609719bSwdenk }; 379*c609719bSwdenk 380*c609719bSwdenk extern __inline__ void pci_set_ops(struct pci_controller *hose, 381*c609719bSwdenk int (*read_byte)(struct pci_controller*, 382*c609719bSwdenk pci_dev_t, int where, u8 *), 383*c609719bSwdenk int (*read_word)(struct pci_controller*, 384*c609719bSwdenk pci_dev_t, int where, u16 *), 385*c609719bSwdenk int (*read_dword)(struct pci_controller*, 386*c609719bSwdenk pci_dev_t, int where, u32 *), 387*c609719bSwdenk int (*write_byte)(struct pci_controller*, 388*c609719bSwdenk pci_dev_t, int where, u8), 389*c609719bSwdenk int (*write_word)(struct pci_controller*, 390*c609719bSwdenk pci_dev_t, int where, u16), 391*c609719bSwdenk int (*write_dword)(struct pci_controller*, 392*c609719bSwdenk pci_dev_t, int where, u32)) { 393*c609719bSwdenk hose->read_byte = read_byte; 394*c609719bSwdenk hose->read_word = read_word; 395*c609719bSwdenk hose->read_dword = read_dword; 396*c609719bSwdenk hose->write_byte = write_byte; 397*c609719bSwdenk hose->write_word = write_word; 398*c609719bSwdenk hose->write_dword = write_dword; 399*c609719bSwdenk } 400*c609719bSwdenk 401*c609719bSwdenk extern void pci_setup_indirect(struct pci_controller* hose, u32 cfg_addr, u32 cfg_data); 402*c609719bSwdenk 403*c609719bSwdenk extern unsigned long pci_hose_bus_to_phys(struct pci_controller* hose, 404*c609719bSwdenk unsigned long addr, unsigned long flags); 405*c609719bSwdenk extern unsigned long pci_hose_phys_to_bus(struct pci_controller* hose, 406*c609719bSwdenk unsigned long addr, unsigned long flags); 407*c609719bSwdenk 408*c609719bSwdenk #define pci_phys_to_bus(dev, addr, flags) \ 409*c609719bSwdenk pci_hose_phys_to_bus(pci_bus_to_hose(PCI_BUS(dev)), (addr), (flags)) 410*c609719bSwdenk #define pci_bus_to_phys(dev, addr, flags) \ 411*c609719bSwdenk pci_hose_bus_to_phys(pci_bus_to_hose(PCI_BUS(dev)), (addr), (flags)) 412*c609719bSwdenk 413*c609719bSwdenk #define pci_phys_to_mem(dev, addr) pci_phys_to_bus((dev), (addr), PCI_REGION_MEM) 414*c609719bSwdenk #define pci_mem_to_phys(dev, addr) pci_bus_to_phys((dev), (addr), PCI_REGION_MEM) 415*c609719bSwdenk #define pci_phys_to_io(dev, addr) pci_phys_to_bus((dev), (addr), PCI_REGION_IO) 416*c609719bSwdenk #define pci_io_to_phys(dev, addr) pci_bus_to_phys((dev), (addr), PCI_REGION_IO) 417*c609719bSwdenk 418*c609719bSwdenk extern int pci_hose_read_config_byte(struct pci_controller *hose, 419*c609719bSwdenk pci_dev_t dev, int where, u8 *val); 420*c609719bSwdenk extern int pci_hose_read_config_word(struct pci_controller *hose, 421*c609719bSwdenk pci_dev_t dev, int where, u16 *val); 422*c609719bSwdenk extern int pci_hose_read_config_dword(struct pci_controller *hose, 423*c609719bSwdenk pci_dev_t dev, int where, u32 *val); 424*c609719bSwdenk extern int pci_hose_write_config_byte(struct pci_controller *hose, 425*c609719bSwdenk pci_dev_t dev, int where, u8 val); 426*c609719bSwdenk extern int pci_hose_write_config_word(struct pci_controller *hose, 427*c609719bSwdenk pci_dev_t dev, int where, u16 val); 428*c609719bSwdenk extern int pci_hose_write_config_dword(struct pci_controller *hose, 429*c609719bSwdenk pci_dev_t dev, int where, u32 val); 430*c609719bSwdenk 431*c609719bSwdenk extern int pci_read_config_byte(pci_dev_t dev, int where, u8 *val); 432*c609719bSwdenk extern int pci_read_config_word(pci_dev_t dev, int where, u16 *val); 433*c609719bSwdenk extern int pci_read_config_dword(pci_dev_t dev, int where, u32 *val); 434*c609719bSwdenk extern int pci_write_config_byte(pci_dev_t dev, int where, u8 val); 435*c609719bSwdenk extern int pci_write_config_word(pci_dev_t dev, int where, u16 val); 436*c609719bSwdenk extern int pci_write_config_dword(pci_dev_t dev, int where, u32 val); 437*c609719bSwdenk 438*c609719bSwdenk extern int pci_hose_read_config_byte_via_dword(struct pci_controller *hose, 439*c609719bSwdenk pci_dev_t dev, int where, u8 *val); 440*c609719bSwdenk extern int pci_hose_read_config_word_via_dword(struct pci_controller *hose, 441*c609719bSwdenk pci_dev_t dev, int where, u16 *val); 442*c609719bSwdenk extern int pci_hose_write_config_byte_via_dword(struct pci_controller *hose, 443*c609719bSwdenk pci_dev_t dev, int where, u8 val); 444*c609719bSwdenk extern int pci_hose_write_config_word_via_dword(struct pci_controller *hose, 445*c609719bSwdenk pci_dev_t dev, int where, u16 val); 446*c609719bSwdenk 447*c609719bSwdenk extern void pci_register_hose(struct pci_controller* hose); 448*c609719bSwdenk extern struct pci_controller* pci_bus_to_hose(int bus); 449*c609719bSwdenk 450*c609719bSwdenk extern int pci_hose_scan(struct pci_controller *hose); 451*c609719bSwdenk extern int pci_hose_scan_bus(struct pci_controller *hose, int bus); 452*c609719bSwdenk 453*c609719bSwdenk extern void pciauto_region_init(struct pci_region* res); 454*c609719bSwdenk extern void pciauto_region_align(struct pci_region *res, unsigned long size); 455*c609719bSwdenk extern int pciauto_region_allocate(struct pci_region* res, unsigned int size, unsigned int *bar); 456*c609719bSwdenk extern void pciauto_setup_device(struct pci_controller *hose, 457*c609719bSwdenk pci_dev_t dev, int bars_num, 458*c609719bSwdenk struct pci_region *mem, 459*c609719bSwdenk struct pci_region *io); 460*c609719bSwdenk void pciauto_config_device(struct pci_controller *hose, pci_dev_t dev); 461*c609719bSwdenk 462*c609719bSwdenk extern pci_dev_t pci_find_device (unsigned int vendor, unsigned int device, int index); 463*c609719bSwdenk extern pci_dev_t pci_find_devices (struct pci_device_id *ids, int index); 464*c609719bSwdenk 465*c609719bSwdenk extern int pci_hose_config_device(struct pci_controller *hose, 466*c609719bSwdenk pci_dev_t dev, 467*c609719bSwdenk unsigned long io, 468*c609719bSwdenk unsigned long mem, 469*c609719bSwdenk unsigned long command); 470*c609719bSwdenk 471*c609719bSwdenk #ifdef CONFIG_MPC824X 472*c609719bSwdenk extern void pci_mpc824x_init (struct pci_controller *hose); 473*c609719bSwdenk #endif 474*c609719bSwdenk 475*c609719bSwdenk #endif /* _PCI_H */ 476