Skip to content

Commit

Permalink
misc: mic: Remove COSM functionality from the MIC card driver
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ashutosh Dixit authored and Greg Kroah-Hartman committed Oct 4, 2015
1 parent 1da2b3e commit d411e79
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 105 deletions.
22 changes: 4 additions & 18 deletions drivers/misc/mic/bus/mic_bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
Expand All @@ -166,24 +164,16 @@ 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
* matching driver.
*/
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);
Expand All @@ -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);

Expand All @@ -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);
Expand Down
88 changes: 3 additions & 85 deletions drivers/misc/mic/card/mic_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,71 +37,6 @@
#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)
{
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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:
Expand All @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion drivers/misc/mic/card/mic_x100.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
13 changes: 13 additions & 0 deletions drivers/misc/mic/common/mic_dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,19 @@
#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
*
Expand Down
3 changes: 2 additions & 1 deletion include/linux/mic_bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit d411e79

Please sign in to comment.