mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
AMD/IOMMU: check / convert IVMD ranges for being / to be reserved
While the specification doesn't say so, just like for VT-d's RMRRs no good can come from these ranges being e.g. conventional RAM or entirely unmarked and hence usable for placing e.g. PCI device BARs. Check whether they are, and put in some limited effort to convert to reserved. (More advanced logic can be added if actual problems are found with this simplistic variant.) Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Paul Durrant <paul@xen.org>
This commit is contained in:
1 parent
4e467d390e
commit
ed6c77ebf0
1 file changed
+32
@@ -384,6 +384,38 @@ static int __init parse_ivmd_block(const struct acpi_ivrs_memory *ivmd_block)
|
||||
AMD_IOMMU_DEBUG("IVMD Block: type %#x phys %#lx len %#lx\n",
|
||||
ivmd_block->header.type, start_addr, mem_length);
|
||||
|
||||
if ( !e820_all_mapped(base, limit + PAGE_SIZE, E820_RESERVED) )
|
||||
{
|
||||
paddr_t addr;
|
||||
|
||||
AMD_IOMMU_DEBUG("IVMD: [%lx,%lx) is not (entirely) in reserved memory\n",
|
||||
base, limit + PAGE_SIZE);
|
||||
|
||||
for ( addr = base; addr <= limit; addr += PAGE_SIZE )
|
||||
{
|
||||
unsigned int type = page_get_ram_type(maddr_to_mfn(addr));
|
||||
|
||||
if ( type == RAM_TYPE_UNKNOWN )
|
||||
{
|
||||
if ( e820_add_range(&e820, addr, addr + PAGE_SIZE,
|
||||
E820_RESERVED) )
|
||||
continue;
|
||||
AMD_IOMMU_DEBUG("IVMD Error: Page at %lx couldn't be reserved\n",
|
||||
addr);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* Types which won't be handed out are considered good enough. */
|
||||
if ( !(type & (RAM_TYPE_RESERVED | RAM_TYPE_ACPI |
|
||||
RAM_TYPE_UNUSABLE)) )
|
||||
continue;
|
||||
|
||||
AMD_IOMMU_DEBUG("IVMD Error: Page at %lx can't be converted\n",
|
||||
addr);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ivmd_block->header.flags & ACPI_IVMD_EXCLUSION_RANGE )
|
||||
exclusion = true;
|
||||
else if ( ivmd_block->header.flags & ACPI_IVMD_UNITY )
|
||||
|
||||