@@ -65,8 +65,6 @@ struct acpi_drhd_unit *ioapic_to_drhd(un
struct acpi_drhd_unit *hpet_to_drhd(unsigned int hpet_id);
struct acpi_rhsa_unit *drhd_to_rhsa(const struct acpi_drhd_unit *drhd);
-struct acpi_drhd_unit *find_ats_dev_drhd(struct vtd_iommu *iommu);
-
int ats_device(const struct pci_dev *, const struct acpi_drhd_unit *);
int dev_invalidate_iotlb(struct vtd_iommu *iommu, u16 did,
@@ -624,8 +624,7 @@ int cf_check vtd_flush_iotlb_reg(
}
static int __must_check iommu_flush_iotlb_global(struct vtd_iommu *iommu,
- bool flush_non_present_entry,
- bool flush_dev_iotlb)
+ bool flush_non_present_entry)
{
int status;
@@ -633,7 +632,7 @@ static int __must_check iommu_flush_iotl
vtd_ops_preamble_quirk(iommu);
status = iommu->flush.iotlb(iommu, 0, 0, 0, DMA_TLB_GLOBAL_FLUSH,
- flush_non_present_entry, flush_dev_iotlb);
+ flush_non_present_entry, iommu->flush_dev_iotlb);
/* undo platform specific errata workarounds */
vtd_ops_postamble_quirk(iommu);
@@ -642,8 +641,7 @@ static int __must_check iommu_flush_iotl
}
static int __must_check iommu_flush_iotlb_dsi(struct vtd_iommu *iommu, u16 did,
- bool flush_non_present_entry,
- bool flush_dev_iotlb)
+ bool flush_non_present_entry)
{
int status;
@@ -651,7 +649,7 @@ static int __must_check iommu_flush_iotl
vtd_ops_preamble_quirk(iommu);
status = iommu->flush.iotlb(iommu, did, 0, 0, DMA_TLB_DSI_FLUSH,
- flush_non_present_entry, flush_dev_iotlb);
+ flush_non_present_entry, iommu->flush_dev_iotlb);
/* undo platform specific errata workarounds */
vtd_ops_postamble_quirk(iommu);
@@ -661,26 +659,23 @@ static int __must_check iommu_flush_iotl
static int __must_check iommu_flush_iotlb_psi(struct vtd_iommu *iommu, u16 did,
u64 addr, unsigned int order,
- bool flush_non_present_entry,
- bool flush_dev_iotlb)
+ bool flush_non_present_entry)
{
int status;
/* Fallback to domain selective flush if no PSI support */
if ( !cap_pgsel_inv(iommu->cap) )
- return iommu_flush_iotlb_dsi(iommu, did, flush_non_present_entry,
- flush_dev_iotlb);
+ return iommu_flush_iotlb_dsi(iommu, did, flush_non_present_entry);
/* Fallback to domain selective flush if size is too big */
if ( order > cap_max_amask_val(iommu->cap) )
- return iommu_flush_iotlb_dsi(iommu, did, flush_non_present_entry,
- flush_dev_iotlb);
+ return iommu_flush_iotlb_dsi(iommu, did, flush_non_present_entry);
/* apply platform specific errata workarounds */
vtd_ops_preamble_quirk(iommu);
status = iommu->flush.iotlb(iommu, did, addr, order, DMA_TLB_PSI_FLUSH,
- flush_non_present_entry, flush_dev_iotlb);
+ flush_non_present_entry, iommu->flush_dev_iotlb);
/* undo platform specific errata workarounds */
vtd_ops_postamble_quirk(iommu);
@@ -692,7 +687,6 @@ static int __must_check iommu_flush_all(
{
struct acpi_drhd_unit *drhd;
struct vtd_iommu *iommu;
- bool flush_dev_iotlb;
int rc = 0;
flush_local(FLUSH_CACHE);
@@ -703,8 +697,7 @@ static int __must_check iommu_flush_all(
iommu = drhd->iommu;
context_rc = iommu_flush_context_global(iommu, 0);
- flush_dev_iotlb = !!find_ats_dev_drhd(iommu);
- iotlb_rc = iommu_flush_iotlb_global(iommu, 0, flush_dev_iotlb);
+ iotlb_rc = iommu_flush_iotlb_global(iommu, 0);
/*
* The current logic for returns:
@@ -734,7 +727,6 @@ static int __must_check cf_check iommu_f
struct domain_iommu *hd = dom_iommu(d);
struct acpi_drhd_unit *drhd;
struct vtd_iommu *iommu;
- bool flush_dev_iotlb;
int iommu_domid;
int ret = 0;
@@ -762,21 +754,18 @@ static int __must_check cf_check iommu_f
if ( !test_bit(iommu->index, hd->arch.vtd.iommu_bitmap) )
continue;
- flush_dev_iotlb = !!find_ats_dev_drhd(iommu);
iommu_domid = get_iommu_did(d->domain_id, iommu, !d->is_dying);
if ( iommu_domid == -1 )
continue;
if ( !page_count || (page_count & (page_count - 1)) ||
dfn_eq(dfn, INVALID_DFN) || !IS_ALIGNED(dfn_x(dfn), page_count) )
- rc = iommu_flush_iotlb_dsi(iommu, iommu_domid,
- 0, flush_dev_iotlb);
+ rc = iommu_flush_iotlb_dsi(iommu, iommu_domid, 0);
else
rc = iommu_flush_iotlb_psi(iommu, iommu_domid,
dfn_to_daddr(dfn),
get_order_from_pages(page_count),
- !(flush_flags & IOMMU_FLUSHF_modified),
- flush_dev_iotlb);
+ !(flush_flags & IOMMU_FLUSHF_modified));
if ( rc > 0 )
iommu_flush_write_buffer(iommu);
@@ -1488,7 +1477,6 @@ int domain_context_mapping_one(
uint16_t seg = iommu->drhd->segment, prev_did = 0;
struct domain *prev_dom = NULL;
int rc, ret;
- bool flush_dev_iotlb;
if ( QUARANTINE_SKIP(domain, pgd_maddr) )
return 0;
@@ -1637,8 +1625,7 @@ int domain_context_mapping_one(
rc = iommu_flush_context_device(iommu, prev_did, PCI_BDF(bus, devfn),
DMA_CCMD_MASK_NOBIT, !prev_dom);
- flush_dev_iotlb = !!find_ats_dev_drhd(iommu);
- ret = iommu_flush_iotlb_dsi(iommu, prev_did, !prev_dom, flush_dev_iotlb);
+ ret = iommu_flush_iotlb_dsi(iommu, prev_did, !prev_dom);
/*
* The current logic for returns:
@@ -1882,7 +1869,6 @@ int domain_context_unmap_one(
struct context_entry *context, *context_entries;
u64 maddr;
int iommu_domid, rc, ret;
- bool flush_dev_iotlb;
ASSERT(pcidevs_locked());
spin_lock(&iommu->lock);
@@ -1908,8 +1894,7 @@ int domain_context_unmap_one(
PCI_BDF(bus, devfn),
DMA_CCMD_MASK_NOBIT, 0);
- flush_dev_iotlb = !!find_ats_dev_drhd(iommu);
- ret = iommu_flush_iotlb_dsi(iommu, iommu_domid, 0, flush_dev_iotlb);
+ ret = iommu_flush_iotlb_dsi(iommu, iommu_domid, 0);
/*
* The current logic for returns:
@@ -484,6 +484,7 @@ struct vtd_iommu {
spinlock_t register_lock; /* protect iommu register handling */
u64 root_maddr; /* root entry machine address */
nodeid_t node;
+ bool flush_dev_iotlb;
struct msi_desc msi;
struct acpi_drhd_unit *drhd;
@@ -28,22 +28,8 @@
#include "../extern.h"
#include "../../ats.h"
-static LIST_HEAD(ats_dev_drhd_units);
-
-struct acpi_drhd_unit *find_ats_dev_drhd(struct vtd_iommu *iommu)
-{
- struct acpi_drhd_unit *drhd;
- list_for_each_entry ( drhd, &ats_dev_drhd_units, list )
- {
- if ( drhd->iommu == iommu )
- return drhd;
- }
- return NULL;
-}
-
int ats_device(const struct pci_dev *pdev, const struct acpi_drhd_unit *drhd)
{
- struct acpi_drhd_unit *ats_drhd;
unsigned int pos, expfl = 0;
const struct acpi_satc_unit *satc;
@@ -66,17 +52,10 @@ int ats_device(const struct pci_dev *pde
if ( opt_ats < 0 && (!satc || !satc->atc_required) )
return 0;
- ats_drhd = find_ats_dev_drhd(drhd->iommu);
pos = pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS);
+ if ( pos )
+ drhd->iommu->flush_dev_iotlb = true;
- if ( pos && (ats_drhd == NULL) )
- {
- ats_drhd = xmalloc(struct acpi_drhd_unit);
- if ( !ats_drhd )
- return -ENOMEM;
- *ats_drhd = *drhd;
- list_add_tail(&ats_drhd->list, &ats_dev_drhd_units);
- }
return pos;
}