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

Commit 7d31089e authored by Mitchel Humpherys's avatar Mitchel Humpherys
Browse files

iommu: Add iommu_trigger_fault



It can be useful to trigger an IOMMU fault during development and
debugging.  Add support to the IOMMU framework to do so.

Change-Id: I908c9f5b52c6abe937f031de546d290027ba64b5
Signed-off-by: default avatarMitchel Humpherys <mitchelh@codeaurora.org>
parent 455b690f
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -917,6 +917,21 @@ void iommu_set_fault_handler(struct iommu_domain *domain,
}
EXPORT_SYMBOL_GPL(iommu_set_fault_handler);

/**
 * iommu_trigger_fault() - trigger an IOMMU fault
 * @domain: iommu domain
 *
 * Triggers a fault on the device to which this domain is attached.
 *
 * This function should only be used for debugging purposes, for obvious
 * reasons.
 */
void iommu_trigger_fault(struct iommu_domain *domain)
{
	if (domain->ops->trigger_fault)
		domain->ops->trigger_fault(domain);
}

struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
{
	struct iommu_domain *domain;
+7 −0
Original line number Diff line number Diff line
@@ -116,6 +116,7 @@ enum iommu_attr {
 * @domain_get_attr: Query domain attributes
 * @domain_set_attr: Change domain attributes
 * @pgsize_bitmap: bitmap of supported page sizes
 * @trigger_fault: trigger a fault on the device attached to an iommu domain
 */
struct iommu_ops {
	bool (*capable)(enum iommu_cap);
@@ -155,6 +156,7 @@ struct iommu_ops {
	u32 (*domain_get_windows)(struct iommu_domain *domain);
	int (*dma_supported)(struct iommu_domain *domain, struct device *dev,
			     u64 mask);
	void (*trigger_fault)(struct iommu_domain *domain);

	unsigned long pgsize_bitmap;
};
@@ -194,6 +196,7 @@ extern phys_addr_t iommu_iova_to_phys_hard(struct iommu_domain *domain,
					   dma_addr_t iova);
extern void iommu_set_fault_handler(struct iommu_domain *domain,
			iommu_fault_handler_t handler, void *token);
extern void iommu_trigger_fault(struct iommu_domain *domain);

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

static inline void iommu_trigger_fault(struct iommu_domain *domain)
{
}

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