|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3/3] AMD/IOMMU: replace a few literal numbers
Introduce IOMMU_PDE_NEXT_LEVEL_{MIN,MAX} to replace literal 1, 6, and 7
instances. While doing so replace two uses of memset() by initializers.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
TBD: We should really honor the hats field of union
amd_iommu_ext_features, but the specification (or at least the
parts I did look at in the course of putting together this patch)
is unclear about the maximum valid value in case EFRSup is clear.
--- a/xen/drivers/passthrough/amd/iommu_map.c
+++ b/xen/drivers/passthrough/amd/iommu_map.c
@@ -187,7 +187,8 @@ static int iommu_pde_from_dfn(struct dom
table = hd->arch.root_table;
level = hd->arch.paging_mode;
- BUG_ON( table == NULL || level < 1 || level > 6 );
+ BUG_ON(!table || level < IOMMU_PDE_NEXT_LEVEL_MIN ||
+ level > IOMMU_PDE_NEXT_LEVEL_MAX);
/*
* A frame number past what the current page tables can represent can't
@@ -198,7 +199,7 @@ static int iommu_pde_from_dfn(struct dom
next_table_mfn = mfn_x(page_to_mfn(table));
- while ( level > 1 )
+ while ( level > IOMMU_PDE_NEXT_LEVEL_MIN )
{
unsigned int next_level = level - 1;
pt_mfn[level] = next_table_mfn;
@@ -274,7 +275,7 @@ static int iommu_pde_from_dfn(struct dom
level--;
}
- /* mfn of level 1 page table */
+ /* mfn of IOMMU_PDE_NEXT_LEVEL_MIN page table */
pt_mfn[level] = next_table_mfn;
return 0;
}
@@ -284,9 +285,7 @@ int amd_iommu_map_page(struct domain *d,
{
struct domain_iommu *hd = dom_iommu(d);
int rc;
- unsigned long pt_mfn[7];
-
- memset(pt_mfn, 0, sizeof(pt_mfn));
+ unsigned long pt_mfn[IOMMU_PDE_NEXT_LEVEL_MAX + 1] = {};
spin_lock(&hd->arch.mapping_lock);
@@ -300,7 +299,8 @@ int amd_iommu_map_page(struct domain *d,
return rc;
}
- if ( iommu_pde_from_dfn(d, dfn_x(dfn), pt_mfn, true) || (pt_mfn[1] == 0) )
+ if ( iommu_pde_from_dfn(d, dfn_x(dfn), pt_mfn, true) ||
+ !pt_mfn[IOMMU_PDE_NEXT_LEVEL_MIN] )
{
spin_unlock(&hd->arch.mapping_lock);
AMD_IOMMU_DEBUG("Invalid IO pagetable entry dfn = %"PRI_dfn"\n",
@@ -310,9 +310,11 @@ int amd_iommu_map_page(struct domain *d,
}
/* Install 4k mapping */
- *flush_flags |= set_iommu_pte_present(pt_mfn[1], dfn_x(dfn), mfn_x(mfn),
- 1, (flags & IOMMUF_writable),
- (flags & IOMMUF_readable));
+ *flush_flags |= set_iommu_pte_present(pt_mfn[IOMMU_PDE_NEXT_LEVEL_MIN],
+ dfn_x(dfn), mfn_x(mfn),
+ IOMMU_PDE_NEXT_LEVEL_MIN,
+ flags & IOMMUF_writable,
+ flags & IOMMUF_readable);
spin_unlock(&hd->arch.mapping_lock);
@@ -322,11 +324,9 @@ int amd_iommu_map_page(struct domain *d,
int amd_iommu_unmap_page(struct domain *d, dfn_t dfn,
unsigned int *flush_flags)
{
- unsigned long pt_mfn[7];
+ unsigned long pt_mfn[IOMMU_PDE_NEXT_LEVEL_MAX + 1] = {};
struct domain_iommu *hd = dom_iommu(d);
- memset(pt_mfn, 0, sizeof(pt_mfn));
-
spin_lock(&hd->arch.mapping_lock);
if ( !hd->arch.root_table )
@@ -344,10 +344,12 @@ int amd_iommu_unmap_page(struct domain *
return -EFAULT;
}
- if ( pt_mfn[1] )
+ if ( pt_mfn[IOMMU_PDE_NEXT_LEVEL_MIN] )
{
/* Mark PTE as 'page not present'. */
- *flush_flags |= clear_iommu_pte_present(pt_mfn[1], dfn_x(dfn));
+ *flush_flags |=
+ clear_iommu_pte_present(pt_mfn[IOMMU_PDE_NEXT_LEVEL_MIN],
+ dfn_x(dfn));
}
spin_unlock(&hd->arch.mapping_lock);
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
@@ -233,14 +233,14 @@ static int __must_check allocate_domain_
int amd_iommu_get_paging_mode(unsigned long entries)
{
- int level = 1;
+ int level = IOMMU_PDE_NEXT_LEVEL_MIN;
BUG_ON( !entries );
while ( entries > PTE_PER_TABLE_SIZE )
{
entries = PTE_PER_TABLE_ALIGN(entries) >> PTE_PER_TABLE_SHIFT;
- if ( ++level > 6 )
+ if ( ++level > IOMMU_PDE_NEXT_LEVEL_MAX )
return -ENOMEM;
}
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
@@ -465,6 +465,9 @@ union amd_iommu_x2apic_control {
#define IOMMU_PAGE_TABLE_U32_PER_ENTRY (IOMMU_PAGE_TABLE_ENTRY_SIZE / 4)
#define IOMMU_PAGE_TABLE_ALIGNMENT 4096
+#define IOMMU_PDE_NEXT_LEVEL_MIN 1
+#define IOMMU_PDE_NEXT_LEVEL_MAX 6
+
struct amd_iommu_pte {
uint64_t pr:1;
uint64_t ignored0:4;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |