>>> 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
> 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
|