Commit 06d54f00 authored by Nicolin Chen's avatar Nicolin Chen Committed by Jason Gunthorpe
Browse files

iommu: Drop sw_msi from iommu_domain

There are only two sw_msi implementations in the entire system, thus it's
not very necessary to have an sw_msi pointer.

Instead, check domain->cookie_type to call the two sw_msi implementations
directly from the core code.

Link: https://patch.msgid.link/r/7ded87c871afcbaac665b71354de0a335087bf0f.1742871535.git.nicolinc@nvidia.com


Suggested-by: default avatarRobin Murphy <robin.murphy@arm.com>
Reviewed-by: default avatarRobin Murphy <robin.murphy@arm.com>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Signed-off-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent ec031e1b
Loading
Loading
Loading
Loading
+2 −12
Original line number Diff line number Diff line
@@ -94,9 +94,6 @@ static int __init iommu_dma_forcedac_setup(char *str)
}
early_param("iommu.forcedac", iommu_dma_forcedac_setup);

static int iommu_dma_sw_msi(struct iommu_domain *domain, struct msi_desc *desc,
			    phys_addr_t msi_addr);

/* Number of entries per flush queue */
#define IOVA_DEFAULT_FQ_SIZE	256
#define IOVA_SINGLE_FQ_SIZE	32768
@@ -377,7 +374,6 @@ int iommu_get_dma_cookie(struct iommu_domain *domain)

	mutex_init(&cookie->mutex);
	INIT_LIST_HEAD(&cookie->msi_page_list);
	iommu_domain_set_sw_msi(domain, iommu_dma_sw_msi);
	domain->cookie_type = IOMMU_COOKIE_DMA_IOVA;
	domain->iova_cookie = cookie;
	return 0;
@@ -411,7 +407,6 @@ int iommu_get_msi_cookie(struct iommu_domain *domain, dma_addr_t base)

	cookie->msi_iova = base;
	INIT_LIST_HEAD(&cookie->msi_page_list);
	iommu_domain_set_sw_msi(domain, iommu_dma_sw_msi);
	domain->cookie_type = IOMMU_COOKIE_DMA_MSI;
	domain->msi_cookie = cookie;
	return 0;
@@ -427,11 +422,6 @@ void iommu_put_dma_cookie(struct iommu_domain *domain)
	struct iommu_dma_cookie *cookie = domain->iova_cookie;
	struct iommu_dma_msi_page *msi, *tmp;

#if IS_ENABLED(CONFIG_IRQ_MSI_IOMMU)
	if (domain->sw_msi != iommu_dma_sw_msi)
		return;
