Commit 3b7e2482 authored by Shameer Kolothum's avatar Shameer Kolothum Committed by Joerg Roedel
Browse files

iommu: Introduce a callback to struct iommu_resv_region



A callback is introduced to struct iommu_resv_region to free memory
allocations associated with the reserved region. This will be useful
when we introduce support for IORT RMR based reserved regions.

Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Tested-by: default avatarSteven Price <steven.price@arm.com>
Tested-by: default avatarLaurentiu Tudor <laurentiu.tudor@nxp.com>
Tested-by: default avatarHanjun Guo <guohanjun@huawei.com>
Signed-off-by: default avatarShameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Acked-by: default avatarRobin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/20220615101044.1972-2-shameerali.kolothum.thodi@huawei.com
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent ac9a5d52
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -2590,17 +2590,23 @@ void iommu_put_resv_regions(struct device *dev, struct list_head *list)
 * @list: reserved region list for device
 *
 * IOMMU drivers can use this to implement their .put_resv_regions() callback
 * for simple reservations. Memory allocated for each reserved region will be
 * freed. If an IOMMU driver allocates additional resources per region, it is
 * going to have to implement a custom callback.
 * for simple reservations. If a per region callback is provided that will be
 * used to free all memory allocations associated with the reserved region or
 * else just free up the memory for the regions. If an IOMMU driver allocates
 * additional resources per region, it is going to have to implement a custom
 * callback.
 */
void generic_iommu_put_resv_regions(struct device *dev, struct list_head *list)
{
	struct iommu_resv_region *entry, *next;

	list_for_each_entry_safe(entry, next, list, list)
	list_for_each_entry_safe(entry, next, list, list) {
		if (entry->free)
			entry->free(dev, entry);
		else
			kfree(entry);
	}
}
EXPORT_SYMBOL(generic_iommu_put_resv_regions);

struct iommu_resv_region *iommu_alloc_resv_region(phys_addr_t start,
+2 −0
Original line number Diff line number Diff line
@@ -135,6 +135,7 @@ enum iommu_resv_type {
 * @length: Length of the region in bytes
 * @prot: IOMMU Protection flags (READ/WRITE/...)
 * @type: Type of the reserved region
 * @free: Callback to free associated memory allocations
 */
struct iommu_resv_region {
	struct list_head	list;
@@ -142,6 +143,7 @@ struct iommu_resv_region {
	size_t			length;
	int			prot;
	enum iommu_resv_type	type;
	void (*free)(struct device *dev, struct iommu_resv_region *region);
};

/**