misc: mic: Remove COSM functionality from the MIC card driver
authorAshutosh Dixit <ashutosh.dixit@intel.com>
Wed, 30 Sep 2015 01:13:54 +0000 (18:13 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 4 Oct 2015 11:46:06 +0000 (12:46 +0100)
Since card side COSM functionality, to trigger MIC device shutdowns
and communicate shutdown status to the host, is now moved into a
separate COSM client driver, this patch removes this functionality
from the base MIC card driver. The mic_bus driver is also updated to
use the device index provided by COSM rather than maintain its own
device index.

Reviewed-by: Nikhil Rao <nikhil.rao@intel.com>
Reviewed-by: Sudeep Dutt <sudeep.dutt@intel.com>
Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mic/bus/mic_bus.c
drivers/misc/mic/card/mic_device.c
drivers/misc/mic/card/mic_x100.c
drivers/misc/mic/common/mic_dev.h
include/linux/mic_bus.h

index 961ae90aae470b3fdbe4d8f613d2f1fe3dee87d5..c64955d8cbc1d8a66d4e0e7cc8ad881f161f516b 100644 (file)
@@ -25,9 +25,6 @@
 #include <linux/idr.h>
 #include <linux/mic_bus.h>
 
-/* Unique numbering for mbus devices. */
-static DEFINE_IDA(mbus_index_ida);
-
 static ssize_t device_show(struct device *d,
                           struct device_attribute *attr, char *buf)
 {
@@ -147,7 +144,8 @@ static void mbus_release_dev(struct device *d)
 
 struct mbus_device *
 mbus_register_device(struct device *pdev, int id, struct dma_map_ops *dma_ops,
-                    struct mbus_hw_ops *hw_ops, void __iomem *mmio_va)
+                    struct mbus_hw_ops *hw_ops, int index,
+                    void __iomem *mmio_va)
 {
        int ret;
        struct mbus_device *mbdev;
@@ -166,13 +164,7 @@ mbus_register_device(struct device *pdev, int id, struct dma_map_ops *dma_ops,
        mbdev->dev.release = mbus_release_dev;
        mbdev->hw_ops = hw_ops;
        mbdev->dev.bus = &mic_bus;
-
-       /* Assign a unique device index and hence name. */
-       ret = ida_simple_get(&mbus_index_ida, 0, 0, GFP_KERNEL);
-       if (ret < 0)
-               goto free_mbdev;
-
-       mbdev->index = ret;
+       mbdev->index = index;
        dev_set_name(&mbdev->dev, "mbus-dev%u", mbdev->index);
        /*
         * device_register() causes the bus infrastructure to look for a
@@ -180,10 +172,8 @@ mbus_register_device(struct device *pdev, int id, struct dma_map_ops *dma_ops,
         */
        ret = device_register(&mbdev->dev);
        if (ret)
-               goto ida_remove;
+               goto free_mbdev;
        return mbdev;
-ida_remove:
-       ida_simple_remove(&mbus_index_ida, mbdev->index);
 free_mbdev:
        kfree(mbdev);
        return ERR_PTR(ret);
@@ -192,10 +182,7 @@ EXPORT_SYMBOL_GPL(mbus_register_device);
 
 void mbus_unregister_device(struct mbus_device *mbdev)
 {
-       int index = mbdev->index; /* save for after device release */
-
        device_unregister(&mbdev->dev);
-       ida_simple_remove(&mbus_index_ida, index);
 }
 EXPORT_SYMBOL_GPL(mbus_unregister_device);
 
@@ -207,7 +194,6 @@ static int __init mbus_init(void)
 static void __exit mbus_exit(void)
 {
        bus_unregister(&mic_bus);
-       ida_destroy(&mbus_index_ida);
 }
 
 core_initcall(mbus_init);
index 6338908b225228a0a77ff08ce68572363fa8a760..d0edaf7e0cd586325666955c592d0431f8340754 100644 (file)
 #include "mic_virtio.h"
 
 static struct mic_driver *g_drv;
-static struct mic_irq *shutdown_cookie;
-
-static void mic_notify_host(u8 state)
-{
-       struct mic_driver *mdrv = g_drv;
-       struct mic_bootparam __iomem *bootparam = mdrv->dp;
-
-       iowrite8(state, &bootparam->shutdown_status);
-       dev_dbg(mdrv->dev, "%s %d system_state %d\n",
-               __func__, __LINE__, state);
-       mic_send_intr(&mdrv->mdev, ioread8(&bootparam->c2h_shutdown_db));
-}
-
-static int mic_panic_event(struct notifier_block *this, unsigned long event,
-               void *ptr)
-{
-       struct mic_driver *mdrv = g_drv;
-       struct mic_bootparam __iomem *bootparam = mdrv->dp;
-
-       iowrite8(-1, &bootparam->h2c_config_db);
-       iowrite8(-1, &bootparam->h2c_shutdown_db);
-       mic_notify_host(MIC_CRASHED);
-       return NOTIFY_DONE;
-}
-
-static struct notifier_block mic_panic = {
-       .notifier_call  = mic_panic_event,
-};
-
-static irqreturn_t mic_shutdown_isr(int irq, void *data)
-{
-       struct mic_driver *mdrv = g_drv;
-       struct mic_bootparam __iomem *bootparam = mdrv->dp;
-
-       mic_ack_interrupt(&g_drv->mdev);
-       if (ioread8(&bootparam->shutdown_card))
-               orderly_poweroff(true);
-       return IRQ_HANDLED;
-}
-
-static int mic_shutdown_init(void)
-{
-       int rc = 0;
-       struct mic_driver *mdrv = g_drv;
-       struct mic_bootparam __iomem *bootparam = mdrv->dp;
-       int shutdown_db;
-
-       shutdown_db = mic_next_card_db();
-       shutdown_cookie = mic_request_card_irq(mic_shutdown_isr, NULL,
-                                              "Shutdown", mdrv, shutdown_db);
-       if (IS_ERR(shutdown_cookie))
-               rc = PTR_ERR(shutdown_cookie);
-       else
-               iowrite8(shutdown_db, &bootparam->h2c_shutdown_db);
-       return rc;
-}
-
-static void mic_shutdown_uninit(void)
-{
-       struct mic_driver *mdrv = g_drv;
-       struct mic_bootparam __iomem *bootparam = mdrv->dp;
-
-       iowrite8(-1, &bootparam->h2c_shutdown_db);
-       mic_free_card_irq(shutdown_cookie, mdrv);
-}
 
 static int __init mic_dp_init(void)
 {
@@ -359,11 +294,7 @@ int __init mic_driver_init(struct mic_driver *mdrv)
        u8 node_id;
 
        g_drv = mdrv;
-       /*
-        * Unloading the card module is not supported. The MIC card module
-        * handles fundamental operations like host/card initiated shutdowns
-        * and informing the host about card crashes and cannot be unloaded.
-        */
+       /* Unloading the card module is not supported. */
        if (!try_module_get(mdrv->dev->driver->owner)) {
                rc = -ENODEV;
                goto done;
@@ -374,12 +305,9 @@ int __init mic_driver_init(struct mic_driver *mdrv)
        rc = mic_init_irq();
        if (rc)
                goto dp_uninit;
-       rc = mic_shutdown_init();
-       if (rc)
-               goto irq_uninit;
        if (!mic_request_dma_chans(mdrv)) {
                rc = -ENODEV;
-               goto shutdown_uninit;
+               goto irq_uninit;
        }
        rc = mic_devices_init(mdrv);
        if (rc)
@@ -390,21 +318,18 @@ int __init mic_driver_init(struct mic_driver *mdrv)
                                           NULL, &scif_hw_ops,
                                           0, node_id, &mdrv->mdev.mmio, NULL,
                                           NULL, mdrv->dp, mdrv->dma_ch,
-                                          mdrv->num_dma_ch);
+                                          mdrv->num_dma_ch, true);
        if (IS_ERR(mdrv->scdev)) {
                rc = PTR_ERR(mdrv->scdev);
                goto device_uninit;
        }
        mic_create_card_debug_dir(mdrv);
-       atomic_notifier_chain_register(&panic_notifier_list, &mic_panic);
 done:
        return rc;
 device_uninit:
        mic_devices_uninit(mdrv);
 dma_free:
        mic_free_dma_chans(mdrv);
-shutdown_uninit:
-       mic_shutdown_uninit();
 irq_uninit:
        mic_uninit_irq();
 dp_uninit:
@@ -425,13 +350,6 @@ void mic_driver_uninit(struct mic_driver *mdrv)
        scif_unregister_device(mdrv->scdev);
        mic_devices_uninit(mdrv);
        mic_free_dma_chans(mdrv);
-       /*
-        * Inform the host about the shutdown status i.e. poweroff/restart etc.
-        * The module cannot be unloaded so the only code path to call
-        * mic_devices_uninit(..) is the shutdown callback.
-        */
-       mic_notify_host(system_state);
-       mic_shutdown_uninit();
        mic_uninit_irq();
        mic_dp_uninit();
        module_put(mdrv->dev->driver->owner);
index 77fd41781c2e16336661fb55740a10742514b45f..b2958ce2368c7b3fc1609bf891aa99e0701215aa 100644 (file)
@@ -261,7 +261,7 @@ static int __init mic_probe(struct platform_device *pdev)
        mic_hw_intr_init(mdrv);
        platform_set_drvdata(pdev, mdrv);
        mdrv->dma_mbdev = mbus_register_device(mdrv->dev, MBUS_DEV_DMA_MIC,
-                                              NULL, &mbus_hw_ops,
+                                              NULL, &mbus_hw_ops, 0,
                                               mdrv->mdev.mmio.va);
        if (IS_ERR(mdrv->dma_mbdev)) {
                rc = PTR_ERR(mdrv->dma_mbdev);
index 0b58c46045dc572b3f1e5fa0f69b3aa53876a9fa..50776772ebdf47313af5613cc7374438343c084f 100644 (file)
 #ifndef __MIC_DEV_H__
 #define __MIC_DEV_H__
 
+/* The maximum number of MIC devices supported in a single host system. */
+#define MIC_MAX_NUM_DEVS 128
+
+/**
+ * enum mic_hw_family - The hardware family to which a device belongs.
+ */
+enum mic_hw_family {
+       MIC_FAMILY_X100 = 0,
+       MIC_FAMILY_X200,
+       MIC_FAMILY_UNKNOWN,
+       MIC_FAMILY_LAST
+};
+
 /**
  * struct mic_mw - MIC memory window
  *
index d5b5f76d57ef4b3821d19f2e62f14b0d56d0359b..27d7c95fd0da0cf88ecb0d7c7a03c0b5c96e0fe4 100644 (file)
@@ -91,7 +91,8 @@ struct mbus_hw_ops {
 
 struct mbus_device *
 mbus_register_device(struct device *pdev, int id, struct dma_map_ops *dma_ops,
-                    struct mbus_hw_ops *hw_ops, void __iomem *mmio_va);
+                    struct mbus_hw_ops *hw_ops, int index,
+                    void __iomem *mmio_va);
 void mbus_unregister_device(struct mbus_device *mbdev);
 
 int mbus_register_driver(struct mbus_driver *drv);