From: Alex Williamson <alex.williamson@redhat.com>
To: Bjorn Helgaas <bhelgaas@google.com>
Cc: aafabbri@cisco.com, kvm@vger.kernel.org, B07421@freescale.com,
aik@ozlabs.ru, konrad.wilk@oracle.com, linux-pci@vger.kernel.org,
agraf@suse.de, qemu-devel@nongnu.org, chrisw@sous-sol.org,
B08248@freescale.com, iommu@lists.linux-foundation.org,
gregkh@linuxfoundation.org, avi@redhat.com, joerg.roedel@amd.com,
benve@cisco.com, dwmw2@infradead.org,
linux-kernel@vger.kernel.org, david@gibson.dropbear.id.au
Subject: Re: [Qemu-devel] [PATCH 05/13] pci: New pci_acs_enabled()
Date: Mon, 14 May 2012 16:49:26 -0600 [thread overview]
Message-ID: <1337035766.6954.74.camel@bling.home> (raw)
In-Reply-To: <CAErSpo58hKPFb5duOi64sWuR5AJDTVp0rRHkQLotYE3CMXRRhA@mail.gmail.com>
On Mon, 2012-05-14 at 16:02 -0600, Bjorn Helgaas wrote:
> On Fri, May 11, 2012 at 4:56 PM, Alex Williamson
> <alex.williamson@redhat.com> wrote:
> > In a PCIe environment, transactions aren't always required to
> > reach the root bus before being re-routed. Peer-to-peer DMA
> > may actually not be seen by the IOMMU in these cases. For
> > IOMMU groups, we want to provide IOMMU drivers a way to detect
> > these restrictions. Provided with a PCI device, pci_acs_enabled
> > returns the furthest downstream device with a complete PCI ACS
> > chain. This information can then be used in grouping to create
> > fully isolated groups. ACS chain logic extracted from libvirt.
>
> The name "pci_acs_enabled()" sounds like it returns a boolean, but it doesn't.
Right, maybe this should be:
struct pci_dev *pci_find_upstream_acs(struct pci_dev *pdev);
> I'm not sure what "a complete PCI ACS chain" means.
>
> The function starts from "dev" and searches *upstream*, so I'm
> guessing it returns the root of a subtree that must be contained in a
> group.
Any intermediate switch between an endpoint and the root bus can
redirect a dma access without iommu translation, so we're looking for
the furthest upstream device for which acs is enabled all the way up to
the root bus. I'll fix the function name and comments/commit log if
that makes it sufficiently clear. Thanks,
Alex
> > Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
> > ---
> >
> > drivers/pci/pci.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> > include/linux/pci.h | 1 +
> > 2 files changed, 44 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> > index 111569c..d7f05ce 100644
> > --- a/drivers/pci/pci.c
> > +++ b/drivers/pci/pci.c
> > @@ -2358,6 +2358,49 @@ void pci_enable_acs(struct pci_dev *dev)
> > pci_write_config_word(dev, pos + PCI_ACS_CTRL, ctrl);
> > }
> >
> > +#define PCI_EXT_CAP_ACS_ENABLED (PCI_ACS_SV | PCI_ACS_RR | \
> > + PCI_ACS_CR | PCI_ACS_UF)
> > +
> > +/**
> > + * pci_acs_enabled - test ACS support in downstream chain
> > + * @dev: starting PCI device
> > + *
> > + * Returns the furthest downstream device with an unbroken ACS chain. If
> > + * ACS is enabled throughout the chain, the returned device is the same as
> > + * the one passed in.
> > + */
> > +struct pci_dev *pci_acs_enabled(struct pci_dev *dev)
> > +{
> > + struct pci_dev *acs_dev;
> > + int pos;
> > + u16 ctrl;
> > +
> > + if (!pci_is_root_bus(dev->bus))
> > + acs_dev = pci_acs_enabled(dev->bus->self);
> > + else
> > + return dev;
> > +
> > + /* If the chain is already broken, pass on the device */
> > + if (acs_dev != dev->bus->self)
> > + return acs_dev;
> > +
> > + if (!pci_is_pcie(dev) || (dev->class >> 8) != PCI_CLASS_BRIDGE_PCI)
> > + return dev;
> > +
> > + if (dev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
> > + return dev;
> > +
> > + pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);
> > + if (!pos)
> > + return acs_dev;
> > +
> > + pci_read_config_word(dev, pos + PCI_ACS_CTRL, &ctrl);
> > + if ((ctrl & PCI_EXT_CAP_ACS_ENABLED) != PCI_EXT_CAP_ACS_ENABLED)
> > + return acs_dev;
> > +
> > + return dev;
> > +}
> > +
> > /**
> > * pci_swizzle_interrupt_pin - swizzle INTx for device behind bridge
> > * @dev: the PCI device
> > diff --git a/include/linux/pci.h b/include/linux/pci.h
> > index 9910b5c..dc25da3 100644
> > --- a/include/linux/pci.h
> > +++ b/include/linux/pci.h
> > @@ -1586,6 +1586,7 @@ static inline bool pci_is_pcie(struct pci_dev *dev)
> > }
> >
> > void pci_request_acs(void);
> > +struct pci_dev *pci_acs_enabled(struct pci_dev *dev);
> >
> >
> > #define PCI_VPD_LRDT 0x80 /* Large Resource Data Type */
> >
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2012-05-14 22:49 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-11 22:55 [Qemu-devel] [PATCH 00/13] IOMMU Groups + VFIO Alex Williamson
2012-05-11 22:55 ` [Qemu-devel] [PATCH 01/13] driver core: Add iommu_group tracking to struct device Alex Williamson
2012-05-11 23:38 ` Greg KH
2012-05-11 23:58 ` Alex Williamson
2012-05-12 0:00 ` Greg KH
2012-05-11 22:55 ` [Qemu-devel] [PATCH 02/13] iommu: IOMMU Groups Alex Williamson
2012-05-11 23:39 ` Greg KH
2012-05-11 23:58 ` Alex Williamson
2012-05-14 1:16 ` David Gibson
2012-05-14 17:11 ` Alex Williamson
2012-05-15 2:03 ` David Gibson
2012-05-15 6:34 ` Alex Williamson
2012-05-17 3:29 ` David Gibson
2012-05-11 22:55 ` [Qemu-devel] [PATCH 03/13] iommu: IOMMU groups for VT-d and AMD-Vi Alex Williamson
2012-05-17 3:37 ` David Gibson
2012-05-11 22:55 ` [Qemu-devel] [PATCH 04/13] pci: New pci_dma_quirk() Alex Williamson
2012-05-17 3:39 ` David Gibson
2012-05-17 4:06 ` Alex Williamson
2012-05-17 7:19 ` Anonymous
2012-05-17 15:22 ` Alex Williamson
2012-05-11 22:56 ` [Qemu-devel] [PATCH 05/13] pci: New pci_acs_enabled() Alex Williamson
2012-05-14 22:02 ` Bjorn Helgaas
2012-05-14 22:49 ` Alex Williamson [this message]
2012-05-15 19:56 ` Bjorn Helgaas
2012-05-15 20:05 ` Bjorn Helgaas
2012-05-15 21:09 ` Alex Williamson
2012-05-16 13:29 ` Don Dutile
2012-05-16 16:21 ` Alex Williamson
2012-05-16 19:36 ` Alex Williamson
2012-05-18 23:00 ` [Qemu-devel] RESEND3: " Don Dutile
2012-05-19 2:47 ` [Qemu-devel] " Alex Williamson
2012-05-21 13:31 ` Don Dutile
2012-05-21 14:59 ` Alex Williamson
2012-05-21 18:14 ` Don Dutile
2012-05-11 22:56 ` [Qemu-devel] [PATCH 06/13] iommu: Make use of DMA quirking and ACS enabled check for groups Alex Williamson
2012-05-11 22:56 ` [Qemu-devel] [PATCH 07/13] vfio: VFIO core Alex Williamson
2012-05-11 22:56 ` [Qemu-devel] [PATCH 08/13] vfio: Add documentation Alex Williamson
2012-05-11 22:56 ` [Qemu-devel] [PATCH 09/13] vfio: x86 IOMMU implementation Alex Williamson
2012-05-11 22:56 ` [Qemu-devel] [PATCH 10/13] pci: export pci_user functions for use by other drivers Alex Williamson
2012-05-14 21:20 ` Bjorn Helgaas
2012-05-11 22:56 ` [Qemu-devel] [PATCH 11/13] pci: Create common pcibios_err_to_errno Alex Williamson
2012-05-21 17:55 ` Konrad Rzeszutek Wilk
2012-05-11 22:56 ` [Qemu-devel] [PATCH 12/13] pci: Misc pci_reg additions Alex Williamson
2012-05-11 22:56 ` [Qemu-devel] [PATCH 13/13] vfio: Add PCI device driver Alex Williamson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1337035766.6954.74.camel@bling.home \
--to=alex.williamson@redhat.com \
--cc=B07421@freescale.com \
--cc=B08248@freescale.com \
--cc=aafabbri@cisco.com \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=avi@redhat.com \
--cc=benve@cisco.com \
--cc=bhelgaas@google.com \
--cc=chrisw@sous-sol.org \
--cc=david@gibson.dropbear.id.au \
--cc=dwmw2@infradead.org \
--cc=gregkh@linuxfoundation.org \
--cc=iommu@lists.linux-foundation.org \
--cc=joerg.roedel@amd.com \
--cc=konrad.wilk@oracle.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).