On Wed, Mar 11, 2020 at 01:45:00PM +0100, Jean-Philippe Brucker wrote: > IOMMU drivers need to perform several tests when checking if a device > supports ATS. Move them all into a new function that returns true when > a device and its host bridge support ATS. > > Since pci_enable_ats() now calls pci_ats_supported(), the following > new checks are now common: > * whether a device is trusted. Devices plugged into external-facing > ports such as thunderbolt are untrusted. > * whether the host bridge supports ATS, which defaults to true unless > the firmware description states that ATS isn't supported by the host > bridge. > > Signed-off-by: Jean-Philippe Brucker <jean-philippe@xxxxxxxxxx> Acked-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > --- > drivers/pci/ats.c | 30 +++++++++++++++++++++++++++++- > include/linux/pci-ats.h | 3 +++ > 2 files changed, 32 insertions(+), 1 deletion(-) > > diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c > index 390e92f2d8d1..bbfd0d42b8b9 100644 > --- a/drivers/pci/ats.c > +++ b/drivers/pci/ats.c > @@ -30,6 +30,34 @@ void pci_ats_init(struct pci_dev *dev) > dev->ats_cap = pos; > } > > +/** > + * pci_ats_supported - check if the device can use ATS > + * @dev: the PCI device > + * > + * Returns true if the device supports ATS and is allowed to use it, false > + * otherwise. > + */ > +bool pci_ats_supported(struct pci_dev *dev) > +{ > + struct pci_host_bridge *bridge; > + > + if (!dev->ats_cap) > + return false; > + > + if (dev->untrusted) > + return false; > + > + bridge = pci_find_host_bridge(dev->bus); > + if (!bridge) > + return false; > + > + if (!bridge->ats_supported) > + return false; > + > + return true; I assume this is the same as return bridge->ats_supported; Only "assuming" because I'm not a C language lawyer, but I assume it does the obvious conversion from unsigned:1 to bool. > +}