Commit e8d57210 authored by Jason Gunthorpe's avatar Jason Gunthorpe

iommufd: Add kAPI toward external drivers for physical devices

Add the four functions external drivers need to connect physical DMA to
the IOMMUFD:

iommufd_device_bind() / iommufd_device_unbind()
  Register the device with iommufd and establish security isolation.

iommufd_device_attach() / iommufd_device_detach()
  Connect a bound device to a page table

Binding a device creates a device object ID in the uAPI, however the
generic API does not yet provide any IOCTLs to manipulate them.

Link: https://lore.kernel.org/r/13-v6-a196d26f289e+11787-iommufd_jgg@nvidia.comReviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Tested-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Tested-by: default avatarYi Liu <yi.l.liu@intel.com>
Tested-by: default avatarLixiao Yang <lixiao.yang@intel.com>
Tested-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent ea4acfac
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
iommufd-y := \ iommufd-y := \
device.o \
hw_pagetable.o \ hw_pagetable.o \
io_pagetable.o \ io_pagetable.o \
ioas.o \ ioas.o \
......
This diff is collapsed.
...@@ -103,6 +103,7 @@ static inline int iommufd_ucmd_respond(struct iommufd_ucmd *ucmd, ...@@ -103,6 +103,7 @@ static inline int iommufd_ucmd_respond(struct iommufd_ucmd *ucmd,
enum iommufd_object_type { enum iommufd_object_type {
IOMMUFD_OBJ_NONE, IOMMUFD_OBJ_NONE,
IOMMUFD_OBJ_ANY = IOMMUFD_OBJ_NONE, IOMMUFD_OBJ_ANY = IOMMUFD_OBJ_NONE,
IOMMUFD_OBJ_DEVICE,
IOMMUFD_OBJ_HW_PAGETABLE, IOMMUFD_OBJ_HW_PAGETABLE,
IOMMUFD_OBJ_IOAS, IOMMUFD_OBJ_IOAS,
}; };
...@@ -229,6 +230,8 @@ struct iommufd_hw_pagetable { ...@@ -229,6 +230,8 @@ struct iommufd_hw_pagetable {
struct iommufd_ioas *ioas; struct iommufd_ioas *ioas;
struct iommu_domain *domain; struct iommu_domain *domain;
bool auto_domain : 1; bool auto_domain : 1;
bool enforce_cache_coherency : 1;
bool msi_cookie : 1;
/* Head at iommufd_ioas::hwpt_list */ /* Head at iommufd_ioas::hwpt_list */
struct list_head hwpt_item; struct list_head hwpt_item;
struct mutex devices_lock; struct mutex devices_lock;
...@@ -240,6 +243,8 @@ iommufd_hw_pagetable_alloc(struct iommufd_ctx *ictx, struct iommufd_ioas *ioas, ...@@ -240,6 +243,8 @@ iommufd_hw_pagetable_alloc(struct iommufd_ctx *ictx, struct iommufd_ioas *ioas,
struct device *dev); struct device *dev);
void iommufd_hw_pagetable_destroy(struct iommufd_object *obj); void iommufd_hw_pagetable_destroy(struct iommufd_object *obj);
void iommufd_device_destroy(struct iommufd_object *obj);
struct iommufd_access { struct iommufd_access {
unsigned long iova_alignment; unsigned long iova_alignment;
u32 iopt_access_list_id; u32 iopt_access_list_id;
......
...@@ -357,6 +357,9 @@ void iommufd_ctx_put(struct iommufd_ctx *ictx) ...@@ -357,6 +357,9 @@ void iommufd_ctx_put(struct iommufd_ctx *ictx)
EXPORT_SYMBOL_NS_GPL(iommufd_ctx_put, IOMMUFD); EXPORT_SYMBOL_NS_GPL(iommufd_ctx_put, IOMMUFD);
static const struct iommufd_object_ops iommufd_object_ops[] = { static const struct iommufd_object_ops iommufd_object_ops[] = {
[IOMMUFD_OBJ_DEVICE] = {
.destroy = iommufd_device_destroy,
},
[IOMMUFD_OBJ_IOAS] = { [IOMMUFD_OBJ_IOAS] = {
.destroy = iommufd_ioas_destroy, .destroy = iommufd_ioas_destroy,
}, },
......
...@@ -9,10 +9,19 @@ ...@@ -9,10 +9,19 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/device.h>
struct iommufd_device;
struct iommufd_ctx; struct iommufd_ctx;
struct file; struct file;
struct iommufd_device *iommufd_device_bind(struct iommufd_ctx *ictx,
struct device *dev, u32 *id);
void iommufd_device_unbind(struct iommufd_device *idev);
int iommufd_device_attach(struct iommufd_device *idev, u32 *pt_id);
void iommufd_device_detach(struct iommufd_device *idev);
enum { enum {
IOMMUFD_ACCESS_RW_READ = 0, IOMMUFD_ACCESS_RW_READ = 0,
IOMMUFD_ACCESS_RW_WRITE = 1 << 0, IOMMUFD_ACCESS_RW_WRITE = 1 << 0,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment