Subversion Repositories Kolibri OS

Rev

Rev 2161 | Rev 3031 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1964 serge 1
/*
2
 *	pci.h
3
 *
4
 *	PCI defines and function prototypes
5
 *	Copyright 1994, Drew Eckhardt
6
 *	Copyright 1997--1999 Martin Mares 
7
 *
8
 *	For more information, please consult the following manuals (look at
9
 *	http://www.pcisig.com/ for how to get them):
10
 *
11
 *	PCI BIOS Specification
12
 *	PCI Local Bus Specification
13
 *	PCI to PCI Bridge Specification
14
 *	PCI System Design Guide
15
 */
1408 serge 16
 
1970 serge 17
#ifndef LINUX_PCI_H
18
#define LINUX_PCI_H
19
 
1408 serge 20
#include 
21
#include 
2161 serge 22
#include 	/* The pci register defines */
23
#include 
1408 serge 24
 
1628 serge 25
 
2161 serge 26
#define PCI_CFG_SPACE_SIZE      256
27
#define PCI_CFG_SPACE_EXP_SIZE  4096
1970 serge 28
 
2161 serge 29
 
1408 serge 30
#define PCI_ANY_ID (~0)
31
 
32
 
33
#define PCI_CLASS_NOT_DEFINED           0x0000
34
#define PCI_CLASS_NOT_DEFINED_VGA       0x0001
35
 
36
#define PCI_BASE_CLASS_STORAGE          0x01
37
#define PCI_CLASS_STORAGE_SCSI          0x0100
38
#define PCI_CLASS_STORAGE_IDE           0x0101
39
#define PCI_CLASS_STORAGE_FLOPPY        0x0102
40
#define PCI_CLASS_STORAGE_IPI           0x0103
41
#define PCI_CLASS_STORAGE_RAID          0x0104
42
#define PCI_CLASS_STORAGE_SATA          0x0106
43
#define PCI_CLASS_STORAGE_SATA_AHCI     0x010601
44
#define PCI_CLASS_STORAGE_SAS           0x0107
45
#define PCI_CLASS_STORAGE_OTHER         0x0180
46
 
47
#define PCI_BASE_CLASS_NETWORK          0x02
48
#define PCI_CLASS_NETWORK_ETHERNET      0x0200
49
#define PCI_CLASS_NETWORK_TOKEN_RING    0x0201
50
#define PCI_CLASS_NETWORK_FDDI          0x0202
51
#define PCI_CLASS_NETWORK_ATM           0x0203
52
#define PCI_CLASS_NETWORK_OTHER         0x0280
53
 
54
#define PCI_BASE_CLASS_DISPLAY          0x03
55
#define PCI_CLASS_DISPLAY_VGA           0x0300
56
#define PCI_CLASS_DISPLAY_XGA           0x0301
57
#define PCI_CLASS_DISPLAY_3D            0x0302
58
#define PCI_CLASS_DISPLAY_OTHER         0x0380
59
 
60
#define PCI_BASE_CLASS_MULTIMEDIA       0x04
61
#define PCI_CLASS_MULTIMEDIA_VIDEO      0x0400
62
#define PCI_CLASS_MULTIMEDIA_AUDIO      0x0401
63
#define PCI_CLASS_MULTIMEDIA_PHONE      0x0402
64
#define PCI_CLASS_MULTIMEDIA_OTHER      0x0480
65
 
66
#define PCI_BASE_CLASS_MEMORY           0x05
67
#define PCI_CLASS_MEMORY_RAM            0x0500
68
#define PCI_CLASS_MEMORY_FLASH          0x0501
69
#define PCI_CLASS_MEMORY_OTHER          0x0580
70
 
71
#define PCI_BASE_CLASS_BRIDGE           0x06
72
#define PCI_CLASS_BRIDGE_HOST           0x0600
73
#define PCI_CLASS_BRIDGE_ISA            0x0601
74
#define PCI_CLASS_BRIDGE_EISA           0x0602
75
#define PCI_CLASS_BRIDGE_MC             0x0603
76
#define PCI_CLASS_BRIDGE_PCI            0x0604
77
#define PCI_CLASS_BRIDGE_PCMCIA         0x0605
78
#define PCI_CLASS_BRIDGE_NUBUS          0x0606
79
#define PCI_CLASS_BRIDGE_CARDBUS        0x0607
80
#define PCI_CLASS_BRIDGE_RACEWAY        0x0608
81
#define PCI_CLASS_BRIDGE_OTHER          0x0680
82
 
83
#define PCI_BASE_CLASS_COMMUNICATION    0x07
84
#define PCI_CLASS_COMMUNICATION_SERIAL  0x0700
85
#define PCI_CLASS_COMMUNICATION_PARALLEL 0x0701
86
#define PCI_CLASS_COMMUNICATION_MULTISERIAL 0x0702
87
#define PCI_CLASS_COMMUNICATION_MODEM   0x0703
88
#define PCI_CLASS_COMMUNICATION_OTHER   0x0780
89
 
90
#define PCI_BASE_CLASS_SYSTEM           0x08
91
#define PCI_CLASS_SYSTEM_PIC            0x0800
92
#define PCI_CLASS_SYSTEM_PIC_IOAPIC     0x080010
93
#define PCI_CLASS_SYSTEM_PIC_IOXAPIC    0x080020
94
#define PCI_CLASS_SYSTEM_DMA            0x0801
95
#define PCI_CLASS_SYSTEM_TIMER          0x0802
96
#define PCI_CLASS_SYSTEM_RTC            0x0803
97
#define PCI_CLASS_SYSTEM_PCI_HOTPLUG    0x0804
98
#define PCI_CLASS_SYSTEM_SDHCI          0x0805
99
#define PCI_CLASS_SYSTEM_OTHER          0x0880
100
 
101
#define PCI_BASE_CLASS_INPUT            0x09
102
#define PCI_CLASS_INPUT_KEYBOARD        0x0900
103
#define PCI_CLASS_INPUT_PEN             0x0901
104
#define PCI_CLASS_INPUT_MOUSE           0x0902
105
#define PCI_CLASS_INPUT_SCANNER         0x0903
106
#define PCI_CLASS_INPUT_GAMEPORT        0x0904
107
#define PCI_CLASS_INPUT_OTHER           0x0980
108
 
109
#define PCI_BASE_CLASS_DOCKING          0x0a
110
#define PCI_CLASS_DOCKING_GENERIC       0x0a00
111
#define PCI_CLASS_DOCKING_OTHER         0x0a80
112
 
113
#define PCI_BASE_CLASS_PROCESSOR        0x0b
114
#define PCI_CLASS_PROCESSOR_386         0x0b00
115
#define PCI_CLASS_PROCESSOR_486         0x0b01
116
#define PCI_CLASS_PROCESSOR_PENTIUM     0x0b02
117
#define PCI_CLASS_PROCESSOR_ALPHA       0x0b10
118
#define PCI_CLASS_PROCESSOR_POWERPC     0x0b20
119
#define PCI_CLASS_PROCESSOR_MIPS        0x0b30
120
#define PCI_CLASS_PROCESSOR_CO          0x0b40
121
 
122
#define PCI_BASE_CLASS_SERIAL           0x0c
123
#define PCI_CLASS_SERIAL_FIREWIRE       0x0c00
124
#define PCI_CLASS_SERIAL_FIREWIRE_OHCI  0x0c0010
125
#define PCI_CLASS_SERIAL_ACCESS         0x0c01
126
#define PCI_CLASS_SERIAL_SSA            0x0c02
127
#define PCI_CLASS_SERIAL_USB            0x0c03
128
#define PCI_CLASS_SERIAL_USB_UHCI       0x0c0300
129
#define PCI_CLASS_SERIAL_USB_OHCI       0x0c0310
130
#define PCI_CLASS_SERIAL_USB_EHCI       0x0c0320
131
#define PCI_CLASS_SERIAL_FIBER          0x0c04
132
#define PCI_CLASS_SERIAL_SMBUS          0x0c05
133
 
