diff options
| -rw-r--r-- | drivers/pci/Makefile | 2 | ||||
| -rw-r--r-- | drivers/pci/pci.c | 102 | ||||
| -rw-r--r-- | drivers/pci/vc.c | 434 | ||||
| -rw-r--r-- | drivers/vfio/pci/vfio_pci_config.c | 12 | ||||
| -rw-r--r-- | include/linux/pci.h | 15 | ||||
| -rw-r--r-- | include/uapi/linux/pci_regs.h | 29 |
6 files changed, 549 insertions, 45 deletions
diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile index 6ebf5bf8e7a7..17d2b07ee67c 100644 --- a/drivers/pci/Makefile +++ b/drivers/pci/Makefile | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | obj-y += access.o bus.o probe.o host-bridge.o remove.o pci.o \ | 5 | obj-y += access.o bus.o probe.o host-bridge.o remove.o pci.o \ |
| 6 | pci-driver.o search.o pci-sysfs.o rom.o setup-res.o \ | 6 | pci-driver.o search.o pci-sysfs.o rom.o setup-res.o \ |
| 7 | irq.o vpd.o setup-bus.o | 7 | irq.o vpd.o setup-bus.o vc.o |
| 8 | obj-$(CONFIG_PROC_FS) += proc.o | 8 | obj-$(CONFIG_PROC_FS) += proc.o |
| 9 | obj-$(CONFIG_SYSFS) += slot.o | 9 | obj-$(CONFIG_SYSFS) += slot.o |
| 10 | 10 | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 33120d156668..508e560b7d2a 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -431,6 +431,32 @@ pci_find_parent_resource(const struct pci_dev *dev, struct resource *res) | |||
| 431 | } | 431 | } |
| 432 | 432 | ||
| 433 | /** | 433 | /** |
| 434 | * pci_wait_for_pending - wait for @mask bit(s) to clear in status word @pos | ||
| 435 | * @dev: the PCI device to operate on | ||
| 436 | * @pos: config space offset of status word | ||
| 437 | * @mask: mask of bit(s) to care about in status word | ||
| 438 | * | ||
| 439 | * Return 1 when mask bit(s) in status word clear, 0 otherwise. | ||
| 440 | */ | ||
| 441 | int pci_wait_for_pending(struct pci_dev *dev, int pos, u16 mask) | ||
| 442 | { | ||
| 443 | int i; | ||
| 444 | |||
| 445 | /* Wait for Transaction Pending bit clean */ | ||
| 446 | for (i = 0; i < 4; i++) { | ||
| 447 | u16 status; | ||
| 448 | if (i) | ||
| 449 | msleep((1 << (i - 1)) * 100); | ||
| 450 | |||
| 451 | pci_read_config_word(dev, pos, &status); | ||
| 452 | if (!(status & mask)) | ||
| 453 | return 1; | ||
| 454 | } | ||
| 455 | |||
| 456 | return 0; | ||
| 457 | } | ||
| 458 | |||
| 459 | /** | ||
| 434 | * pci_restore_bars - restore a devices BAR values (e.g. after wake-up) | 460 | * pci_restore_bars - restore a devices BAR values (e.g. after wake-up) |
| 435 | * @dev: PCI device to have its BARs restored | 461 | * @dev: PCI device to have its BARs restored |
| 436 | * | 462 | * |
| @@ -835,18 +861,28 @@ EXPORT_SYMBOL(pci_choose_state); | |||
| 835 | #define PCI_EXP_SAVE_REGS 7 | 861 | #define PCI_EXP_SAVE_REGS 7 |
| 836 | 862 | ||
| 837 | 863 | ||
| 838 | static struct pci_cap_saved_state *pci_find_saved_cap( | 864 | static struct pci_cap_saved_state *_pci_find_saved_cap(struct pci_dev *pci_dev, |
| 839 | struct pci_dev *pci_dev, char cap) | 865 | u16 cap, bool extended) |
| 840 | { | 866 | { |
| 841 | struct pci_cap_saved_state *tmp; | 867 | struct pci_cap_saved_state *tmp; |
| 842 | 868 | ||
| 843 | hlist_for_each_entry(tmp, &pci_dev->saved_cap_space, next) { | 869 | hlist_for_each_entry(tmp, &pci_dev->saved_cap_space, next) { |
| 844 | if (tmp->cap.cap_nr == cap) | 870 | if (tmp->cap.cap_extended == extended && tmp->cap.cap_nr == cap) |
| 845 | return tmp; | 871 | return tmp; |
| 846 | } | 872 | } |
| 847 | return NULL; | 873 | return NULL; |
| 848 | } | 874 | } |
| 849 | 875 | ||
| 876 | struct pci_cap_saved_state *pci_find_saved_cap(struct pci_dev *dev, char cap) | ||
| 877 | { | ||
| 878 | return _pci_find_saved_cap(dev, cap, false); | ||
| 879 | } | ||
| 880 | |||
| 881 | struct pci_cap_saved_state *pci_find_saved_ext_cap(struct pci_dev *dev, u16 cap) | ||
| 882 | { | ||
| 883 | return _pci_find_saved_cap(dev, cap, true); | ||
| 884 | } | ||
| 885 | |||
| 850 | static int pci_save_pcie_state(struct pci_dev *dev) | 886 | static int pci_save_pcie_state(struct pci_dev *dev) |
| 851 | { | 887 | { |
| 852 | int i = 0; | 888 | int i = 0; |
| @@ -948,6 +984,8 @@ pci_save_state(struct pci_dev *dev) | |||
| 948 | return i; | 984 | return i; |
| 949 | if ((i = pci_save_pcix_state(dev)) != 0) | 985 | if ((i = pci_save_pcix_state(dev)) != 0) |
| 950 | return i; | 986 | return i; |
| 987 | if ((i = pci_save_vc_state(dev)) != 0) | ||
| 988 | return i; | ||
| 951 | return 0; | 989 | return 0; |
| 952 | } | 990 | } |
| 953 | 991 | ||
| @@ -1010,6 +1048,7 @@ void pci_restore_state(struct pci_dev *dev) | |||
| 1010 | /* PCI Express register must be restored first */ | 1048 | /* PCI Express register must be restored first */ |
| 1011 | pci_restore_pcie_state(dev); | 1049 | pci_restore_pcie_state(dev); |
| 1012 | pci_restore_ats_state(dev); | 1050 | pci_restore_ats_state(dev); |
| 1051 | pci_restore_vc_state(dev); | ||
| 1013 | 1052 | ||
| 1014 | pci_restore_config_space(dev); | 1053 | pci_restore_config_space(dev); |
| 1015 | 1054 | ||
| @@ -1087,7 +1126,7 @@ int pci_load_saved_state(struct pci_dev *dev, struct pci_saved_state *state) | |||
| 1087 | while (cap->size) { | 1126 | while (cap->size) { |
| 1088 | struct pci_cap_saved_state *tmp; | 1127 | struct pci_cap_saved_state *tmp; |
| 1089 | 1128 | ||
| 1090 | tmp = pci_find_saved_cap(dev, cap->cap_nr); | 1129 | tmp = _pci_find_saved_cap(dev, cap->cap_nr, cap->cap_extended); |
| 1091 | if (!tmp || tmp->cap.size != cap->size) | 1130 | if (!tmp || tmp->cap.size != cap->size) |
| 1092 | return -EINVAL; | 1131 | return -EINVAL; |
| 1093 | 1132 | ||
| @@ -2021,18 +2060,24 @@ static void pci_add_saved_cap(struct pci_dev *pci_dev, | |||
| 2021 | } | 2060 | } |
| 2022 | 2061 | ||
| 2023 | /** | 2062 | /** |
| 2024 | * pci_add_cap_save_buffer - allocate buffer for saving given capability registers | 2063 | * _pci_add_cap_save_buffer - allocate buffer for saving given |
| 2064 | * capability registers | ||
| 2025 | * @dev: the PCI device | 2065 | * @dev: the PCI device |
| 2026 | * @cap: the capability to allocate the buffer for | 2066 | * @cap: the capability to allocate the buffer for |
| 2067 | * @extended: Standard or Extended capability ID | ||
| 2027 | * @size: requested size of the buffer | 2068 | * @size: requested size of the buffer |
| 2028 | */ | 2069 | */ |
| 2029 | static int pci_add_cap_save_buffer( | 2070 | static int _pci_add_cap_save_buffer(struct pci_dev *dev, u16 cap, |
| 2030 | struct pci_dev *dev, char cap, unsigned int size) | 2071 | bool extended, unsigned int size) |
| 2031 | { | 2072 | { |
| 2032 | int pos; | 2073 | int pos; |
| 2033 | struct pci_cap_saved_state *save_state; | 2074 | struct pci_cap_saved_state *save_state; |
| 2034 | 2075 | ||
| 2035 | pos = pci_find_capability(dev, cap); | 2076 | if (extended) |
| 2077 | pos = pci_find_ext_capability(dev, cap); | ||
| 2078 | else | ||
| 2079 | pos = pci_find_capability(dev, cap); | ||
| 2080 | |||
| 2036 | if (pos <= 0) | 2081 | if (pos <= 0) |
| 2037 | return 0; | 2082 | return 0; |
| 2038 | 2083 | ||
| @@ -2041,12 +2086,23 @@ static int pci_add_cap_save_buffer( | |||
| 2041 | return -ENOMEM; | 2086 | return -ENOMEM; |
| 2042 | 2087 | ||
| 2043 | save_state->cap.cap_nr = cap; | 2088 | save_state->cap.cap_nr = cap; |
| 2089 | save_state->cap.cap_extended = extended; | ||
| 2044 | save_state->cap.size = size; | 2090 | save_state->cap.size = size; |
| 2045 | pci_add_saved_cap(dev, save_state); | 2091 | pci_add_saved_cap(dev, save_state); |
| 2046 | 2092 | ||
| 2047 | return 0; | 2093 | return 0; |
| 2048 | } | 2094 | } |
| 2049 | 2095 | ||
| 2096 | int pci_add_cap_save_buffer(struct pci_dev *dev, char cap, unsigned int size) | ||
| 2097 | { | ||
| 2098 | return _pci_add_cap_save_buffer(dev, cap, false, size); | ||
| 2099 | } | ||
| 2100 | |||
| 2101 | int pci_add_ext_cap_save_buffer(struct pci_dev *dev, u16 cap, unsigned int size) | ||
| 2102 | { | ||
| 2103 | return _pci_add_cap_save_buffer(dev, cap, true, size); | ||
| 2104 | } | ||
| 2105 | |||
| 2050 | /** | 2106 | /** |
| 2051 | * pci_allocate_cap_save_buffers - allocate buffers for saving capabilities | 2107 | * pci_allocate_cap_save_buffers - allocate buffers for saving capabilities |
| 2052 | * @dev: the PCI device | 2108 | * @dev: the PCI device |
| @@ -2065,6 +2121,8 @@ void pci_allocate_cap_save_buffers(struct pci_dev *dev) | |||
| 2065 | if (error) | 2121 | if (error) |
| 2066 | dev_err(&dev->dev, | 2122 | dev_err(&dev->dev, |
| 2067 | "unable to preallocate PCI-X save buffer\n"); | 2123 | "unable to preallocate PCI-X save buffer\n"); |
| 2124 | |||
| 2125 | pci_allocate_vc_save_buffers(dev); | ||
| 2068 | } | 2126 | } |
| 2069 | 2127 | ||
| 2070 | void pci_free_cap_save_buffers(struct pci_dev *dev) | 2128 | void pci_free_cap_save_buffers(struct pci_dev *dev) |
| @@ -3204,20 +3262,10 @@ EXPORT_SYMBOL(pci_set_dma_seg_boundary); | |||
| 3204 | */ | 3262 | */ |
| 3205 | int pci_wait_for_pending_transaction(struct pci_dev *dev) | 3263 | int pci_wait_for_pending_transaction(struct pci_dev *dev) |
| 3206 | { | 3264 | { |
