Subject: linux-next: manual merge of the iommufd tree with the iommu tree

From: Stephen Rothwell <[email-masked]>
Date: Wed, 25 Oct 2023 15:44:20 +1100

Hi all,

Today's linux-next merge of the iommufd tree got a conflict in:

  include/linux/iommu.h

between commits:

  1c68cbc64fe6 ("iommu: Add IOMMU_DOMAIN_PLATFORM")
  4601cd2d7c4c ("iommu: Add ops->domain_alloc_paging()")

from the iommu tree and commits:

  1621aef1fbfe ("iommu: Add IOMMU_DOMAIN_NESTED")
  909f4abd1097 ("iommu: Add new iommu op to create domains owned by userspace")
  17dd7701a2e7 ("iommu: Pass in parent domain with user_data to domain_alloc_user op")

from the iommufd tree.

I fixed it up (see below) and can carry the fix as necessary. This
is now fixed as far as linux-next is concerned, but any non trivial
conflicts should be mentioned to your upstream maintainer when your tree
is submitted for merging.  You may also want to consider cooperating
with the maintainer of the conflicting tree to minimise any particularly
complex conflicts.

-- 
Cheers,
Stephen Rothwell

diff --cc include/linux/iommu.h
index b5b254e205c6,f347bf31761f..000000000000
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@@ -64,8 -66,10 +66,11 @@@ struct iommu_domain_geometry 
  #define __IOMMU_DOMAIN_DMA_FQ	(1U << 3)  /* DMA-API uses flush queue    */
  
  #define __IOMMU_DOMAIN_SVA	(1U << 4)  /* Shared process address space */
 +#define __IOMMU_DOMAIN_PLATFORM	(1U << 5)
  
+ #define __IOMMU_DOMAIN_NESTED	(1U << 5)  /* User-managed address space nested
+ 					      on a stage-2 translation        */
+ 
  #define IOMMU_DOMAIN_ALLOC_FLAGS ~__IOMMU_DOMAIN_DMA_FQ
  /*
   * This are the possible domain-types
@@@ -94,7 -96,7 +99,8 @@@
  				 __IOMMU_DOMAIN_DMA_API |	\
  				 __IOMMU_DOMAIN_DMA_FQ)
  #define IOMMU_DOMAIN_SVA	(__IOMMU_DOMAIN_SVA)
 +#define IOMMU_DOMAIN_PLATFORM	(__IOMMU_DOMAIN_PLATFORM)
+ #define IOMMU_DOMAIN_NESTED	(__IOMMU_DOMAIN_NESTED)
  
  struct iommu_domain {
  	unsigned type;
@@@ -238,9 -327,19 +331,21 @@@ static inline int __iommu_copy_struct_f
   *           op is allocated in the iommu driver and freed by the caller after
   *           use. The information type is one of enum iommu_hw_info_type defined
   *           in include/uapi/linux/iommufd.h.
-  * @domain_alloc: allocate iommu domain
+  * @domain_alloc: allocate and return an iommu domain if success. Otherwise
+  *                NULL is returned. The domain is not fully initialized until
+  *                the caller iommu_domain_alloc() returns.
 + * @domain_alloc_paging: Allocate an iommu_domain that can be used for
 + *                       UNMANAGED, DMA, and DMA_FQ domain types.
+  * @domain_alloc_user: Allocate an iommu domain corresponding to the input
+  *                     parameters as defined in include/uapi/linux/iommufd.h.
+  *                     Unlike @domain_alloc, it is called only by IOMMUFD and
+  *                     must fully initialize the new domain before return.
+  *                     Upon success, if the @user_data is valid and the @parent
+  *                     points to a kernel-managed domain, the new domain must be
+  *                     IOMMU_DOMAIN_NESTED type; otherwise, the @parent must be
+  *                     NULL while the @user_data can be optionally provided, the
+  *                     new domain must support __IOMMU_DOMAIN_PAGING.
+  *                     Upon failure, ERR_PTR must be returned.
   * @probe_device: Add device to iommu driver handling
   * @release_device: Remove device from iommu driver handling
   * @probe_finalize: Do final setup work after the device is added to an IOMMU
@@@ -275,7 -372,9 +380,10 @@@ struct iommu_ops 
  
  	/* Domain allocation and freeing by the iommu driver */
  	struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type);
 +	struct iommu_domain *(*domain_alloc_paging)(struct device *dev);
+ 	struct iommu_domain *(*domain_alloc_user)(
+ 		struct device *dev, u32 flags, struct iommu_domain *parent,
+ 		const struct iommu_user_data *user_data);
  
  	struct iommu_device *(*probe_device)(struct device *dev);
  	void (*release_device)(struct device *dev);