mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Sudeep Dutt <sudeep.dutt@intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>,
	Siva Yerramreddy <yshivakrishna@gmail.com>,
	Ashutosh Dixit <ashutosh.dixit@intel.com>,
	Nikhil Rao <nikhil.rao@intel.com>,
	linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org
Subject: Re: [PATCH char-misc-next 2/8] misc: mic: add a bus driver for virtual MIC devices
Date: Wed, 28 May 2014 13:50:49 -0700	[thread overview]
Message-ID: <20140528205049.GA10468@kroah.com> (raw)
In-Reply-To: <07b374763197000963b1161e0fce0c3254ce8a0d.1401239759.git.sudeep.dutt@intel.com>

On Tue, May 27, 2014 at 07:36:11PM -0700, Sudeep Dutt wrote:
> +int register_mbus_driver(struct mbus_driver *driver)
> +{
> +	driver->driver.bus = &mic_bus;
> +	return driver_register(&driver->driver);
> +}
> +EXPORT_SYMBOL_GPL(register_mbus_driver);

mbus_register_driver()?

> +void unregister_mbus_driver(struct mbus_driver *driver)
> +{
> +	driver_unregister(&driver->driver);
> +}
> +EXPORT_SYMBOL_GPL(unregister_mbus_driver);

mbus_unregister_driver()?

> +int register_mbus_device(struct mbus_device *dev)

mbus_register_device()?

Trying to keep the kernel namespace sane.

Why doesn't this function create the device structure?

> +{
> +	int err;
> +
> +	dev->dev.bus = &mic_bus;
> +
> +	/* Assign a unique device index and hence name. */
> +	err = ida_simple_get(&mbus_index_ida, 0, 0, GFP_KERNEL);
> +	if (err < 0)
> +		return err;
> +
> +	dev->index = err;
> +	dev_set_name(&dev->dev, "mbus-dev%u", dev->index);
> +	/*
> +	 * device_register() causes the bus infrastructure to look for a
> +	 * matching driver.
> +	 */
> +	err = device_register(&dev->dev);
> +	return err;
> +}
> +EXPORT_SYMBOL_GPL(register_mbus_device);
> +
> +void unregister_mbus_device(struct mbus_device *dev)
> +{
> +	int index = dev->index; /* save for after device release */
> +
> +	device_unregister(&dev->dev);
> +	ida_simple_remove(&mbus_index_ida, index);
> +}
> +EXPORT_SYMBOL_GPL(unregister_mbus_device);
> +
> +static int __init mbus_init(void)
> +{
> +	return bus_register(&mic_bus);
> +}
> +
> +static void __exit mbus_exit(void)
> +{
> +	bus_unregister(&mic_bus);
> +}
> +
> +core_initcall(mbus_init);
> +module_exit(mbus_exit);
> +
> +MODULE_AUTHOR("Intel Corporation");
> +MODULE_DESCRIPTION("Intel(R) MIC Bus driver");
> +MODULE_LICENSE("GPL v2");
> diff --git a/include/linux/mic_bus.h b/include/linux/mic_bus.h
> new file mode 100644
> index 0000000..8297573
> --- /dev/null
> +++ b/include/linux/mic_bus.h
> @@ -0,0 +1,148 @@
> +/*
> + * Intel MIC Platform Software Stack (MPSS)
> + *
> + * Copyright(c) 2014 Intel Corporation.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License, version 2, as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * General Public License for more details.
> + *
> + * The full GNU General Public License is included in this distribution in
> + * the file called "COPYING".
> + *
> + * Intel MIC Bus driver.
> + *
> + * This implementation is very similar to the the virtio bus driver
> + * implementation @ include/linux/virtio.h.
> + */
> +#ifndef _MIC_BUS_H_
> +#define _MIC_BUS_H_
> +/*
> + * Everything a mbus driver needs to work with any particular mbus
> + * implementation.
> + */
> +#include <linux/types.h>
> +#include <linux/device.h>
> +#include <linux/mod_devicetable.h>
> +#include <linux/interrupt.h>
> +#include <linux/dma-mapping.h>
> +
> +struct mbus_device_id {
> +	__u32 device;
> +	__u32 vendor;
> +};
> +
> +#define MBUS_DEV_DMA_HOST 2
> +#define MBUS_DEV_DMA_MIC 3
> +#define MBUS_DEV_ANY_ID 0xffffffff
> +
> +/**
> + * mbus_device - representation of a device using mbus
> + * @priv: private pointer for the driver's use.
> + * @mmio_va: virtual address of mmio space
> + * @hw_ops: the hardware ops supported by this device.
> + * @id: the device type identification (used to match it with a driver).
> + * @dev: underlying device.
> + * be used to communicate with.
> + * @index: unique position on the mbus bus
> + */
> +struct mbus_device {
> +	void *priv;
> +	void __iomem *mmio_va;
> +	struct mbus_hw_ops *hw_ops;
> +	struct mbus_device_id id;
> +	struct device dev;
> +	int index;
> +};
> +
> +/**
> + * mbus_driver - operations for a mbus I/O driver
> + * @driver: underlying device driver (populate name and owner).
> + * @id_table: the ids serviced by this driver.
> + * @probe: the function to call when a device is found.  Returns 0 or -errno.
> + * @remove: the function to call when a device is removed.
> + */
> +struct mbus_driver {
> +	struct device_driver driver;
> +	const struct mbus_device_id *id_table;
> +	int (*probe)(struct mbus_device *dev);
> +	void (*scan)(struct mbus_device *dev);
> +	void (*remove)(struct mbus_device *dev);
> +};
> +
> +/**
> + * struct mic_irq - opaque pointer used as cookie
> + */
> +struct mic_irq;
> +
> +/**
> + * mbus_hw_ops - Hardware operations for accessing a MIC device on the MIC bus.
> + */
> +struct mbus_hw_ops {
> +	struct mic_irq* (*request_threaded_irq)(struct mbus_device *mbdev,
> +			irq_handler_t handler, irq_handler_t thread_fn,
> +			const char *name, void *data, int intr_src);
> +	void (*free_irq)(struct mbus_device *mbdev,
> +			struct mic_irq *cookie, void *data);
> +	void (*ack_interrupt)(struct mbus_device *mbdev, int num);
> +};
> +
> +int register_mbus_device(struct mbus_device *dev);
> +void unregister_mbus_device(struct mbus_device *dev);
> +
> +int register_mbus_driver(struct mbus_driver *drv);
> +void unregister_mbus_driver(struct mbus_driver *drv);
> +
> +static inline struct mbus_device *dev_to_mbus(struct device *_dev)
> +{
> +	return container_of(_dev, struct mbus_device, dev);
> +}
> +
> +static inline struct mbus_driver *drv_to_mbus(struct device_driver *drv)
> +{
> +	return container_of(drv, struct mbus_driver, driver);
> +}
> +
> +static inline void mbus_release_dev(struct device *d)
> +{
> +}

As per the kernel documentation rules, I get to publicly make fun of you
for doing this half-hearted attempt to get around the kernel providing
you with a valid kernel message as to why you always need to provide a
proper release function :(

Consider yourself mocked.

And go read the kernel documentation for why.

An inline function?  Why?


> +static inline int
> +mbus_add_device(struct mbus_device *mbdev, struct device *pdev, int id,
> +		struct dma_map_ops *dma_ops, struct mbus_hw_ops *hw_ops,
> +		void __iomem *mmio_va)

inline?  Why?

> +{
> +	int ret;
> +
> +	mbdev->mmio_va = mmio_va;
> +	mbdev->dev.parent = pdev;
> +	mbdev->id.device = id;
> +	mbdev->id.vendor = MBUS_DEV_ANY_ID;
> +	mbdev->dev.archdata.dma_ops = dma_ops;
> +	mbdev->dev.dma_mask = &mbdev->dev.coherent_dma_mask;
> +	dma_set_mask(&mbdev->dev, DMA_BIT_MASK(64));
> +	mbdev->dev.release = mbus_release_dev;
> +	mbdev->hw_ops = hw_ops;
> +	dev_set_drvdata(&mbdev->dev, mbdev);
> +
> +	ret = register_mbus_device(mbdev);
> +	if (ret) {
> +		dev_err(mbdev->dev.parent,
> +			"Failed to register mbus device type %u\n", id);
> +		return ret;
> +	}
> +	return 0;
> +}
> +
> +static inline void mbus_remove_device(struct mbus_device *mbdev)
> +{
> +	unregister_mbus_device(mbdev);
> +	memset(mbdev, 0x0, sizeof(*mbdev));

Why are you doing this?  (hint, I think I know why, and it's totally and
unacceptably wrong.)

Also, inline?


  reply	other threads:[~2014-05-28 20:47 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-28  2:36 [PATCH char-misc-next 0/8] Enable dma driver for MIC X100 Coprocessors Sudeep Dutt
2014-05-28  2:36 ` [PATCH char-misc-next 1/8] misc: mic: Add mic bus and dma driver documentation Sudeep Dutt
2014-05-28  2:36 ` [PATCH char-misc-next 2/8] misc: mic: add a bus driver for virtual MIC devices Sudeep Dutt
2014-05-28 20:50   ` Greg Kroah-Hartman [this message]
2014-05-29  2:56     ` Sudeep Dutt
2014-05-28  2:36 ` [PATCH char-misc-next 3/8] dma: MIC X100 DMA Driver Sudeep Dutt
2014-05-28  2:36 ` [PATCH char-misc-next 4/8] misc: mic: add threaded irq support in host driver Sudeep Dutt
2014-05-28  2:36 ` [PATCH char-misc-next 5/8] misc: mic: add dma " Sudeep Dutt
2014-05-28  2:36 ` [PATCH char-misc-next 6/8] misc: mic: add threaded irq support in card driver Sudeep Dutt
2014-05-28  2:36 ` [PATCH char-misc-next 7/8] misc: mic: add dma " Sudeep Dutt
2014-05-28  2:36 ` [PATCH char-misc-next 8/8] misc: mic: add support for loading/unloading dma driver Sudeep Dutt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140528205049.GA10468@kroah.com \
    --to=gregkh@linuxfoundation.org \
    --cc=ashutosh.dixit@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dmaengine@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nikhil.rao@intel.com \
    --cc=sudeep.dutt@intel.com \
    --cc=yshivakrishna@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome