VT-d: cleanup ATS code

Rather than having per-architecture stubs when ATS support is not
implemented, simply provide inline functions in the common header for
that case.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
This commit is contained in:
Jan Beulich committed 2011-03-09 16:29:52 +00:00
1 parent 7b491593ff
commit 345ff09cee
5 files changed
+45 -93

No files matched your search

+36 -4
View File
@@ -24,7 +24,6 @@
#include "dmar.h"
#include <xen/keyhandler.h>
extern bool_t ats_enabled;
extern bool_t rwbf_quirk;
void print_iommu_regs(struct acpi_drhd_unit *drhd);
@@ -56,17 +55,50 @@ struct iommu * ioapic_to_iommu(unsigned int apic_id);
struct acpi_drhd_unit * ioapic_to_drhd(unsigned int apic_id);
struct acpi_drhd_unit * iommu_to_drhd(struct iommu *iommu);
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(int seg, int bus, int devfn);
int enable_ats_device(int seg, int bus, int devfn);
int disable_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,
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)
{
return NULL;
}
static inline int ats_device(int seg, int bus, int devfn)
{
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)
{
return 0;
}
#endif
int qinval_device_iotlb(struct iommu *iommu,
u32 max_invs_pend, u16 sid, u16 size, u64 addr);
int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
u64 addr, unsigned int size_order, u64 type);
unsigned int get_cache_line_size(void);
void cacheline_flush(char *);
@@ -1,2 +1 @@
obj-y += vtd.o
obj-y += ats.o
-59
View File
@@ -1,59 +0,0 @@
/*
* Copyright (c) 2006, Intel Corporation.
*
* 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.
*
* Author: Allen Kay <allen.m.kay@intel.com>
*/
#include <xen/sched.h>
#include <xen/iommu.h>
#include <xen/time.h>
#include <xen/pci.h>
#include <xen/pci_regs.h>
#include <asm/msi.h>
#include "../iommu.h"
#include "../dmar.h"
#include "../vtd.h"
#include "../extern.h"
struct pci_ats_dev;
bool_t __read_mostly ats_enabled = 0;
struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu)
{
return NULL;
}
int ats_device(int seg, int bus, int devfn)
{
return 0;
}
int enable_ats_device(int seg, int bus, int devfn)
{
return 0;
}
int disable_ats_device(int seg, int bus, int devfn)
{
return 0;
}
int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
u64 addr, unsigned int size_order, u64 type)
{
return 0;
}
+1 -1
View File
@@ -1,2 +1,2 @@
obj-y += vtd.o
obj-y += ats.o
obj-$(CONFIG_X86_64) += ats.o
+8 -28
View File
@@ -127,23 +127,11 @@ int enable_ats_device(int seg, int bus, int devfn)
u32 value;
int pos;
if ( !acpi_find_matched_atsr_unit(bus, devfn) )
{
dprintk(XENLOG_WARNING VTDPREFIX,
"cannot find matched atsr for %x:%x.%x\n",
bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
return 0;
}
pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
if ( !pos )
{
dprintk(XENLOG_ERR VTDPREFIX, "ats capability not found %x:%x.%x\n",
bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
return 0;
}
else
dprintk(XENLOG_ERR VTDPREFIX, "ats capability found %x:%x.%x\n",
BUG_ON(!pos);
if ( iommu_verbose )
dprintk(XENLOG_INFO VTDPREFIX, "%x:%x.%x: ATS capability found\n",
bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
/* BUGBUG: add back seg when multi-seg platform support is enabled */
@@ -189,16 +177,14 @@ int enable_ats_device(int seg, int bus, int devfn)
return pos;
}
int disable_ats_device(int seg, int bus, int devfn)
void disable_ats_device(int seg, int bus, int devfn)
{
struct list_head *pdev_list, *tmp;
struct pci_ats_dev *pdev;
u32 value;
int pos;
pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
if ( !pos )
return 0;
BUG_ON(!pos);
/* BUGBUG: add back seg when multi-seg platform support is enabled */
value = pci_conf_read16(bus, PCI_SLOT(devfn),
@@ -207,9 +193,8 @@ int disable_ats_device(int seg, int bus, int devfn)
pci_conf_write16(bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
pos + ATS_REG_CTL, value);
list_for_each_safe( pdev_list, tmp, &ats_devices )
list_for_each_entry ( pdev, &ats_devices, list )
{
pdev = list_entry(pdev_list, struct pci_ats_dev, list);
if ( pdev->bus == bus && pdev->devfn == devfn )
{
list_del(&pdev->list);
@@ -221,8 +206,6 @@ int disable_ats_device(int seg, int bus, int devfn)
if ( iommu_verbose )
dprintk(XENLOG_INFO VTDPREFIX, "%x:%x.%x: ATS is disabled\n",
bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
return 0;
}
@@ -257,10 +240,7 @@ out:
if ( ctxt_entry )
unmap_vtd_domain_page(ctxt_entry);
if ( found )
return 1;
return 0;
return found;
}
int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.