Skip to content
Permalink
Browse files
iommu/dma: Introduce generic helper to retrieve RMR info
Reserved Memory Regions(RMR) associated with an IOMMU may be
described either through ACPI tables or DT in systems with
devices that require a unity mapping or bypass for those
regions in IOMMU drivers.

Introduce a generic interface so that IOMMU drivers can retrieve
and set up necessary mappings.

Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
  • Loading branch information
shamiali2008 authored and intel-lab-lkp committed Apr 20, 2021
1 parent a08447e commit c68d4ba37ecc2173a2dc418799e23a184685d681
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 0 deletions.
@@ -191,6 +191,39 @@ void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list)
}
EXPORT_SYMBOL(iommu_dma_get_resv_regions);

/**
* iommu_dma_get_rmrs - Retrieve Reserved Memory Regions(RMRs) associated
* with a given IOMMU
* @iommu_fwnode: fwnode associated with IOMMU
* @list: RMR list to be populated
*
*/
int iommu_dma_get_rmrs(struct fwnode_handle *iommu_fwnode,
struct list_head *list)
{
return 0;
}
EXPORT_SYMBOL(iommu_dma_get_rmrs);

struct iommu_rmr *iommu_dma_alloc_rmr(u64 base, u64 length, u32 sid,
u32 flags)
{
struct iommu_rmr *rmr;

rmr = kzalloc(sizeof(*rmr), GFP_KERNEL);
if (!rmr)
return NULL;

INIT_LIST_HEAD(&rmr->list);
rmr->base_address = base;
rmr->length = length;
rmr->sid = sid;
rmr->flags = flags;

return rmr;
}
EXPORT_SYMBOL(iommu_dma_alloc_rmr);

static int cookie_init_hw_msi_region(struct iommu_dma_cookie *cookie,
phys_addr_t start, phys_addr_t end)
{
@@ -40,6 +40,9 @@ void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list);
void iommu_dma_free_cpu_cached_iovas(unsigned int cpu,
struct iommu_domain *domain);

int iommu_dma_get_rmrs(struct fwnode_handle *iommu, struct list_head *list);
struct iommu_rmr *iommu_dma_alloc_rmr(u64 base, u64 length, u32 sid, u32 flags);

#else /* CONFIG_IOMMU_DMA */

struct iommu_domain;
@@ -86,5 +89,10 @@ static inline void iommu_dma_free_cpu_cached_iovas(unsigned int cpu,
{
}

int iommu_dma_get_rmrs(struct fwnode_handle *iommu, struct list_head *list);
{
return 0;
}

#endif /* CONFIG_IOMMU_DMA */
#endif /* __DMA_IOMMU_H */
@@ -595,6 +595,25 @@ struct iommu_sva {
struct device *dev;
};

/**
* struct iommu_rmr - Reserved Memory Region details per IOMMU
* @list: Linked list pointers to hold RMR region info
* @base_address: base address of Reserved Memory Region
* @length: length of memory region
* @sid: associated stream id
* @flags: flags that apply to the RMR node
*/
struct iommu_rmr {
struct list_head list;
phys_addr_t base_address;
u64 length;
u32 sid;
u32 flags;
};

/* RMR Remap permitted */
#define IOMMU_RMR_REMAP_PERMITTED (1 << 0)

int iommu_fwspec_init(struct device *dev, struct fwnode_handle *iommu_fwnode,
const struct iommu_ops *ops);
void iommu_fwspec_free(struct device *dev);

0 comments on commit c68d4ba

Please sign in to comment.