|
@@ -128,6 +128,23 @@ void pci_disable_ats(struct pci_dev *dev)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(pci_disable_ats);
|
|
|
|
|
|
+void pci_restore_ats_state(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ u16 ctrl;
|
|
|
+
|
|
|
+ if (!pci_ats_enabled(dev))
|
|
|
+ return;
|
|
|
+ if (!pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ATS))
|
|
|
+ BUG();
|
|
|
+
|
|
|
+ ctrl = PCI_ATS_CTRL_ENABLE;
|
|
|
+ if (!dev->is_virtfn)
|
|
|
+ ctrl |= PCI_ATS_CTRL_STU(dev->ats->stu - PCI_ATS_MIN_STU);
|
|
|
+
|
|
|
+ pci_write_config_word(dev, dev->ats->pos + PCI_ATS_CTRL, ctrl);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(pci_restore_ats_state);
|
|
|
+
|
|
|
/**
|
|
|
* pci_ats_queue_depth - query the ATS Invalidate Queue Depth
|
|
|
* @dev: the PCI device
|