134
#define PCI_BASE_CLASS_WIRELESS                 0x0d
135
#define PCI_CLASS_WIRELESS_RF_CONTROLLER        0x0d10
136
#define PCI_CLASS_WIRELESS_WHCI                 0x0d1010
137
 
138
#define PCI_BASE_CLASS_INTELLIGENT      0x0e
139
#define PCI_CLASS_INTELLIGENT_I2O       0x0e00
140
 
141
#define PCI_BASE_CLASS_SATELLITE        0x0f
142
#define PCI_CLASS_SATELLITE_TV          0x0f00
143
#define PCI_CLASS_SATELLITE_AUDIO       0x0f01
144
#define PCI_CLASS_SATELLITE_VOICE       0x0f03
145
#define PCI_CLASS_SATELLITE_DATA        0x0f04
146
 
147
#define PCI_BASE_CLASS_CRYPT            0x10
148
#define PCI_CLASS_CRYPT_NETWORK         0x1000
149
#define PCI_CLASS_CRYPT_ENTERTAINMENT   0x1001
150
#define PCI_CLASS_CRYPT_OTHER           0x1080
151
 
152
#define PCI_BASE_CLASS_SIGNAL_PROCESSING 0x11
153
#define PCI_CLASS_SP_DPIO               0x1100
154
#define PCI_CLASS_SP_OTHER              0x1180
155
 
156
#define PCI_CLASS_OTHERS                0xff
157
 
158
 
159
 
1964 serge 160
 
161
 
1408 serge 162
#define PCI_MAP_IS_IO(b)  ((b) & PCI_MAP_IO)
163
#define PCI_MAP_IS_MEM(b)   (!PCI_MAP_IS_IO(b))
164
 
165
#define PCI_MAP_IS64BITMEM(b)   \
166
    (((b) & PCI_MAP_MEMORY_TYPE_MASK) == PCI_MAP_MEMORY_TYPE_64BIT)
167
 
168
#define PCIGETMEMORY(b)   ((b) & PCI_MAP_MEMORY_ADDRESS_MASK)
169
#define PCIGETMEMORY64HIGH(b)   (*((CARD32*)&b + 1))
170
#define PCIGETMEMORY64(b)   \
171
    (PCIGETMEMORY(b) | ((CARD64)PCIGETMEMORY64HIGH(b) << 32))
172
 
173
#define PCI_MAP_IO_ADDRESS_MASK       0xfffffffc
174
 
175
#define PCIGETIO(b)     ((b) & PCI_MAP_IO_ADDRESS_MASK)
176
 
177
#define PCI_MAP_ROM_DECODE_ENABLE     0x00000001
178
#define PCI_MAP_ROM_ADDRESS_MASK      0xfffff800
179
 
180
#define PCIGETROM(b)        ((b) & PCI_MAP_ROM_ADDRESS_MASK)
181
 
182
 
183
#ifndef PCI_DOM_MASK
184
# define PCI_DOM_MASK 0x0ffu
185
#endif
186
#define PCI_DOMBUS_MASK (((PCI_DOM_MASK) << 8) | 0x0ffu)
187
 
188
#define PCI_MAKE_TAG(b,d,f)  ((((b) & (PCI_DOMBUS_MASK)) << 16) | \
189
                  (((d) & 0x00001fu) << 11) | \
190
                  (((f) & 0x000007u) << 8))
191
 
192
#define PCI_BUS_FROM_TAG(tag)  (((tag) >> 16) & (PCI_DOMBUS_MASK))
193
#define PCI_DEV_FROM_TAG(tag)  (((tag) & 0x0000f800u) >> 11)
194
#define PCI_FUNC_FROM_TAG(tag) (((tag) & 0x00000700u) >> 8)
195
#define PCI_DFN_FROM_TAG(tag)  (((tag) & 0x0000ff00u) >> 8)
196
 
2161 serge 197
/*
198
 * The PCI interface treats multi-function devices as independent
199
 * devices.  The slot/function address of each device is encoded
200
 * in a single byte as follows:
201
 *
202
 *	7:3 = slot
203
 *	2:0 = function
204
 */
