Mailing List Archive

[PATCH 05 of 14 V3] amd iommu: Enable guest level translation
# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1326213593 -3600
# Node ID e698b7b63a9dc75c5cad4dbe02d38d90bdaf1512
# Parent 6cb08a39044171124b9b9176b50d2ea9196420bb
amd iommu: Enable guest level translation.
Similar to nested paging for SVM, IOMMUv2 supports two level translations for
DMA. This patch enables this feature.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 6cb08a390441 -r e698b7b63a9d xen/drivers/passthrough/amd/iommu_init.c
--- a/xen/drivers/passthrough/amd/iommu_init.c Tue Jan 10 17:39:49 2012 +0100
+++ b/xen/drivers/passthrough/amd/iommu_init.c Tue Jan 10 17:39:53 2012 +0100
@@ -223,6 +223,23 @@ static void set_iommu_translation_contro
writel(entry, iommu->mmio_base+IOMMU_CONTROL_MMIO_OFFSET);
}

+static void set_iommu_guest_translation_control(struct amd_iommu *iommu,
+ int enable)
+{
+ u32 entry;
+
+ entry = readl(iommu->mmio_base + IOMMU_CONTROL_MMIO_OFFSET);
+
+ enable ?
+ iommu_set_bit(&entry, IOMMU_CONTROL_GT_ENABLE_SHIFT):
+ iommu_clear_bit(&entry, IOMMU_CONTROL_GT_ENABLE_SHIFT);
+
+ writel(entry, iommu->mmio_base+IOMMU_CONTROL_MMIO_OFFSET);
+
+ if ( enable )
+ AMD_IOMMU_DEBUG("Guest Translation Enabled.\n");
+}
+
static void set_iommu_command_buffer_control(struct amd_iommu *iommu,
int enable)
{
@@ -658,6 +675,9 @@ static void enable_iommu(struct amd_iomm
if ( iommu_has_feature(iommu, IOMMU_EXT_FEATURE_PPRSUP_SHIFT) )
set_iommu_ppr_log_control(iommu, IOMMU_CONTROL_ENABLED);

+ if ( iommu_has_feature(iommu, IOMMU_EXT_FEATURE_GTSUP_SHIFT) )
+ set_iommu_guest_translation_control(iommu, IOMMU_CONTROL_ENABLED);
+
set_iommu_translation_control(iommu, IOMMU_CONTROL_ENABLED);

if ( iommu_has_feature(iommu, IOMMU_EXT_FEATURE_IASUP_SHIFT) )
@@ -998,6 +1018,9 @@ static void disable_iommu(struct amd_iom
if ( iommu_has_feature(iommu, IOMMU_EXT_FEATURE_PPRSUP_SHIFT) )
set_iommu_ppr_log_control(iommu, IOMMU_CONTROL_DISABLED);

+ if ( iommu_has_feature(iommu, IOMMU_EXT_FEATURE_GTSUP_SHIFT) )
+ set_iommu_guest_translation_control(iommu, IOMMU_CONTROL_DISABLED);
+
set_iommu_translation_control(iommu, IOMMU_CONTROL_DISABLED);

iommu->enabled = 0;


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel