Commit d411e793 authored by Ashutosh Dixit's avatar Ashutosh Dixit Committed by Greg Kroah-Hartman
Browse files

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: default avatarNikhil Rao <nikhil.rao@intel.com>
Reviewed-by: default avatarSudeep Dutt <sudeep.dutt@intel.com>
Signed-off-by: default avatarAshutosh Dixit <ashutosh.dixit@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 1da2b3ee
Loading
Loading
Loading
Loading
+4 −18
Original line number Diff line number Diff line
@@ -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);
+3 −85
Original line number Diff line number Diff line
@@ -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)
{
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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);
+13 −0
Original line number Diff line number Diff line
@@ -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
 *
+2 −1
Original line number Diff line number Diff line
@@ -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);