1408 serge 205
#define PCI_DEVFN(slot, func)  ((((slot) & 0x1f) << 3) | ((func) & 0x07))
206
#define PCI_SLOT(devfn)        (((devfn) >> 3) & 0x1f)
207
#define PCI_FUNC(devfn)        ((devfn) & 0x07)
208
 
209
 
210
 
211
typedef unsigned int PCITAG;
212
 
213
extern inline PCITAG
214
pciTag(int busnum, int devnum, int funcnum)
215
{
216
    return(PCI_MAKE_TAG(busnum,devnum,funcnum));
217
}
218
 
2161 serge 219
/* pci_slot represents a physical slot */
220
struct pci_slot {
221
	struct pci_bus *bus;		/* The bus this slot is on */
222
	struct list_head list;		/* node in list of slots on this bus */
223
	struct hotplug_slot *hotplug;	/* Hotplug info (migrate over time) */
224
	unsigned char number;		/* PCI_SLOT(pci_dev->devfn) */
225
};
1627 serge 226
 
2161 serge 227
/* File state for mmap()s on /proc/bus/pci/X/Y */
228
enum pci_mmap_state {
229
	pci_mmap_io,
230
	pci_mmap_mem
1964 serge 231
};
232
 
2161 serge 233
/* This defines the direction arg to the DMA mapping routines. */
234
#define PCI_DMA_BIDIRECTIONAL	0
235
#define PCI_DMA_TODEVICE	1
236
#define PCI_DMA_FROMDEVICE	2
237
#define PCI_DMA_NONE		3
238
 
1408 serge 239
/*
2161 serge 240
 *  For PCI devices, the region numbers are assigned this way:
1627 serge 241
 */
2161 serge 242
enum {
243
    /* #0-5: standard PCI resources */
244
    PCI_STD_RESOURCES,
245
    PCI_STD_RESOURCE_END = 5,
1627 serge 246
 
2161 serge 247
    /* #6: expansion ROM resource */
248
    PCI_ROM_RESOURCE,
1627 serge 249
 
2161 serge 250
    /* device specific resources */
251
#ifdef CONFIG_PCI_IOV
252
    PCI_IOV_RESOURCES,
253
    PCI_IOV_RESOURCE_END = PCI_IOV_RESOURCES + PCI_SRIOV_NUM_BARS - 1,
254
#endif
1627 serge 255
 
2161 serge 256
    /* resources assigned to buses behind the bridge */
257
#define PCI_BRIDGE_RESOURCE_NUM 4
1627 serge 258
 
2161 serge 259
    PCI_BRIDGE_RESOURCES,
260
    PCI_BRIDGE_RESOURCE_END = PCI_BRIDGE_RESOURCES +
261
                  PCI_BRIDGE_RESOURCE_NUM - 1,
1627 serge 262
 
2161 serge 263
    /* total resources associated with a PCI device */
264
    PCI_NUM_RESOURCES,
1627 serge 265
 
2161 serge 266
    /* preserve this for compatibility */
267
    DEVICE_COUNT_RESOURCE
268
};
1627 serge 269
 
2161 serge 270
typedef int __bitwise pci_power_t;
1627 serge 271
 
2161 serge 272
#define PCI_D0		((pci_power_t __force) 0)
273
#define PCI_D1		((pci_power_t __force) 1)
274
#define PCI_D2		((pci_power_t __force) 2)
275
#define PCI_D3hot	((pci_power_t __force) 3)
276
#define PCI_D3cold	((pci_power_t __force) 4)
277
#define PCI_UNKNOWN	((pci_power_t __force) 5)
278
#define PCI_POWER_ERROR	((pci_power_t __force) -1)
279
/** The pci_channel state describes connectivity between the CPU and
280
 *  the pci device.  If some PCI bus between here and the pci device
281
 *  has crashed or locked up, this info is reflected here.
282
 */
283
typedef unsigned int __bitwise pci_channel_state_t;
1964 serge 284
 
2161 serge 285
enum pci_channel_state {
286
	/* I/O channel is in normal state */
287
	pci_channel_io_normal = (__force pci_channel_state_t) 1,
1964 serge 288
 
2161 serge 289
	/* I/O to channel is blocked */
290
	pci_channel_io_frozen = (__force pci_channel_state_t) 2,
1964 serge 291
 
2161 serge 292
	/* PCI card is dead */
293
	pci_channel_io_perm_failure = (__force pci_channel_state_t) 3,
294
};
295
typedef unsigned short __bitwise pci_bus_flags_t;
296
enum pci_bus_flags {
297
    PCI_BUS_FLAGS_NO_MSI   = (__force pci_bus_flags_t) 1,
298
    PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2,
299
};
1964 serge 300
 
2161 serge 301
/* Based on the PCI Hotplug Spec, but some values are made up by us */
302
enum pci_bus_speed {
303
	PCI_SPEED_33MHz			= 0x00,
304
	PCI_SPEED_66MHz			= 0x01,
305
	PCI_SPEED_66MHz_PCIX		= 0x02,
306
	PCI_SPEED_100MHz_PCIX		= 0x03,
307
	PCI_SPEED_133MHz_PCIX		= 0x04,
308
	PCI_SPEED_66MHz_PCIX_ECC	= 0x05,
309
	PCI_SPEED_100MHz_PCIX_ECC	= 0x06,
310
	PCI_SPEED_133MHz_PCIX_ECC	= 0x07,
311
	PCI_SPEED_66MHz_PCIX_266	= 0x09,
312
	PCI_SPEED_100MHz_PCIX_266	= 0x0a,
313
	PCI_SPEED_133MHz_PCIX_266	= 0x0b,
314
	AGP_UNKNOWN			= 0x0c,
315
	AGP_1X				= 0x0d,
316
	AGP_2X				= 0x0e,
317
	AGP_4X				= 0x0f,
318
	AGP_8X				= 0x10,
319
	PCI_SPEED_66MHz_PCIX_533	= 0x11,
320
	PCI_SPEED_100MHz_PCIX_533	= 0x12,
321
	PCI_SPEED_133MHz_PCIX_533	= 0x13,
322
	PCIE_SPEED_2_5GT		= 0x14,
323
	PCIE_SPEED_5_0GT		= 0x15,
324
	PCIE_SPEED_8_0GT		= 0x16,
325
	PCI_SPEED_UNKNOWN		= 0xff,
326
};
1408 serge 327
 
328
/*
329
 * The pci_dev structure is used to describe PCI devices.
330
 */
331
struct pci_dev {
2161 serge 332
    struct list_head bus_list;  /* node in per-bus list */
333
    struct pci_bus  *bus;       /* bus this device is on */
334
    struct pci_bus  *subordinate;   /* bus this device bridges to */
1408 serge 335
 
2161 serge 336
	void		*sysdata;	/* hook for sys-specific extension */
1408 serge 337
//    struct proc_dir_entry *procent; /* device entry in /proc/bus/pci */
2161 serge 338
	struct pci_slot	*slot;		/* Physical slot this device is in */
339
    u32_t           busnr;
340
	unsigned int	devfn;		/* encoded device & function index */
341
	unsigned short	vendor;
342
	unsigned short	device;
343
	unsigned short	subsystem_vendor;
344
	unsigned short	subsystem_device;
345
	unsigned int	class;		/* 3 bytes: (base,sub,prog-if) */
346
	u8		revision;	/* PCI revision, low byte of class word */
347
	u8		hdr_type;	/* PCI header type (`multi' flag masked out) */
348
	u8		pcie_cap;	/* PCI-E capability offset */
349
	u8		pcie_type;	/* PCI-E device/port type */
350
	u8		rom_base_reg;	/* which config register controls the ROM */
351
	u8		pin;  		/* which interrupt pin this device uses */
1408 serge 352
 
353
 //   struct pci_driver *driver;  /* which driver has allocated this device */
1964 serge 354
    uint64_t     dma_mask;   /* Mask of the bits of bus address this
1408 serge 355
                       device implements.  Normally this is
356
                       0xffffffff.  You only need to change
357
                       this if your device has broken DMA
358
                       or supports 64-bit transfers.  */
359
 
360
 //   struct device_dma_parameters dma_parms;
361
 
2161 serge 362
	pci_power_t     current_state;  /* Current operating state. In ACPI-speak,
363
					   this is D0-D3, D0 being fully functional,
364
					   and D3 being off. */
365
	int		pm_cap;		/* PM capability offset in the
366
					   configuration space */
1408 serge 367
    unsigned int    pme_support:5;  /* Bitmask of states from which PME#
368
                       can be generated */
2161 serge 369
	unsigned int	pme_interrupt:1;
1408 serge 370
    unsigned int    d1_support:1;   /* Low power state D1 is supported */
371
    unsigned int    d2_support:1;   /* Low power state D2 is supported */
372
    unsigned int    no_d1d2:1;  /* Only allow D0 and D3 */
2161 serge 373
	unsigned int	mmio_always_on:1;	/* disallow turning off io/mem
374
						   decoding during bar sizing */
375
	unsigned int	wakeup_prepared:1;
376
	unsigned int	d3_delay;	/* D3->D0 transition time in ms */
1408 serge 377
 
2161 serge 378
 
379
	pci_channel_state_t error_state;	/* current connectivity state */
1430 serge 380
    struct  device  dev;        /* Generic device interface */
2161 serge 381
    struct acpi_device *acpi_dev;
382
    int     cfg_size;   /* Size of configuration space */
1408 serge 383
 
384
    /*
385
     * Instead of touching interrupt line and base address registers
386
     * directly, use the values stored here. They might be different!
387
     */
388
    unsigned int    irq;
389
    struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */
2161 serge 390
	resource_size_t	fw_addr[DEVICE_COUNT_RESOURCE]; /* FW-assigned addr */
1408 serge 391
 
392
    /* These fields are used by common fixups */
393
    unsigned int    transparent:1;  /* Transparent PCI bridge */
394
    unsigned int    multifunction:1;/* Part of multi-function device */
395
    /* keep track of device state */
396
    unsigned int    is_added:1;
397
    unsigned int    is_busmaster:1; /* device is busmaster */
398
    unsigned int    no_msi:1;   /* device may not use msi */
399
    unsigned int    block_ucfg_access:1;    /* userspace config space access is blocked */
400
    unsigned int    broken_parity_status:1; /* Device generates false positive parity */
401
    unsigned int    irq_reroute_variant:2;  /* device needs IRQ rerouting variant */
402
    unsigned int    msi_enabled:1;
403
    unsigned int    msix_enabled:1;
2161 serge 404
	unsigned int	ari_enabled:1;	/* ARI forwarding */
1408 serge 405
    unsigned int    is_managed:1;
2161 serge 406
	unsigned int	is_pcie:1;	/* Obsolete. Will be removed.
407
					   Use pci_is_pcie() instead */
408
	unsigned int    needs_freset:1; /* Dev requires fundamental reset */
1408 serge 409
    unsigned int    state_saved:1;
410
    unsigned int    is_physfn:1;
411
    unsigned int    is_virtfn:1;
2161 serge 412
	unsigned int	reset_fn:1;
413
	unsigned int    is_hotplug_bridge:1;
1964 serge 414
//    pci_dev_flags_t dev_flags;
415
//    atomic_t    enable_cnt;   /* pci_enable_device has been called */
1408 serge 416
 
417
//    u32     saved_config_space[16]; /* config space saved at suspend time */
418
//    struct hlist_head saved_cap_space;
419
//    struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */
1964 serge 420
//    int rom_attr_enabled;       /* has display of the rom attribute been enabled? */
1408 serge 421
//    struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */
422
//    struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */
423
};
424
 
425
#define pci_resource_start(dev, bar)    ((dev)->resource[(bar)].start)
426
#define pci_resource_end(dev, bar)      ((dev)->resource[(bar)].end)
427
#define pci_resource_flags(dev, bar)    ((dev)->resource[(bar)].flags)
428
#define pci_resource_len(dev,bar) \
429
        ((pci_resource_start((dev), (bar)) == 0 &&      \
430
          pci_resource_end((dev), (bar)) ==             \
431
          pci_resource_start((dev), (bar))) ? 0 :       \
432
                                                        \
433
         (pci_resource_end((dev), (bar)) -              \
434
          pci_resource_start((dev), (bar)) + 1))
435
 
436
 
2161 serge 437
struct pci_bus {
438
    struct list_head node;      /* node in list of buses */
439
    struct pci_bus  *parent;    /* parent bus this bridge is on */
440
    struct list_head children;  /* list of child buses */
441
    struct list_head devices;   /* list of devices on this bus */
442
    struct pci_dev  *self;      /* bridge device as seen by parent */
443
    struct list_head slots;     /* list of slots on this bus */
444
    struct resource *resource[PCI_BRIDGE_RESOURCE_NUM];
445
    struct list_head resources; /* address space routed to this bus */
1964 serge 446
 
2161 serge 447
    struct pci_ops  *ops;       /* configuration access functions */
448
    void        *sysdata;   /* hook for sys-specific extension */
449
    struct proc_dir_entry *procdir; /* directory entry in /proc/bus/pci */
1964 serge 450
 
2161 serge 451
    unsigned char   number;     /* bus number */
452
    unsigned char   primary;    /* number of primary bridge */
453
    unsigned char   secondary;  /* number of secondary bridge */
454
    unsigned char   subordinate;    /* max number of subordinate buses */
455
    unsigned char   max_bus_speed;  /* enum pci_bus_speed */
456
    unsigned char   cur_bus_speed;  /* enum pci_bus_speed */
457
 
458
    char        name[48];
459
 
460
    unsigned short  bridge_ctl; /* manage NO_ISA/FBB/et al behaviors */
461
    pci_bus_flags_t bus_flags;  /* Inherited by child busses */
462
    struct device       *bridge;
463
    struct device       dev;
464
    struct bin_attribute    *legacy_io; /* legacy I/O for this bus */
465
    struct bin_attribute    *legacy_mem; /* legacy mem */
466
    unsigned int        is_added:1;
467
};
468
 
469
 
470
#define pci_bus_b(n)    list_entry(n, struct pci_bus, node)
471
#define to_pci_bus(n)   container_of(n, struct pci_bus, dev)
472
#define pci_dev_b(n)    list_entry(n, struct pci_dev, bus_list)
473
#define to_pci_dev(n) container_of(n, struct pci_dev, dev)
474
#define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL)
475
 
476
 
477
/* Low-level architecture-dependent routines */
478
 
479
struct pci_sysdata {
480
        int             domain;         /* PCI domain */
481
        int             node;           /* NUMA node */
482
};
483
 
484
 
485
#define pci_bus_b(n)    list_entry(n, struct pci_bus, node)
486
#define to_pci_bus(n)   container_of(n, struct pci_bus, dev)
487
 
488
/*
489
 * Returns true if the pci bus is root (behind host-pci bridge),
490
 * false otherwise
491
 */
492
static inline bool pci_is_root_bus(struct pci_bus *pbus)
493
{
494
    return !(pbus->parent);
495
}
496
 
497
struct pci_bus *
498
pci_find_next_bus(const struct pci_bus *from);
499
 
500
 
501
  /*
502
 * Error values that may be returned by PCI functions.
503
 */
504
#define PCIBIOS_SUCCESSFUL      0x00
505
#define PCIBIOS_FUNC_NOT_SUPPORTED  0x81
506
#define PCIBIOS_BAD_VENDOR_ID       0x83
507
#define PCIBIOS_DEVICE_NOT_FOUND    0x86
508
#define PCIBIOS_BAD_REGISTER_NUMBER 0x87
509
#define PCIBIOS_SET_FAILED      0x88
510
#define PCIBIOS_BUFFER_TOO_SMALL    0x89
511
 
512
/* Low-level architecture-dependent routines */
513
 
514
struct pci_ops {
515
    int (*read)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val);
516
    int (*write)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val);
517
};
518
 
519
 
520
enum pci_bar_type {
521
    pci_bar_unknown,    /* Standard PCI BAR probe */
522
    pci_bar_io,     /* An io port BAR */
523
    pci_bar_mem32,      /* A 32-bit memory BAR */
524
    pci_bar_mem64,      /* A 64-bit memory BAR */
525
};
526
 
527
/*
528
 * PCI domain support.  Sometimes called PCI segment (eg by ACPI),
529
 * a PCI domain is defined to be a set of PCI busses which share
530
 * configuration space.
531
 */
532
#ifdef CONFIG_PCI_DOMAINS
533
extern int pci_domains_supported;
534
#else
535
enum { pci_domains_supported = 0 };
536
static inline int pci_domain_nr(struct pci_bus *bus)
537
{
538
    return 0;
539
}
540
 
541
static inline int pci_proc_domain(struct pci_bus *bus)
542
{
543
    return 0;
544
}
545
#endif /* CONFIG_PCI_DOMAINS */
546
 
547
/**
548
 * pci_pcie_cap - get the saved PCIe capability offset
549
 * @dev: PCI device
550
 *
551
 * PCIe capability offset is calculated at PCI device initialization
552
 * time and saved in the data structure. This function returns saved
553
 * PCIe capability offset. Using this instead of pci_find_capability()
554
 * reduces unnecessary search in the PCI configuration space. If you
555
 * need to calculate PCIe capability offset from raw device for some
556
 * reasons, please use pci_find_capability() instead.
557
 */
558
static inline int pci_pcie_cap(struct pci_dev *dev)
559
{
560
    return dev->pcie_cap;
561
}
562
 
563
/**
564
 * pci_is_pcie - check if the PCI device is PCI Express capable
565
 * @dev: PCI device
566
 *
567
 * Retrun true if the PCI device is PCI Express capable, false otherwise.
568
 */
569
static inline bool pci_is_pcie(struct pci_dev *dev)
570
{
571
    return !!pci_pcie_cap(dev);
572
}
573
 
574
static inline int pci_iov_init(struct pci_dev *dev)
575
{
576
    return -ENODEV;
577
}
578
static inline void pci_iov_release(struct pci_dev *dev)
579
 
580
{}
581
 
582
static inline int pci_iov_resource_bar(struct pci_dev *dev, int resno,
583
                       enum pci_bar_type *type)
584
{
585
    return 0;
586
}
587
static inline void pci_restore_iov_state(struct pci_dev *dev)
588
{
589
}
590
static inline int pci_iov_bus_range(struct pci_bus *bus)
591
{
592
    return 0;
593
}
594
 
595
static inline int pci_enable_ats(struct pci_dev *dev, int ps)
596
{
597
    return -ENODEV;
598
}
599
static inline void pci_disable_ats(struct pci_dev *dev)
600
{
601
}
602
static inline int pci_ats_queue_depth(struct pci_dev *dev)
603
{
604
    return -ENODEV;
605
}
606
static inline int pci_ats_enabled(struct pci_dev *dev)
607
{
608
    return 0;
609
}
610
 
611
int pci_setup_device(struct pci_dev *dev);
612
int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
613
         struct resource *res, unsigned int reg);
614
int pci_resource_bar(struct pci_dev *dev, int resno,
615
         enum pci_bar_type *type);
616
int pci_bus_add_child(struct pci_bus *bus);
617
unsigned int pci_scan_child_bus(struct pci_bus *bus);
618
 
619
 
1408 serge 620
typedef struct
621
{
622
    struct list_head    link;
623
    struct pci_dev      pci_dev;
624
}pci_dev_t;
625
 
626
int enum_pci_devices(void);
627
 
2967 Serge 628
const struct pci_device_id*
629
find_pci_device(pci_dev_t* pdev, const struct pci_device_id *idlist);
1408 serge 630
 
631
#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
632
 
633
int pci_set_dma_mask(struct pci_dev *dev, u64 mask);
634
 
2967 Serge 635
struct pci_dev *pci_get_bus_and_slot(unsigned int bus, unsigned int devfn);
636
struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from);
1408 serge 637
 
2967 Serge 638
void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size);
639
 
1964 serge 640
#define pci_name(x) "radeon"
1631 serge 641
 
1408 serge 642
#endif //__PCI__H__
643
 
644