Intel(R) Management Engine (ME) Client bus API
===============================================


Rationale
=========
MEI misc character device is useful for dedicated applications to send and receive
data to the many FW appliance found in Intel's ME from the user space.
However for some of the ME functionalities it make sense to leverage existing software
stack and expose them through existing kernel subsystems.

In order to plug seamlessly into the kernel device driver model we add kernel virtual
bus abstraction on top of the MEI driver. This allows implementing linux kernel drivers
for the various MEI features as a stand alone entities found in their respective subsystem.
Existing device drivers can even potentially be re-used by adding an MEI CL bus layer to
the existing code.


MEI CL bus API
===========
A driver implementation for an MEI Client is very similar to existing bus
based device drivers. The driver registers itself as an MEI CL bus driver through
the mei_cl_driver structure:

struct mei_cl_driver {
	struct device_driver driver;
	const char *name;

	const struct mei_cl_device_id *id_table;

	int (*probe)(struct mei_cl_device *dev, const struct mei_cl_id *id);
	int (*remove)(struct mei_cl_device *dev);
};

struct mei_cl_id {
	char name[MEI_NAME_SIZE];
	kernel_ulong_t driver_info;
};

The mei_cl_id structure allows the driver to bind itself against a device name.

To actually register a driver on the ME Client bus one must call the mei_cl_add_driver()
API. This is typically called at module init time.

Once registered on the ME Client bus, a driver will typically try to do some I/O on
this bus and this should be done through the mei_cl_send() and mei_cl_recv()
routines. The latter is synchronous (blocks and sleeps until data shows up).
In order for drivers to be notified of pending events waiting for them (e.g.
an Rx event) they can register an event handler through the
mei_cl_register_event_cb() routine. Currently only the MEI_EVENT_RX event
will trigger an event handler call and the driver implementation is supposed
to call mei_recv() from the event handler in order to fetch the pending
received buffers.


Example
=======
As a theoretical example let's pretend the ME comes with a "contact" NFC IP.
The driver init and exit routines for this device would look like:

#define CONTACT_DRIVER_NAME "contact"

static struct mei_cl_device_id contact_mei_cl_tbl[] = {
	{ CONTACT_DRIVER_NAME, },

	/* required last entry */
	{ }
};
MODULE_DEVICE_TABLE(mei_cl, contact_mei_cl_tbl);

static struct mei_cl_driver contact_driver = {
       .id_table = contact_mei_tbl,
       .name = CONTACT_DRIVER_NAME,

       .probe = contact_probe,
       .remove = contact_remove,
};

static int contact_init(void)
{
	int r;

	r = mei_cl_driver_register(&contact_driver);
	if (r) {
		pr_err(CONTACT_DRIVER_NAME ": driver registration failed\n");
		return r;
	}

	return 0;
}

static void __exit contact_exit(void)
{
	mei_cl_driver_unregister(&contact_driver);
}

module_init(contact_init);
module_exit(contact_exit);

And the driver's simplified probe routine would look like that:

int contact_probe(struct mei_cl_device *dev, struct mei_cl_device_id *id)
{
	struct contact_driver *contact;

	[...]
	mei_cl_enable_device(dev);

	mei_cl_register_event_cb(dev, contact_event_cb, contact);

	return 0;
 }

In the probe routine the driver first enable the MEI device and then registers
an ME bus event handler which is as close as it can get to registering a
threaded IRQ handler.
The handler implementation will typically call some I/O routine depending on
the pending events:

#define MAX_NFC_PAYLOAD 128

static void contact_event_cb(struct mei_cl_device *dev, u32 events,
			     void *context)
{
	struct contact_driver *contact = context;

	if (events & BIT(MEI_EVENT_RX)) {
		u8 payload[MAX_NFC_PAYLOAD];
		int payload_size;

		payload_size = mei_recv(dev, payload, MAX_NFC_PAYLOAD);
		if (payload_size <= 0)
			return;

		/* Hook to the NFC subsystem */
		nfc_hci_recv_frame(contact->hdev, payload, payload_size);
	}
}
