From: Alexander Usyskin <alexander.usys...@intel.com>

Expose the client dma mapping via mei client
bus interface.

Signed-off-by: Alexander Usyskin <alexander.usys...@intel.com>
Signed-off-by: Tomas Winkler <tomas.wink...@intel.com>
---
 drivers/misc/mei/bus.c     | 46 ++++++++++++++++++++++++++++++++++++++
 drivers/misc/mei/hw.h      |  5 +++++
 include/linux/mei_cl_bus.h |  3 +++
 3 files changed, 54 insertions(+)

diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
index 34fb5e541fe5..d430710a5fe5 100644
--- a/drivers/misc/mei/bus.c
+++ b/drivers/misc/mei/bus.c
@@ -636,6 +636,52 @@ static void mei_cl_bus_vtag_free(struct mei_cl_device 
*cldev)
        kfree(cl_vtag);
 }
 
+void *mei_cldev_dma_map(struct mei_cl_device *cldev, u8 buffer_id, size_t size)
+{
+       struct mei_device *bus;
+       struct mei_cl *cl;
+       int ret;
+
+       if (!cldev || !buffer_id || !size)
+               return ERR_PTR(-EINVAL);
+
+       if (!IS_ALIGNED(size, MEI_FW_PAGE_SIZE)) {
+               dev_err(&cldev->dev, "Map size should be aligned to %lu\n",
+                       MEI_FW_PAGE_SIZE);
+               return ERR_PTR(-EINVAL);
+       }
+
+       cl = cldev->cl;
+       bus = cldev->bus;
+
+       mutex_lock(&bus->device_lock);
+       ret = mei_cl_dma_alloc_and_map(cl, NULL, buffer_id, size);
+       mutex_unlock(&bus->device_lock);
+       if (ret)
+               return ERR_PTR(ret);
+       return cl->dma.vaddr;
+}
+EXPORT_SYMBOL_GPL(mei_cldev_dma_map);
+
+int mei_cldev_dma_unmap(struct mei_cl_device *cldev)
+{
+       struct mei_device *bus;
+       struct mei_cl *cl;
+       int ret;
+
+       if (!cldev)
+               return -EINVAL;
+
+       cl = cldev->cl;
+       bus = cldev->bus;
+
+       mutex_lock(&bus->device_lock);
+       ret = mei_cl_dma_unmap(cl, NULL);
+       mutex_unlock(&bus->device_lock);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(mei_cldev_dma_unmap);
+
 /**
  * mei_cldev_enable - enable me client device
  *     create connection with me client
diff --git a/drivers/misc/mei/hw.h b/drivers/misc/mei/hw.h
index b10606550613..bc240b88abf1 100644
--- a/drivers/misc/mei/hw.h
+++ b/drivers/misc/mei/hw.h
@@ -22,6 +22,11 @@
 #define MEI_D0I3_TIMEOUT            5  /* D0i3 set/unset max response time */
 #define MEI_HBM_TIMEOUT             1  /* 1 second */
 
+/*
+ * FW page size for DMA allocations
+ */
+#define MEI_FW_PAGE_SIZE 4096UL
+
 /*
  * MEI Version
  */
diff --git a/include/linux/mei_cl_bus.h b/include/linux/mei_cl_bus.h
index 959ad7d850b4..53801eacfaef 100644
--- a/include/linux/mei_cl_bus.h
+++ b/include/linux/mei_cl_bus.h
@@ -116,4 +116,7 @@ int mei_cldev_enable(struct mei_cl_device *cldev);
 int mei_cldev_disable(struct mei_cl_device *cldev);
 bool mei_cldev_enabled(struct mei_cl_device *cldev);
 
+void *mei_cldev_dma_map(struct mei_cl_device *cldev, u8 buffer_id, size_t 
size);
+int mei_cldev_dma_unmap(struct mei_cl_device *cldev);
+
 #endif /* _LINUX_MEI_CL_BUS_H */
-- 
2.26.2

Reply via email to