diff options
Diffstat (limited to 'include/linux/pci.h')
-rw-r--r-- | include/linux/pci.h | 96 |
1 files changed, 67 insertions, 29 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h index 03b0b8c3c81b..48890cf3f96e 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -82,7 +82,30 @@ enum pci_mmap_state { | |||
82 | #define PCI_DMA_FROMDEVICE 2 | 82 | #define PCI_DMA_FROMDEVICE 2 |
83 | #define PCI_DMA_NONE 3 | 83 | #define PCI_DMA_NONE 3 |
84 | 84 | ||
85 | #define DEVICE_COUNT_RESOURCE 12 | 85 | /* |
86 | * For PCI devices, the region numbers are assigned this way: | ||
87 | */ | ||
88 | enum { | ||
89 | /* #0-5: standard PCI resources */ | ||
90 | PCI_STD_RESOURCES, | ||
91 | PCI_STD_RESOURCE_END = 5, | ||
92 | |||
93 | /* #6: expansion ROM resource */ | ||
94 | PCI_ROM_RESOURCE, | ||
95 | |||
96 | /* resources assigned to buses behind the bridge */ | ||
97 | #define PCI_BRIDGE_RESOURCE_NUM 4 | ||
98 | |||
99 | PCI_BRIDGE_RESOURCES, | ||
100 | PCI_BRIDGE_RESOURCE_END = PCI_BRIDGE_RESOURCES + | ||
101 | PCI_BRIDGE_RESOURCE_NUM - 1, | ||
102 | |||
103 | /* total resources associated with a PCI device */ | ||
104 | PCI_NUM_RESOURCES, | ||
105 | |||
106 | /* preserve this for compatibility */ | ||
107 | DEVICE_COUNT_RESOURCE | ||
108 | }; | ||
86 | 109 | ||
87 | typedef int __bitwise pci_power_t; | 110 | typedef int __bitwise pci_power_t; |
88 | 111 | ||
@@ -94,6 +117,10 @@ typedef int __bitwise pci_power_t; | |||
94 | #define PCI_UNKNOWN ((pci_power_t __force) 5) | 117 | #define PCI_UNKNOWN ((pci_power_t __force) 5) |
95 | #define PCI_POWER_ERROR ((pci_power_t __force) -1) | 118 | #define PCI_POWER_ERROR ((pci_power_t __force) -1) |
96 | 119 | ||
120 | #define PCI_PM_D2_DELAY 200 | ||
121 | #define PCI_PM_D3_WAIT 10 | ||
122 | #define PCI_PM_BUS_WAIT 50 | ||
123 | |||
97 | /** The pci_channel state describes connectivity between the CPU and | 124 | /** The pci_channel state describes connectivity between the CPU and |
98 | * the pci device. If some PCI bus between here and the pci device | 125 | * the pci device. If some PCI bus between here and the pci device |
99 | * has crashed or locked up, this info is reflected here. | 126 | * has crashed or locked up, this info is reflected here. |
@@ -229,6 +256,7 @@ struct pci_dev { | |||
229 | unsigned int ari_enabled:1; /* ARI forwarding */ | 256 | unsigned int ari_enabled:1; /* ARI forwarding */ |
230 | unsigned int is_managed:1; | 257 | unsigned int is_managed:1; |
231 | unsigned int is_pcie:1; | 258 | unsigned int is_pcie:1; |
259 | unsigned int state_saved:1; | ||
232 | pci_dev_flags_t dev_flags; | 260 | pci_dev_flags_t dev_flags; |
233 | atomic_t enable_cnt; /* pci_enable_device has been called */ | 261 | atomic_t enable_cnt; /* pci_enable_device has been called */ |
234 | 262 | ||
@@ -274,18 +302,6 @@ static inline void pci_add_saved_cap(struct pci_dev *pci_dev, | |||
274 | hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space); | 302 | hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space); |
275 | } | 303 | } |
276 | 304 | ||
277 | /* | ||
278 | * For PCI devices, the region numbers are assigned this way: | ||
279 | * | ||
280 | * 0-5 standard PCI regions | ||
281 | * 6 expansion ROM | ||
282 | * 7-10 bridges: address space assigned to buses behind the bridge | ||
283 | */ | ||
284 | |||
285 | #define PCI_ROM_RESOURCE 6 | ||
286 | #define PCI_BRIDGE_RESOURCES 7 | ||
287 | #define PCI_NUM_RESOURCES 11 | ||
288 | |||
289 | #ifndef PCI_BUS_NUM_RESOURCES | 305 | #ifndef PCI_BUS_NUM_RESOURCES |
290 | #define PCI_BUS_NUM_RESOURCES 16 | 306 | #define PCI_BUS_NUM_RESOURCES 16 |
291 | #endif | 307 | #endif |
@@ -325,6 +341,15 @@ struct pci_bus { | |||
325 | #define pci_bus_b(n) list_entry(n, struct pci_bus, node) | 341 | #define pci_bus_b(n) list_entry(n, struct pci_bus, node) |
326 | #define to_pci_bus(n) container_of(n, struct pci_bus, dev) | 342 | #define to_pci_bus(n) container_of(n, struct pci_bus, dev) |
327 | 343 | ||
344 | #ifdef CONFIG_PCI_MSI | ||
345 | static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev) | ||
346 | { | ||
347 | return pci_dev->msi_enabled || pci_dev->msix_enabled; | ||
348 | } | ||
349 | #else | ||
350 | static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev) { return false; } | ||
351 | #endif | ||
352 | |||
328 | /* | 353 | /* |
329 | * Error values that may be returned by PCI functions. | 354 | * Error values that may be returned by PCI functions. |
330 | */ | 355 | */ |
@@ -421,7 +446,6 @@ struct pci_driver { | |||
421 | int (*resume_early) (struct pci_dev *dev); | 446 | int (*resume_early) (struct pci_dev *dev); |
422 | int (*resume) (struct pci_dev *dev); /* Device woken up */ | 447 | int (*resume) (struct pci_dev *dev); /* Device woken up */ |
423 | void (*shutdown) (struct pci_dev *dev); | 448 | void (*shutdown) (struct pci_dev *dev); |
424 | struct pm_ext_ops *pm; | ||
425 | struct pci_error_handlers *err_handler; | 449 | struct pci_error_handlers *err_handler; |
426 | struct device_driver driver; | 450 | struct device_driver driver; |
427 | struct pci_dynids dynids; | 451 | struct pci_dynids dynids; |
@@ -533,7 +557,9 @@ int __must_check pci_bus_add_device(struct pci_dev *dev); | |||
533 | void pci_read_bridge_bases(struct pci_bus *child); | 557 | void pci_read_bridge_bases(struct pci_bus *child); |
534 | struct resource *pci_find_parent_resource(const struct pci_dev *dev, | 558 | struct resource *pci_find_parent_resource(const struct pci_dev *dev, |
535 | struct resource *res); | 559 | struct resource *res); |
560 | u8 pci_swizzle_interrupt_pin(struct pci_dev *dev, u8 pin); | ||
536 | int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge); | 561 | int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge); |
562 | u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp); | ||
537 | extern struct pci_dev *pci_dev_get(struct pci_dev *dev); | 563 | extern struct pci_dev *pci_dev_get(struct pci_dev *dev); |
538 | extern void pci_dev_put(struct pci_dev *dev); | 564 | extern void pci_dev_put(struct pci_dev *dev); |
539 | extern void pci_remove_bus(struct pci_bus *b); | 565 | extern void pci_remove_bus(struct pci_bus *b); |
@@ -630,6 +656,7 @@ static inline int pci_is_managed(struct pci_dev *pdev) | |||
630 | 656 | ||
631 | void pci_disable_device(struct pci_dev *dev); | 657 | void pci_disable_device(struct pci_dev *dev); |
632 | void pci_set_master(struct pci_dev *dev); | 658 | void pci_set_master(struct pci_dev *dev); |
659 | void pci_clear_master(struct pci_dev *dev); | ||
633 | int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state); | 660 | int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state); |
634 | #define HAVE_PCI_SET_MWI | 661 | #define HAVE_PCI_SET_MWI |
635 | int __must_check pci_set_mwi(struct pci_dev *dev); | 662 | int __must_check pci_set_mwi(struct pci_dev *dev); |
@@ -648,7 +675,7 @@ int pcie_get_readrq(struct pci_dev *dev); | |||
648 | int pcie_set_readrq(struct pci_dev *dev, int rq); | 675 | int pcie_set_readrq(struct pci_dev *dev, int rq); |
649 | int pci_reset_function(struct pci_dev *dev); | 676 | int pci_reset_function(struct pci_dev *dev); |
650 | int pci_execute_reset_function(struct pci_dev *dev); | 677 | int pci_execute_reset_function(struct pci_dev *dev); |
651 | void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno); | 678 | void pci_update_resource(struct pci_dev *dev, int resno); |
652 | int __must_check pci_assign_resource(struct pci_dev *dev, int i); | 679 | int __must_check pci_assign_resource(struct pci_dev *dev, int i); |
653 | int pci_select_bars(struct pci_dev *dev, unsigned long flags); | 680 | int pci_select_bars(struct pci_dev *dev, unsigned long flags); |
654 | 681 | ||
@@ -675,6 +702,11 @@ int pci_back_from_sleep(struct pci_dev *dev); | |||
675 | /* Functions for PCI Hotplug drivers to use */ | 702 | /* Functions for PCI Hotplug drivers to use */ |
676 | int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap); | 703 | int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap); |
677 | 704 | ||
705 | /* Vital product data routines */ | ||
706 | ssize_t pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf); | ||
707 | ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void *buf); | ||
708 | int pci_vpd_truncate(struct pci_dev *dev, size_t size); | ||
709 | |||
678 | /* Helper functions for low-level code (drivers/pci/setup-[bus,res].c) */ | 710 | /* Helper functions for low-level code (drivers/pci/setup-[bus,res].c) */ |
679 | void pci_bus_assign_resources(struct pci_bus *bus); | 711 | void pci_bus_assign_resources(struct pci_bus *bus); |
680 | void pci_bus_size_bridges(struct pci_bus *bus); | 712 | void pci_bus_size_bridges(struct pci_bus *bus); |
@@ -687,10 +719,13 @@ void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *), | |||
687 | int (*)(struct pci_dev *, u8, u8)); | 719 | int (*)(struct pci_dev *, u8, u8)); |
688 | #define HAVE_PCI_REQ_REGIONS 2 | 720 | #define HAVE_PCI_REQ_REGIONS 2 |
689 | int __must_check pci_request_regions(struct pci_dev *, const char *); | 721 | int __must_check pci_request_regions(struct pci_dev *, const char *); |
722 | int __must_check pci_request_regions_exclusive(struct pci_dev *, const char *); | ||
690 | void pci_release_regions(struct pci_dev *); | 723 | void pci_release_regions(struct pci_dev *); |
691 | int __must_check pci_request_region(struct pci_dev *, int, const char *); | 724 | int __must_check pci_request_region(struct pci_dev *, int, const char *); |
725 | int __must_check pci_request_region_exclusive(struct pci_dev *, int, const char *); | ||
692 | void pci_release_region(struct pci_dev *, int); | 726 | void pci_release_region(struct pci_dev *, int); |
693 | int pci_request_selected_regions(struct pci_dev *, int, const char *); | 727 | int pci_request_selected_regions(struct pci_dev *, int, const char *); |
728 | int pci_request_selected_regions_exclusive(struct pci_dev *, int, const char *); | ||
694 | void pci_release_selected_regions(struct pci_dev *, int); | 729 | void pci_release_selected_regions(struct pci_dev *, int); |
695 | 730 | ||
696 | /* drivers/pci/bus.c */ | 731 | /* drivers/pci/bus.c */ |
@@ -780,6 +815,10 @@ static inline void msi_remove_pci_irq_vectors(struct pci_dev *dev) | |||
780 | 815 | ||
781 | static inline void pci_restore_msi_state(struct pci_dev *dev) | 816 | static inline void pci_restore_msi_state(struct pci_dev *dev) |
782 | { } | 817 | { } |
818 | static inline int pci_msi_enabled(void) | ||
819 | { | ||
820 | return 0; | ||
821 | } | ||
783 | #else | 822 | #else |
784 | extern int pci_enable_msi(struct pci_dev *dev); | 823 | extern int pci_enable_msi(struct pci_dev *dev); |
785 | extern void pci_msi_shutdown(struct pci_dev *dev); | 824 | extern void pci_msi_shutdown(struct pci_dev *dev); |
@@ -790,6 +829,16 @@ extern void pci_msix_shutdown(struct pci_dev *dev); | |||
790 | extern void pci_disable_msix(struct pci_dev *dev); | 829 | extern void pci_disable_msix(struct pci_dev *dev); |
791 | extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); | 830 | extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); |
792 | extern void pci_restore_msi_state(struct pci_dev *dev); | 831 | extern void pci_restore_msi_state(struct pci_dev *dev); |
832 | extern int pci_msi_enabled(void); | ||
833 | #endif | ||
834 | |||
835 | #ifndef CONFIG_PCIEASPM | ||
836 | static inline int pcie_aspm_enabled(void) | ||
837 | { | ||
838 | return 0; | ||
839 | } | ||
840 | #else | ||
841 | extern int pcie_aspm_enabled(void); | ||
793 | #endif | 842 | #endif |
794 | 843 | ||
795 | #ifdef CONFIG_HT_IRQ | 844 | #ifdef CONFIG_HT_IRQ |
@@ -1141,20 +1190,9 @@ static inline void pci_mmcfg_early_init(void) { } | |||
1141 | static inline void pci_mmcfg_late_init(void) { } | 1190 | static inline void pci_mmcfg_late_init(void) { } |
1142 | #endif | 1191 | #endif |
1143 | 1192 | ||
1144 | #ifdef CONFIG_HAS_IOMEM | 1193 | int pci_ext_cfg_avail(struct pci_dev *dev); |
1145 | static inline void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar) | 1194 | |
1146 | { | 1195 | void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar); |
1147 | /* | ||
1148 | * Make sure the BAR is actually a memory resource, not an IO resource | ||
1149 | */ | ||
1150 | if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM)) { | ||
1151 | WARN_ON(1); | ||
1152 | return NULL; | ||
1153 | } | ||
1154 | return ioremap_nocache(pci_resource_start(pdev, bar), | ||
1155 | pci_resource_len(pdev, bar)); | ||
1156 | } | ||
1157 | #endif | ||
1158 | 1196 | ||
1159 | #endif /* __KERNEL__ */ | 1197 | #endif /* __KERNEL__ */ |
1160 | #endif /* LINUX_PCI_H */ | 1198 | #endif /* LINUX_PCI_H */ |