Chameleon

Chameleon Svn Source Tree

Root/branches/ErmaC/Enoch/i386/libsaio/pci.h

1/*
2 *
3 * Copyright 2008 by Islam M. Ahmed Zaid. All rights reserved.
4 *
5 */
6
7#ifndef __LIBSAIO_PCI_H
8#define __LIBSAIO_PCI_H
9
10/*
11 * 31 24 16 15 11 10 8
12 * +---------------------------------------------------------------+
13 * |1| 0 | BUS | DEV |FUNC | 0 |
14 * +---------------------------------------------------------------+
15 */
16
17typedef struct {
18uint32_t:2;
19uint32_treg:6;
20uint32_tfunc:3;
21uint32_tdev:5;
22uint32_tbus:8;
23uint32_t:7;
24uint32_teb:1;
25} pci_addr_t;
26
27typedef union {
28pci_addr_tbits;
29uint32_taddr;
30} pci_dev_t;
31
32typedef struct pci_dt_t {
33uint8_t* regs;
34pci_dev_tdev;
35
36uint16_tdevfn; /* encoded device & function index */
37uint16_tvendor_id; /* Specifies a vendor ID. The PCI bus configuration code obtains this
38 vendor ID from the vendor ID device register. */
39uint16_tdevice_id; /* Specifies a device ID that identifies the specific device. The PCI
40 bus configuration code obtains this device ID from the device ID
41 device register. */
42
43union {
44struct {
45uint16_tvendor_id; /* Specifies a subsystem vendor ID. */
46uint16_tdevice_id; /* Specifies a subsystem device ID that identifies the specific device. */
47} subsys;
48uint32_tsubsys_id;
49}subsys_id;
50
51uint8_t progif; /* A read-only register that specifies a register-level programming interface the device has, if it has any at all. */
52
53uint8_t revision_id; /* PCI revision ID. Specifies a revision identifier for a particular device. Where valid IDs are allocated by the vendor. */
54
55uint16_tclass_id; /* Specifies a class code. This member is a data structure that stores information related to the device's class code device register. */
56
57//uint16_t subclass_id; /* A read-only register that specifies the specific function the device performs. */
58
59struct pci_dt_t*parent;
60struct pci_dt_t*children;
61struct pci_dt_t*next;
62} pci_dt_t; // Info
63
64/* Have pci_addr in the same format as the values written to 0xcf8
65 * so register accesses can be made easy. */
66#define PCIADDR(bus, dev, func) ((1 << 31) | (bus << 16) | (dev << 11) | (func << 8))
67#define PCI_ADDR_REG0xcf8
68#define PCI_DATA_REG0xcfc
69
70extern pci_dt_t*root_pci_dev;
71extern uint8_tpci_config_read8(uint32_t, uint8_t);
72extern uint16_tpci_config_read16(uint32_t, uint8_t);
73extern uint32_tpci_config_read32(uint32_t, uint8_t);
74extern voidpci_config_write8(uint32_t, uint8_t, uint8_t);
75extern voidpci_config_write16(uint32_t, uint8_t, uint16_t);
76extern voidpci_config_write32(uint32_t, uint8_t, uint32_t);
77extern char*get_pci_dev_path(pci_dt_t *);
78extern voidbuild_pci_dt(void);
79extern voiddump_pci_dt(pci_dt_t *);
80
81//-----------------------------------------------------------------------------
82// added by iNDi
83
84/* Option ROM PCI Data Structure */
85typedef struct {
86uint32_tsignature;// ati - 0x52494350, nvidia - 0x50434952, 'PCIR'
87uint16_tvendor_id;
88uint16_tdevice_id;
89uint16_tvital_product_data_offset;
90uint16_tstructure_length;
91uint8_tstructure_revision;
92uint8_tclass_code[3];
93uint16_timage_length; //same as rom_size for NVidia and ATI, 0x80 for Intel
94uint16_timage_revision;
95uint8_tcode_type;
96uint8_tindicator;
97uint16_treserved;
98} option_rom_pci_header_t;
99
100
101typedef struct {
102uint32_tsignature;// 0x24506E50 '$PnP'
103uint8_trevision;//1
104uint8_tlength;
105uint16_toffset;
106uint8_tchecksum;
107uint32_tidentifier;
108uint16_tmanufacturer;
109uint16_tproduct;
110uint8_tclass[3];
111uint8_tindicators;
112uint16_tboot_vector;
113uint16_tdisconnect_vector;
114uint16_tbootstrap_vector;
115uint16_treserved;
116uint16_tresource_vector;
117} option_rom_pnp_header_t;
118
119/* Option ROM header */
120typedef struct {
121uint16_tsignature; // 0xAA55
122uint8_trom_size; //in 512 bytes blocks
123uint8_tjump; //0xE9 for ATI and Intel, 0xEB for NVidia
124uint8_tentry_point[4]; //offset to
125uint8_treserved[16];
126uint16_tpci_header_offset; //@0x18
127uint16_texpansion_header_offset;
128} option_rom_header_t;
129
130
131/*
132 * Under PCI, each device has 256 bytes of configuration address space,
133 * of which the first 64 bytes are standardized as follows:
134 *
135 * register name offset
136 *******************************************************/
137#define PCI_VENDOR_ID0x00/* 16 bits */
138#define PCI_DEVICE_ID0x02/* 16 bits */
139#define PCI_COMMAND 0x04/* 16 bits */
140#define PCI_COMMAND_IO0x0001/* Enable response in I/O space */
141#define PCI_COMMAND_MEMORY0x0002/* Enable response in Memory space */
142#define PCI_COMMAND_MASTER0x0004/* Enable bus mastering */
143#define PCI_COMMAND_SPECIAL0x0008/* Enable response to special cycles (1 byte) */
144#define PCI_COMMAND_INVALIDATE0x0010/* Use memory write and invalidate */
145#define PCI_COMMAND_VGA_PALETTE0x0020/* Enable palette snooping */
146#define PCI_COMMAND_PARITY0x0040/* Enable parity checking */
147#define PCI_COMMAND_WAIT0x0080/* Enable address/data stepping */
148#define PCI_COMMAND_SERR0x0100/* Enable SERR */
149#define PCI_COMMAND_FAST_BACK0x0200/* Enable back-to-back writes */
150#define PCI_COMMAND_DISABLE_INTx0x0400/* PCIE: Disable INTx interrupts */
151
152#define PCI_STATUS 0x06/* 16 bits */
153#define PCI_STATUS_INTx0x0008/* PCIE: INTx interrupt pending */
154#define PCI_STATUS_CAP_LIST0x0010/* Support Capability List */
155#define PCI_STATUS_66MHZ0x0020/* Support 66 Mhz PCI 2.1 bus */
156#define PCI_STATUS_UDF0x0040/* Support User Definable Features [obsolete] */
157#define PCI_STATUS_FAST_BACK0x0080/* Accept fast-back to back */
158#define PCI_STATUS_PARITY0x0100/* Detected parity error */
159#define PCI_STATUS_DEVSEL_FAST0x0000
160#define PCI_STATUS_DEVSEL_MEDIUM0x0200
161#define PCI_STATUS_DEVSEL_SLOW0x0400
162#define PCI_STATUS_DEVSEL_MASK0x0600/* DEVSEL timing */
163#define PCI_STATUS_SIG_TARGET_ABORT0x0800/* Set on target abort */
164#define PCI_STATUS_REC_TARGET_ABORT0x1000/* Master ack of " */
165#define PCI_STATUS_REC_MASTER_ABORT0x2000/* Set on master abort */
166#define PCI_STATUS_SIG_SYSTEM_ERROR0x4000/* Set when we drive SERR */
167#define PCI_STATUS_DETECTED_PARITY0x8000/* Set on parity error */
168
169#define PCI_CLASS_REVISION0x08/* High 24 bits are class, low 8 revision */
170#define PCI_CLASS_PROG0x09/* Reg. Level Programming Interface know also as PCI_PROG_IF */
171#define PCI_CLASS_DEVICE0x0a/* Device subclass */
172//#define PCI_SUBCLASS_DEVICE0x0b/* Device class */
173
174#define PCI_CACHE_LINE_SIZE0x0c/* 8 bits */
175#define PCI_LATENCY_TIMER0x0d/* 8 bits */
176#define PCI_HEADER_TYPE0x0e/* 8 bits */
177#define PCI_HEADER_TYPE_NORMAL0x00
178#define PCI_HEADER_TYPE_BRIDGE0x01
179#define PCI_HEADER_TYPE_CARDBUS0x02
180
181#define PCI_BIST 0x0f/* 8 bits */
182#define PCI_BIST_CODE_MASK0x0f/* Return result */
183#define PCI_BIST_START0x40/* 1 to start BIST, 2 secs or less */
184#define PCI_BIST_CAPABLE0x80/* 1 if BIST capable */
185
186/*
187 * Base addresses specify locations in memory or I/O space.
188 * Decoded size can be determined by writing a value of
189 * 0xffffffff to the register, and reading it back. Only
190 * 1 bits are decoded.
191 */
192#define PCI_BASE_ADDRESS_00x10/* 32 bits */
193#define PCI_BASE_ADDRESS_10x14/* 32 bits [htype 0,1 only] */
194#define PCI_BASE_ADDRESS_20x18/* 32 bits [htype 0 only] */
195#define PCI_BASE_ADDRESS_30x1c/* 32 bits */
196#define PCI_BASE_ADDRESS_40x20/* 32 bits */
197#define PCI_BASE_ADDRESS_50x24/* 32 bits */
198#define PCI_BASE_ADDRESS_SPACE0x01/* 0 = memory, 1 = I/O */
199#define PCI_BASE_ADDRESS_SPACE_IO0x01
200#define PCI_BASE_ADDRESS_SPACE_MEMORY0x00
201#define PCI_BASE_ADDRESS_MEM_TYPE_MASK0x06
202#define PCI_BASE_ADDRESS_MEM_TYPE_320x00/* 32 bit address */
203#define PCI_BASE_ADDRESS_MEM_TYPE_1M0x02/* Below 1M [obsolete] */
204#define PCI_BASE_ADDRESS_MEM_TYPE_640x04/* 64 bit address */
205#define PCI_BASE_ADDRESS_MEM_PREFETCH0x08/* prefetchable? */
206#define PCI_BASE_ADDRESS_MEM_MASK(~(pciaddr_t)0x0f)
207#define PCI_BASE_ADDRESS_IO_MASK(~(pciaddr_t)0x03)
208/* bit 1 is reserved if address_space = 1 */
209
210/* Header type 0 (normal devices) */
211#define PCI_CARDBUS_CIS0x28
212#define PCI_SUBSYSTEM_VENDOR_ID0x2c/* */
213#define PCI_SUBSYSTEM_ID0x2e/* */
214#define PCI_ROM_ADDRESS0x30/* Bits 31..11 are address, 10..1 reserved */
215#define PCI_ROM_ADDRESS_ENABLE0x01
216#define PCI_ROM_ADDRESS_MASK(~(pciaddr_t)0x7ff)
217
218#define PCI_CAPABILITY_LIST0x34/* Offset of first capability list entry */
219
220/* 0x35-0x3b are reserved */
221#define PCI_INTERRUPT_LINE0x3c/* 8 bits */
222#define PCI_INTERRUPT_PIN0x3d/* 8 bits */
223#define PCI_MIN_GNT 0x3e/* 8 bits */
224#define PCI_MAX_LAT 0x3f/* 8 bits */
225
226/* Header type 1 (PCI-to-PCI bridges) */
227#define PCI_PRIMARY_BUS0x18/* Primary bus number */
228#define PCI_SECONDARY_BUS0x19/* Secondary bus number */
229#define PCI_SUBORDINATE_BUS0x1a/* Highest bus number behind the bridge */
230#define PCI_SEC_LATENCY_TIMER0x1b/* Latency timer for secondary interface */
231#define PCI_IO_BASE 0x1c/* I/O range behind the bridge */
232#define PCI_IO_LIMIT0x1d
233#define PCI_IO_RANGE_TYPE_MASK0x0f/* I/O bridging type */
234#define PCI_IO_RANGE_TYPE_160x00
235#define PCI_IO_RANGE_TYPE_320x01
236#define PCI_IO_RANGE_MASK~0x0f
237#define PCI_SEC_STATUS0x1e/* Secondary status register */
238#define PCI_MEMORY_BASE0x20/* Memory range behind */
239#define PCI_MEMORY_LIMIT0x22
240#define PCI_MEMORY_RANGE_TYPE_MASK0x0f
241#define PCI_MEMORY_RANGE_MASK~0x0f
242#define PCI_PREF_MEMORY_BASE0x24/* Prefetchable memory range behind */
243#define PCI_PREF_MEMORY_LIMIT0x26
244#define PCI_PREF_RANGE_TYPE_MASK0x0f
245#define PCI_PREF_RANGE_TYPE_320x00
246#define PCI_PREF_RANGE_TYPE_640x01
247#define PCI_PREF_RANGE_MASK~0x0f
248#define PCI_PREF_BASE_UPPER320x28/* Upper half of prefetchable memory range */
249#define PCI_PREF_LIMIT_UPPER320x2c
250#define PCI_IO_BASE_UPPER160x30/* Upper half of I/O addresses */
251#define PCI_IO_LIMIT_UPPER160x32
252/* 0x34 same as for htype 0 */
253/* 0x35-0x3b is reserved */
254#define PCI_ROM_ADDRESS10x38/* Same as PCI_ROM_ADDRESS, but for htype 1 */
255/* 0x3c-0x3d are same as for htype 0 */
256#define PCI_BRIDGE_CONTROL0x3e
257#define PCI_BRIDGE_CTL_PARITY0x01/* Enable parity detection on secondary interface */
258#define PCI_BRIDGE_CTL_SERR0x02/* The same for SERR forwarding */
259#define PCI_BRIDGE_CTL_NO_ISA0x04/* Disable bridging of ISA ports */
260#define PCI_BRIDGE_CTL_VGA0x08/* Forward VGA addresses */
261#define PCI_BRIDGE_CTL_MASTER_ABORT0x20/* Report master aborts */
262#define PCI_BRIDGE_CTL_BUS_RESET0x40/* Secondary bus reset */
263#define PCI_BRIDGE_CTL_FAST_BACK0x80/* Fast Back2Back enabled on secondary interface */
264#define PCI_BRIDGE_CTL_PRI_DISCARD_TIMER0x100/* PCI-X? */
265#define PCI_BRIDGE_CTL_SEC_DISCARD_TIMER0x200/* PCI-X? */
266#define PCI_BRIDGE_CTL_DISCARD_TIMER_STATUS0x400/* PCI-X? */
267#define PCI_BRIDGE_CTL_DISCARD_TIMER_SERR_EN0x800/* PCI-X? */
268
269/* Header type 2 (CardBus bridges) */
270/* 0x14-0x15 reserved */
271#define PCI_CB_SEC_STATUS0x16/* Secondary status */
272#define PCI_CB_PRIMARY_BUS0x18/* PCI bus number */
273#define PCI_CB_CARD_BUS0x19/* CardBus bus number */
274#define PCI_CB_SUBORDINATE_BUS0x1a/* Subordinate bus number */
275#define PCI_CB_LATENCY_TIMER0x1b/* CardBus latency timer */
276#define PCI_CB_MEMORY_BASE_00x1c
277#define PCI_CB_MEMORY_LIMIT_00x20
278#define PCI_CB_MEMORY_BASE_10x24
279#define PCI_CB_MEMORY_LIMIT_10x28
280#define PCI_CB_IO_BASE_00x2c
281#define PCI_CB_IO_BASE_0_HI0x2e
282#define PCI_CB_IO_LIMIT_00x30
283#define PCI_CB_IO_LIMIT_0_HI0x32
284#define PCI_CB_IO_BASE_10x34
285#define PCI_CB_IO_BASE_1_HI0x36
286#define PCI_CB_IO_LIMIT_10x38
287#define PCI_CB_IO_LIMIT_1_HI0x3a
288#definePCI_CB_IO_RANGE_MASK~0x03
289/* 0x3c-0x3d are same as for htype 0 */
290#define PCI_CB_BRIDGE_CONTROL0x3e
291#define PCI_CB_BRIDGE_CTL_PARITY0x01/* Similar to standard bridge control register */
292#define PCI_CB_BRIDGE_CTL_SERR0x02
293#define PCI_CB_BRIDGE_CTL_ISA0x04
294#define PCI_CB_BRIDGE_CTL_VGA0x08
295#define PCI_CB_BRIDGE_CTL_MASTER_ABORT0x20
296#define PCI_CB_BRIDGE_CTL_CB_RESET0x40/* CardBus reset */
297#define PCI_CB_BRIDGE_CTL_16BIT_INT0x80/* Enable interrupt for 16-bit cards */
298#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM00x100/* Prefetch enable for both memory regions */
299#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM10x200
300#define PCI_CB_BRIDGE_CTL_POST_WRITES0x400
301#define PCI_CB_SUBSYSTEM_VENDOR_ID0x40
302#define PCI_CB_SUBSYSTEM_ID0x42
303#define PCI_CB_LEGACY_MODE_BASE0x44/* 16-bit PC Card legacy mode base address (ExCa) */
304/* 0x48-0x7f reserved */
305
306/* Capability Identification Numbers list */
307#define PCI_CAP_LIST_ID0/* Capability ID */
308#define PCI_CAP_ID_PM0x01/* Power Management */
309#define PCI_CAP_ID_AGP0x02/* Accelerated Graphics Port */
310#define PCI_CAP_ID_VPD0x03/* Vital Product Data */
311#define PCI_CAP_ID_SLOTID0x04/* Slot Identification */
312#define PCI_CAP_ID_MSI0x05/* Message Signaled Interrupts */
313#define PCI_CAP_ID_CHSWP0x06/* CompactPCI HotSwap */
314#define PCI_CAP_ID_PCIX0x07/* PCI-X */
315#define PCI_CAP_ID_HT0x08/* HyperTransport */
316#define PCI_CAP_ID_VNDR0x09/* Vendor specific */
317#define PCI_CAP_ID_DBG0x0A/* Debug port */
318#define PCI_CAP_ID_CCRC0x0B/* CompactPCI Central Resource Control */
319#define PCI_CAP_ID_HOTPLUG0x0C/* PCI hot-plug */
320#define PCI_CAP_ID_SSVID0x0D/* Bridge subsystem vendor/device ID */
321#define PCI_CAP_ID_AGP30x0E/* AGP 8x */
322#define PCI_CAP_ID_SECURE0x0F/* Secure device (?) */
323#define PCI_CAP_ID_EXP0x10/* PCI Express */
324#define PCI_CAP_ID_MSIX0x11/* MSI-X */
325#define PCI_CAP_ID_SATA0x12/* Serial-ATA HBA */
326#define PCI_CAP_ID_AF0x13/* Advanced features of PCI devices integrated in PCIe root cplx */
327#define PCI_CAP_LIST_NEXT1/* Next capability in the list */
328#define PCI_CAP_FLAGS2/* Capability defined flags (16 bits) */
329#define PCI_CAP_SIZEOF4
330
331/* Capabilities residing in the PCI Express extended configuration space */
332#define PCI_EXT_CAP_ID_AER0x01/* Advanced Error Reporting */
333#define PCI_EXT_CAP_ID_VC0x02/* Virtual Channel */
334#define PCI_EXT_CAP_ID_DSN0x03/* Device Serial Number */
335#define PCI_EXT_CAP_ID_PB0x04/* Power Budgeting */
336#define PCI_EXT_CAP_ID_RCLINK0x05/* Root Complex Link Declaration */
337#define PCI_EXT_CAP_ID_RCILINK0x06/* Root Complex Internal Link Declaration */
338#define PCI_EXT_CAP_ID_RCECOLL0x07/* Root Complex Event Collector */
339#define PCI_EXT_CAP_ID_MFVC0x08/* Multi-Function Virtual Channel */
340#define PCI_EXT_CAP_ID_RBCB0x0a/* Root Bridge Control Block */
341#define PCI_EXT_CAP_ID_VNDR0x0b/* Vendor specific */
342#define PCI_EXT_CAP_ID_ACS0x0d/* Access Controls */
343#define PCI_EXT_CAP_ID_ARI0x0e/* Alternative Routing-ID Interpretation */
344#define PCI_EXT_CAP_ID_ATS0x0f/* Address Translation Service */
345#define PCI_EXT_CAP_ID_SRIOV0x10/* Single Root I/O Virtualization */
346
347/* Power Management Registers */
348#define PCI_PM_CAP_VER_MASK0x0007/* Version (2=PM1.1) */
349#define PCI_PM_CAP_PME_CLOCK0x0008/* Clock required for PME generation */
350#define PCI_PM_CAP_DSI0x0020/* Device specific initialization required */
351#define PCI_PM_CAP_AUX_C_MASK0x01c0/* Maximum aux current required in D3cold */
352#define PCI_PM_CAP_D10x0200/* D1 power state support */
353#define PCI_PM_CAP_D20x0400/* D2 power state support */
354#define PCI_PM_CAP_PME_D00x0800/* PME can be asserted from D0 */
355#define PCI_PM_CAP_PME_D10x1000/* PME can be asserted from D1 */
356#define PCI_PM_CAP_PME_D20x2000/* PME can be asserted from D2 */
357#define PCI_PM_CAP_PME_D3_HOT0x4000/* PME can be asserted from D3hot */
358#define PCI_PM_CAP_PME_D3_COLD0x8000/* PME can be asserted from D3cold */
359#define PCI_PM_CTRL4/* PM control and status register */
360#define PCI_PM_CTRL_STATE_MASK0x0003/* Current power state (D0 to D3) */
361#define PCI_PM_CTRL_PME_ENABLE0x0100/* PME pin enable */
362#define PCI_PM_CTRL_DATA_SEL_MASK0x1e00/* PM table data index */
363#define PCI_PM_CTRL_DATA_SCALE_MASK0x6000/* PM table data scaling factor */
364#define PCI_PM_CTRL_PME_STATUS0x8000/* PME pin status */
365#define PCI_PM_PPB_EXTENSIONS6/* PPB support extensions */
366#define PCI_PM_PPB_B2_B30x40/* If bridge enters D3hot, bus enters: 0=B3, 1=B2 */
367#define PCI_PM_BPCC_ENABLE0x80/* Secondary bus is power managed */
368#define PCI_PM_DATA_REGISTER7/* PM table contents read here */
369#define PCI_PM_SIZEOF8
370
371/* AGP registers */
372#define PCI_AGP_VERSION2/* BCD version number */
373#define PCI_AGP_RFU3/* Rest of capability flags */
374#define PCI_AGP_STATUS4/* Status register */
375#define PCI_AGP_STATUS_RQ_MASK0xff000000/* Maximum number of requests - 1 */
376#define PCI_AGP_STATUS_ISOCH0x10000/* Isochronous transactions supported */
377#define PCI_AGP_STATUS_ARQSZ_MASK0xe000/* log2(optimum async req size in bytes) - 4 */
378#define PCI_AGP_STATUS_CAL_MASK0x1c00/* Calibration cycle timing */
379#define PCI_AGP_STATUS_SBA0x0200/* Sideband addressing supported */
380#define PCI_AGP_STATUS_ITA_COH0x0100/* In-aperture accesses always coherent */
381#define PCI_AGP_STATUS_GART640x0080/* 64-bit GART entries supported */
382#define PCI_AGP_STATUS_HTRANS0x0040/* If 0, core logic can xlate host CPU accesses thru aperture */
383#define PCI_AGP_STATUS_64BIT0x0020/* 64-bit addressing cycles supported */
384#define PCI_AGP_STATUS_FW0x0010/* Fast write transfers supported */
385#define PCI_AGP_STATUS_AGP30x0008/* AGP3 mode supported */
386#define PCI_AGP_STATUS_RATE40x0004/* 4x transfer rate supported (RFU in AGP3 mode) */
387#define PCI_AGP_STATUS_RATE20x0002/* 2x transfer rate supported (8x in AGP3 mode) */
388#define PCI_AGP_STATUS_RATE10x0001/* 1x transfer rate supported (4x in AGP3 mode) */
389#define PCI_AGP_COMMAND8/* Control register */
390#define PCI_AGP_COMMAND_RQ_MASK0xff000000/* Master: Maximum number of requests */
391#define PCI_AGP_COMMAND_ARQSZ_MASK0xe000/* log2(optimum async req size in bytes) - 4 */
392#define PCI_AGP_COMMAND_CAL_MASK0x1c00/* Calibration cycle timing */
393#define PCI_AGP_COMMAND_SBA0x0200/* Sideband addressing enabled */
394#define PCI_AGP_COMMAND_AGP0x0100/* Allow processing of AGP transactions */
395#define PCI_AGP_COMMAND_GART640x0080/* 64-bit GART entries enabled */
396#define PCI_AGP_COMMAND_64BIT0x0020/* Allow generation of 64-bit addr cycles */
397#define PCI_AGP_COMMAND_FW0x0010/* Enable FW transfers */
398#define PCI_AGP_COMMAND_RATE40x0004/* Use 4x rate (RFU in AGP3 mode) */
399#define PCI_AGP_COMMAND_RATE20x0002/* Use 2x rate (8x in AGP3 mode) */
400#define PCI_AGP_COMMAND_RATE10x0001/* Use 1x rate (4x in AGP3 mode) */
401#define PCI_AGP_SIZEOF12
402
403/* Vital Product Data */
404#define PCI_VPD_ADDR2/* Address to access (15 bits!) */
405#define PCI_VPD_ADDR_MASK0x7fff/* Address mask */
406#define PCI_VPD_ADDR_F0x8000/* Write 0, 1 indicates completion */
407#define PCI_VPD_DATA4/* 32-bits of data returned here */
408
409/* Slot Identification */
410#define PCI_SID_ESR2/* Expansion Slot Register */
411#define PCI_SID_ESR_NSLOTS0x1f/* Number of expansion slots available */
412#define PCI_SID_ESR_FIC0x20/* First In Chassis Flag */
413#define PCI_SID_CHASSIS_NR3/* Chassis Number */
414
415/* Message Signaled Interrupts registers */
416#define PCI_MSI_FLAGS2/* Various flags */
417#define PCI_MSI_FLAGS_MASK_BIT0x100/* interrupt masking & reporting supported */
418#define PCI_MSI_FLAGS_64BIT0x080/* 64-bit addresses allowed */
419#define PCI_MSI_FLAGS_QSIZE0x070/* Message queue size configured */
420#define PCI_MSI_FLAGS_QMASK0x00e/* Maximum queue size available */
421#define PCI_MSI_FLAGS_ENABLE0x001/* MSI feature enabled */
422#define PCI_MSI_RFU3/* Rest of capability flags */
423#define PCI_MSI_ADDRESS_LO4/* Lower 32 bits */
424#define PCI_MSI_ADDRESS_HI8/* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */
425#define PCI_MSI_DATA_328/* 16 bits of data for 32-bit devices */
426#define PCI_MSI_DATA_6412/* 16 bits of data for 64-bit devices */
427#define PCI_MSI_MASK_BIT_3212/* per-vector masking for 32-bit devices */
428#define PCI_MSI_MASK_BIT_6416/* per-vector masking for 64-bit devices */
429#define PCI_MSI_PENDING_3216/* per-vector interrupt pending for 32-bit devices */
430#define PCI_MSI_PENDING_6420/* per-vector interrupt pending for 64-bit devices */
431
432/* PCI-X */
433#define PCI_PCIX_COMMAND2/* Command register offset */
434#define PCI_PCIX_COMMAND_DPERE0x0001/* Data Parity Error Recover Enable */
435#define PCI_PCIX_COMMAND_ERO0x0002/* Enable Relaxed Ordering */
436#define PCI_PCIX_COMMAND_MAX_MEM_READ_BYTE_COUNT0x000c/* Maximum Memory Read Byte Count */
437#define PCI_PCIX_COMMAND_MAX_OUTSTANDING_SPLIT_TRANS0x0070
438#define PCI_PCIX_COMMAND_RESERVED0xf80
439#define PCI_PCIX_STATUS4/* Status register offset */
440#define PCI_PCIX_STATUS_FUNCTION0x00000007
441#define PCI_PCIX_STATUS_DEVICE0x000000f8
442#define PCI_PCIX_STATUS_BUS0x0000ff00
443#define PCI_PCIX_STATUS_64BIT0x00010000
444#define PCI_PCIX_STATUS_133MHZ0x00020000
445#define PCI_PCIX_STATUS_SC_DISCARDED0x00040000/* Split Completion Discarded */
446#define PCI_PCIX_STATUS_UNEXPECTED_SC0x00080000/* Unexpected Split Completion */
447#define PCI_PCIX_STATUS_DEVICE_COMPLEXITY0x00100000/* 0 = simple device, 1 = bridge device */
448#define PCI_PCIX_STATUS_DESIGNED_MAX_MEM_READ_BYTE_COUNT0x00600000/* 0 = 512 bytes, 1 = 1024, 2 = 2048, 3 = 4096 */
449#define PCI_PCIX_STATUS_DESIGNED_MAX_OUTSTANDING_SPLIT_TRANS0x03800000
450#define PCI_PCIX_STATUS_DESIGNED_MAX_CUMULATIVE_READ_SIZE0x1c000000
451#define PCI_PCIX_STATUS_RCVD_SC_ERR_MESS0x20000000/* Received Split Completion Error Message */
452#define PCI_PCIX_STATUS_266MHZ0x40000000/* 266 MHz capable */
453#define PCI_PCIX_STATUS_533MHZ0x80000000/* 533 MHz capable */
454#define PCI_PCIX_SIZEOF4
455
456/* PCI-X Bridges */
457#define PCI_PCIX_BRIDGE_SEC_STATUS2/* Secondary bus status register offset */
458#define PCI_PCIX_BRIDGE_SEC_STATUS_64BIT0x0001
459#define PCI_PCIX_BRIDGE_SEC_STATUS_133MHZ0x0002
460#define PCI_PCIX_BRIDGE_SEC_STATUS_SC_DISCARDED0x0004/* Split Completion Discarded on secondary bus */
461#define PCI_PCIX_BRIDGE_SEC_STATUS_UNEXPECTED_SC0x0008/* Unexpected Split Completion on secondary bus */
462#define PCI_PCIX_BRIDGE_SEC_STATUS_SC_OVERRUN0x0010/* Split Completion Overrun on secondary bus */
463#define PCI_PCIX_BRIDGE_SEC_STATUS_SPLIT_REQUEST_DELAYED0x0020
464#define PCI_PCIX_BRIDGE_SEC_STATUS_CLOCK_FREQ0x01c0
465#define PCI_PCIX_BRIDGE_SEC_STATUS_RESERVED0xfe00
466#define PCI_PCIX_BRIDGE_STATUS4/* Primary bus status register offset */
467#define PCI_PCIX_BRIDGE_STATUS_FUNCTION0x00000007
468#define PCI_PCIX_BRIDGE_STATUS_DEVICE0x000000f8
469#define PCI_PCIX_BRIDGE_STATUS_BUS0x0000ff00
470#define PCI_PCIX_BRIDGE_STATUS_64BIT0x00010000
471#define PCI_PCIX_BRIDGE_STATUS_133MHZ0x00020000
472#define PCI_PCIX_BRIDGE_STATUS_SC_DISCARDED0x00040000/* Split Completion Discarded */
473#define PCI_PCIX_BRIDGE_STATUS_UNEXPECTED_SC0x00080000/* Unexpected Split Completion */
474#define PCI_PCIX_BRIDGE_STATUS_SC_OVERRUN0x00100000/* Split Completion Overrun */
475#define PCI_PCIX_BRIDGE_STATUS_SPLIT_REQUEST_DELAYED0x00200000
476#define PCI_PCIX_BRIDGE_STATUS_RESERVED0xffc00000
477#define PCI_PCIX_BRIDGE_UPSTREAM_SPLIT_TRANS_CTRL8/* Upstream Split Transaction Register offset */
478#define PCI_PCIX_BRIDGE_DOWNSTREAM_SPLIT_TRANS_CTRL12/* Downstream Split Transaction Register offset */
479#define PCI_PCIX_BRIDGE_STR_CAPACITY0x0000ffff
480#define PCI_PCIX_BRIDGE_STR_COMMITMENT_LIMIT0xffff0000
481#define PCI_PCIX_BRIDGE_SIZEOF 12
482
483/* PCI Express */
484#define PCI_EXP_FLAGS0x2/* Capabilities register */
485#define PCI_EXP_FLAGS_VERS0x000f/* Capability version */
486#define PCI_EXP_FLAGS_TYPE0x00f0/* Device/Port type */
487#define PCI_EXP_TYPE_ENDPOINT0x0 /* Express Endpoint */
488#define PCI_EXP_TYPE_LEG_END0x1 /* Legacy Endpoint */
489#define PCI_EXP_TYPE_ROOT_PORT0x4 /* Root Port */
490#define PCI_EXP_TYPE_UPSTREAM0x5 /* Upstream Port */
491#define PCI_EXP_TYPE_DOWNSTREAM0x6 /* Downstream Port */
492#define PCI_EXP_TYPE_PCI_BRIDGE0x7 /* PCI/PCI-X Bridge */
493#define PCI_EXP_TYPE_PCIE_BRIDGE0x8 /* PCI/PCI-X to PCIE Bridge */
494#define PCI_EXP_TYPE_ROOT_INT_EP0x9 /* Root Complex Integrated Endpoint */
495#define PCI_EXP_TYPE_ROOT_EC0xa /* Root Complex Event Collector */
496#define PCI_EXP_FLAGS_SLOT0x0100/* Slot implemented */
497#define PCI_EXP_FLAGS_IRQ0x3e00/* Interrupt message number */
498#define PCI_EXP_DEVCAP0x4 /* Device capabilities */
499#define PCI_EXP_DEVCAP_PAYLOAD0x07/* Max_Payload_Size */
500#define PCI_EXP_DEVCAP_PHANTOM0x18/* Phantom functions */
501#define PCI_EXP_DEVCAP_EXT_TAG0x20/* Extended tags */
502#define PCI_EXP_DEVCAP_L0S0x1c0/* L0s Acceptable Latency */
503#define PCI_EXP_DEVCAP_L10xe00/* L1 Acceptable Latency */
504#define PCI_EXP_DEVCAP_ATN_BUT0x1000/* Attention Button Present */
505#define PCI_EXP_DEVCAP_ATN_IND0x2000/* Attention Indicator Present */
506#define PCI_EXP_DEVCAP_PWR_IND0x4000/* Power Indicator Present */
507#define PCI_EXP_DEVCAP_RBE0x8000/* Role-Based Error Reporting */
508#define PCI_EXP_DEVCAP_PWR_VAL0x3fc0000/* Slot Power Limit Value */
509#define PCI_EXP_DEVCAP_PWR_SCL0xc000000/* Slot Power Limit Scale */
510#define PCI_EXP_DEVCAP_FLRESET0x10000000/* Function-Level Reset */
511#define PCI_EXP_DEVCTL0x8 /* Device Control */
512#define PCI_EXP_DEVCTL_CERE0x0001/* Correctable Error Reporting En. */
513#define PCI_EXP_DEVCTL_NFERE0x0002/* Non-Fatal Error Reporting Enable */
514#define PCI_EXP_DEVCTL_FERE0x0004/* Fatal Error Reporting Enable */
515#define PCI_EXP_DEVCTL_URRE0x0008/* Unsupported Request Reporting En. */
516#define PCI_EXP_DEVCTL_RELAXED0x0010/* Enable Relaxed Ordering */
517#define PCI_EXP_DEVCTL_PAYLOAD0x00e0/* Max_Payload_Size */
518#define PCI_EXP_DEVCTL_EXT_TAG0x0100/* Extended Tag Field Enable */
519#define PCI_EXP_DEVCTL_PHANTOM0x0200/* Phantom Functions Enable */
520#define PCI_EXP_DEVCTL_AUX_PME0x0400/* Auxiliary Power PM Enable */
521#define PCI_EXP_DEVCTL_NOSNOOP0x0800/* Enable No Snoop */
522#define PCI_EXP_DEVCTL_READRQ0x7000/* Max_Read_Request_Size */
523#define PCI_EXP_DEVCTL_BCRE0x8000/* Bridge Configuration Retry Enable */
524#define PCI_EXP_DEVCTL_FLRESET0x8000/* Function-Level Reset [bit shared with BCRE] */
525#define PCI_EXP_DEVSTA0xa /* Device Status */
526#define PCI_EXP_DEVSTA_CED0x01/* Correctable Error Detected */
527#define PCI_EXP_DEVSTA_NFED0x02/* Non-Fatal Error Detected */
528#define PCI_EXP_DEVSTA_FED0x04/* Fatal Error Detected */
529#define PCI_EXP_DEVSTA_URD0x08/* Unsupported Request Detected */
530#define PCI_EXP_DEVSTA_AUXPD0x10/* AUX Power Detected */
531#define PCI_EXP_DEVSTA_TRPND0x20/* Transactions Pending */
532#define PCI_EXP_LNKCAP0xc /* Link Capabilities */
533#define PCI_EXP_LNKCAP_SPEED0x0000f /* Maximum Link Speed */
534#define PCI_EXP_LNKCAP_WIDTH0x003f0 /* Maximum Link Width */
535#define PCI_EXP_LNKCAP_ASPM0x00c00 /* Active State Power Management */
536#define PCI_EXP_LNKCAP_L0S0x07000 /* L0s Acceptable Latency */
537#define PCI_EXP_LNKCAP_L10x38000 /* L1 Acceptable Latency */
538#define PCI_EXP_LNKCAP_CLOCKPM0x40000 /* Clock Power Management */
539#define PCI_EXP_LNKCAP_SURPRISE0x80000 /* Surprise Down Error Reporting */
540#define PCI_EXP_LNKCAP_DLLA0x100000/* Data Link Layer Active Reporting */
541#define PCI_EXP_LNKCAP_LBNC0x200000/* Link Bandwidth Notification Capability */
542#define PCI_EXP_LNKCAP_PORT0xff000000/* Port Number */
543#define PCI_EXP_LNKCTL0x10/* Link Control */
544#define PCI_EXP_LNKCTL_ASPM0x0003/* ASPM Control */
545#define PCI_EXP_LNKCTL_RCB0x0008/* Read Completion Boundary */
546#define PCI_EXP_LNKCTL_DISABLE0x0010/* Link Disable */
547#define PCI_EXP_LNKCTL_RETRAIN0x0020/* Retrain Link */
548#define PCI_EXP_LNKCTL_CLOCK0x0040/* Common Clock Configuration */
549#define PCI_EXP_LNKCTL_XSYNCH0x0080/* Extended Synch */
550#define PCI_EXP_LNKCTL_CLOCKPM0x0100/* Clock Power Management */
551#define PCI_EXP_LNKCTL_HWAUTWD0x0200/* Hardware Autonomous Width Disable */
552#define PCI_EXP_LNKCTL_BWMIE0x0400/* Bandwidth Mgmt Interrupt Enable */
553#define PCI_EXP_LNKCTL_AUTBWIE0x0800/* Autonomous Bandwidth Mgmt Interrupt Enable */
554#define PCI_EXP_LNKSTA0x12/* Link Status */
555#define PCI_EXP_LNKSTA_SPEED0x000f/* Negotiated Link Speed */
556#define PCI_EXP_LNKSTA_WIDTH0x03f0/* Negotiated Link Width */
557#define PCI_EXP_LNKSTA_TR_ERR0x0400/* Training Error (obsolete) */
558#define PCI_EXP_LNKSTA_TRAIN0x0800/* Link Training */
559#define PCI_EXP_LNKSTA_SL_CLK0x1000/* Slot Clock Configuration */
560#define PCI_EXP_LNKSTA_DL_ACT0x2000/* Data Link Layer in DL_Active State */
561#define PCI_EXP_LNKSTA_BWMGMT0x4000/* Bandwidth Mgmt Status */
562#define PCI_EXP_LNKSTA_AUTBW0x8000/* Autonomous Bandwidth Mgmt Status */
563#define PCI_EXP_SLTCAP0x14/* Slot Capabilities */
564#define PCI_EXP_SLTCAP_ATNB0x0001/* Attention Button Present */
565#define PCI_EXP_SLTCAP_PWRC0x0002/* Power Controller Present */
566#define PCI_EXP_SLTCAP_MRL0x0004/* MRL Sensor Present */
567#define PCI_EXP_SLTCAP_ATNI0x0008/* Attention Indicator Present */
568#define PCI_EXP_SLTCAP_PWRI0x0010/* Power Indicator Present */
569#define PCI_EXP_SLTCAP_HPS0x0020/* Hot-Plug Surprise */
570#define PCI_EXP_SLTCAP_HPC0x0040/* Hot-Plug Capable */
571#define PCI_EXP_SLTCAP_PWR_VAL0x00007f80/* Slot Power Limit Value */
572#define PCI_EXP_SLTCAP_PWR_SCL0x00018000/* Slot Power Limit Scale */
573#define PCI_EXP_SLTCAP_INTERLOCK0x020000/* Electromechanical Interlock Present */
574#define PCI_EXP_SLTCAP_NOCMDCOMP0x040000/* No Command Completed Support */
575#define PCI_EXP_SLTCAP_PSN0xfff80000/* Physical Slot Number */
576#define PCI_EXP_SLTCTL0x18/* Slot Control */
577#define PCI_EXP_SLTCTL_ATNB0x0001/* Attention Button Pressed Enable */
578#define PCI_EXP_SLTCTL_PWRF0x0002/* Power Fault Detected Enable */
579#define PCI_EXP_SLTCTL_MRLS0x0004/* MRL Sensor Changed Enable */
580#define PCI_EXP_SLTCTL_PRSD0x0008/* Presence Detect Changed Enable */
581#define PCI_EXP_SLTCTL_CMDC0x0010/* Command Completed Interrupt Enable */
582#define PCI_EXP_SLTCTL_HPIE0x0020/* Hot-Plug Interrupt Enable */
583#define PCI_EXP_SLTCTL_ATNI0x00c0/* Attention Indicator Control */
584#define PCI_EXP_SLTCTL_PWRI0x0300/* Power Indicator Control */
585#define PCI_EXP_SLTCTL_PWRC0x0400/* Power Controller Control */
586#define PCI_EXP_SLTCTL_INTERLOCK0x0800/* Electromechanical Interlock Control */
587#define PCI_EXP_SLTCTL_LLCHG0x1000/* Data Link Layer State Changed Enable */
588#define PCI_EXP_SLTSTA0x1a/* Slot Status */
589#define PCI_EXP_SLTSTA_ATNB0x0001/* Attention Button Pressed */
590#define PCI_EXP_SLTSTA_PWRF0x0002/* Power Fault Detected */
591#define PCI_EXP_SLTSTA_MRLS0x0004/* MRL Sensor Changed */
592#define PCI_EXP_SLTSTA_PRSD0x0008/* Presence Detect Changed */
593#define PCI_EXP_SLTSTA_CMDC0x0010/* Command Completed */
594#define PCI_EXP_SLTSTA_MRL_ST0x0020/* MRL Sensor State */
595#define PCI_EXP_SLTSTA_PRES0x0040/* Presence Detect State */
596#define PCI_EXP_SLTSTA_INTERLOCK0x0080/* Electromechanical Interlock Status */
597#define PCI_EXP_SLTSTA_LLCHG0x0100/* Data Link Layer State Changed */
598#define PCI_EXP_RTCTL0x1c/* Root Control */
599#define PCI_EXP_RTCTL_SECEE0x0001/* System Error on Correctable Error */
600#define PCI_EXP_RTCTL_SENFEE0x0002/* System Error on Non-Fatal Error */
601#define PCI_EXP_RTCTL_SEFEE0x0004/* System Error on Fatal Error */
602#define PCI_EXP_RTCTL_PMEIE0x0008/* PME Interrupt Enable */
603#define PCI_EXP_RTCTL_CRSVIS0x0010/* Configuration Request Retry Status Visible to SW */
604#define PCI_EXP_RTCAP0x1e/* Root Capabilities */
605#define PCI_EXP_RTCAP_CRSVIS0x0010/* Configuration Request Retry Status Visible to SW */
606#define PCI_EXP_RTSTA0x20/* Root Status */
607#define PCI_EXP_RTSTA_PME_REQID0x0000ffff/* PME Requester ID */
608#define PCI_EXP_RTSTA_PME_STATUS0x00010000/* PME Status */
609#define PCI_EXP_RTSTA_PME_PENDING0x00020000/* PME is Pending */
610#define PCI_EXP_DEVCAP20x24/* Device capabilities 2 */
611#define PCI_EXP_DEVCTL20x28/* Device Control */
612#define PCI_EXP_DEV2_TIMEOUT_RANGE(x)((x) & 0xf)/* Completion Timeout Ranges Supported */
613#define PCI_EXP_DEV2_TIMEOUT_VALUE(x)((x) & 0xf)/* Completion Timeout Value */
614#define PCI_EXP_DEV2_TIMEOUT_DIS0x0010/* Completion Timeout Disable Supported */
615#define PCI_EXP_DEV2_ARI0x0020/* ARI Forwarding */
616#define PCI_EXP_DEVSTA20x2a/* Device Status */
617#define PCI_EXP_LNKCAP20x2c/* Link Capabilities */
618#define PCI_EXP_LNKCTL20x30/* Link Control */
619#define PCI_EXP_LNKCTL2_SPEED(x)((x) & 0xf)/* Target Link Speed */
620#define PCI_EXP_LNKCTL2_CMPLNC0x0010/* Enter Compliance */
621#define PCI_EXP_LNKCTL2_SPEED_DIS0x0020/* Hardware Autonomous Speed Disable */
622#define PCI_EXP_LNKCTL2_DEEMPHASIS(x)(((x) >> 6) & 1)/* Selectable De-emphasis */
623#define PCI_EXP_LNKCTL2_MARGIN(x)(((x) >> 7) & 7)/* Transmit Margin */
624#define PCI_EXP_LNKCTL2_MOD_CMPLNC0x0400/* Enter Modified Compliance */
625#define PCI_EXP_LNKCTL2_CMPLNC_SOS0x0800/* Compliance SOS */
626#define PCI_EXP_LNKCTL2_COM_DEEMPHASIS(x)(((x) >> 12) & 1)/* Compliance De-emphasis */
627#define PCI_EXP_LNKSTA20x32/* Link Status */
628#define PCI_EXP_LINKSTA2_DEEMPHASIS(x)((x) & 1)/* Current De-emphasis Level */
629#define PCI_EXP_SLTCAP20x34/* Slot Capabilities */
630#define PCI_EXP_SLTCTL20x38/* Slot Control */
631#define PCI_EXP_SLTSTA20x3a/* Slot Status */
632
633/* MSI-X */
634#define PCI_MSIX_ENABLE0x8000
635#define PCI_MSIX_MASK0x4000
636#define PCI_MSIX_TABSIZE0x03ff
637#define PCI_MSIX_TABLE4
638#define PCI_MSIX_PBA8
639#define PCI_MSIX_BIR0x7
640
641/* Subsystem vendor/device ID for PCI bridges */
642#define PCI_SSVID_VENDOR4
643#define PCI_SSVID_DEVICE6
644
645/* Advanced Error Reporting */
646#define PCI_ERR_UNCOR_STATUS4 /* Uncorrectable Error Status */
647#define PCI_ERR_UNC_TRAIN0x00000001/* Undefined in PCIe rev1.1 & 2.0 spec */
648#define PCI_ERR_UNC_DLP0x00000010/* Data Link Protocol */
649#define PCI_ERR_UNC_SDES0x00000020/* Surprise Down Error */
650#define PCI_ERR_UNC_POISON_TLP0x00001000/* Poisoned TLP */
651#define PCI_ERR_UNC_FCP0x00002000/* Flow Control Protocol */
652#define PCI_ERR_UNC_COMP_TIME0x00004000/* Completion Timeout */
653#define PCI_ERR_UNC_COMP_ABORT0x00008000/* Completer Abort */
654#define PCI_ERR_UNC_UNX_COMP0x00010000/* Unexpected Completion */
655#define PCI_ERR_UNC_RX_OVER0x00020000/* Receiver Overflow */
656#define PCI_ERR_UNC_MALF_TLP0x00040000/* Malformed TLP */
657#define PCI_ERR_UNC_ECRC0x00080000/* ECRC Error Status */
658#define PCI_ERR_UNC_UNSUP0x00100000/* Unsupported Request */
659#define PCI_ERR_UNC_ACS_VIOL0x00200000/* ACS Violation */
660#define PCI_ERR_UNCOR_MASK8/* Uncorrectable Error Mask */
661/* Same bits as above */
662#define PCI_ERR_UNCOR_SEVER12/* Uncorrectable Error Severity */
663/* Same bits as above */
664#define PCI_ERR_COR_STATUS16/* Correctable Error Status */
665#define PCI_ERR_COR_RCVR0x00000001/* Receiver Error Status */
666#define PCI_ERR_COR_BAD_TLP0x00000040/* Bad TLP Status */
667#define PCI_ERR_COR_BAD_DLLP0x00000080/* Bad DLLP Status */
668#define PCI_ERR_COR_REP_ROLL0x00000100/* REPLAY_NUM Rollover */
669#define PCI_ERR_COR_REP_TIMER0x00001000/* Replay Timer Timeout */
670#define PCI_ERR_COR_REP_ANFE0x00002000/* Advisory Non-Fatal Error */
671#define PCI_ERR_COR_MASK20/* Correctable Error Mask */
672/* Same bits as above */
673#define PCI_ERR_CAP 24/* Advanced Error Capabilities */
674#define PCI_ERR_CAP_FEP(x)((x) & 31)/* First Error Pointer */
675#define PCI_ERR_CAP_ECRC_GENC0x00000020/* ECRC Generation Capable */
676#define PCI_ERR_CAP_ECRC_GENE0x00000040/* ECRC Generation Enable */
677#define PCI_ERR_CAP_ECRC_CHKC0x00000080/* ECRC Check Capable */
678#define PCI_ERR_CAP_ECRC_CHKE0x00000100/* ECRC Check Enable */
679#define PCI_ERR_HEADER_LOG28/* Header Log Register (16 bytes) */
680#define PCI_ERR_ROOT_COMMAND44/* Root Error Command */
681#define PCI_ERR_ROOT_STATUS48
682#define PCI_ERR_ROOT_COR_SRC52
683#define PCI_ERR_ROOT_SRC54
684
685/* Virtual Channel */
686#define PCI_VC_PORT_REG14
687#define PCI_VC_PORT_REG28
688#define PCI_VC_PORT_CTRL12
689#define PCI_VC_PORT_STATUS14
690#define PCI_VC_RES_CAP16
691#define PCI_VC_RES_CTRL20
692#define PCI_VC_RES_STATUS26
693
694/* Power Budgeting */
695#define PCI_PWR_DSR 4 /* Data Select Register */
696#define PCI_PWR_DATA8 /* Data Register */
697#define PCI_PWR_DATA_BASE(x)((x) & 0xff)/* Base Power */
698#define PCI_PWR_DATA_SCALE(x)(((x) >> 8) & 3)/* Data Scale */
699#define PCI_PWR_DATA_PM_SUB(x)(((x) >> 10) & 7)/* PM Sub State */
700#define PCI_PWR_DATA_PM_STATE(x)(((x) >> 13) & 3)/* PM State */
701#define PCI_PWR_DATA_TYPE(x)(((x) >> 15) & 7)/* Type */
702#define PCI_PWR_DATA_RAIL(x)(((x) >> 18) & 7)/* Power Rail */
703#define PCI_PWR_CAP 12 /* Capability */
704#define PCI_PWR_CAP_BUDGET(x)((x) & 1) /* Included in system budget */
705
706/* Access Control Services */
707#define PCI_ACS_CAP 0x04/* ACS Capability Register */
708#define PCI_ACS_CAP_VALID0x0001/* ACS Source Validation */
709#define PCI_ACS_CAP_BLOCK0x0002/* ACS Translation Blocking */
710#define PCI_ACS_CAP_REQ_RED0x0004/* ACS P2P Request Redirect */
711#define PCI_ACS_CAP_CMPLT_RED0x0008/* ACS P2P Completion Redirect */
712#define PCI_ACS_CAP_FORWARD0x0010/* ACS Upstream Forwarding */
713#define PCI_ACS_CAP_EGRESS0x0020/* ACS P2P Egress Control */
714#define PCI_ACS_CAP_TRANS0x0040/* ACS Direct Translated P2P */
715#define PCI_ACS_CAP_VECTOR(x)(((x) >> 8) & 0xff)/* Egress Control Vector Size */
716#define PCI_ACS_CTRL0x06/* ACS Control Register */
717#define PCI_ACS_CTRL_VALID0x0001/* ACS Source Validation Enable */
718#define PCI_ACS_CTRL_BLOCK0x0002/* ACS Translation Blocking Enable */
719#define PCI_ACS_CTRL_REQ_RED0x0004/* ACS P2P Request Redirect Enable */
720#define PCI_ACS_CTRL_CMPLT_RED0x0008/* ACS P2P Completion Redirect Enable */
721#define PCI_ACS_CTRL_FORWARD0x0010/* ACS Upstream Forwarding Enable */
722#define PCI_ACS_CTRL_EGRESS0x0020/* ACS P2P Egress Control Enable */
723#define PCI_ACS_CTRL_TRANS0x0040/* ACS Direct Translated P2P Enable */
724#define PCI_ACS_EGRESS_CTRL0x08/* Egress Control Vector */
725
726/* Alternative Routing-ID Interpretation */
727#define PCI_ARI_CAP 0x04/* ARI Capability Register */
728#define PCI_ARI_CAP_MFVC0x0001/* MFVC Function Groups Capability */
729#define PCI_ARI_CAP_ACS0x0002/* ACS Function Groups Capability */
730#define PCI_ARI_CAP_NFN(x)(((x) >> 8) & 0xff)/* Next Function Number */
731#define PCI_ARI_CTRL0x06/* ARI Control Register */
732#define PCI_ARI_CTRL_MFVC0x0001/* MFVC Function Groups Enable */
733#define PCI_ARI_CTRL_ACS0x0002/* ACS Function Groups Enable */
734#define PCI_ARI_CTRL_FG(x)(((x) >> 4) & 7)/* Function Group */
735
736/* Address Translation Service */
737#define PCI_ATS_CAP 0x04/* ATS Capability Register */
738#define PCI_ATS_CAP_IQD(x)((x) & 0x1f)/* Invalidate Queue Depth */
739#define PCI_ATS_CTRL0x06/* ATS Control Register */
740#define PCI_ATS_CTRL_STU(x)((x) & 0x1f)/* Smallest Translation Unit */
741#define PCI_ATS_CTRL_ENABLE0x8000/* ATS Enable */
742
743/* Single Root I/O Virtualization */
744#define PCI_IOV_CAP 0x04/* SR-IOV Capability Register */
745#define PCI_IOV_CAP_VFM0x00000001/* VF Migration Capable */
746#define PCI_IOV_CAP_IMN(x)((x) >> 21)/* VF Migration Interrupt Message Number */
747#define PCI_IOV_CTRL0x08/* SR-IOV Control Register */
748#define PCI_IOV_CTRL_VFE0x0001/* VF Enable */
749#define PCI_IOV_CTRL_VFME0x0002/* VF Migration Enable */
750#define PCI_IOV_CTRL_VFMIE0x0004/* VF Migration Interrupt Enable */
751#define PCI_IOV_CTRL_MSE0x0008/* VF MSE */
752#define PCI_IOV_CTRL_ARI0x0010/* ARI Capable Hierarchy */
753#define PCI_IOV_STATUS0x0a/* SR-IOV Status Register */
754#define PCI_IOV_STATUS_MS0x0001/* VF Migration Status */
755#define PCI_IOV_INITIALVF0x0c/* Number of VFs that are initially associated */
756#define PCI_IOV_TOTALVF0x0e/* Maximum number of VFs that could be associated */
757#define PCI_IOV_NUMVF0x10/* Number of VFs that are available */
758#define PCI_IOV_FDL 0x12/* Function Dependency Link */
759#define PCI_IOV_OFFSET0x14/* First VF Offset */
760#define PCI_IOV_STRIDE0x16/* Routing ID offset from one VF to the next one */
761#define PCI_IOV_DID 0x1a/* VF Device ID */
762#define PCI_IOV_SUPPS0x1c/* Supported Page Sizes */
763#define PCI_IOV_SYSPS0x20/* System Page Size */
764#define PCI_IOV_BAR_BASE0x24/* VF BAR0, VF BAR1, ... VF BAR5 */
765#define PCI_IOV_NUM_BAR6/* Number of VF BARs */
766#define PCI_IOV_MSAO0x3c/* VF Migration State Array Offset */
767#define PCI_IOV_MSA_BIR(x)((x) & 7)/* VF Migration State BIR */
768#define PCI_IOV_MSA_OFFSET(x)((x) & 0xfffffff8)/* VF Migration State Offset */
769
770/*
771 * The PCI interface treats multi-function devices as independent
772 * devices. The slot/function address of each device is encoded
773 * in a single byte as follows:
774 *
775 *7:3 = slot
776 *2:0 = function
777 */
778#define PCI_DEVFN(slot,func)((((slot) & 0x1f) << 3) | ((func) & 0x07))
779#define PCI_SLOT(devfn)(((devfn) >> 3) & 0x1f)
780#define PCI_FUNC(devfn)((devfn) & 0x07)
781
782/* Device classes and subclasses */
783#define PCI_CLASS_NOT_DEFINED0x0000
784#define PCI_CLASS_NOT_DEFINED_VGA0x0001
785
786// values for the class_sub field for class_base = 0x00 (Device was built prior definition of the class code field)
787
788// values for the class_sub field for class_base = 0x01 (Mass Storage Controller)
789#define PCI_BASE_CLASS_STORAGE0x01
790#define PCI_CLASS_STORAGE_SCSI0x0100
791#define PCI_CLASS_STORAGE_IDE0x0101
792#define PCI_CLASS_STORAGE_FLOPPY0x0102
793#define PCI_CLASS_STORAGE_IPI0x0103
794#define PCI_CLASS_STORAGE_RAID0x0104
795#define PCI_CLASS_STORAGE_ATA0x0105
796#define PCI_CLASS_STORAGE_SATA0x0106
797#define PCI_CLASS_STORAGE_SATA_AHCI0x010601
798#define PCI_CLASS_STORAGE_SAS0x0107
799#define PCI_CLASS_STORAGE_OTHER0x0180
800
801// values for the class_sub field for class_base = 0x02 (Network Controller)
802#define PCI_BASE_CLASS_NETWORK0x02
803#define PCI_CLASS_NETWORK_ETHERNET0x0200
804#define PCI_CLASS_NETWORK_TOKEN_RING0x0201
805#define PCI_CLASS_NETWORK_FDDI0x0202
806#define PCI_CLASS_NETWORK_ATM0x0203
807#define PCI_CLASS_NETWORK_ISDN0x0204
808#define PCI_CLASS_NETWORK_OTHER0x0280
809
810// values for the class_sub field for class_base = 0x03 (Display Controller)
811#define PCI_BASE_CLASS_DISPLAY0x03
812#define PCI_CLASS_DISPLAY_VGA0x0300
813#define PCI_CLASS_DISPLAY_XGA0x0301
814#define PCI_CLASS_DISPLAY_3D0x0302
815#define PCI_CLASS_DISPLAY_OTHER0x0380
816
817// values for the class_sub field for class_base = 0x04 (Multimedia Controller)
818#define PCI_BASE_CLASS_MULTIMEDIA0x04
819#define PCI_CLASS_MULTIMEDIA_VIDEO0x0400 /* video */
820#define PCI_CLASS_MULTIMEDIA_AUDIO0x0401 /* audio */
821#define PCI_CLASS_MULTIMEDIA_PHONE0x0402
822#define PCI_CLASS_MULTIMEDIA_AUDIO_DEV0x0403 /* HD audio */
823#define PCI_CLASS_MULTIMEDIA_OTHER0x0480
824
825// values for the class_sub field for class_base = 0x05 (Memory Controller)
826#define PCI_BASE_CLASS_MEMORY0x05
827#define PCI_CLASS_MEMORY_RAM0x0500
828#define PCI_CLASS_MEMORY_FLASH0x0501
829#define PCI_CLASS_MEMORY_OTHER0x0580
830
831// values for the class_sub field for class_base = 0x06 (Bridge Device)
832#define PCI_BASE_CLASS_BRIDGE0x06
833#define PCI_CLASS_BRIDGE_HOST0x0600
834#define PCI_CLASS_BRIDGE_ISA0x0601
835#define PCI_CLASS_BRIDGE_EISA0x0602
836#define PCI_CLASS_BRIDGE_MC0x0603
837#define PCI_CLASS_BRIDGE_PCI0x0604
838#define PCI_CLASS_BRIDGE_PCMCIA0x0605
839#define PCI_CLASS_BRIDGE_NUBUS0x0606
840#define PCI_CLASS_BRIDGE_CARDBUS0x0607
841#define PCI_CLASS_BRIDGE_RACEWAY0x0608
842#define PCI_CLASS_BRIDGE_PCI_SEMI0x0609
843#define PCI_CLASS_BRIDGE_IB_TO_PCI0x060a
844#define PCI_CLASS_BRIDGE_OTHER0x0680
845
846// values for the class_sub field for class_base = 0x07 (Simple Communications Controllers)
847#define PCI_BASE_CLASS_COMMUNICATION0x07
848#define PCI_CLASS_COMMUNICATION_SERIAL0x0700
849#define PCI_CLASS_COMMUNICATION_PARALLEL0x0701
850#define PCI_CLASS_COMMUNICATION_MSERIAL0x0702
851#define PCI_CLASS_COMMUNICATION_MODEM0x0703
852#define PCI_CLASS_COMMUNICATION_OTHER0x0780
853
854// values for the class_sub field for class_base = 0x08 (Base System Peripherals)
855#define PCI_BASE_CLASS_SYSTEM0x08 //
856#define PCI_CLASS_SYSTEM_PIC0x0800 //
857#define PCI_CLASS_SYSTEM_PIC_IOAPIC0x080010
858#define PCI_CLASS_SYSTEM_PIC_IOXAPIC0x080020 // I/O APIC interrupt controller , 32 bye none-prefectable memory.
859#define PCI_CLASS_SYSTEM_DMA0x0801
860#define PCI_CLASS_SYSTEM_TIMER0x0802
861#define PCI_CLASS_SYSTEM_RTC0x0803
862#define PCI_CLASS_SYSTEM_PCI_HOTPLUG0x0804 // HotPlug Controller
863#define PCI_CLASS_SYSTEM_SDHCI0x0805
864#define PCI_CLASS_SYSTEM_OTHER0x0880
865
866// values for the class_sub field for class_base = 0x09 (Input Devices)
867#define PCI_BASE_CLASS_INPUT0x09
868#define PCI_CLASS_INPUT_KEYBOARD0x0900
869#define PCI_CLASS_INPUT_PEN0x0901
870#define PCI_CLASS_INPUT_MOUSE0x0902
871#define PCI_CLASS_INPUT_SCANNER0x0903
872#define PCI_CLASS_INPUT_GAMEPORT0x0904
873#define PCI_CLASS_INPUT_OTHER0x0980
874
875// values for the class_sub field for class_base = 0x0a (Docking Stations)
876#define PCI_BASE_CLASS_DOCKING0x0a
877#define PCI_CLASS_DOCKING_GENERIC0x0a00
878#define PCI_CLASS_DOCKING_OTHER0x0a80
879
880// values for the class_sub field for class_base = 0x0b (processor)
881#define PCI_BASE_CLASS_PROCESSOR0x0b
882#define PCI_CLASS_PROCESSOR_3860x0b00
883#define PCI_CLASS_PROCESSOR_4860x0b01
884#define PCI_CLASS_PROCESSOR_PENTIUM0x0b02
885#define PCI_CLASS_PROCESSOR_ALPHA0x0b10
886#define PCI_CLASS_PROCESSOR_POWERPC0x0b20
887#define PCI_CLASS_PROCESSOR_MIPS0x0b30
888#define PCI_CLASS_PROCESSOR_CO0x0b40 // Co-Processor
889
890// values for the class_sub field for class_base = 0x0c (serial bus controller)
891#define PCI_BASE_CLASS_SERIAL0x0c
892#define PCI_CLASS_SERIAL_FIREWIRE0x0c00 /* FireWire (IEEE 1394) */
893#define PCI_CLASS_SERIAL_FIREWIRE_OHCI0x0c10
894#define PCI_CLASS_SERIAL_ACCESS0x0c01
895#define PCI_CLASS_SERIAL_SSA0x0c02
896#define PCI_CLASS_SERIAL_USB0x0c03 /* Universal Serial Bus */
897#define PCI_IF_UHCI 0x00 /* Universal Host Controller Interface */
898#define PCI_IF_OHCI 0x10 /* Open Host Controller Interface */
899#define PCI_IF_EHCI 0x20 /* Enhanced Host Controller Interface */
900#define PCI_IF_XHCI 0x30 /* Extensible Host Controller Interface */
901#define PCI_CLASS_SERIAL_FIBER0x0c04
902#define PCI_CLASS_SERIAL_SMBUS0x0c05
903#define PCI_CLASS_SERIAL_INFINIBAND0x0c06
904
905// values for the class_sub field for class_base = 0x0d (Wireless Controller)
906#define PCI_BASE_CLASS_WIRELESS0x0d
907#define PCI_CLASS_WIRELESS_IRDA0x0d00
908#define PCI_CLASS_WIRELESS_IR0x0d01
909#define PCI_CLASS_WIRELESS_RF0x0d10
910#define PCI_CLASS_WIRELESS_BLUETOOTH0x0d11
911#define PCI_CLASS_WIRELESS_BROADBAND0x0d12
912#define PCI_CLASS_WIRELESS_80211A0x0d20
913#define PCI_CLASS_WIRELESS_80211B0x0d21
914#define PCI_CLASS_WIRELESS_WHCI0x0d1010
915#define PCI_CLASS_WIRELESS_OTHER0x80
916
917// values for the class_sub field for class_base = 0x0e (Intelligent I/O Controller)
918#define PCI_BASE_CLASS_INTELLIGENT0x0e
919#define PCI_CLASS_INTELLIGENT_I2O0x0e00
920
921// values for the class_sub field for class_base = 0x0f (Satellite Communication Controller)
922#define PCI_BASE_CLASS_SATELLITE0x0f
923#define PCI_CLASS_SATELLITE_TV0x0f00
924#define PCI_CLASS_SATELLITE_AUDIO0x0f01
925#define PCI_CLASS_SATELLITE_VOICE0x0f03
926#define PCI_CLASS_SATELLITE_DATA0x0f04
927
928// values for the class_sub field for class_base = 0x10 (Encryption and decryption controller)
929#define PCI_BASE_CLASS_CRYPT0x10
930#define PCI_CLASS_CRYPT_NETWORK0x1000
931#define PCI_CLASS_CRYPT_ENTERTAINMENT0x1010
932#define PCI_CLASS_CRYPT_OTHER0x1080
933// values for the class_sub field for class_base = 0x12 (Data Acquisition and Signal Processing Controllers)
934#define PCI_BASE_CLASS_SIGNAL0x11
935#define PCI_CLASS_SIGNAL_DPIO0x1100
936#define PCI_CLASS_SIGNAL_PERF_CTR0x1101
937#define PCI_CLASS_SIGNAL_SYNCHRONIZER0x1110
938#define PCI_CLASS_SIGNAL_OTHER0x1180
939
940// values for the class_sub field for class_base = 0xff (Device does not fit any defined class)
941#define PCI_CLASS_OTHERS 0xff
942
943/* Several ID's we need in the library */
944#define PCI_VENDOR_ID_LOGITECH 0x046d
945#define PCI_VENDOR_ID_WACOM 0x056a
946#define PCI_VENDOR_ID_COMPAQ 0x0e11
947#define PCI_VENDOR_ID_NCR 0x1000
948#define PCI_VENDOR_ID_ATI 0x1002
949#define PCI_VENDOR_ID_NS 0x100b
950#define PCI_VENDOR_ID_TSENG 0x100c
951#define PCI_VENDOR_ID_WEITEK 0x100e
952#define PCI_VENDOR_ID_DEC 0x1011
953#define PCI_VENDOR_ID_CIRRUS 0x1013
954#define PCI_VENDOR_ID_IBM 0x1014
955#define PCI_VENDOR_ID_AMD 0x1022
956#define PCI_VENDOR_ID_DELL 0x1028
957#define PCI_VENDOR_ID_MATROX 0x102B
958#define PCI_VENDOR_ID_NEC 0x1033
959#define PCI_VENDOR_ID_FD 0x1036
960#define PCI_VENDOR_ID_SI 0x1039
961#define PCI_VENDOR_ID_HP 0x103c
962#define PCI_VENDOR_ID_ASUS 0x1043
963#define PCI_VENDOR_ID_TI 0x104c // Texas Istruments
964#define PCI_VENDOR_ID_SONY 0x104d
965#define PCI_VENDOR_ID_HITACHI 0x1054
966#define PCI_VENDOR_ID_MOTOROLA 0x1057
967#define PCI_VENDOR_ID_APPLE 0x106b
968#define PCI_VENDOR_ID_SUN 0x108e
969#define PCI_VENDOR_ID_CMD 0x1095
970#define PCI_VENDOR_ID_NVIDIA 0x10de
971#define PCI_VENDOR_ID_REALTEK 0x10ec
972#define PCI_VENDOR_ID_VIA 0x1106
973#define PCI_VENDOR_ID_DLINK 0x1186
974#define PCI_VENDOR_ID_MARVELL 0x11ab
975#define PCI_VENDOR_ID_NETGEAR 0x1385
976#define PCI_VENDOR_ID_IOMEGA 0x13ca
977#define PCI_VENDOR_ID_SAMSUNG 0x144d
978#define PCI_VENDOR_ID_GIGABYTE 0x1458
979#define PCI_VENDOR_ID_BROADCOM 0x14e4
980#define PCI_VENDOR_ID_ATHEROS 0x168c
981#define PCI_VENDOR_ID_LINKSYS 0x1737
982#define PCI_VENDOR_ID_BELKIN 0x1799
983#define PCI_VENDOR_ID_LENOVO 0x17aa
984#define PCI_VENDOR_ID_RALINK 0x1814
985#define PCI_VENDOR_ID_SITECOM 0x182d
986#define PCI_VENDOR_ID_JMICRON 0x197B
987#define PCI_VENDOR_ID_OCZ 0x1b85
988#define PCI_VENDOR_ID_INTEL 0x8086
989
990#endif /* !__LIBSAIO_PCI_H */
991

Archive Download this file

Revision: 2323