[PATCH char-misc-next v4 11/13] misc: mic: MIC host driver specific changes to enable SCIF

2015-04-29 Thread Sudeep Dutt
MIC host driver specific changes to enable SCIF. This patch implements
the SCIF hardware bus operations and registers a SCIF device on the
SCIF hardware bus.

Reviewed-by: Nikhil Rao 
Reviewed-by: Ashutosh Dixit 
Signed-off-by: Sudeep Dutt 
---
 drivers/misc/mic/Kconfig|   2 +-
 drivers/misc/mic/host/mic_device.h  |  11 +-
 drivers/misc/mic/host/mic_intr.h|   3 +-
 drivers/misc/mic/host/mic_smpt.h|   1 +
 drivers/misc/mic/host/mic_boot.c| 264 ++--
 drivers/misc/mic/host/mic_debugfs.c |  13 ++
 drivers/misc/mic/host/mic_main.c|   6 +
 drivers/misc/mic/host/mic_smpt.c|   7 +-
 drivers/misc/mic/host/mic_virtio.c  |   6 +-
 drivers/misc/mic/host/mic_x100.c|   3 +-
 10 files changed, 292 insertions(+), 24 deletions(-)

diff --git a/drivers/misc/mic/Kconfig b/drivers/misc/mic/Kconfig
index bcf6e36..a2ea3ab 100644
--- a/drivers/misc/mic/Kconfig
+++ b/drivers/misc/mic/Kconfig
@@ -36,7 +36,7 @@ comment "Intel MIC Host Driver"
 
 config INTEL_MIC_HOST
tristate "Intel MIC Host Driver"
-   depends on 64BIT && PCI && X86 && INTEL_MIC_BUS
+   depends on 64BIT && PCI && X86 && INTEL_MIC_BUS && SCIF_BUS
select VHOST_RING
help
  This enables Host Driver support for the Intel Many Integrated
diff --git a/drivers/misc/mic/host/mic_device.h 
b/drivers/misc/mic/host/mic_device.h
index 016bd15..01a7555 100644
--- a/drivers/misc/mic/host/mic_device.h
+++ b/drivers/misc/mic/host/mic_device.h
@@ -27,7 +27,7 @@
 #include 
 #include 
 #include 
-
+#include "../bus/scif_bus.h"
 #include "mic_intr.h"
 
 /* The maximum number of MIC devices supported in a single host system. */
