intel-iommu: errors with smaller iommu widths
authorTom Lyon <pugs@cisco.com>
Mon, 17 May 2010 07:20:45 +0000 (08:20 +0100)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Mon, 17 May 2010 07:34:18 +0000 (08:34 +0100)
commita99c47a228c194aa75bffdcb82806c5f33c7c63b
tree90f8651c7374356bb29811ca6401858fb545610b
parent4f506e07e0a3dff34427cece255a8f390a78d5a0
intel-iommu: errors with smaller iommu widths

When using iommu_domain_alloc with the Intel iommu, the domain address
width is always initialized to 48 bits (agaw 2).  This domain->agaw value
is then used by pfn_to_dma_pte to (always) build a 4 level page table.
However, not all systems support iommu width of 48 or 4 level page tables.
In particular, the Core i5-660 and i5-670 support an address width of 36
bits (not 39!), an agaw of only 1, and only 3 level page tables.

This version of the patch simply lops off extra levels of the page tables
if the agaw value of the iommu is less than what is currently allocated
for the domain (in intel_iommu_attach_device).  If there were already
allocated addresses above what the new iommu can handle, EFAULT is
returned.

Signed-off-by: Tom Lyon <pugs@cisco.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/pci/intel-iommu.c