diff options
Diffstat (limited to 'include/linux/pci.h')
| -rw-r--r-- | include/linux/pci.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h index de690ca73d58..0a44072383ec 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
| @@ -78,6 +78,23 @@ typedef int __bitwise pci_power_t; | |||
| 78 | #define PCI_UNKNOWN ((pci_power_t __force) 5) | 78 | #define PCI_UNKNOWN ((pci_power_t __force) 5) |
| 79 | #define PCI_POWER_ERROR ((pci_power_t __force) -1) | 79 | #define PCI_POWER_ERROR ((pci_power_t __force) -1) |
| 80 | 80 | ||
| 81 | /** The pci_channel state describes connectivity between the CPU and | ||
| 82 | * the pci device. If some PCI bus between here and the pci device | ||
| 83 | * has crashed or locked up, this info is reflected here. | ||
| 84 | */ | ||
| 85 | typedef unsigned int __bitwise pci_channel_state_t; | ||
| 86 | |||
| 87 | enum pci_channel_state { | ||
| 88 | /* I/O channel is in normal state */ | ||
| 89 | pci_channel_io_normal = (__force pci_channel_state_t) 1, | ||
| 90 | |||
| 91 | /* I/O to channel is blocked */ | ||
| 92 | pci_channel_io_frozen = (__force pci_channel_state_t) 2, | ||
| 93 | |||
| 94 | /* PCI card is dead */ | ||
| 95 | pci_channel_io_perm_failure = (__force pci_channel_state_t) 3, | ||
| 96 | }; | ||
| 97 | |||
| 81 | /* | 98 | /* |
| 82 | * The pci_dev structure is used to describe PCI devices. | 99 | * The pci_dev structure is used to describe PCI devices. |
| 83 | */ | 100 | */ |
| @@ -98,6 +115,7 @@ struct pci_dev { | |||
| 98 | unsigned int class; /* 3 bytes: (base,sub,prog-if) */ | 115 | unsigned int class; /* 3 bytes: (base,sub,prog-if) */ |
| 99 | u8 hdr_type; /* PCI header type (`multi' flag masked out) */ | 116 | u8 hdr_type; /* PCI header type (`multi' flag masked out) */ |
| 100 | u8 rom_base_reg; /* which config register controls the ROM */ | 117 | u8 rom_base_reg; /* which config register controls the ROM */ |
| 118 | u8 pin; /* which interrupt pin this device uses */ | ||
| 101 | 119 | ||
| 102 | struct pci_driver *driver; /* which driver has allocated this device */ | 120 | struct pci_driver *driver; /* which driver has allocated this device */ |
| 103 | u64 dma_mask; /* Mask of the bits of bus address this | 121 | u64 dma_mask; /* Mask of the bits of bus address this |
| @@ -110,6 +128,7 @@ struct pci_dev { | |||
| 110 | this is D0-D3, D0 being fully functional, | 128 | this is D0-D3, D0 being fully functional, |
| 111 | and D3 being off. */ | 129 | and D3 being off. */ |
| 112 | 130 | ||
| 131 | pci_channel_state_t error_state; /* current connectivity state */ | ||
| 113 | struct device dev; /* Generic device interface */ | 132 | struct device dev; /* Generic device interface */ |
| 114 | 133 | ||
| 115 | /* device is compatible with these IDs */ | 134 | /* device is compatible with these IDs */ |
| @@ -232,6 +251,54 @@ struct pci_dynids { | |||
| 232 | unsigned int use_driver_data:1; /* pci_driver->driver_data is used */ | 251 | unsigned int use_driver_data:1; /* pci_driver->driver_data is used */ |
| 233 | }; | 252 | }; |
| 234 | 253 | ||
| 254 | /* ---------------------------------------------------------------- */ | ||
| 255 | /** PCI Error Recovery System (PCI-ERS). If a PCI device driver provides | ||
| 256 | * a set fof callbacks in struct pci_error_handlers, then that device driver | ||
| 257 | * will be notified of PCI bus errors, and will be driven to recovery | ||
| 258 | * when an error occurs. | ||
| 259 | */ | ||
| 260 | |||
| 261 | typedef unsigned int __bitwise pci_ers_result_t; | ||
| 262 | |||
| 263 | enum pci_ers_result { | ||
| 264 | /* no result/none/not supported in device driver */ | ||
| 265 | PCI_ERS_RESULT_NONE = (__force pci_ers_result_t) 1, | ||
| 266 | |||
| 267 | /* Device driver can recover without slot reset */ | ||
| 268 | PCI_ERS_RESULT_CAN_RECOVER = (__force pci_ers_result_t) 2, | ||
| 269 | |||
| 270 | /* Device driver wants slot to be reset. */ | ||
| 271 | PCI_ERS_RESULT_NEED_RESET = (__force pci_ers_result_t) 3, | ||
| 272 | |||
| 273 | /* Device has completely failed, is unrecoverable */ | ||
| 274 | PCI_ERS_RESULT_DISCONNECT = (__force pci_ers_result_t) 4, | ||
| 275 | |||
| 276 | /* Device driver is fully recovered and operational */ | ||
| 277 | PCI_ERS_RESULT_RECOVERED = (__force pci_ers_result_t) 5, | ||
| 278 | }; | ||
| 279 | |||
| 280 | /* PCI bus error event callbacks */ | ||
| 281 | struct pci_error_handlers | ||
| 282 | { | ||
| 283 | /* PCI bus error detected on this device */ | ||
| 284 | pci_ers_result_t (*error_detected)(struct pci_dev *dev, | ||
| 285 | enum pci_channel_state error); | ||
| 286 | |||
| 287 | /* MMIO has been re-enabled, but not DMA */ | ||
| 288 | pci_ers_result_t (*mmio_enabled)(struct pci_dev *dev); | ||
| 289 | |||
| 290 | /* PCI Express link has been reset */ | ||
| 291 | pci_ers_result_t (*link_reset)(struct pci_dev *dev); | ||
| 292 | |||
| 293 | /* PCI slot has been reset */ | ||
| 294 | pci_ers_result_t (*slot_reset)(struct pci_dev *dev); | ||
| 295 | |||
| 296 | /* Device driver may resume normal operations */ | ||
| 297 | void (*resume)(struct pci_dev *dev); | ||
| 298 | }; | ||
| 299 | |||
| 300 | /* ---------------------------------------------------------------- */ | ||
| 301 | |||
| 235 | struct module; | 302 | struct module; |
| 236 | struct pci_driver { | 303 | struct pci_driver { |
| 237 | struct list_head node; | 304 | struct list_head node; |
| @@ -244,6 +311,7 @@ struct pci_driver { | |||
| 244 | int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable); /* Enable wake event */ | 311 | int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable); /* Enable wake event */ |
| 245 | void (*shutdown) (struct pci_dev *dev); | 312 | void (*shutdown) (struct pci_dev *dev); |
| 246 | 313 | ||
| 314 | struct pci_error_handlers *err_handler; | ||
| 247 | struct device_driver driver; | 315 | struct device_driver driver; |
| 248 | struct pci_dynids dynids; | 316 | struct pci_dynids dynids; |
| 249 | }; | 317 | }; |
| @@ -448,6 +516,7 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass | |||
| 448 | 516 | ||
| 449 | void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *), | 517 | void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *), |
| 450 | void *userdata); | 518 | void *userdata); |
| 519 | int pci_cfg_space_size(struct pci_dev *dev); | ||
| 451 | 520 | ||
| 452 | /* kmem_cache style wrapper around pci_alloc_consistent() */ | 521 | /* kmem_cache style wrapper around pci_alloc_consistent() */ |
| 453 | 522 | ||