@@ -90,7 +90,9 @@ enum mic_stepping {
  * @vdev_list: list of virtio devices.
  * @pm_notifier: Handles PM notifications from the OS.
  * @dma_mbdev: MIC BUS DMA device.
- * @dma_ch: DMA channel reserved by this driver for use by virtio devices.
+ * @dma_ch - Array of DMA channels
+ * @num_dma_ch - Number of DMA channels available
+ * @scdev: SCIF device on the SCIF virtual bus.
  */
 struct mic_device {
struct mic_mw mmio;
@@ -129,7 +131,9 @@ struct mic_device {
struct list_head vdev_list;
struct notifier_block pm_notifier;
struct mbus_device *dma_mbdev;
-   struct dma_chan *dma_ch;
+   struct dma_chan *dma_ch[MIC_MAX_DMA_CHAN];
+   int num_dma_ch;
+   struct scif_hw_dev *scdev;
 };
 
 /**
@@ -228,4 +232,5 @@ void mic_exit_debugfs(void);
 void mic_prepare_suspend(struct mic_device *mdev);
 void mic_complete_resume(struct mic_device *mdev);
 void mic_suspend(struct mic_device *mdev);
+extern atomic_t g_num_mics;
 #endif
diff --git a/drivers/misc/mic/host/mic_intr.h b/drivers/misc/mic/host/mic_intr.h
index 9f783d4a..cce2882 100644
--- a/drivers/misc/mic/host/mic_intr.h
+++ b/drivers/misc/mic/host/mic_intr.h
@@ -28,8 +28,9 @@
  * 3 for virtio network, console and block devices.
  * 1 for card shutdown notifications.
  * 4 for host owned DMA channels.
+ * 1 for SCIF
  */
-#define MIC_MIN_MSIX 8
+#define MIC_MIN_MSIX 9
 #define MIC_NUM_OFFSETS 32
 
 /**
diff --git a/drivers/misc/mic/host/mic_smpt.h b/drivers/misc/mic/host/mic_smpt.h
index 51970ab..68721c6 100644
--- a/drivers/misc/mic/host/mic_smpt.h
+++ b/drivers/misc/mic/host/mic_smpt.h
@@ -78,6 +78,7 @@ void mic_unmap_single(struct mic_device *mdev,
 dma_addr_t mic_map(struct mic_device *mdev,
dma_addr_t dma_addr, size_t size);
 void mic_unmap(struct mic_device *mdev, dma_addr_t mic_addr, size_t size);
+dma_addr_t mic_to_dma_addr(struct mic_device *mdev, dma_addr_t mic_addr);
 
 /**
  * mic_map_error - Check a MIC address for errors.
diff --git a/drivers/misc/mic/host/mic_boot.c b/drivers/misc/mic/host/mic_boot.c
index ff2b0fb..bb15506 100644
--- a/drivers/misc/mic/host/mic_boot.c
+++ b/drivers/misc/mic/host/mic_boot.c
@@ -21,6 +21,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -29,6 +30,188 @@
 #include "mic_smpt.h"
 #include "mic_virtio.h"
 
+static inline struct mic_device *scdev_to_mdev(struct scif_hw_dev *scdev)
+{
+   return dev_get_drvdata(scdev->dev.parent);
+}
+
+static void *__mic_dma_alloc(struct device *dev, size_t size,
+dma_addr_t *dma_handle, gfp_t gfp,
+struct dma_attrs *attrs)
+{
+   struct scif_hw_dev *scdev = dev_get_drvdata(dev);
+   struct mic_device *mdev = scdev_to_mdev(scdev);
+   dma_addr_t tmp;
+   void *va = kmalloc(size, gfp);
+
+   if (va) {
+   tmp = mic_map_single(mdev, va, size);
+   if (dma_mapping_error(dev, tmp)) {
+   kfree(va);
+   va = NULL;
+   } else {
+   *dma_handle = tmp;
+   }
+   }
+   return va;
+}
+
+static void __mic_dma_free(struct device *dev, size_t size, void *vaddr,
+  dma_addr_t dma_handle, struct dma_attrs *attrs)
+{
+   struct scif_hw_dev *scdev = 

[PATCH char-misc-next v4 11/13] misc: mic: MIC host driver specific changes to enable SCIF

2015-04-29 Thread Sudeep Dutt
MIC host driver specific changes to enable SCIF. This patch implements
the SCIF hardware bus operations and registers a SCIF device on the
SCIF hardware bus.

Reviewed-by: Nikhil Rao nikhil@intel.com
Reviewed-by: Ashutosh Dixit ashutosh.di...@intel.com
Signed-off-by: Sudeep Dutt sudeep.d...@intel.com
---
 drivers/misc/mic/Kconfig|   2 +-
 drivers/misc/mic/host/mic_device.h  |  11 +-
 drivers/misc/mic/host/mic_intr.h|   3 +-
 drivers/misc/mic/host/mic_smpt.h|   1 +
 drivers/misc/mic/host/mic_boot.c| 264 ++--
 drivers/misc/mic/host/mic_debugfs.c |  13 ++
 drivers/misc/mic/host/mic_main.c|   6 +
 drivers/misc/mic/host/mic_smpt.c|   7 +-
 drivers/misc/mic/host/mic_virtio.c  |   6 +-
 drivers/misc/mic/host/mic_x100.c|   3 +-
 10 files changed, 292 insertions(+), 24 deletions(-)

diff --git a/drivers/misc/mic/Kconfig b/drivers/misc/mic/Kconfig
index bcf6e36..a2ea3ab 100644
--- a/drivers/misc/mic/Kconfig
+++ b/drivers/misc/mic/Kconfig
@@ -36,7 +36,7 @@ comment Intel MIC Host Driver
 
 config INTEL_MIC_HOST
tristate Intel MIC Host Driver
-   depends on 64BIT  PCI  X86  INTEL_MIC_BUS
+   depends on 64BIT  PCI  X86  INTEL_MIC_BUS  SCIF_BUS
select VHOST_RING
help
  This enables Host Driver support for the Intel Many Integrated
diff --git a/drivers/misc/mic/host/mic_device.h 
b/drivers/misc/mic/host/mic_device.h
index 016bd15..01a7555 100644
--- a/drivers/misc/mic/host/mic_device.h
+++ b/drivers/misc/mic/host/mic_device.h
@@ -27,7 +27,7 @@
 #include linux/irqreturn.h
 #include linux/dmaengine.h
 #include linux/mic_bus.h
-
+#include ../bus/scif_bus.h
 #include mic_intr.h
 
 /* The maximum number of MIC devices supported in a single host system. */
@@ -90,7 +90,9 @@ enum mic_stepping {
  * @vdev_list: list of virtio devices.
  * @pm_notifier: Handles PM notifications from the OS.
  * @dma_mbdev: MIC BUS DMA device.
- * @dma_ch: DMA channel reserved by this driver for use by virtio devices.
+ * @dma_ch - Array of DMA channels
+ * @num_dma_ch - Number of DMA channels available
+ * @scdev: SCIF device on the SCIF virtual bus.
  */
 struct mic_device {
struct mic_mw mmio;
@@ -129,7 +131,9 @@ struct mic_device {
struct list_head vdev_list;
struct notifier_block pm_notifier;
struct mbus_device *dma_mbdev;
-   struct dma_chan *dma_ch;
+   struct dma_chan *dma_ch[MIC_MAX_DMA_CHAN];
+   int num_dma_ch;
+   struct scif_hw_dev *scdev;
 };
 
 /**
@@ -228,4 +232,5 @@ void mic_exit_debugfs(void);
 void mic_prepare_suspend(struct mic_device *mdev);
 void mic_complete_resume(struct mic_device *mdev);
 void mic_suspend(struct mic_device *mdev);
+extern atomic_t g_num_mics;
 #endif
diff --git a/drivers/misc/mic/host/mic_intr.h b/drivers/misc/mic/host/mic_intr.h
index 9f783d4a..cce2882 100644
--- a/drivers/misc/mic/host/mic_intr.h
+++ b/drivers/misc/mic/host/mic_intr.h
@@ -28,8 +28,9 @@
  * 3 for virtio network, console and block devices.
  * 1 for card shutdown notifications.
  * 4 for host owned DMA channels.
+ * 1 for SCIF
  */
-#define MIC_MIN_MSIX 8
+#define MIC_MIN_MSIX 9
 #define MIC_NUM_OFFSETS 32
 
 /**
diff --git a/drivers/misc/mic/host/mic_smpt.h b/drivers/misc/mic/host/mic_smpt.h
index 51970ab..68721c6 100644
--- a/drivers/misc/mic/host/mic_smpt.h
+++ b/drivers/misc/mic/host/mic_smpt.h
@@ -78,6 +78,7 @@ void mic_unmap_single(struct mic_device *mdev,
 dma_addr_t mic_map(struct mic_device *mdev,
dma_addr_t dma_addr, size_t size);
 void mic_unmap(struct mic_device *mdev, dma_addr_t mic_addr, size_t size);
+dma_addr_t mic_to_dma_addr(struct mic_device *mdev, dma_addr_t mic_addr);
 
 /**
  * mic_map_error - Check a MIC address for errors.
diff --git a/drivers/misc/mic/host/mic_boot.c b/drivers/misc/mic/host/mic_boot.c
index ff2b0fb..bb15506 100644
--- a/drivers/misc/mic/host/mic_boot.c
+++ b/drivers/misc/mic/host/mic_boot.c
@@ -21,6 +21,7 @@
 #include linux/delay.h
 #include linux/firmware.h
 #include linux/pci.h
+#include linux/kmod.h
 
 #include linux/mic_common.h
 #include linux/mic_bus.h
@@ -29,6 +30,188 @@
 #include mic_smpt.h
 #include mic_virtio.h
 
+static inline struct mic_device *scdev_to_mdev(struct scif_hw_dev *scdev)
+{
+   return dev_get_drvdata(scdev-dev.parent);
+}
+
+static void *__mic_dma_alloc(struct device *dev, size_t size,
+dma_addr_t *dma_handle, gfp_t gfp,
+struct dma_attrs *attrs)
+{
+   struct scif_hw_dev *scdev = dev_get_drvdata(dev);
+   struct mic_device *mdev = scdev_to_mdev(scdev);
+   dma_addr_t tmp;
+   void *va = kmalloc(size, gfp);
+
+   if (va) {
+   tmp = mic_map_single(mdev, va, size);
+   if (dma_mapping_error(dev, tmp)) {
+   kfree(va);
+   va = NULL;
+   } else {
+   *dma_handle = tmp;
+   }
+   }
+   return va;
+}
+
+static void 

Re: [PATCH char-misc-next v4 11/13] misc: mic: MIC host driver specific changes to enable SCIF

2015-03-31 Thread Paul Bolle
On Mon, 2015-03-30 at 18:36 -0700, Sudeep Dutt wrote:
> --- a/drivers/misc/mic/Kconfig
> +++ b/drivers/misc/mic/Kconfig

>  config INTEL_MIC_HOST
>   tristate "Intel MIC Host Driver"
> - depends on 64BIT && PCI && X86 && INTEL_MIC_BUS
> + depends on 64BIT && PCI && X86 && INTEL_MIC_BUS && SCIF_BUS

Currently this appears to be equivalent to
depends on INTEL_MIC_BUS && SCIF_BUS

Would that work too? Ditto for 12/13.

>   select VHOST_RING
>   help
> This enables Host Driver support for the Intel Many Integrated


Paul Bolle

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH char-misc-next v4 11/13] misc: mic: MIC host driver specific changes to enable SCIF

2015-03-31 Thread Paul Bolle
On Mon, 2015-03-30 at 18:36 -0700, Sudeep Dutt wrote:
 --- a/drivers/misc/mic/Kconfig
 +++ b/drivers/misc/mic/Kconfig

  config INTEL_MIC_HOST
   tristate Intel MIC Host Driver
 - depends on 64BIT  PCI  X86  INTEL_MIC_BUS
 + depends on 64BIT  PCI  X86  INTEL_MIC_BUS  SCIF_BUS

Currently this appears to be equivalent to
depends on INTEL_MIC_BUS  SCIF_BUS

Would that work too? Ditto for 12/13.

   select VHOST_RING
   help
 This enables Host Driver support for the Intel Many Integrated


Paul Bolle

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH char-misc-next v4 11/13] misc: mic: MIC host driver specific changes to enable SCIF

2015-03-30 Thread Sudeep Dutt
MIC host driver specific changes to enable SCIF. This patch implements
the SCIF hardware bus operations and registers a SCIF device on the
SCIF hardware bus.

Reviewed-by: Nikhil Rao 
Reviewed-by: Ashutosh Dixit 
Signed-off-by: Sudeep Dutt 
---
 drivers/misc/mic/Kconfig|   2 +-
 drivers/misc/mic/host/mic_device.h  |  11 +-
 drivers/misc/mic/host/mic_intr.h|   3 +-
 drivers/misc/mic/host/mic_smpt.h|   1 +
 drivers/misc/mic/host/mic_boot.c| 264 ++--
 drivers/misc/mic/host/mic_debugfs.c |  13 ++
 drivers/misc/mic/host/mic_main.c|   6 +
 drivers/misc/mic/host/mic_smpt.c|   7 +-
 drivers/misc/mic/host/mic_virtio.c  |   6 +-
 drivers/misc/mic/host/mic_x100.c|   3 +-
 10 files changed, 292 insertions(+), 24 deletions(-)

diff --git a/drivers/misc/mic/Kconfig b/drivers/misc/mic/Kconfig
index bcf6e36..a2ea3ab 100644
--- a/drivers/misc/mic/Kconfig
+++ b/drivers/misc/mic/Kconfig
@@ -36,7 +36,7 @@ comment "Intel MIC Host Driver"
 
 config INTEL_MIC_HOST
tristate "Intel MIC Host Driver"
-   depends on 64BIT && PCI && X86 && INTEL_MIC_BUS
+   depends on 64BIT && PCI && X86 && INTEL_MIC_BUS && SCIF_BUS
select VHOST_RING
help
  This enables Host Driver support for the Intel Many Integrated
diff --git a/drivers/misc/mic/host/mic_device.h 
b/drivers/misc/mic/host/mic_device.h
index 016bd15..01a7555 100644
--- a/drivers/misc/mic/host/mic_device.h
+++ b/drivers/misc/mic/host/mic_device.h
@@ -27,7 +27,7 @@
 #include 
 #include 
 #include 
-
+#include "../bus/scif_bus.h"
 #include "mic_intr.h"
 
 /* The maximum number of MIC devices supported in a single host system. */
@@ -90,7 +90,9 @@ enum mic_stepping {
  * @vdev_list: list of virtio devices.
  * @pm_notifier: Handles PM notifications from the OS.
  * @dma_mbdev: MIC BUS DMA device.
- * @dma_ch: DMA channel reserved by this driver for use by virtio devices.
+ * @dma_ch - Array of DMA channels
+ * @num_dma_ch - Number of DMA channels available
+ * @scdev: SCIF device on the SCIF virtual bus.
  */
 struct mic_device {
struct mic_mw mmio;
@@ -129,7 +131,9 @@ struct mic_device {
struct list_head vdev_list;
struct notifier_block pm_notifier;
struct mbus_device *dma_mbdev;
-   struct dma_chan *dma_ch;
+   struct dma_chan *dma_ch[MIC_MAX_DMA_CHAN];
+   int num_dma_ch;
+   struct scif_hw_dev *scdev;
 };
 
 /**
@@ -228,4 +232,5 @@ void mic_exit_debugfs(void);
 void mic_prepare_suspend(struct mic_device *mdev);
 void mic_complete_resume(struct mic_device *mdev);
 void mic_suspend(struct mic_device *mdev);
+extern atomic_t g_num_mics;
 #endif
diff --git a/drivers/misc/mic/host/mic_intr.h b/drivers/misc/mic/host/mic_intr.h
index 9f783d4a..cce2882 100644
--- a/drivers/misc/mic/host/mic_intr.h
+++ b/drivers/misc/mic/host/mic_intr.h
@@ -28,8 +28,9 @@
  * 3 for virtio network, console and block devices.
  * 1 for card shutdown notifications.
  * 4 for host owned DMA channels.
+ * 1 for SCIF
  */
-#define MIC_MIN_MSIX 8
+#define MIC_MIN_MSIX 9
 #define MIC_NUM_OFFSETS 32
 
 /**
diff --git a/drivers/misc/mic/host/mic_smpt.h b/drivers/misc/mic/host/mic_smpt.h
index 51970ab..68721c6 100644
--- a/drivers/misc/mic/host/mic_smpt.h
+++ b/drivers/misc/mic/host/mic_smpt.h
@@ -78,6 +78,7 @@ void mic_unmap_single(struct mic_device *mdev,
 dma_addr_t mic_map(struct mic_device *mdev,
dma_addr_t dma_addr, size_t size);
 void mic_unmap(struct mic_device *mdev, dma_addr_t mic_addr, size_t size);
+dma_addr_t mic_to_dma_addr(struct mic_device *mdev, dma_addr_t mic_addr);
 
 /**
  * mic_map_error - Check a MIC address for errors.
diff --git a/drivers/misc/mic/host/mic_boot.c b/drivers/misc/mic/host/mic_boot.c
index ff2b0fb..bb15506 100644
--- a/drivers/misc/mic/host/mic_boot.c
+++ b/drivers/misc/mic/host/mic_boot.c
@@ -21,6 +21,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -29,6 +30,188 @@
 #include "mic_smpt.h"
 #include "mic_virtio.h"
 
+static inline struct mic_device *scdev_to_mdev(struct scif_hw_dev *scdev)
+{
+   return dev_get_drvdata(scdev->dev.parent);
+}
+
+static void *__mic_dma_alloc(struct device *dev, size_t size,
+dma_addr_t *dma_handle, gfp_t gfp,
+struct dma_attrs *attrs)
+{
+   struct scif_hw_dev *scdev = dev_get_drvdata(dev);
+   struct mic_device *mdev = scdev_to_mdev(scdev);
+   dma_addr_t tmp;
+   void *va = kmalloc(size, gfp);
+
+   if (va) {
+   tmp = mic_map_single(mdev, va, size);
+   if (dma_mapping_error(dev, tmp)) {
+   kfree(va);
+   va = NULL;
+   } else {
+   *dma_handle = tmp;
+   }
+   }
+   return va;
+}
+
+static void __mic_dma_free(struct device *dev, size_t size, void *vaddr,
+  dma_addr_t dma_handle, struct dma_attrs *attrs)
+{
+   struct scif_hw_dev *scdev = 

[PATCH char-misc-next v4 11/13] misc: mic: MIC host driver specific changes to enable SCIF

2015-03-30 Thread Sudeep Dutt
MIC host driver specific changes to enable SCIF. This patch implements
the SCIF hardware bus operations and registers a SCIF device on the
SCIF hardware bus.

Reviewed-by: Nikhil Rao nikhil@intel.com
Reviewed-by: Ashutosh Dixit ashutosh.di...@intel.com
Signed-off-by: Sudeep Dutt sudeep.d...@intel.com
---
 drivers/misc/mic/Kconfig|   2 +-
 drivers/misc/mic/host/mic_device.h  |  11 +-
 drivers/misc/mic/host/mic_intr.h|   3 +-
 drivers/misc/mic/host/mic_smpt.h|   1 +
 drivers/misc/mic/host/mic_boot.c| 264 ++--
 drivers/misc/mic/host/mic_debugfs.c |  13 ++
 drivers/misc/mic/host/mic_main.c|   6 +
 drivers/misc/mic/host/mic_smpt.c|   7 +-
 drivers/misc/mic/host/mic_virtio.c  |   6 +-
 drivers/misc/mic/host/mic_x100.c|   3 +-
 10 files changed, 292 insertions(+), 24 deletions(-)

diff --git a/drivers/misc/mic/Kconfig b/drivers/misc/mic/Kconfig
index bcf6e36..a2ea3ab 100644
--- a/drivers/misc/mic/Kconfig
+++ b/drivers/misc/mic/Kconfig
@@ -36,7 +36,7 @@ comment Intel MIC Host Driver
 
 config INTEL_MIC_HOST
tristate Intel MIC Host Driver
-   depends on 64BIT  PCI  X86  INTEL_MIC_BUS
+   depends on 64BIT  PCI  X86  INTEL_MIC_BUS  SCIF_BUS
select VHOST_RING
help
  This enables Host Driver support for the Intel Many Integrated
diff --git a/drivers/misc/mic/host/mic_device.h 
b/drivers/misc/mic/host/mic_device.h
index 016bd15..01a7555 100644
--- a/drivers/misc/mic/host/mic_device.h
+++ b/drivers/misc/mic/host/mic_device.h
@@ -27,7 +27,7 @@
 #include linux/irqreturn.h
 #include linux/dmaengine.h
 #include linux/mic_bus.h
-
+#include ../bus/scif_bus.h
 #include mic_intr.h
 
 /* The maximum number of MIC devices supported in a single host system. */
@@ -90,7 +90,9 @@ enum mic_stepping {
  * @vdev_list: list of virtio devices.
  * @pm_notifier: Handles PM notifications from the OS.
  * @dma_mbdev: MIC BUS DMA device.
- * @dma_ch: DMA channel reserved by this driver for use by virtio devices.
+ * @dma_ch - Array of DMA channels
+ * @num_dma_ch - Number of DMA channels available
+ * @scdev: SCIF device on the SCIF virtual bus.
  */
 struct mic_device {
struct mic_mw mmio;
@@ -129,7 +131,9 @@ struct mic_device {
struct list_head vdev_list;
struct notifier_block pm_notifier;
struct mbus_device *dma_mbdev;
-   struct dma_chan *dma_ch;
+   struct dma_chan *dma_ch[MIC_MAX_DMA_CHAN];
+   int num_dma_ch;
+   struct scif_hw_dev *scdev;
 };
 
 /**
@@ -228,4 +232,5 @@ void mic_exit_debugfs(void);
 void mic_prepare_suspend(struct mic_device *mdev);
 void mic_complete_resume(struct mic_device *mdev);
 void mic_suspend(struct mic_device *mdev);
+extern atomic_t g_num_mics;
 #endif
diff --git a/drivers/misc/mic/host/mic_intr.h b/drivers/misc/mic/host/mic_intr.h
index 9f783d4a..cce2882 100644
--- a/drivers/misc/mic/host/mic_intr.h
+++ b/drivers/misc/mic/host/mic_intr.h
@@ -28,8 +28,9 @@
  * 3 for virtio network, console and block devices.
  * 1 for card shutdown notifications.
  * 4 for host owned DMA channels.
+ * 1 for SCIF
  */
-#define MIC_MIN_MSIX 8
+#define MIC_MIN_MSIX 9
 #define MIC_NUM_OFFSETS 32
 
 /**
diff --git a/drivers/misc/mic/host/mic_smpt.h b/drivers/misc/mic/host/mic_smpt.h
index 51970ab..68721c6 100644
--- a/drivers/misc/mic/host/mic_smpt.h
+++ b/drivers/misc/mic/host/mic_smpt.h
@@ -78,6 +78,7 @@ void mic_unmap_single(struct mic_device *mdev,
 dma_addr_t mic_map(struct mic_device *mdev,
dma_addr_t dma_addr, size_t size);
 void mic_unmap(struct mic_device *mdev, dma_addr_t mic_addr, size_t size);
+dma_addr_t mic_to_dma_addr(struct mic_device *mdev, dma_addr_t mic_addr);
 
 /**
  * mic_map_error - Check a MIC address for errors.
diff --git a/drivers/misc/mic/host/mic_boot.c b/drivers/misc/mic/host/mic_boot.c
index ff2b0fb..bb15506 100644
--- a/drivers/misc/mic/host/mic_boot.c
+++ b/drivers/misc/mic/host/mic_boot.c
@@ -21,6 +21,7 @@
 #include linux/delay.h
 #include linux/firmware.h
 #include linux/pci.h
+#include linux/kmod.h
 
 #include linux/mic_common.h
 #include linux/mic_bus.h
@@ -29,6 +30,188 @@
 #include mic_smpt.h
 #include mic_virtio.h
 
+static inline struct mic_device *scdev_to_mdev(struct scif_hw_dev *scdev)
+{
+   return dev_get_drvdata(scdev-dev.parent);
+}
+
+static void *__mic_dma_alloc(struct device *dev, size_t size,
+dma_addr_t *dma_handle, gfp_t gfp,
+struct dma_attrs *attrs)
+{
+   struct scif_hw_dev *scdev = dev_get_drvdata(dev);
+   struct mic_device *mdev = scdev_to_mdev(scdev);
+   dma_addr_t tmp;
+   void *va = kmalloc(size, gfp);
+
+   if (va) {
+   tmp = mic_map_single(mdev, va, size);
+   if (dma_mapping_error(dev, tmp)) {
+   kfree(va);
+   va = NULL;
+   } else {
+   *dma_handle = tmp;
+   }
+   }
+   return va;
+}
+
+static void