misc: mic: Remove COSM functionality from the MIC card driver
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>
This commit is contained in:
parent
1da2b3eeef
commit
d411e79391
|
@ -25,9 +25,6 @@
|
||||||
#include <linux/idr.h>
|
#include <linux/idr.h>
|
||||||
#include <linux/mic_bus.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,
|
static ssize_t device_show(struct device *d,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
|
@ -147,7 +144,8 @@ static void mbus_release_dev(struct device *d)
|
||||||
|
|
||||||
struct mbus_device *
|
struct mbus_device *
|
||||||
mbus_register_device(struct device *pdev, int id, struct dma_map_ops *dma_ops,
|
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;
|
int ret;
|
||||||
struct mbus_device *mbdev;
|
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->dev.release = mbus_release_dev;
|
||||||
mbdev->hw_ops = hw_ops;
|
mbdev->hw_ops = hw_ops;
|
||||||
mbdev->dev.bus = &mic_bus;
|
mbdev->dev.bus = &mic_bus;
|
||||||
|
mbdev->index = index;
|
||||||
/* 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;
|
|
||||||
dev_set_name(&mbdev->dev, "mbus-dev%u", mbdev->index);
|
dev_set_name(&mbdev->dev, "mbus-dev%u", mbdev->index);
|
||||||
/*
|
/*
|
||||||
* device_register() causes the bus infrastructure to look for a
|
* 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);
|
ret = device_register(&mbdev->dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto ida_remove;
|
goto free_mbdev;
|
||||||
return mbdev;
|
return mbdev;
|
||||||
ida_remove:
|
|
||||||
ida_simple_remove(&mbus_index_ida, mbdev->index);
|
|
||||||
free_mbdev:
|
free_mbdev:
|
||||||
kfree(mbdev);
|
kfree(mbdev);
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
@ -192,10 +182,7 @@ EXPORT_SYMBOL_GPL(mbus_register_device);
|
||||||
|
|
||||||
void mbus_unregister_device(struct mbus_device *mbdev)
|
void mbus_unregister_device(struct mbus_device *mbdev)
|
||||||
{
|
{
|
||||||
int index = mbdev->index; /* save for after device release */
|
|
||||||
|
|
||||||
device_unregister(&mbdev->dev);
|
device_unregister(&mbdev->dev);
|
||||||
ida_simple_remove(&mbus_index_ida, index);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mbus_unregister_device);
|
EXPORT_SYMBOL_GPL(mbus_unregister_device);
|
||||||
|
|
||||||
|
@ -207,7 +194,6 @@ static int __init mbus_init(void)
|
||||||
static void __exit mbus_exit(void)
|
static void __exit mbus_exit(void)
|
||||||
{
|
{
|
||||||
bus_unregister(&mic_bus);
|
bus_unregister(&mic_bus);
|
||||||
ida_destroy(&mbus_index_ida);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
core_initcall(mbus_init);
|
core_initcall(mbus_init);
|
||||||
|
|
|
@ -37,71 +37,6 @@
|
||||||
#include "mic_virtio.h"
|
#include "mic_virtio.h"
|
||||||
|
|
||||||
static struct mic_driver *g_drv;
|
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)
|
static int __init mic_dp_init(void)
|
||||||
{
|
{
|
||||||
|
@ -359,11 +294,7 @@ int __init mic_driver_init(struct mic_driver *mdrv)
|
||||||
u8 node_id;
|
u8 node_id;
|
||||||
|
|
||||||
g_drv = mdrv;
|
g_drv = mdrv;
|
||||||
/*
|
/* Unloading the card module is not supported. */
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
if (!try_module_get(mdrv->dev->driver->owner)) {
|
if (!try_module_get(mdrv->dev->driver->owner)) {
|
||||||
rc = -ENODEV;
|
rc = -ENODEV;
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -374,12 +305,9 @@ int __init mic_driver_init(struct mic_driver *mdrv)
|
||||||
rc = mic_init_irq();
|
rc = mic_init_irq();
|
||||||
if (rc)
|
if (rc)
|
||||||
goto dp_uninit;
|
goto dp_uninit;
|
||||||
rc = mic_shutdown_init();
|
|
||||||
if (rc)
|
|
||||||
goto irq_uninit;
|
|
||||||
if (!mic_request_dma_chans(mdrv)) {
|
if (!mic_request_dma_chans(mdrv)) {
|
||||||
rc = -ENODEV;
|
rc = -ENODEV;
|
||||||
goto shutdown_uninit;
|
goto irq_uninit;
|
||||||
}
|
}
|
||||||
rc = mic_devices_init(mdrv);
|
rc = mic_devices_init(mdrv);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
@ -390,21 +318,18 @@ int __init mic_driver_init(struct mic_driver *mdrv)
|
||||||
NULL, &scif_hw_ops,
|
NULL, &scif_hw_ops,
|
||||||
0, node_id, &mdrv->mdev.mmio, NULL,
|
0, node_id, &mdrv->mdev.mmio, NULL,
|
||||||
NULL, mdrv->dp, mdrv->dma_ch,
|
NULL, mdrv->dp, mdrv->dma_ch,
|
||||||
mdrv->num_dma_ch);
|
mdrv->num_dma_ch, true);
|
||||||
if (IS_ERR(mdrv->scdev)) {
|
if (IS_ERR(mdrv->scdev)) {
|
||||||
rc = PTR_ERR(mdrv->scdev);
|
rc = PTR_ERR(mdrv->scdev);
|
||||||
goto device_uninit;
|
goto device_uninit;
|
||||||
}
|
}
|
||||||
mic_create_card_debug_dir(mdrv);
|
mic_create_card_debug_dir(mdrv);
|
||||||
atomic_notifier_chain_register(&panic_notifier_list, &mic_panic);
|
|
||||||
done:
|
done:
|
||||||
return rc;
|
return rc;
|
||||||
device_uninit:
|
device_uninit:
|
||||||
mic_devices_uninit(mdrv);
|
mic_devices_uninit(mdrv);
|
||||||
dma_free:
|
dma_free:
|
||||||
mic_free_dma_chans(mdrv);
|
mic_free_dma_chans(mdrv);
|
||||||
shutdown_uninit:
|
|
||||||
mic_shutdown_uninit();
|
|
||||||
irq_uninit:
|
irq_uninit:
|
||||||
mic_uninit_irq();
|
mic_uninit_irq();
|
||||||
dp_uninit:
|
dp_uninit:
|
||||||
|
@ -425,13 +350,6 @@ void mic_driver_uninit(struct mic_driver *mdrv)
|
||||||
scif_unregister_device(mdrv->scdev);
|
scif_unregister_device(mdrv->scdev);
|
||||||
mic_devices_uninit(mdrv);
|
mic_devices_uninit(mdrv);
|
||||||
mic_free_dma_chans(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_uninit_irq();
|
||||||
mic_dp_uninit();
|
mic_dp_uninit();
|
||||||
module_put(mdrv->dev->driver->owner);
|
module_put(mdrv->dev->driver->owner);
|
||||||
|
|
|
@ -261,7 +261,7 @@ static int __init mic_probe(struct platform_device *pdev)
|
||||||
mic_hw_intr_init(mdrv);
|
mic_hw_intr_init(mdrv);
|
||||||
platform_set_drvdata(pdev, mdrv);
|
platform_set_drvdata(pdev, mdrv);
|
||||||
mdrv->dma_mbdev = mbus_register_device(mdrv->dev, MBUS_DEV_DMA_MIC,
|
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);
|
mdrv->mdev.mmio.va);
|
||||||
if (IS_ERR(mdrv->dma_mbdev)) {
|
if (IS_ERR(mdrv->dma_mbdev)) {
|
||||||
rc = PTR_ERR(mdrv->dma_mbdev);
|
rc = PTR_ERR(mdrv->dma_mbdev);
|
||||||
|
|
|
@ -21,6 +21,19 @@
|
||||||
#ifndef __MIC_DEV_H__
|
#ifndef __MIC_DEV_H__
|
||||||
#define __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
|
* struct mic_mw - MIC memory window
|
||||||
*
|
*
|
||||||
|
|
|
@ -91,7 +91,8 @@ struct mbus_hw_ops {
|
||||||
|
|
||||||
struct mbus_device *
|
struct mbus_device *
|
||||||
mbus_register_device(struct device *pdev, int id, struct dma_map_ops *dma_ops,
|
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);
|
void mbus_unregister_device(struct mbus_device *mbdev);
|
||||||
|
|
||||||
int mbus_register_driver(struct mbus_driver *drv);
|
int mbus_register_driver(struct mbus_driver *drv);
|
||||||
|
|
Loading…
Reference in New Issue