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

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

iommu: Add DOMAIN_ATTR_WINDOWS domain attribute



This attribute can be used to set and get the number of
subwindows on IOMMUs that are window-based.

Signed-off-by: default avatarJoerg Roedel <joro@8bytes.org>
parent d7787d57
Loading
Loading
Loading
Loading
+30 −3
Original line number Diff line number Diff line
@@ -891,6 +891,7 @@ int iommu_domain_get_attr(struct iommu_domain *domain,
	struct iommu_domain_geometry *geometry;
	bool *paging;
	int ret = 0;
	u32 *count;

	switch (attr) {
	case DOMAIN_ATTR_GEOMETRY:
@@ -901,6 +902,15 @@ int iommu_domain_get_attr(struct iommu_domain *domain,
	case DOMAIN_ATTR_PAGING:
		paging  = data;
		*paging = (domain->ops->pgsize_bitmap != 0UL);
		break;
	case DOMAIN_ATTR_WINDOWS:
		count = data;

		if (domain->ops->domain_get_windows != NULL)
			*count = domain->ops->domain_get_windows(domain);
		else
			ret = -ENODEV;

		break;
	default:
		if (!domain->ops->domain_get_attr)
@@ -916,9 +926,26 @@ EXPORT_SYMBOL_GPL(iommu_domain_get_attr);
int iommu_domain_set_attr(struct iommu_domain *domain,
			  enum iommu_attr attr, void *data)
{
	if (!domain->ops->domain_set_attr)
	int ret = 0;
	u32 *count;

	switch (attr) {
	case DOMAIN_ATTR_WINDOWS:
		count = data;

		if (domain->ops->domain_set_windows != NULL)
			ret = domain->ops->domain_set_windows(domain, *count);
		else
			ret = -ENODEV;

		break;
	default:
		if (domain->ops->domain_set_attr == NULL)
			return -EINVAL;

	return domain->ops->domain_set_attr(domain, attr, data);
		ret = domain->ops->domain_set_attr(domain, attr, data);
	}

	return ret;
}
EXPORT_SYMBOL_GPL(iommu_domain_set_attr);
+5 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ struct iommu_domain {
enum iommu_attr {
	DOMAIN_ATTR_GEOMETRY,
	DOMAIN_ATTR_PAGING,
	DOMAIN_ATTR_WINDOWS,
	DOMAIN_ATTR_MAX,
};

@@ -106,6 +107,10 @@ struct iommu_ops {
	int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr,
				    phys_addr_t paddr, u64 size);
	void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr);
	/* Set the numer of window per domain */
	int (*domain_set_windows)(struct iommu_domain *domain, u32 w_count);
	/* Get the numer of window per domain */
	u32 (*domain_get_windows)(struct iommu_domain *domain);

	unsigned long pgsize_bitmap;
};