# HG changeset patch
# User Wei Wang <wei.wang2@xxxxxxx>
# Date 1320747951 -3600
# Node ID ca03648989b4bd52a631f38a993590e504b90dc3
# Parent 4de6a56b7b5d0da75e380ecf55d8fbb2541f946b
ats: Add new ATS helper functions
Signed-off-by Wei Wang <wei.wang2@xxxxxxx>
Committed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
diff -r 4de6a56b7b5d -r ca03648989b4 xen/drivers/passthrough/ats.h
--- a/xen/drivers/passthrough/ats.h Tue Nov 08 11:25:19 2011 +0100
+++ b/xen/drivers/passthrough/ats.h Tue Nov 08 11:25:51 2011 +0100
@@ -16,6 +16,8 @@
#ifndef _ATS_H_
#define _ATS_H_
+#include <xen/pci_regs.h>
+
struct pci_ats_dev {
struct list_head list;
u16 seg;
@@ -36,6 +38,28 @@
int enable_ats_device(int seg, int bus, int devfn);
void disable_ats_device(int seg, int bus, int devfn);
+struct pci_ats_dev *get_ats_device(int seg, int bus, int devfn);
+
+static inline int pci_ats_enabled(int seg, int bus, int devfn)
+{
+ u32 value;
+ int pos;
+
+ pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+ BUG_ON(!pos);
+
+ value = pci_conf_read16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
+ pos + ATS_REG_CTL);
+ return value & ATS_ENABLE;
+}
+
+static inline int pci_ats_device(int seg, int bus, int devfn)
+{
+ if ( !ats_enabled )
+ return 0;
+
+ return pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+}
#else
@@ -50,6 +74,22 @@
{
BUG();
}
+
+static inline int pci_ats_enabled(int seg, int bus, int devfn)
+{
+ return 0;
+}
+
+static inline int pci_ats_device(int seg, int bus, int devfn)
+{
+ return 0;
+}
+
+static inline struct pci_ats_dev *get_ats_device(int seg, int bus, int devfn)
+{
+ return NULL;
+}
+
#endif
#endif /* _ATS_H_ */
diff -r 4de6a56b7b5d -r ca03648989b4 xen/drivers/passthrough/x86/ats.c
--- a/xen/drivers/passthrough/x86/ats.c Tue Nov 08 11:25:19 2011 +0100
+++ b/xen/drivers/passthrough/x86/ats.c Tue Nov 08 11:25:51 2011 +0100
@@ -134,3 +134,19 @@
dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS is disabled\n",
seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
}
+
+struct pci_ats_dev *get_ats_device(int seg, int bus, int devfn)
+{
+ struct pci_ats_dev *pdev;
+
+ if ( !pci_ats_device(seg, bus, devfn) )
+ return NULL;
+
+ list_for_each_entry ( pdev, &ats_devices, list )
+ {
+ if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
+ return pdev;
+ }
+
+ return NULL;
+}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|