# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1236930083 0
# Node ID 44fd32e157f23d0a620b22ec32705fa0f5e04295
# Parent 36d8c23b75745c2bd8dd906eb7d2294df3d966b2
Backport: PCI: fix ARI code to be compatible with mixed ARI/non-ARI
systems
commit 8113587c2d14d3be2414190845b2e2617c0aa33b
Author: Zhao, Yu <yu.zhao@xxxxxxxxx>
Date: Thu Oct 23 13:15:39 2008 +0800
PCI: fix ARI code to be compatible with mixed ARI/non-ARI systems
The original ARI support code has a compatibility problem with
non-ARI
devices. If a device doesn't support ARI, turning on ARI
forwarding on
its upper level bridge will cause undefined behavior.
This fix turns on ARI forwarding only when the subordinate devices
support it.
Tested-by: Suresh Siddha <suresh.b.siddha@xxxxxxxxx>
Signed-off-by: Yu Zhao <yu.zhao@xxxxxxxxx>
Signed-off-by: Jesse Barnes <jbarnes@xxxxxxxxxxxxxxxx>
Signed-off-by: Yu Zhao <yu.zhao@xxxxxxxxx>
---
drivers/pci/pci.c | 29 +++++++++++++++++------------
1 files changed, 17 insertions(+), 12 deletions(-)
diff -r 36d8c23b7574 -r 44fd32e157f2 drivers/pci/pci.c
--- a/drivers/pci/pci.c Fri Mar 13 07:40:54 2009 +0000
+++ b/drivers/pci/pci.c Fri Mar 13 07:41:23 2009 +0000
@@ -638,27 +638,32 @@ void pci_enable_ari(struct pci_dev *dev)
int pos;
u32 cap;
u16 ctrl;
-
- if (!dev->is_pcie)
+ struct pci_dev *bridge;
+
+ if (dev->devfn)
return;
- if (dev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
- dev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
- return;
-
- pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
+ pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI);
if (!pos)
return;
- pci_read_config_dword(dev, pos + PCI_EXP_DEVCAP2, &cap);
+ bridge = dev->bus->self;
+ if (!bridge)
+ return;
+
+ pos = pci_find_capability(bridge, PCI_CAP_ID_EXP);
+ if (!pos)
+ return;
+
+ pci_read_config_dword(bridge, pos + PCI_EXP_DEVCAP2, &cap);
if (!(cap & PCI_EXP_DEVCAP2_ARI))
return;
- pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &ctrl);
+ pci_read_config_word(bridge, pos + PCI_EXP_DEVCTL2, &ctrl);
ctrl |= PCI_EXP_DEVCTL2_ARI;
- pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, ctrl);
-
- dev->ari_enabled = 1;
+ pci_write_config_word(bridge, pos + PCI_EXP_DEVCTL2, ctrl);
+
+ bridge->ari_enabled = 1;
}
int
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|