[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1 of 6] Move some ats functions into vendor neutral directories
On Friday 21 October 2011 15:08:50 Jan Beulich wrote: > >>> On 21.10.11 at 14:55, Wei Wang <wei.wang2@xxxxxxx> wrote: > > > > # HG changeset patch > > # User Wei Wang <wei.wang2@xxxxxxx> > > # Date 1319201416 -7200 > > # Node ID a559e27ffb2c2a3a90dc25f09205b66668dcdbbb > > # Parent 121af976b2988de389db139231103ceedd11bb8a > > Move some ats functions into vendor neutral directories. > > You move them from an x86-specific place to common code. I suppose > Intel had reasons to expect them to be implemented differently in ia64. > Hence they should go into e.g. xen/drivers/passthrough/x86/ instead. > > Jan Well, we don't have that directory yet. Could we change folder structures in passthrough to be architecture first, then vendors, for example: passthough/x86/vtd passthough/x86/amd passthough/ia64/vtd Thanks, Wei > > Signed-off-by: Wei Wang <wei.wang2@xxxxxxx> > > > > diff -r 121af976b298 -r a559e27ffb2c xen/drivers/passthrough/pci.c > > --- a/xen/drivers/passthrough/pci.c Fri Oct 14 10:17:22 2011 +0200 > > +++ b/xen/drivers/passthrough/pci.c Fri Oct 21 14:50:16 2011 +0200 > > @@ -748,6 +748,95 @@ static int __init setup_dump_pcidevs(voi > > __initcall(setup_dump_pcidevs); > > #endif > > > > +int enable_ats_device(int seg, int bus, int devfn) > > +{ > > + struct pci_ats_dev *pdev = NULL; > > + u32 value; > > + int pos; > > + > > + pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS); > > + BUG_ON(!pos); > > + > > + if ( iommu_verbose ) > > + dprintk(XENLOG_INFO VTDPREFIX, > > + "%04x:%02x:%02x.%u: ATS capability found\n", > > + seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); > > + > > + value = pci_conf_read16(seg, bus, PCI_SLOT(devfn), > > + PCI_FUNC(devfn), pos + ATS_REG_CTL); > > + if ( value & ATS_ENABLE ) > > + { > > + list_for_each_entry ( pdev, &ats_devices, list ) > > + { > > + if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == > > devfn ) + { > > + pos = 0; > > + break; > > + } > > + } > > + } > > + if ( pos ) > > + pdev = xmalloc(struct pci_ats_dev); > > + if ( !pdev ) > > + return -ENOMEM; > > + > > + if ( !(value & ATS_ENABLE) ) > > + { > > + value |= ATS_ENABLE; > > + pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), > > + pos + ATS_REG_CTL, value); > > + } > > + > > + if ( pos ) > > + { > > + pdev->seg = seg; > > + pdev->bus = bus; > > + pdev->devfn = devfn; > > + value = pci_conf_read16(seg, bus, PCI_SLOT(devfn), > > + PCI_FUNC(devfn), pos + ATS_REG_CAP); > > + pdev->ats_queue_depth = value & ATS_QUEUE_DEPTH_MASK; > > + list_add(&pdev->list, &ats_devices); > > + } > > + > > + if ( iommu_verbose ) > > + dprintk(XENLOG_INFO VTDPREFIX, > > + "%04x:%02x:%02x.%u: ATS %s enabled\n", > > + seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), > > + pos ? "is" : "was"); > > + > > + return pos; > > +} > > + > > +void disable_ats_device(int seg, int bus, int devfn) > > +{ > > + struct pci_ats_dev *pdev; > > + 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); > > + value &= ~ATS_ENABLE; > > + pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), > > + pos + ATS_REG_CTL, value); > > + > > + list_for_each_entry ( pdev, &ats_devices, list ) > > + { > > + if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == > > devfn ) + { > > + list_del(&pdev->list); > > + xfree(pdev); > > + break; > > + } > > + } > > + > > + if ( iommu_verbose ) > > + dprintk(XENLOG_INFO VTDPREFIX, > > + "%04x:%02x:%02x.%u: ATS is disabled\n", > > + seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); > > +} > > > > /* > > * Local variables: > > diff -r 121af976b298 -r a559e27ffb2c xen/drivers/passthrough/vtd/extern.h > > --- a/xen/drivers/passthrough/vtd/extern.h Fri Oct 14 10:17:22 2011 +0200 > > +++ b/xen/drivers/passthrough/vtd/extern.h Fri Oct 21 14:50:16 2011 +0200 > > @@ -62,8 +62,6 @@ extern bool_t ats_enabled; > > struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu); > > > > int ats_device(int seg, int bus, int devfn); > > -int enable_ats_device(int seg, int bus, int devfn); > > -void disable_ats_device(int seg, int bus, int devfn); > > int invalidate_ats_tcs(struct iommu *iommu); > > > > int dev_invalidate_iotlb(struct iommu *iommu, u16 did, > > diff -r 121af976b298 -r a559e27ffb2c > > xen/drivers/passthrough/vtd/x86/ats.c --- > > a/xen/drivers/passthrough/vtd/x86/ats.c Fri Oct 14 10:17:22 2011 +0200 > > +++ b/xen/drivers/passthrough/vtd/x86/ats.c Fri Oct 21 14:50:16 2011 > > +0200 @@ -30,20 +30,6 @@ > > > > static LIST_HEAD(ats_dev_drhd_units); > > > > -#define ATS_REG_CAP 4 > > -#define ATS_REG_CTL 6 > > -#define ATS_QUEUE_DEPTH_MASK 0xF > > -#define ATS_ENABLE (1<<15) > > - > > -struct pci_ats_dev { > > - struct list_head list; > > - u16 seg; > > - u8 bus; > > - u8 devfn; > > - u16 ats_queue_depth; /* ATS device invalidation queue depth */ > > -}; > > -static LIST_HEAD(ats_devices); > > - > > static void parse_ats_param(char *s); > > custom_param("ats", parse_ats_param); > > > > @@ -121,97 +107,6 @@ int ats_device(int seg, int bus, int dev > > return pos; > > } > > > > -int enable_ats_device(int seg, int bus, int devfn) > > -{ > > - struct pci_ats_dev *pdev = NULL; > > - u32 value; > > - int pos; > > - > > - pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS); > > - BUG_ON(!pos); > > - > > - if ( iommu_verbose ) > > - dprintk(XENLOG_INFO VTDPREFIX, > > - "%04x:%02x:%02x.%u: ATS capability found\n", > > - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); > > - > > - value = pci_conf_read16(seg, bus, PCI_SLOT(devfn), > > - PCI_FUNC(devfn), pos + ATS_REG_CTL); > > - if ( value & ATS_ENABLE ) > > - { > > - list_for_each_entry ( pdev, &ats_devices, list ) > > - { > > - if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == > > devfn ) - { > > - pos = 0; > > - break; > > - } > > - } > > - } > > - if ( pos ) > > - pdev = xmalloc(struct pci_ats_dev); > > - if ( !pdev ) > > - return -ENOMEM; > > - > > - if ( !(value & ATS_ENABLE) ) > > - { > > - value |= ATS_ENABLE; > > - pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), > > - pos + ATS_REG_CTL, value); > > - } > > - > > - if ( pos ) > > - { > > - pdev->seg = seg; > > - pdev->bus = bus; > > - pdev->devfn = devfn; > > - value = pci_conf_read16(seg, bus, PCI_SLOT(devfn), > > - PCI_FUNC(devfn), pos + ATS_REG_CAP); > > - pdev->ats_queue_depth = value & ATS_QUEUE_DEPTH_MASK; > > - list_add(&pdev->list, &ats_devices); > > - } > > - > > - if ( iommu_verbose ) > > - dprintk(XENLOG_INFO VTDPREFIX, > > - "%04x:%02x:%02x.%u: ATS %s enabled\n", > > - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), > > - pos ? "is" : "was"); > > - > > - return pos; > > -} > > - > > -void disable_ats_device(int seg, int bus, int devfn) > > -{ > > - struct pci_ats_dev *pdev; > > - 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); > > - value &= ~ATS_ENABLE; > > - pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), > > - pos + ATS_REG_CTL, value); > > - > > - list_for_each_entry ( pdev, &ats_devices, list ) > > - { > > - if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == > > devfn ) - { > > - list_del(&pdev->list); > > - xfree(pdev); > > - break; > > - } > > - } > > - > > - if ( iommu_verbose ) > > - dprintk(XENLOG_INFO VTDPREFIX, > > - "%04x:%02x:%02x.%u: ATS is disabled\n", > > - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); > > -} > > - > > - > > static int device_in_domain(struct iommu *iommu, struct pci_ats_dev > > *pdev, u16 did) > > { > > struct root_entry *root_entry = NULL; > > diff -r 121af976b298 -r a559e27ffb2c xen/include/xen/pci.h > > --- a/xen/include/xen/pci.h Fri Oct 14 10:17:22 2011 +0200 > > +++ b/xen/include/xen/pci.h Fri Oct 21 14:50:16 2011 +0200 > > @@ -63,6 +63,20 @@ struct pci_dev { > > u64 vf_rlen[6]; > > }; > > > > +#define ATS_REG_CAP 4 > > +#define ATS_REG_CTL 6 > > +#define ATS_QUEUE_DEPTH_MASK 0xF > > +#define ATS_ENABLE (1<<15) > > + > > +struct pci_ats_dev { > > + struct list_head list; > > + u16 seg; > > + u8 bus; > > + u8 devfn; > > + u16 ats_queue_depth; /* ATS device invalidation queue depth */ > > +}; > > +static LIST_HEAD(ats_devices); > > + > > #define for_each_pdev(domain, pdev) \ > > list_for_each_entry(pdev, &(domain->arch.pdev_list), domain_list) > > > > @@ -136,4 +150,7 @@ void msixtbl_pt_unregister(struct domain > > void msixtbl_pt_cleanup(struct domain *d); > > void pci_enable_acs(struct pci_dev *pdev); > > > > +int enable_ats_device(int seg, int bus, int devfn); > > +void disable_ats_device(int seg, int bus, int devfn); > > + > > #endif /* __XEN_PCI_H__ */ > > > > > > _______________________________________________ > > Xen-devel mailing list > > Xen-devel@xxxxxxxxxxxxxxxxxxx > > http://lists.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |