diff options
-rw-r--r-- | drivers/pci/ats.c | 17 | ||||
-rw-r--r-- | drivers/pci/pci.c | 1 | ||||
-rw-r--r-- | drivers/pci/pci.h | 8 |
3 files changed, 26 insertions, 0 deletions
diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c index e11ebafaf774..a4a1b369853b 100644 --- a/drivers/pci/ats.c +++ b/drivers/pci/ats.c | |||
@@ -128,6 +128,23 @@ void pci_disable_ats(struct pci_dev *dev) | |||
128 | } | 128 | } |
129 | EXPORT_SYMBOL_GPL(pci_disable_ats); | 129 | EXPORT_SYMBOL_GPL(pci_disable_ats); |
130 | 130 | ||
131 | void pci_restore_ats_state(struct pci_dev *dev) | ||
132 | { | ||
133 | u16 ctrl; | ||
134 | |||
135 | if (!pci_ats_enabled(dev)) | ||
136 | return; | ||
137 | if (!pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ATS)) | ||
138 | BUG(); | ||
139 | |||
140 | ctrl = PCI_ATS_CTRL_ENABLE; | ||
141 | if (!dev->is_virtfn) | ||
142 | ctrl |= PCI_ATS_CTRL_STU(dev->ats->stu - PCI_ATS_MIN_STU); | ||
143 | |||
144 | pci_write_config_word(dev, dev->ats->pos + PCI_ATS_CTRL, ctrl); | ||
145 | } | ||
146 | EXPORT_SYMBOL_GPL(pci_restore_ats_state); | ||
147 | |||
131 | /** | 148 | /** |
132 | * pci_ats_queue_depth - query the ATS Invalidate Queue Depth | 149 | * pci_ats_queue_depth - query the ATS Invalidate Queue Depth |
133 | * @dev: the PCI device | 150 | * @dev: the PCI device |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 54343aa5b30a..97fff785e97e 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -965,6 +965,7 @@ void pci_restore_state(struct pci_dev *dev) | |||
965 | 965 | ||
966 | /* PCI Express register must be restored first */ | 966 | /* PCI Express register must be restored first */ |
967 | pci_restore_pcie_state(dev); | 967 | pci_restore_pcie_state(dev); |
968 | pci_restore_ats_state(dev); | ||
968 | 969 | ||
969 | /* | 970 | /* |
970 | * The Base Address register should be programmed before the command | 971 | * The Base Address register should be programmed before the command |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 3b6e4ed306b6..1009a5e88e53 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -251,6 +251,14 @@ struct pci_sriov { | |||
251 | u8 __iomem *mstate; /* VF Migration State Array */ | 251 | u8 __iomem *mstate; /* VF Migration State Array */ |
252 | }; | 252 | }; |
253 | 253 | ||
254 | #ifdef CONFIG_PCI_ATS | ||
255 | extern void pci_restore_ats_state(struct pci_dev *dev); | ||
256 | #else | ||
257 | static inline void pci_restore_ats_state(struct pci_dev *dev) | ||
258 | { | ||
259 | } | ||
260 | #endif /* CONFIG_PCI_ATS */ | ||
261 | |||
254 | #ifdef CONFIG_PCI_IOV | 262 | #ifdef CONFIG_PCI_IOV |
255 | extern int pci_iov_init(struct pci_dev *dev); | 263 | extern int pci_iov_init(struct pci_dev *dev); |
256 | extern void pci_iov_release(struct pci_dev *dev); | 264 | extern void pci_iov_release(struct pci_dev *dev); |