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

Commit 0ff64f80 authored by Joerg Roedel's avatar Joerg Roedel
Browse files

iommu/amd: Implement DOMAIN_ATTR_GEOMETRY attribute



Implement the attribute itself and add the code for the
AMD IOMMU driver.

Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
parent 0cd76dd1
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -3069,6 +3069,10 @@ static int amd_iommu_domain_init(struct iommu_domain *dom)


	dom->priv = domain;
	dom->priv = domain;


	dom->geometry.aperture_start = 0;
	dom->geometry.aperture_end   = ~0ULL;
	dom->geometry.force_aperture = true;

	return 0;
	return 0;


out_free:
out_free:
+16 −3
Original line number Original line Diff line number Diff line
@@ -348,10 +348,23 @@ EXPORT_SYMBOL_GPL(iommu_device_group);
int iommu_domain_get_attr(struct iommu_domain *domain,
int iommu_domain_get_attr(struct iommu_domain *domain,
			  enum iommu_attr attr, void *data)
			  enum iommu_attr attr, void *data)
{
{
	struct iommu_domain_geometry *geometry;
	int ret = 0;

	switch (attr) {
	case DOMAIN_ATTR_GEOMETRY:
		geometry  = data;
		*geometry = domain->geometry;

		break;
	default:
		if (!domain->ops->domain_get_attr)
		if (!domain->ops->domain_get_attr)
			return -EINVAL;
			return -EINVAL;


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

	return ret;
}
}
EXPORT_SYMBOL_GPL(iommu_domain_get_attr);
EXPORT_SYMBOL_GPL(iommu_domain_get_attr);


+8 −0
Original line number Original line Diff line number Diff line
@@ -37,11 +37,18 @@ struct iommu_domain;
typedef int (*iommu_fault_handler_t)(struct iommu_domain *,
typedef int (*iommu_fault_handler_t)(struct iommu_domain *,
			struct device *, unsigned long, int, void *);
			struct device *, unsigned long, int, void *);


struct iommu_domain_geometry {
	dma_addr_t aperture_start; /* First address that can be mapped    */
	dma_addr_t aperture_end;   /* Last address that can be mapped     */
	bool force_aperture;       /* DMA only allowed in mappable range? */
};

struct iommu_domain {
struct iommu_domain {
	struct iommu_ops *ops;
	struct iommu_ops *ops;
	void *priv;
	void *priv;
	iommu_fault_handler_t handler;
	iommu_fault_handler_t handler;
	void *handler_token;
	void *handler_token;
	struct iommu_domain_geometry geometry;
};
};


#define IOMMU_CAP_CACHE_COHERENCY	0x1
#define IOMMU_CAP_CACHE_COHERENCY	0x1
@@ -49,6 +56,7 @@ struct iommu_domain {


enum iommu_attr {
enum iommu_attr {
	DOMAIN_ATTR_MAX,
	DOMAIN_ATTR_MAX,
	DOMAIN_ATTR_GEOMETRY,
};
};


#ifdef CONFIG_IOMMU_API
#ifdef CONFIG_IOMMU_API