From c67a0f7a6e4d09c167f758e7e1507ef8469e876e Mon Sep 17 00:00:00 2001 From: "Hao, Xudong" Date: Sat, 17 Dec 2011 21:24:40 +0800 Subject: [PATCH] --- yaml --- r: 283392 b: refs/heads/master c: 1900ca132f53c3d51e6e6b94ea8912530223c63a h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/pci/ats.c | 17 +++++++++++++++++ trunk/drivers/pci/pci.c | 1 + trunk/drivers/pci/pci.h | 8 ++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 3282e3024d0b..c2636033d014 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 424eb391596a38ddf422bee1617e4b9dea60126f +refs/heads/master: 1900ca132f53c3d51e6e6b94ea8912530223c63a diff --git a/trunk/drivers/pci/ats.c b/trunk/drivers/pci/ats.c index e11ebafaf774..a4a1b369853b 100644 --- a/trunk/drivers/pci/ats.c +++ b/trunk/drivers/pci/ats.c @@ -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 diff --git a/trunk/drivers/pci/pci.c b/trunk/drivers/pci/pci.c index 54343aa5b30a..97fff785e97e 100644 --- a/trunk/drivers/pci/pci.c +++ b/trunk/drivers/pci/pci.c @@ -965,6 +965,7 @@ void pci_restore_state(struct pci_dev *dev) /* PCI Express register must be restored first */ pci_restore_pcie_state(dev); + pci_restore_ats_state(dev); /* * The Base Address register should be programmed before the command diff --git a/trunk/drivers/pci/pci.h b/trunk/drivers/pci/pci.h index 3b6e4ed306b6..1009a5e88e53 100644 --- a/trunk/drivers/pci/pci.h +++ b/trunk/drivers/pci/pci.h @@ -251,6 +251,14 @@ struct pci_sriov { u8 __iomem *mstate; /* VF Migration State Array */ }; +#ifdef CONFIG_PCI_ATS +extern void pci_restore_ats_state(struct pci_dev *dev); +#else +static inline void pci_restore_ats_state(struct pci_dev *dev) +{ +} +#endif /* CONFIG_PCI_ATS */ + #ifdef CONFIG_PCI_IOV extern int pci_iov_init(struct pci_dev *dev); extern void pci_iov_release(struct pci_dev *dev);