[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20230531114759.6173-1-nipun.gupta@amd.com>
Date: Wed, 31 May 2023 17:17:59 +0530
From: Nipun Gupta <nipun.gupta@....com>
To: <gregkh@...uxfoundation.org>, <alex.williamson@...hat.com>,
<linux-kernel@...r.kernel.org>
CC: <git@....com>, <harpreet.anand@....com>,
<pieter.jansen-van-vuuren@....com>, <nikhil.agarwal@....com>,
<michal.simek@....com>, Nipun Gupta <nipun.gupta@....com>
Subject: [PATCH] cdx: add support for driver managed dma
The devices on cdx could be bound to drivers with the device
DMA managed by kernel drivers or user-space applications.
As multiple devices can be placed in the same IOMMU group, the
DMA on these devices must either be entirely under kernel control
or userspace control. driver_managed_dma flag should be set by
the driver which assigns the devices to be controlled by
user-space.
Signed-off-by: Nipun Gupta <nipun.gupta@....com>
Suggested-by: Alex Williamson <alex.williamson@...hat.com>
---
drivers/cdx/cdx.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/drivers/cdx/cdx.c b/drivers/cdx/cdx.c
index 38511fd36325..d2cad4c670a0 100644
--- a/drivers/cdx/cdx.c
+++ b/drivers/cdx/cdx.c
@@ -62,6 +62,8 @@
#include <linux/mm.h>
#include <linux/xarray.h>
#include <linux/cdx/cdx_bus.h>
+#include <linux/iommu.h>
+#include <linux/dma-map-ops.h>
#include "cdx.h"
/* Default DMA mask for devices on a CDX bus */
@@ -257,6 +259,7 @@ static void cdx_shutdown(struct device *dev)
static int cdx_dma_configure(struct device *dev)
{
+ struct cdx_driver *cdx_drv = to_cdx_driver(dev->driver);
struct cdx_device *cdx_dev = to_cdx_device(dev);
u32 input_id = cdx_dev->req_id;
int ret;
@@ -267,9 +270,23 @@ static int cdx_dma_configure(struct device *dev)
return ret;
}
+ if (!ret && !cdx_drv->driver_managed_dma) {
+ ret = iommu_device_use_default_domain(dev);
+ if (ret)
+ arch_teardown_dma_ops(dev);
+ }
+
return 0;
}
+static void cdx_dma_cleanup(struct device *dev)
+{
+ struct cdx_driver *cdx_drv = to_cdx_driver(dev->driver);
+
+ if (!cdx_drv->driver_managed_dma)
+ iommu_device_unuse_default_domain(dev);
+}
+
/* show configuration fields */
#define cdx_config_attr(field, format_string) \
static ssize_t \
@@ -405,6 +422,7 @@ struct bus_type cdx_bus_type = {
.remove = cdx_remove,
.shutdown = cdx_shutdown,
.dma_configure = cdx_dma_configure,
+ .dma_cleanup = cdx_dma_cleanup,
.bus_groups = cdx_bus_groups,
.dev_groups = cdx_dev_groups,
};
--
2.17.1
Powered by blists - more mailing lists