#endif

	if (cookie->iovad.granule) {
		iommu_dma_free_fq(cookie);
		put_iova_domain(&cookie->iovad);
@@ -1826,7 +1816,7 @@ static struct iommu_dma_msi_page *iommu_dma_get_msi_page(struct device *dev,
	return NULL;
}

static int iommu_dma_sw_msi(struct iommu_domain *domain, struct msi_desc *desc,
int iommu_dma_sw_msi(struct iommu_domain *domain, struct msi_desc *desc,
		     phys_addr_t msi_addr)
{
	struct device *dev = msi_desc_to_dev(desc);
+9 −0
Original line number Diff line number Diff line
@@ -19,6 +19,9 @@ int iommu_dma_init_fq(struct iommu_domain *domain);

void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list);

int iommu_dma_sw_msi(struct iommu_domain *domain, struct msi_desc *desc,
		     phys_addr_t msi_addr);

extern bool iommu_dma_forcedac;

#else /* CONFIG_IOMMU_DMA */
@@ -49,5 +52,11 @@ static inline void iommu_dma_get_resv_regions(struct device *dev, struct list_he
{
}

static inline int iommu_dma_sw_msi(struct iommu_domain *domain,
				   struct msi_desc *desc, phys_addr_t msi_addr)
{
	return -ENODEV;
}

#endif	/* CONFIG_IOMMU_DMA */
#endif	/* __DMA_IOMMU_H */
+16 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/errno.h>
#include <linux/host1x_context_bus.h>
#include <linux/iommu.h>
#include <linux/iommufd.h>
#include <linux/idr.h>
#include <linux/err.h>
#include <linux/pci.h>
@@ -3650,8 +3651,21 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr)
		return 0;

	mutex_lock(&group->mutex);
	if (group->domain && group->domain->sw_msi)
		ret = group->domain->sw_msi(group->domain, desc, msi_addr);
	/* An IDENTITY domain must pass through */
	if (group->domain && group->domain->type != IOMMU_DOMAIN_IDENTITY) {
		switch (group->domain->cookie_type) {
		case IOMMU_COOKIE_DMA_MSI:
		case IOMMU_COOKIE_DMA_IOVA:
			ret = iommu_dma_sw_msi(group->domain, desc, msi_addr);
			break;
		case IOMMU_COOKIE_IOMMUFD:
			ret = iommufd_sw_msi(group->domain, desc, msi_addr);
			break;
		default:
			ret = -EOPNOTSUPP;
			break;
		}
	}
	mutex_unlock(&group->mutex);
	return ret;
}
+0 −3
Original line number Diff line number Diff line
@@ -161,7 +161,6 @@ iommufd_hwpt_paging_alloc(struct iommufd_ctx *ictx, struct iommufd_ioas *ioas,
	}
	hwpt->domain->iommufd_hwpt = hwpt;
	hwpt->domain->cookie_type = IOMMU_COOKIE_IOMMUFD;
	iommu_domain_set_sw_msi(hwpt->domain, iommufd_sw_msi);

	/*
	 * Set the coherency mode before we do iopt_table_add_domain() as some
@@ -259,7 +258,6 @@ iommufd_hwpt_nested_alloc(struct iommufd_ctx *ictx,
	hwpt->domain->owner = ops;
	hwpt->domain->iommufd_hwpt = hwpt;
	hwpt->domain->cookie_type = IOMMU_COOKIE_IOMMUFD;
	iommu_domain_set_sw_msi(hwpt->domain, iommufd_sw_msi);

	if (WARN_ON_ONCE(hwpt->domain->type != IOMMU_DOMAIN_NESTED)) {
		rc = -EINVAL;
@@ -318,7 +316,6 @@ iommufd_viommu_alloc_hwpt_nested(struct iommufd_viommu *viommu, u32 flags,
	hwpt->domain->iommufd_hwpt = hwpt;
	hwpt->domain->owner = viommu->iommu_dev->ops;
	hwpt->domain->cookie_type = IOMMU_COOKIE_IOMMUFD;
	iommu_domain_set_sw_msi(hwpt->domain, iommufd_sw_msi);

	if (WARN_ON_ONCE(hwpt->domain->type != IOMMU_DOMAIN_NESTED)) {
		rc = -EINVAL;
+0 −15
Original line number Diff line number Diff line
@@ -229,11 +229,6 @@ struct iommu_domain {
	struct iommu_domain_geometry geometry;
	int (*iopf_handler)(struct iopf_group *group);

#if IS_ENABLED(CONFIG_IRQ_MSI_IOMMU)
	int (*sw_msi)(struct iommu_domain *domain, struct msi_desc *desc,
		      phys_addr_t msi_addr);
#endif

	union { /* cookie */
		struct iommu_dma_cookie *iova_cookie;
		struct iommu_dma_msi_cookie *msi_cookie;
@@ -254,16 +249,6 @@ struct iommu_domain {
	};
};

static inline void iommu_domain_set_sw_msi(
	struct iommu_domain *domain,
	int (*sw_msi)(struct iommu_domain *domain, struct msi_desc *desc,
		      phys_addr_t msi_addr))
{
#if IS_ENABLED(CONFIG_IRQ_MSI_IOMMU)
	domain->sw_msi = sw_msi;
#endif
}

static inline bool iommu_is_dma_domain(struct iommu_domain *domain)
{
	return domain->type & __IOMMU_DOMAIN_DMA_API;