Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1015c2b authored by Joerg Roedel's avatar Joerg Roedel
Browse files

iommu: Introduce direct mapped region handling



Add two new functions to the IOMMU-API to allow the IOMMU
drivers to export the requirements for direct mapped regions
per device.
This is useful for exporting the information in Intel VT-d's
RMRR entries or AMD-Vi's unity mappings.

Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 2c1296d9
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -1469,3 +1469,19 @@ int iommu_domain_set_attr(struct iommu_domain *domain,
	return ret;
}
EXPORT_SYMBOL_GPL(iommu_domain_set_attr);

void iommu_get_dm_regions(struct device *dev, struct list_head *list)
{
	const struct iommu_ops *ops = dev->bus->iommu_ops;

	if (ops && ops->get_dm_regions)
		ops->get_dm_regions(dev, list);
}

void iommu_put_dm_regions(struct device *dev, struct list_head *list)
{
	const struct iommu_ops *ops = dev->bus->iommu_ops;

	if (ops && ops->put_dm_regions)
		ops->put_dm_regions(dev, list);
}
+31 −0
Original line number Diff line number Diff line
@@ -114,6 +114,20 @@ enum iommu_attr {
	DOMAIN_ATTR_MAX,
};

/**
 * struct iommu_dm_region - descriptor for a direct mapped memory region
 * @list: Linked list pointers
 * @start: System physical start address of the region
 * @length: Length of the region in bytes
 * @prot: IOMMU Protection flags (READ/WRITE/...)
 */
struct iommu_dm_region {
	struct list_head	list;
	phys_addr_t		start;
	size_t			length;
	int			prot;
};

#ifdef CONFIG_IOMMU_API

/**
@@ -159,6 +173,10 @@ struct iommu_ops {
	int (*domain_set_attr)(struct iommu_domain *domain,
			       enum iommu_attr attr, void *data);

	/* Request/Free a list of direct mapping requirements for a device */
	void (*get_dm_regions)(struct device *dev, struct list_head *list);
	void (*put_dm_regions)(struct device *dev, struct list_head *list);

	/* Window handling functions */
	int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr,
				    phys_addr_t paddr, u64 size, int prot);
@@ -205,6 +223,9 @@ extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t io
extern void iommu_set_fault_handler(struct iommu_domain *domain,
			iommu_fault_handler_t handler, void *token);

extern void iommu_get_dm_regions(struct device *dev, struct list_head *list);
extern void iommu_put_dm_regions(struct device *dev, struct list_head *list);

extern int iommu_attach_group(struct iommu_domain *domain,
			      struct iommu_group *group);
extern void iommu_detach_group(struct iommu_domain *domain,
@@ -379,6 +400,16 @@ static inline void iommu_set_fault_handler(struct iommu_domain *domain,
{
}

static inline void iommu_get_dm_regions(struct device *dev,
					struct list_head *list)
{
}

static inline void iommu_put_dm_regions(struct device *dev,
					struct list_head *list)
{
}

static inline int iommu_attach_group(struct iommu_domain *domain,
				     struct iommu_group *group)
{