diff options
Diffstat (limited to 'drivers/iommu/iommu.c')
-rw-r--r-- | drivers/iommu/iommu.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 65a3b3d886dc..f36e140ea02b 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -74,6 +74,7 @@ static const char * const iommu_group_resv_type_string[] = { [IOMMU_RESV_RESERVED] = "reserved", [IOMMU_RESV_MSI] = "msi", [IOMMU_RESV_SW_MSI] = "msi", + [IOMMU_RESV_TRANSLATED] = "translated", }; #define IOMMU_CMD_LINE_DMA_API BIT(0) @@ -2582,6 +2583,19 @@ struct iommu_resv_region *iommu_alloc_resv_region(phys_addr_t start, enum iommu_resv_type type, gfp_t gfp) { + if (type == IOMMU_RESV_TRANSLATED) + return NULL; + + return iommu_alloc_resv_region_tr(start, 0, length, prot, type, gfp); +} +EXPORT_SYMBOL_GPL(iommu_alloc_resv_region); + +struct iommu_resv_region *iommu_alloc_resv_region_tr(phys_addr_t start, + dma_addr_t dva_start, + size_t length, int prot, + enum iommu_resv_type type, + gfp_t gfp) +{ struct iommu_resv_region *region; region = kzalloc(sizeof(*region), gfp); @@ -2590,12 +2604,14 @@ struct iommu_resv_region *iommu_alloc_resv_region(phys_addr_t start, INIT_LIST_HEAD(®ion->list); region->start = start; + if (type == IOMMU_RESV_TRANSLATED) + region->dva = dva_start; region->length = length; region->prot = prot; region->type = type; return region; } -EXPORT_SYMBOL_GPL(iommu_alloc_resv_region); +EXPORT_SYMBOL_GPL(iommu_alloc_resv_region_tr); void iommu_set_default_passthrough(bool cmd_line) { |