Re: [PATCH 3/5] ibmebus: Add device creation and bus probing based on of_device

Previous thread: 2.6.23-rc8-mm1, -rc7-mm1 kill audio on HP nx6325 by Rafael J. Wysocki on Tuesday, September 25, 2007 - 8:08 am. (6 messages)

Next thread: [patch 0/5] Linux Kernel Markers (redux) by Mathieu Desnoyers on Tuesday, September 25, 2007 - 8:11 am. (1 message)
To: Paul Mackerras <paulus@...>, LinuxPPC-Dev <linuxppc-dev@...>, LKML <linux-kernel@...>
Cc: Christoph Raisch <raisch@...>, Hoang-Nam Nguyen <hnguyen@...>, Jan-Bernd Themann <themann@...>, Stefan Roscher <stefan.roscher@...>, Thomas Klein <tklein@...>, Arnd Bergmann <arnd@...>, Paul Mackerras <pmac@...>
Date: Tuesday, September 25, 2007 - 8:10 am

This patchset will merge the ibmebus and of_platform bus drivers by basing a
lot of ibmebus functionality on of_platform code and adding the features
specific to ibmebus on top of that.

I split the actual ibmebus rework into three patches (2/5-4/5) for easier
readability. The kernel will compile during the intermediate states, and
ibmebus will not crash, but not work either.

As a side-effect of patch 3/5, a problem with bus_id collisions in case of
two devices sharing the same location code is resolved -- the bus_id is now
determined differently.

[1/5] moves of_device allocation into of_device.[ch]
[2/5] removes the old bus match/probe/remove functions
[3/5] adds device creation and bus probing based on of_device
[4/5] finally moves to of_device and of_platform_driver by changing
ibmebus.h and matching the eHCA and eHEA drivers
[5/5] just changes a nit in ibmebus_store_probe()

These patches should apply cleanly, in order, against 2.6.23-rc5 and against
Linus' git. Please review and comment them, and queue them up for 2.6.24 if
you think they're okay.

Thanks and regards,
Joachim

arch/powerpc/kernel/ibmebus.c | 263 ++++++++---------------------
arch/powerpc/kernel/of_device.c | 80 +++++++++
arch/powerpc/kernel/of_platform.c | 70 +--------
drivers/infiniband/hw/ehca/ehca_classes.h | 2 +-
drivers/infiniband/hw/ehca/ehca_eq.c | 6 +-
drivers/infiniband/hw/ehca/ehca_main.c | 32 ++--
drivers/net/ehea/ehea.h | 2 +-
drivers/net/ehea/ehea_main.c | 72 ++++----
include/asm-powerpc/ibmebus.h | 38 +----
include/asm-powerpc/of_device.h | 4 +
include/linux/of_device.h | 5 +
11 files changed, 226 insertions(+), 348 deletions(-)

--
Joachim Fenkes  --  eHCA Linux Driver Developer and Hardware Tamer
IBM Deutschland Entwicklung GmbH  --  Dept. 3627 (I/O Firmware Dev. 2)
Schoenaicher Strasse 220  --  71032 Boeblingen  --  German...

To: Paul Mackerras <paulus@...>, LinuxPPC-Dev <linuxppc-dev@...>, LKML <linux-kernel@...>
Cc: Christoph Raisch <raisch@...>, Hoang-Nam Nguyen <hnguyen@...>, Jan-Bernd Themann <themann@...>, Stefan Roscher <stefan.roscher@...>, Thomas Klein <tklein@...>, Arnd Bergmann <arnd@...>, Paul Mackerras <pmac@...>
Date: Tuesday, September 25, 2007 - 8:13 am

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---
arch/powerpc/kernel/ibmebus.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/kernel/ibmebus.c b/arch/powerpc/kernel/ibmebus.c
index 379472f..8c08a98 100644
--- a/arch/powerpc/kernel/ibmebus.c
+++ b/arch/powerpc/kernel/ibmebus.c
@@ -270,10 +270,10 @@ static ssize_t ibmebus_store_probe(struct bus_type *bus,
return -ENOMEM;

if (bus_find_device(&ibmebus_bus_type, NULL, path,
- ibmebus_match_path)) {
+ ibmebus_match_path)) {
printk(KERN_WARNING "%s: %s has already been probed\n",
__FUNCTION__, path);
- rc = -EINVAL;
+ rc = -EEXIST;
goto out;
}

--
1.5.2

-

To: Paul Mackerras <paulus@...>, LinuxPPC-Dev <linuxppc-dev@...>, LKML <linux-kernel@...>
Cc: Christoph Raisch <raisch@...>, Hoang-Nam Nguyen <hnguyen@...>, Jan-Bernd Themann <themann@...>, Stefan Roscher <stefan.roscher@...>, Thomas Klein <tklein@...>, Arnd Bergmann <arnd@...>, Paul Mackerras <pmac@...>
Date: Tuesday, September 25, 2007 - 8:12 am

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---
drivers/infiniband/hw/ehca/ehca_classes.h | 2 +-
drivers/net/ehea/ehea.h | 2 +-
include/asm-powerpc/ibmebus.h | 38 +++------------
arch/powerpc/kernel/ibmebus.c | 28 ++++++-----
drivers/infiniband/hw/ehca/ehca_eq.c | 6 +-
drivers/infiniband/hw/ehca/ehca_main.c | 32 ++++++------
drivers/net/ehea/ehea_main.c | 72 ++++++++++++++--------------
7 files changed, 79 insertions(+), 101 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h
index c2edd4c..8ca4dd4 100644
--- a/drivers/infiniband/hw/ehca/ehca_classes.h
+++ b/drivers/infiniband/hw/ehca/ehca_classes.h
@@ -106,7 +106,7 @@ struct ehca_sport {

struct ehca_shca {
struct ib_device ib_device;
- struct ibmebus_dev *ibmebus_dev;
+ struct of_device *ofdev;
u8 num_ports;
int hw_level;
struct list_head shca_list;
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h
index 8d58be5..830a66a 100644
--- a/drivers/net/ehea/ehea.h
+++ b/drivers/net/ehea/ehea.h
@@ -382,7 +382,7 @@ struct ehea_port_res {
#define EHEA_MAX_PORTS 16
struct ehea_adapter {
u64 handle;
- struct ibmebus_dev *ebus_dev;
+ struct of_device *ofdev;
struct ehea_port *port[EHEA_MAX_PORTS];
struct ehea_eq *neq; /* notification event queue */
struct workqueue_struct *ehea_wq;
diff --git a/include/asm-powerpc/ibmebus.h b/include/asm-powerpc/ibmebus.h
index 87d396e..1a9d9ae 100644
--- a/include/asm-powerpc/ibmebus.h
+++ b/include/asm-powerpc/ibmebus.h
@@ -43,42 +43,18 @@
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/mod_devicetable.h>
-#include <asm/of_device.h>
+#include <linux/of_device.h>
+#include <linux/of_platform.h>

extern struct bus_type ibmebus_bus_type;

-struct ibmebus_dev {
- struct of_device ofdev;
-};
+int ibmebus_register_driver(struct of_...

To: <linuxppc-dev@...>
Cc: Joachim Fenkes <fenkes@...>, Paul Mackerras <paulus@...>, LKML <linux-kernel@...>, Thomas Klein <tklein@...>, Jan-Bernd Themann <themann@...>, Paul Mackerras <pmac@...>, Christoph Raisch <raisch@...>, Stefan Roscher <stefan.roscher@...>
Date: Tuesday, September 25, 2007 - 10:42 am

This is missing a description, but the patch looks good.

Arnd <><
-

To: Arnd Bergmann <arnd@...>
Cc: Christoph Raisch <raisch@...>, Jan-Bernd Themann <themann@...>, LKML <linux-kernel@...>, <linuxppc-dev@...>, Paul Mackerras <paulus@...>, Paul Mackerras <pmac@...>, Stefan Roscher <stefan.roscher@...>, Thomas Q Klein <tklein@...>
Date: Wednesday, September 26, 2007 - 4:43 am

The description is "ibmebus: Move to of_device and of_platform_driver,
match eHCA and eHEA drivers" -- I thought that should be enough since the
patch is rather straightforward. I can add a more detailed description,

Thanks =)

Joachim
-

To: Paul Mackerras <paulus@...>, LinuxPPC-Dev <linuxppc-dev@...>, LKML <linux-kernel@...>
Cc: Christoph Raisch <raisch@...>, Hoang-Nam Nguyen <hnguyen@...>, Jan-Bernd Themann <themann@...>, Stefan Roscher <stefan.roscher@...>, Thomas Klein <tklein@...>, Arnd Bergmann <arnd@...>, Paul Mackerras <pmac@...>
Date: Tuesday, September 25, 2007 - 8:12 am

The devtree root is now searched for devices matching a built-in whitelist
during boot, so these devices appear on the bus from the beginning. It is
still possible to manually add/remove devices to/from the bus by using the
probe/remove sysfs interface. Also, when a device driver registers itself,
the devtree is matched against its matchlist.

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---
arch/powerpc/kernel/ibmebus.c | 97 ++++++++++++++++++++++++++++++++++-------
1 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/arch/powerpc/kernel/ibmebus.c b/arch/powerpc/kernel/ibmebus.c
index cc80f84..c506e0d 100644
--- a/arch/powerpc/kernel/ibmebus.c
+++ b/arch/powerpc/kernel/ibmebus.c
@@ -51,6 +51,15 @@ static struct device ibmebus_bus_device = { /* fake "parent" device */

struct bus_type ibmebus_bus_type;

+/* These devices will automatically be added to the bus during init */
+static struct of_device_id builtin_matches[] = {
+ { .name = "lhca" },
+ { .compatible = "IBM,lhca" },
+ { .name = "lhea" },
+ { .compatible = "IBM,lhea" },
+ {},
+};
+
static void *ibmebus_alloc_coherent(struct device *dev,
size_t size,
dma_addr_t *dma_handle,
@@ -124,6 +133,67 @@ static struct dma_mapping_ops ibmebus_dma_ops = {
.dma_supported = ibmebus_dma_supported,
};

+static int ibmebus_match_path(struct device *dev, void *data)
+{
+ struct device_node *dn = to_of_device(dev)->node;
+ return (dn->full_name &&
+ (strcasecmp((char *)data, dn->full_name) == 0));
+}
+
+static int ibmebus_match_node(struct device *dev, void *data)
+{
+ return to_of_device(dev)->node == data;
+}
+
+static int ibmebus_create_device(struct device_node *dn)
+{
+ struct of_device *dev;
+ int ret;
+
+ dev = of_device_alloc(dn, NULL, &ibmebus_bus_device);
+ if (!dev)
+ return -ENOMEM;
+
+ dev->dev.bus = &ibmebus_bus_type;
+ dev->dev.archdata.dma_ops = &ibmebus_dma_ops;
+
+ ret = of_device_register(dev);
+ if (ret...

To: <linuxppc-dev@...>
Cc: Joachim Fenkes <fenkes@...>, Paul Mackerras <paulus@...>, LKML <linux-kernel@...>, Thomas Klein <tklein@...>, Jan-Bernd Themann <themann@...>, Paul Mackerras <pmac@...>, Christoph Raisch <raisch@...>, Stefan Roscher <stefan.roscher@...>
Date: Tuesday, September 25, 2007 - 10:39 am

Hmm, do you have devices that only have the matching name property
but not the compatible property? If not, I'd suggest only looking

the last line looks a bit silly. Maybe instead do

rc = ibmebus_create_device(dn);
of_node_put(dn);
}

kfree(path);
if (rc)
return rc;
return count;
}
-

To: Arnd Bergmann <arnd@...>
Cc: Christoph Raisch <raisch@...>, Jan-Bernd Themann <themann@...>, LKML <linux-kernel@...>, <linuxppc-dev@...>, Paul Mackerras <paulus@...>, Paul Mackerras <pmac@...>, Stefan Roscher <stefan.roscher@...>, Thomas Q Klein <tklein@...>
Date: Wednesday, September 26, 2007 - 4:58 am

> > +/* These devices will automatically be added to the bus during init

If a device that's not an lhca is called "lhca", that's its own fault, i
guess ;) But i concur that looking for the compatible property will

More code lines? ;) But yes, that looks more like "standard kernel
pattern" - I'll change that.

Joachim
-

To: Paul Mackerras <paulus@...>, LinuxPPC-Dev <linuxppc-dev@...>, LKML <linux-kernel@...>
Cc: Christoph Raisch <raisch@...>, Hoang-Nam Nguyen <hnguyen@...>, Jan-Bernd Themann <themann@...>, Stefan Roscher <stefan.roscher@...>, Thomas Klein <tklein@...>, Arnd Bergmann <arnd@...>, Paul Mackerras <pmac@...>
Date: Tuesday, September 25, 2007 - 8:11 am

ibmebus_{,un}register_driver() are replaced by dummy functions because
ibmebus is temporarily unusable in this transitional state.

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---
arch/powerpc/kernel/ibmebus.c | 199 ++---------------------------------------
1 files changed, 6 insertions(+), 193 deletions(-)

diff --git a/arch/powerpc/kernel/ibmebus.c b/arch/powerpc/kernel/ibmebus.c
index d6a38cd..cc80f84 100644
--- a/arch/powerpc/kernel/ibmebus.c
+++ b/arch/powerpc/kernel/ibmebus.c
@@ -41,6 +41,7 @@
#include <linux/kobject.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
+#include <linux/of_platform.h>
#include <asm/ibmebus.h>
#include <asm/abs_addr.h>

@@ -123,183 +124,14 @@ static struct dma_mapping_ops ibmebus_dma_ops = {
.dma_supported = ibmebus_dma_supported,
};

-static int ibmebus_bus_probe(struct device *dev)
-{
- struct ibmebus_dev *ibmebusdev = to_ibmebus_dev(dev);
- struct ibmebus_driver *ibmebusdrv = to_ibmebus_driver(dev->driver);
- const struct of_device_id *id;
- int error = -ENODEV;
-
- if (!ibmebusdrv->probe)
- return error;
-
- id = of_match_device(ibmebusdrv->id_table, &ibmebusdev->ofdev);
- if (id) {
- error = ibmebusdrv->probe(ibmebusdev, id);
- }
-
- return error;
-}
-
-static int ibmebus_bus_remove(struct device *dev)
-{
- struct ibmebus_dev *ibmebusdev = to_ibmebus_dev(dev);
- struct ibmebus_driver *ibmebusdrv = to_ibmebus_driver(dev->driver);
-
- if (ibmebusdrv->remove) {
- return ibmebusdrv->remove(ibmebusdev);
- }
-
- return 0;
-}
-
-static void __devinit ibmebus_dev_release(struct device *dev)
-{
- of_node_put(to_ibmebus_dev(dev)->ofdev.node);
- kfree(to_ibmebus_dev(dev));
-}
-
-static int __devinit ibmebus_register_device_common(
- struct ibmebus_dev *dev, const char *name)
-{
- int err = 0;
-
- dev->ofdev.dev.parent = &ibmebus_bus_device;
- dev->ofdev.dev.bus = &ibmebus_bus_type;
- dev...

To: <linuxppc-dev@...>
Cc: Joachim Fenkes <fenkes@...>, Paul Mackerras <paulus@...>, LKML <linux-kernel@...>, Thomas Klein <tklein@...>, Jan-Bernd Themann <themann@...>, Paul Mackerras <pmac@...>, Christoph Raisch <raisch@...>, Stefan Roscher <stefan.roscher@...>
Date: Tuesday, September 25, 2007 - 10:29 am

Great diffstat!

The description makes it sound like a git-bisect would get broken
by this patch, which should never happen. If the patch indeed
ends up with a broken kernel, it would be better to merge it with
the later patch that fixes the code again.

Arnd <><
-

To: Arnd Bergmann <arnd@...>
Cc: Christoph Raisch <raisch@...>, Jan-Bernd Themann <themann@...>, LKML <linux-kernel@...>, <linuxppc-dev@...>, Paul Mackerras <paulus@...>, Paul Mackerras <pmac@...>, Stefan Roscher <stefan.roscher@...>, Thomas Q Klein <tklein@...>
Date: Wednesday, September 26, 2007 - 5:04 am

I took extra care to prevent just that from happening. ibmebus will simply
be disabled during the transition (because of {un,}register_driver being
empty dummies), but the kernel builds and boots without problems. So
unless you're trying to find an ibmebus-based problem, git bisect will be
fine. I'll repost 2/5 with an updated description.

I split the ibmebus rework into three patches because the merged patch was
impossible to read. Makes reviewing easier.

Joachim
-

To: Paul Mackerras <paulus@...>, LinuxPPC-Dev <linuxppc-dev@...>, LKML <linux-kernel@...>
Cc: Christoph Raisch <raisch@...>, Hoang-Nam Nguyen <hnguyen@...>, Jan-Bernd Themann <themann@...>, Stefan Roscher <stefan.roscher@...>, Thomas Klein <tklein@...>, Arnd Bergmann <arnd@...>, Paul Mackerras <pmac@...>
Date: Tuesday, September 25, 2007 - 8:11 am

Extract generic of_device allocation code from of_platform_device_create()
and move it into of_device.[ch], called of_device_alloc(). Also, there's now
of_device_free() which puts the device node.

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---
include/asm-powerpc/of_device.h | 4 ++
include/linux/of_device.h | 5 ++
arch/powerpc/kernel/of_device.c | 80 +++++++++++++++++++++++++++++++++++++
arch/powerpc/kernel/of_platform.c | 70 +-------------------------------
4 files changed, 91 insertions(+), 68 deletions(-)

diff --git a/include/asm-powerpc/of_device.h b/include/asm-powerpc/of_device.h
index ec2a8a2..9ab469d 100644
--- a/include/asm-powerpc/of_device.h
+++ b/include/asm-powerpc/of_device.h
@@ -17,6 +17,10 @@ struct of_device
struct device dev; /* Generic device interface */
};

+extern struct of_device *of_device_alloc(struct device_node *np,
+ const char *bus_id,
+ struct device *parent);
+
extern ssize_t of_device_get_modalias(struct of_device *ofdev,
char *str, ssize_t len);
extern int of_device_uevent(struct device *dev,
diff --git a/include/linux/of_device.h b/include/linux/of_device.h
index 91bf84b..212bffb 100644
--- a/include/linux/of_device.h
+++ b/include/linux/of_device.h
@@ -22,5 +22,10 @@ extern int of_device_register(struct of_device *ofdev);
extern void of_device_unregister(struct of_device *ofdev);
extern void of_release_dev(struct device *dev);

+static inline void of_device_free(struct of_device *dev)
+{
+ of_release_dev(&dev->dev);
+}
+
#endif /* __KERNEL__ */
#endif /* _LINUX_OF_DEVICE_H */
diff --git a/arch/powerpc/kernel/of_device.c b/arch/powerpc/kernel/of_device.c
index 89b911e..ecb8b0e 100644
--- a/arch/powerpc/kernel/of_device.c
+++ b/arch/powerpc/kernel/of_device.c
@@ -7,8 +7,88 @@
#include <linux/slab.h>

#include <asm/errno.h>
+#include <asm/dcr.h>
#include <asm/of_device.h>

+static void of_device_make_bus_id(struct of_device ...

To: <linuxppc-dev@...>
Cc: Joachim Fenkes <fenkes@...>, Paul Mackerras <paulus@...>, LKML <linux-kernel@...>, Thomas Klein <tklein@...>, Jan-Bernd Themann <themann@...>, Paul Mackerras <pmac@...>, Christoph Raisch <raisch@...>, Stefan Roscher <stefan.roscher@...>
Date: Tuesday, September 25, 2007 - 10:27 am

Sorry I didn't review the patches earlier when you sent them in private.
The patch looks good to me, especially since you did exactly what I
suggested ;-)

Maybe the description should have another sentence in it about what
the change is good for. You have that in the 0/5 mail, but that does
not go into the changelog, so the information gets lost in the process.

Arnd <><
-

To: Arnd Bergmann <arnd@...>
Cc: Christoph Raisch <raisch@...>, Jan-Bernd Themann <themann@...>, LKML <linux-kernel@...>, <linuxppc-dev@...>, Paul Mackerras <paulus@...>, Paul Mackerras <pmac@...>, Stefan Roscher <stefan.roscher@...>, Thomas Q Klein <tklein@...>
Date: Wednesday, September 26, 2007 - 5:07 am

Yes, our discussions were very productive. Thanks and sorry I forgot to

Can do. New patch coming right up!

Joachim
-

Previous thread: 2.6.23-rc8-mm1, -rc7-mm1 kill audio on HP nx6325 by Rafael J. Wysocki on Tuesday, September 25, 2007 - 8:08 am. (6 messages)

Next thread: [patch 0/5] Linux Kernel Markers (redux) by Mathieu Desnoyers on Tuesday, September 25, 2007 - 8:11 am. (1 message)