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

Commit d124ad8b authored by Mitchel Humpherys's avatar Mitchel Humpherys
Browse files

iommu: Add iommu_reg_read and iommu_reg_write



It might be useful for IOMMU clients to peek and poke at their IOMMU's
registers, but knowing how to access those registers is really the job
of the IOMMU driver (it might need to enable specific clocks and
regulators, for example).  Provide an API to read and write IOMMU
registers that can be implemented by the driver.

Change-Id: I5b2f19225f8bd258278780ff24b4ea96460857aa
Signed-off-by: default avatarMitchel Humpherys <mitchelh@codeaurora.org>
parent 8c550138
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -933,6 +933,30 @@ void iommu_trigger_fault(struct iommu_domain *domain, unsigned long flags)
		domain->ops->trigger_fault(domain, flags);
}

/**
 * iommu_reg_read() - read an IOMMU register
 *
 * Reads the IOMMU register at the given offset.
 */
unsigned long iommu_reg_read(struct iommu_domain *domain, unsigned long offset)
{
	if (domain->ops->reg_read)
		return domain->ops->reg_read(domain, offset);
	return 0;
}

/**
 * iommu_reg_write() - write an IOMMU register
 *
 * Writes the given value to the IOMMU register at the given offset.
 */
void iommu_reg_write(struct iommu_domain *domain, unsigned long offset,
		     unsigned long val)
{
	if (domain->ops->reg_write)
		domain->ops->reg_write(domain, offset, val);
}

struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
{
	struct iommu_domain *domain;
+21 −0
Original line number Diff line number Diff line
@@ -124,6 +124,8 @@ extern struct dentry *iommu_debugfs_top;
 * @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
 * @reg_read: read an IOMMU register
 * @reg_write: write an IOMMU register
 */
struct iommu_ops {
	bool (*capable)(enum iommu_cap);
@@ -164,6 +166,10 @@ struct iommu_ops {
	int (*dma_supported)(struct iommu_domain *domain, struct device *dev,
			     u64 mask);
	void (*trigger_fault)(struct iommu_domain *domain, unsigned long flags);
	unsigned long (*reg_read)(struct iommu_domain *domain,
				  unsigned long offset);
	void (*reg_write)(struct iommu_domain *domain, unsigned long val,
			  unsigned long offset);

	unsigned long pgsize_bitmap;
};
@@ -205,6 +211,10 @@ 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,
				unsigned long flags);
extern unsigned long iommu_reg_read(struct iommu_domain *domain,
				    unsigned long offset);
extern void iommu_reg_write(struct iommu_domain *domain, unsigned long offset,
			    unsigned long val);

extern int iommu_attach_group(struct iommu_domain *domain,
			      struct iommu_group *group);
@@ -413,6 +423,17 @@ static inline void iommu_trigger_fault(struct iommu_domain *domain,
{
}

static inline unsigned long iommu_reg_read(struct iommu_domain *domain,
					   unsigned long offset)
{
	return 0;
}

static inline void iommu_reg_write(struct iommu_domain *domain,
				   unsigned long val, unsigned long offset)
{
}

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