Commit b8c5ff76 authored by Nipun Gupta's avatar Nipun Gupta Committed by Greg Kroah-Hartman

cdx: fix driver managed dma support

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. Fix the CDX bus driver to acknowlege the
driver_managed_dma flag and call the appropriate iommu APIs.

Fixes: 2959ab24 ("cdx: add the cdx bus driver")
Signed-off-by: default avatarNipun Gupta <nipun.gupta@amd.com>
Reported-by: default avatarAlex Williamson <alex.williamson@redhat.com>
Closes: https://lore.kernel.org/lkml/20230524134831.28dc97e2.alex.williamson@redhat.com/Reviewed-by: default avatarNikhil Agarwal <nikhil.agarwal@amd.com>
Message-ID: <20230605131009.6869-1-nipun.gupta@amd.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9e66fb52
...@@ -62,6 +62,8 @@ ...@@ -62,6 +62,8 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/xarray.h> #include <linux/xarray.h>
#include <linux/cdx/cdx_bus.h> #include <linux/cdx/cdx_bus.h>
#include <linux/iommu.h>
#include <linux/dma-map-ops.h>
#include "cdx.h" #include "cdx.h"
/* Default DMA mask for devices on a CDX bus */ /* Default DMA mask for devices on a CDX bus */
...@@ -257,6 +259,7 @@ static void cdx_shutdown(struct device *dev) ...@@ -257,6 +259,7 @@ static void cdx_shutdown(struct device *dev)
static int cdx_dma_configure(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); struct cdx_device *cdx_dev = to_cdx_device(dev);
u32 input_id = cdx_dev->req_id; u32 input_id = cdx_dev->req_id;
int ret; int ret;
...@@ -267,9 +270,23 @@ static int cdx_dma_configure(struct device *dev) ...@@ -267,9 +270,23 @@ static int cdx_dma_configure(struct device *dev)
return ret; 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; 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 */ /* show configuration fields */
#define cdx_config_attr(field, format_string) \ #define cdx_config_attr(field, format_string) \
static ssize_t \ static ssize_t \
...@@ -405,6 +422,7 @@ struct bus_type cdx_bus_type = { ...@@ -405,6 +422,7 @@ struct bus_type cdx_bus_type = {
.remove = cdx_remove, .remove = cdx_remove,
.shutdown = cdx_shutdown, .shutdown = cdx_shutdown,
.dma_configure = cdx_dma_configure, .dma_configure = cdx_dma_configure,
.dma_cleanup = cdx_dma_cleanup,
.bus_groups = cdx_bus_groups, .bus_groups = cdx_bus_groups,
.dev_groups = cdx_dev_groups, .dev_groups = cdx_dev_groups,
}; };
......
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