[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.