>>> On 03.11.11 at 16:48, Wei Wang <wei.wang2@xxxxxxx> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@xxxxxxx>
> # Date 1320334551 -3600
> # Node ID ef46c471a11f83d07e256ad2e0b868828f45ef63
> # Parent 119bccb1cc5eee1364bbbd3bd1a30f22e9db703a
> ats: Move some ats functions to a new directory.
> Remove VTD prefix from debug output.
> passhrough/x86 holds vendor neutral codes for x86 architecture.
>
> Signed-off-by: Wei Wang <wei.wang2@xxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/Makefile
> --- a/xen/drivers/passthrough/Makefile Wed Nov 02 13:53:05 2011 +0100
> +++ b/xen/drivers/passthrough/Makefile Thu Nov 03 16:35:51 2011 +0100
> @@ -1,6 +1,7 @@
> subdir-$(x86) += vtd
> subdir-$(ia64) += vtd
> subdir-$(x86) += amd
> +subdir-$(x86_64) += x86
>
> obj-y += iommu.o
> obj-y += io.o
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/ats.h
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/ats.h Thu Nov 03 16:35:51 2011 +0100
> @@ -0,0 +1,56 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
> for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with
> + * this program; if not, write to the Free Software Foundation, Inc., 59
> Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + */
> +
> +#ifndef _ATS_H_
> +#define _ATS_H_
> +
> +struct pci_ats_dev {
> + struct list_head list;
> + u16 seg;
> + u8 bus;
> + u8 devfn;
> + u16 ats_queue_depth; /* ATS device invalidation queue depth */
> +};
> +
> +#ifdef CONFIG_X86_64
> +
> +#define ATS_REG_CAP 4
> +#define ATS_REG_CTL 6
> +#define ATS_QUEUE_DEPTH_MASK 0xF
> +#define ATS_ENABLE (1<<15)
> +
> +extern struct list_head ats_devices;
> +extern bool_t ats_enabled;
> +
> +int enable_ats_device(int seg, int bus, int devfn);
> +void disable_ats_device(int seg, int bus, int devfn);
> +
> +#else
> +
> +#define ats_enabled 0
> +static inline int enable_ats_device(int seg, int bus, int devfn)
> +{
> + BUG();
> + return -ENOSYS;
> +}
> +
> +static inline void disable_ats_device(int seg, int bus, int devfn)
> +{
> + BUG();
> +}
> +#endif
> +
> +#endif /* _ATS_H_ */
> +
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/vtd/extern.h
> --- a/xen/drivers/passthrough/vtd/extern.h Wed Nov 02 13:53:05 2011 +0100
> +++ b/xen/drivers/passthrough/vtd/extern.h Thu Nov 03 16:35:51 2011 +0100
> @@ -57,18 +57,13 @@ struct acpi_drhd_unit * iommu_to_drhd(st
> struct acpi_rhsa_unit * drhd_to_rhsa(struct acpi_drhd_unit *drhd);
>
> #ifdef CONFIG_X86_64
> -extern bool_t ats_enabled;
> -
> struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
>
> int ats_device(const struct pci_dev *, const struct acpi_drhd_unit *);
> -int enable_ats_device(int seg, int bus, int devfn);
> -void disable_ats_device(int seg, int bus, int devfn);
>
> int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
> u64 addr, unsigned int size_order, u64 type);
> #else
> -#define ats_enabled 0
>
> static inline struct acpi_drhd_unit *find_ats_dev_drhd(struct iommu *iommu)
> {
> @@ -80,15 +75,6 @@ static inline int ats_device(const struc
> {
> return 0;
> }
> -static inline int enable_ats_device(int seg, int bus, int devfn)
> -{
> - BUG();
> - return -ENOSYS;
> -}
> -static inline void disable_ats_device(int seg, int bus, int devfn)
> -{
> - BUG();
> -}
>
> static inline int dev_invalidate_iotlb(struct iommu *iommu, u16 did, u64
> addr,
> unsigned int size_order, u64 type)
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/vtd/iommu.c
> --- a/xen/drivers/passthrough/vtd/iommu.c Wed Nov 02 13:53:05 2011 +0100
> +++ b/xen/drivers/passthrough/vtd/iommu.c Thu Nov 03 16:35:51 2011 +0100
> @@ -40,6 +40,7 @@
> #include "dmar.h"
> #include "extern.h"
> #include "vtd.h"
> +#include "../ats.h"
>
> #ifdef __ia64__
> #define nr_ioapics iosapic_get_nr_iosapics()
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/vtd/x86/ats.c
> --- a/xen/drivers/passthrough/vtd/x86/ats.c Wed Nov 02 13:53:05 2011 +0100
> +++ b/xen/drivers/passthrough/vtd/x86/ats.c Thu Nov 03 16:35:51 2011 +0100
> @@ -27,51 +27,10 @@
> #include "../dmar.h"
> #include "../vtd.h"
> #include "../extern.h"
> +#include "../../ats.h"
>
> 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);
> -
> -bool_t __read_mostly ats_enabled = 1;
> -
> -static void __init parse_ats_param(char *s)
> -{
> - char *ss;
> -
> - do {
> - ss = strchr(s, ',');
> - if ( ss )
> - *ss = '\0';
> -
> - switch ( parse_bool(s) )
> - {
> - case 0:
> - ats_enabled = 0;
> - break;
> - case 1:
> - ats_enabled = 1;
> - break;
> - }
> -
> - s = ss + 1;
> - } while ( ss );
> -}
> -
> struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu)
> {
> struct acpi_drhd_unit *drhd;
> @@ -113,97 +72,6 @@ int ats_device(const struct pci_dev *pde
> 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 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/x86/Makefile
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/x86/Makefile Thu Nov 03 16:35:51 2011 +0100
> @@ -0,0 +1,1 @@
> +obj-$(CONFIG_X86_64) += ats.o
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/x86/ats.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/x86/ats.c Thu Nov 03 16:35:51 2011 +0100
> @@ -0,0 +1,136 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
> for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with
> + * this program; if not, write to the Free Software Foundation, Inc., 59
> Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + */
> +
> +#include <xen/sched.h>
> +#include <xen/pci.h>
> +#include <xen/pci_regs.h>
> +#include "../ats.h"
> +
> +LIST_HEAD(ats_devices);
> +
> +static void parse_ats_param(char *s);
> +custom_param("ats", parse_ats_param);
> +
> +bool_t __read_mostly ats_enabled = 1;
> +
> +static void __init parse_ats_param(char *s)
> +{
> + char *ss;
> +
> + do {
> + ss = strchr(s, ',');
> + if ( ss )
> + *ss = '\0';
> +
> + switch ( parse_bool(s) )
> + {
> + case 0:
> + ats_enabled = 0;
> + break;
> + case 1:
> + ats_enabled = 1;
> + break;
> + }
> +
> + s = ss + 1;
> + } while ( ss );
> +}
> +
> +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, "%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, "%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, "%04x:%02x:%02x.%u: ATS is disabled\n",
> + seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> +}
>
>
> _______________________________________________
> 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
|