Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-12 Thread Sebastian Hesselbarth

On 02/12/2014 01:21 AM, Stephen N Chivers wrote:

Sebastian Hesselbarth sebastian.hesselba...@gmail.com wrote on
02/12/2014 10:46:36 AM:


From: Sebastian Hesselbarth sebastian.hesselba...@gmail.com
To: Scott Wood scottw...@freescale.com
Cc: Kumar Gala ga...@kernel.crashing.org, Stephen N Chivers
schiv...@csc.com.au, Chris Proctor cproc...@csc.com.au,
linuxppc-dev@lists.ozlabs.org, Arnd Bergmann a...@arndb.de,
devicetree devicet...@vger.kernel.org
Date: 02/12/2014 11:04 AM
Subject: Re: Linux-3.14-rc2: Order of serial node compatibles in DTS

files.


On 02/12/2014 12:41 AM, Scott Wood wrote:


Regardless of whether .type = serial gets removed, it seems wrong for
of_match_node() to accept a .type-only match (or .name, or anything else
that doesn't involve .compatible) before it accepts a compatible match
other than the first in the compatible property.


Right, I thought about it and came to the same conclusion. I sent a
patch a second ago to prefer .compatible != NULL matches over those
with .compatible == NULL.

Would be great if Stephen can re-test that. If it solves the issue, I
can send a patch tomorrow.

Done.

But, the Interrupt Controller (MPIC)
goes AWOL and it is down hill from there.

The MPIC is specified in the DTS as:

 mpic: pic@4 {
 interrupt-controller;
 #address-cells = 0;
 #interrupt-cells = 2;
 reg = 0x4 0x4;
 compatible = chrp,open-pic;
 device_type = open-pic;
 big-endian;
 };

The board support file has the standard mechanism for allocating
the PIC:

 struct mpic *mpic;

 mpic = mpic_alloc(NULL, 0, 0, 0, 256,  OpenPIC  );
 BUG_ON(mpic == NULL);

 mpic_init(mpic);

I checked for damage in applying the patch and it has applied
correctly.


Hmm, I did a mistake in the patch:

-   while (m-name[0] || m-type[0]) {
+   while (m-compatible[0] || m-name[0] || m-type[0]) {

for the second added match. Otherwise, the matches are not
evaluated down to the sentinel but the loop quits on the first
match table entry without .name and .type set.

Sebastian
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-12 Thread Sebastian Hesselbarth

On 02/12/2014 06:28 AM, Kevin Hao wrote:

On Wed, Feb 12, 2014 at 10:21:58AM +1000, Stephen N Chivers wrote:

But, the Interrupt Controller (MPIC)
goes AWOL and it is down hill from there.

The MPIC is specified in the DTS as:

 mpic: pic@4 {
 interrupt-controller;
 #address-cells = 0;
 #interrupt-cells = 2;
 reg = 0x4 0x4;
 compatible = chrp,open-pic;
 device_type = open-pic;
 big-endian;
 };

The board support file has the standard mechanism for allocating
the PIC:

 struct mpic *mpic;

 mpic = mpic_alloc(NULL, 0, 0, 0, 256,  OpenPIC  );
 BUG_ON(mpic == NULL);

 mpic_init(mpic);

I checked for damage in applying the patch and it has applied
correctly.


How about the following fix?

diff --git a/drivers/of/base.c b/drivers/of/base.c
index ff85450d5683..ca91984d3c4b 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -730,32 +730,40 @@ out:
  }
  EXPORT_SYMBOL(of_find_node_with_property);

+static int of_match_type_name(const struct device_node *node,
+   const struct of_device_id *m)


I am fine with having a sub-function here, but it should rather be
named of_match_type_or_name.


+{
+   int match = 1;
+
+   if (m-name[0])
+   match = node-name  !strcmp(m-name, node-name);
+
+   if (m-type[0])
+   match = node-type  !strcmp(m-type, node-type);
+
+   return match;
+}

[...]

+   /* Check against matches without compatible string */
+   m = matches;
+   while (!m-compatible[0]  (m-name[0] || m-type[0])) {


We shouldn't check for anything else than the sentinel here.
Although I guess yours will not quit early as mine did but that
way we don't have to worry about it.

Sebastian


+   match = of_match_type_name(node, m);
+   if (match)
+   return m;
+   m++;
+   }
+
return NULL;
  }



___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-12 Thread Kevin Hao
On Wed, Feb 12, 2014 at 09:30:00AM +0100, Sebastian Hesselbarth wrote:
 On 02/12/2014 06:28 AM, Kevin Hao wrote:
 On Wed, Feb 12, 2014 at 10:21:58AM +1000, Stephen N Chivers wrote:
 But, the Interrupt Controller (MPIC)
 goes AWOL and it is down hill from there.
 
 The MPIC is specified in the DTS as:
 
  mpic: pic@4 {
  interrupt-controller;
  #address-cells = 0;
  #interrupt-cells = 2;
  reg = 0x4 0x4;
  compatible = chrp,open-pic;
  device_type = open-pic;
  big-endian;
  };
 
 The board support file has the standard mechanism for allocating
 the PIC:
 
  struct mpic *mpic;
 
  mpic = mpic_alloc(NULL, 0, 0, 0, 256,  OpenPIC  );
  BUG_ON(mpic == NULL);
 
  mpic_init(mpic);
 
 I checked for damage in applying the patch and it has applied
 correctly.
 
 How about the following fix?
 
 diff --git a/drivers/of/base.c b/drivers/of/base.c
 index ff85450d5683..ca91984d3c4b 100644
 --- a/drivers/of/base.c
 +++ b/drivers/of/base.c
 @@ -730,32 +730,40 @@ out:
   }
   EXPORT_SYMBOL(of_find_node_with_property);
 
 +static int of_match_type_name(const struct device_node *node,
 +const struct of_device_id *m)
 
 I am fine with having a sub-function here, but it should rather be
 named of_match_type_or_name.

OK.

 
 +{
 +int match = 1;
 +
 +if (m-name[0])
 +match = node-name  !strcmp(m-name, node-name);
 +
 +if (m-type[0])
 +match = node-type  !strcmp(m-type, node-type);
 +
 +return match;
 +}
 [...]
 +/* Check against matches without compatible string */
 +m = matches;
 +while (!m-compatible[0]  (m-name[0] || m-type[0])) {
 
 We shouldn't check for anything else than the sentinel here.
 Although I guess yours will not quit early as mine did but that
 way we don't have to worry about it.

Yes, this is still buggy. I will change something like this:

m = matches;
/* Check against matches without compatible string */
while (m-name[0] || m-type[0] || m-compatible[0]) {
if (m-compatible[0]) {
m++;
continue;
}

match = of_match_type_name(node, m);
if (match)
return m;
m++;
}

Thanks,
Kevin


pgps8ftEWKrhl.pgp
Description: PGP signature
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-12 Thread Kevin Hao
On Wed, Feb 12, 2014 at 09:25:24AM +0100, Sebastian Hesselbarth wrote:
 
 Hmm, I did a mistake in the patch:
 
 - while (m-name[0] || m-type[0]) {
 + while (m-compatible[0] || m-name[0] || m-type[0]) {
 
 for the second added match. Otherwise, the matches are not
 evaluated down to the sentinel but the loop quits on the first
 match table entry without .name and .type set.

But this is still not right. We also need to skip the matches with
.compatible here.

Thanks,
Kevin
 
 Sebastian
 ___
 Linuxppc-dev mailing list
 Linuxppc-dev@lists.ozlabs.org
 https://lists.ozlabs.org/listinfo/linuxppc-dev


pgpwFO4K17beE.pgp
Description: PGP signature
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-12 Thread Arnd Bergmann
On Wednesday 12 February 2014, Sebastian Hesselbarth wrote:
 On 02/12/2014 12:38 AM, Stephen N Chivers wrote:
  Sebastian Hesselbarth sebastian.hesselba...@gmail.com wrote on

  I don't think the missing compatible is causing it, but of_serial
  provides a DT match for .type = serial just to fail later on
  with the error seen above.
 
  The commit in question reorders of_match_device in a way that match
  table order is not relevant anymore. This can cause it to match
  .type = serial first here.
 
  Rather than touching the commit, I suggest to remove the problematic
  .type = serial from the match table. It is of no use anyway.
  Deleting the serial line from the match table fixes the problem.
  I tested it for both orderings of compatible.
 
 I revert my statement about removing anything from of_serial.c. Instead
 we should try to prefer matches with compatibles over type/name without
 compatibles. Something like the patch below (compile tested only)

That would probably be a good idea. However, I think in this
case we also want to remove the line from the driver, as it clearly
never works on any hardware and the driver just errors out for the
device_type match.

Arnd
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-12 Thread Sebastian Hesselbarth

On 02/12/14 11:31, Kevin Hao wrote:

On Wed, Feb 12, 2014 at 09:30:00AM +0100, Sebastian Hesselbarth wrote:

On 02/12/2014 06:28 AM, Kevin Hao wrote:

On Wed, Feb 12, 2014 at 10:21:58AM +1000, Stephen N Chivers wrote:

But, the Interrupt Controller (MPIC)
goes AWOL and it is down hill from there.

The MPIC is specified in the DTS as:

 mpic: pic@4 {
 interrupt-controller;
 #address-cells = 0;
 #interrupt-cells = 2;
 reg = 0x4 0x4;
 compatible = chrp,open-pic;
 device_type = open-pic;
 big-endian;
 };

The board support file has the standard mechanism for allocating
the PIC:

 struct mpic *mpic;

 mpic = mpic_alloc(NULL, 0, 0, 0, 256,  OpenPIC  );
 BUG_ON(mpic == NULL);

 mpic_init(mpic);

I checked for damage in applying the patch and it has applied
correctly.


How about the following fix?

diff --git a/drivers/of/base.c b/drivers/of/base.c
index ff85450d5683..ca91984d3c4b 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -730,32 +730,40 @@ out:
  }
  EXPORT_SYMBOL(of_find_node_with_property);

+static int of_match_type_name(const struct device_node *node,
+   const struct of_device_id *m)


I am fine with having a sub-function here, but it should rather be
named of_match_type_or_name.


OK.




+{
+   int match = 1;
+
+   if (m-name[0])
+   match = node-name  !strcmp(m-name, node-name);
+
+   if (m-type[0])
+   match = node-type  !strcmp(m-type, node-type);
+
+   return match;
+}

[...]

+   /* Check against matches without compatible string */
+   m = matches;
+   while (!m-compatible[0]  (m-name[0] || m-type[0])) {


We shouldn't check for anything else than the sentinel here.
Although I guess yours will not quit early as mine did but that
way we don't have to worry about it.


Yes, this is still buggy. I will change something like this:

m = matches;
/* Check against matches without compatible string */
while (m-name[0] || m-type[0] || m-compatible[0]) {
if (m-compatible[0]) {
m++;
continue;
}

match = of_match_type_name(node, m);
if (match)
return m;
m++;
}


You can cook it down to:

m = matches;
/* Check against matches without compatible string */
while (m-name[0] || m-type[0] || m-compatible[0]) {
if (!m-compatible[0]  of_match_type_or_name(node, m)
return m;
m++;
}





___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-12 Thread Kevin Hao
On Wed, Feb 12, 2014 at 12:26:14PM +0100, Sebastian Hesselbarth wrote:
 You can cook it down to:
 
   m = matches;
   /* Check against matches without compatible string */
   while (m-name[0] || m-type[0] || m-compatible[0]) {
   if (!m-compatible[0]  of_match_type_or_name(node, m)
   return m;
   m++;
   }

Will do.

Thanks,
Kevin


pgpEyfZ_1f1QZ.pgp
Description: PGP signature
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-11 Thread Stephen N Chivers
I have been trial booting a 3.14-rc2 kernel for a 85xx platform 
(dtbImage).

After mounting the root filesystem there are no messages from the init 
scripts
and the serial console is not available for login.

In the kernel log messages there is:

of_serial f1004500.serial: Unknown serial port found, ignored.

The serial nodes in boards dts file are specified as:

serial0: serial@4500 {
cell-index = 0;
device_type = serial;
compatible = fsl,ns16550, ns16550;
reg = 0x4500 0x100;
clock-frequency = 0;
interrupts = 0x2a 0x2;
interrupt-parent = mpic;
};

Reversing the order of the compatible:

compatible = ns16550, fsl,ns16550;

restores the serial console.

Linux-3.13 does not have this behaviour.

There are 49 dts files in Linux-3.14-rc2 that have the fsl,ns16550 
compatible first.

Stephen Chivers,
CSC Australia Pty. Ltd.
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-11 Thread Kumar Gala

On Feb 11, 2014, at 2:57 PM, Stephen N Chivers schiv...@csc.com.au wrote:

 I have been trial booting a 3.14-rc2 kernel for a 85xx platform 
 (dtbImage).
 
 After mounting the root filesystem there are no messages from the init 
 scripts
 and the serial console is not available for login.
 
 In the kernel log messages there is:
 
 of_serial f1004500.serial: Unknown serial port found, ignored.
 
 The serial nodes in boards dts file are specified as:
 
serial0: serial@4500 {
cell-index = 0;
device_type = serial;
compatible = fsl,ns16550, ns16550;
reg = 0x4500 0x100;
clock-frequency = 0;
interrupts = 0x2a 0x2;
interrupt-parent = mpic;
};
 
 Reversing the order of the compatible:
 
compatible = ns16550, fsl,ns16550;
 
 restores the serial console.
 
 Linux-3.13 does not have this behaviour.
 
 There are 49 dts files in Linux-3.14-rc2 that have the fsl,ns16550 
 compatible first.

Hmm,

Wondering if this caused the issue:

commit 105353145eafb3ea919f5cdeb652a9d8f270228e
Author: Sebastian Hesselbarth sebastian.hesselba...@gmail.com
Date:   Tue Dec 3 14:52:00 2013 +0100

OF: base: match each node compatible against all given matches first


- k
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-11 Thread Sebastian Hesselbarth

On 02/11/2014 11:33 PM, Kumar Gala wrote:


On Feb 11, 2014, at 2:57 PM, Stephen N Chivers schiv...@csc.com.au wrote:


I have been trial booting a 3.14-rc2 kernel for a 85xx platform
(dtbImage).

After mounting the root filesystem there are no messages from the init
scripts
and the serial console is not available for login.

In the kernel log messages there is:

of_serial f1004500.serial: Unknown serial port found, ignored.

The serial nodes in boards dts file are specified as:

serial0: serial@4500 {
cell-index = 0;
device_type = serial;
compatible = fsl,ns16550, ns16550;
reg = 0x4500 0x100;
clock-frequency = 0;
interrupts = 0x2a 0x2;
interrupt-parent = mpic;
};

Reversing the order of the compatible:

compatible = ns16550, fsl,ns16550;

restores the serial console.

Linux-3.13 does not have this behaviour.

There are 49 dts files in Linux-3.14-rc2 that have the fsl,ns16550
compatible first.


Hmm,

Wondering if this caused the issue:

commit 105353145eafb3ea919f5cdeb652a9d8f270228e
Author: Sebastian Hesselbarth sebastian.hesselba...@gmail.com
Date:   Tue Dec 3 14:52:00 2013 +0100

 OF: base: match each node compatible against all given matches first


[adding Arnd on Cc]

Could be. I checked tty/serial/of_serial.c and it does not provide a
compatible for fsl,ns16550. Does reverting the patch fix the issue
observed?

I don't think the missing compatible is causing it, but of_serial
provides a DT match for .type = serial just to fail later on
with the error seen above.

The commit in question reorders of_match_device in a way that match
table order is not relevant anymore. This can cause it to match
.type = serial first here.

Rather than touching the commit, I suggest to remove the problematic
.type = serial from the match table. It is of no use anyway.

Sebastian
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-11 Thread Stephen N Chivers
Sebastian Hesselbarth sebastian.hesselba...@gmail.com wrote on 
02/12/2014 09:51:43 AM:

 From: Sebastian Hesselbarth sebastian.hesselba...@gmail.com
 To: Kumar Gala ga...@kernel.crashing.org, Stephen N Chivers 
 schiv...@csc.com.au
 Cc: linuxppc-dev@lists.ozlabs.org, Chris Proctor 
 cproc...@csc.com.au, devicetree devicet...@vger.kernel.org, Arnd
 Bergmann a...@arndb.de
 Date: 02/12/2014 09:51 AM
 Subject: Re: Linux-3.14-rc2: Order of serial node compatibles in DTS 
files.
 
 On 02/11/2014 11:33 PM, Kumar Gala wrote:
 
  On Feb 11, 2014, at 2:57 PM, Stephen N Chivers schiv...@csc.com.au 
wrote:
 
  I have been trial booting a 3.14-rc2 kernel for a 85xx platform
  (dtbImage).
 
  After mounting the root filesystem there are no messages from the 
init
  scripts
  and the serial console is not available for login.
 
  In the kernel log messages there is:
 
  of_serial f1004500.serial: Unknown serial port found, ignored.
 
  The serial nodes in boards dts file are specified as:
 
  serial0: serial@4500 {
  cell-index = 0;
  device_type = serial;
  compatible = fsl,ns16550, ns16550;
  reg = 0x4500 0x100;
  clock-frequency = 0;
  interrupts = 0x2a 0x2;
  interrupt-parent = mpic;
  };
 
  Reversing the order of the compatible:
 
  compatible = ns16550, fsl,ns16550;
 
  restores the serial console.
 
  Linux-3.13 does not have this behaviour.
 
  There are 49 dts files in Linux-3.14-rc2 that have the fsl,ns16550
  compatible first.
 
  Hmm,
 
  Wondering if this caused the issue:
 
  commit 105353145eafb3ea919f5cdeb652a9d8f270228e
  Author: Sebastian Hesselbarth sebastian.hesselba...@gmail.com
  Date:   Tue Dec 3 14:52:00 2013 +0100
 
   OF: base: match each node compatible against all given matches 
first
 
 [adding Arnd on Cc]
 
 Could be. I checked tty/serial/of_serial.c and it does not provide a
 compatible for fsl,ns16550. Does reverting the patch fix the issue
 observed?
 
 I don't think the missing compatible is causing it, but of_serial
 provides a DT match for .type = serial just to fail later on
 with the error seen above.
 
 The commit in question reorders of_match_device in a way that match
 table order is not relevant anymore. This can cause it to match
 .type = serial first here.
 
 Rather than touching the commit, I suggest to remove the problematic
 .type = serial from the match table. It is of no use anyway.
Deleting the serial line from the match table fixes the problem.
I tested it for both orderings of compatible.
 
 Sebastian

Thanks,
Stephen Chivers,
CSC Australia Pty. Ltd.

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-11 Thread Scott Wood
On Tue, 2014-02-11 at 23:51 +0100, Sebastian Hesselbarth wrote:
 On 02/11/2014 11:33 PM, Kumar Gala wrote:
  Hmm,
 
  Wondering if this caused the issue:
 
  commit 105353145eafb3ea919f5cdeb652a9d8f270228e
  Author: Sebastian Hesselbarth sebastian.hesselba...@gmail.com
  Date:   Tue Dec 3 14:52:00 2013 +0100
 
   OF: base: match each node compatible against all given matches first
 
 [adding Arnd on Cc]
 
 Could be. I checked tty/serial/of_serial.c and it does not provide a
 compatible for fsl,ns16550. Does reverting the patch fix the issue
 observed?
 
 I don't think the missing compatible is causing it, but of_serial
 provides a DT match for .type = serial just to fail later on
 with the error seen above.
 
 The commit in question reorders of_match_device in a way that match
 table order is not relevant anymore. This can cause it to match
 .type = serial first here.
 
 Rather than touching the commit, I suggest to remove the problematic
 .type = serial from the match table. It is of no use anyway.

Regardless of whether .type = serial gets removed, it seems wrong for
of_match_node() to accept a .type-only match (or .name, or anything else
that doesn't involve .compatible) before it accepts a compatible match
other than the first in the compatible property.

-Scott


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-11 Thread Sebastian Hesselbarth

On 02/12/2014 12:38 AM, Stephen N Chivers wrote:

Sebastian Hesselbarth sebastian.hesselba...@gmail.com wrote on

On 02/11/2014 11:33 PM, Kumar Gala wrote:

On Feb 11, 2014, at 2:57 PM, Stephen N Chivers schiv...@csc.com.au wrote:

I have been trial booting a 3.14-rc2 kernel for a 85xx platform
(dtbImage).

[...]


of_serial f1004500.serial: Unknown serial port found, ignored.

The serial nodes in boards dts file are specified as:

 serial0: serial@4500 {
 cell-index = 0;
 device_type = serial;
 compatible = fsl,ns16550, ns16550;
 reg = 0x4500 0x100;
 clock-frequency = 0;
 interrupts = 0x2a 0x2;
 interrupt-parent = mpic;
 };


Wondering if this caused the issue:

commit 105353145eafb3ea919f5cdeb652a9d8f270228e
Author: Sebastian Hesselbarth sebastian.hesselba...@gmail.com
Date:   Tue Dec 3 14:52:00 2013 +0100

  OF: base: match each node compatible against all given matches first



[...]


I don't think the missing compatible is causing it, but of_serial
provides a DT match for .type = serial just to fail later on
with the error seen above.

The commit in question reorders of_match_device in a way that match
table order is not relevant anymore. This can cause it to match
.type = serial first here.

Rather than touching the commit, I suggest to remove the problematic
.type = serial from the match table. It is of no use anyway.

Deleting the serial line from the match table fixes the problem.
I tested it for both orderings of compatible.


I revert my statement about removing anything from of_serial.c. Instead
we should try to prefer matches with compatibles over type/name without
compatibles. Something like the patch below (compile tested only)





diff --git a/drivers/of/base.c b/drivers/of/base.c
index ff85450d5683..60da53b385ff 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -734,6 +734,7 @@ static
 const struct of_device_id *__of_match_node(const struct of_device_id *matches,
 	   const struct device_node *node)
 {
+	const struct of_device_id *m;
 	const char *cp;
 	int cplen, l;
 
@@ -742,15 +743,15 @@ const struct of_device_id *__of_match_node(const struct of_device_id *matches,
 
 	cp = __of_get_property(node, compatible, cplen);
 	do {
-		const struct of_device_id *m = matches;
+		m = matches;
 
 		/* Check against matches with current compatible string */
 		while (m-name[0] || m-type[0] || m-compatible[0]) {
 			int match = 1;
-			if (m-name[0])
+			if (m-name[0]  m-compatible[0])
 match = node-name
 	 !strcmp(m-name, node-name);
-			if (m-type[0])
+			if (m-type[0]  m-compatible[0])
 match = node-type
 	 !strcmp(m-type, node-type);
 			if (m-compatible[0])
@@ -770,6 +771,21 @@ const struct of_device_id *__of_match_node(const struct of_device_id *matches,
 		}
 	} while (cp  (cplen  0));
 
+	/* Check against matches without compatible string */
+	m = matches;
+	while (m-name[0] || m-type[0]) {
+		int match = 1;
+		if (m-name[0])
+			match = node-name
+ !strcmp(m-name, node-name);
+		if (m-type[0])
+			match = node-type
+ !strcmp(m-type, node-type);
+		if (match)
+			return m;
+		m++;
+	}
+
 	return NULL;
 }
 
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-11 Thread Sebastian Hesselbarth

On 02/12/2014 12:41 AM, Scott Wood wrote:

On Tue, 2014-02-11 at 23:51 +0100, Sebastian Hesselbarth wrote:

On 02/11/2014 11:33 PM, Kumar Gala wrote:

Hmm,

Wondering if this caused the issue:

commit 105353145eafb3ea919f5cdeb652a9d8f270228e
Author: Sebastian Hesselbarth sebastian.hesselba...@gmail.com
Date:   Tue Dec 3 14:52:00 2013 +0100

  OF: base: match each node compatible against all given matches first


[adding Arnd on Cc]

Could be. I checked tty/serial/of_serial.c and it does not provide a
compatible for fsl,ns16550. Does reverting the patch fix the issue
observed?

I don't think the missing compatible is causing it, but of_serial
provides a DT match for .type = serial just to fail later on
with the error seen above.

The commit in question reorders of_match_device in a way that match
table order is not relevant anymore. This can cause it to match
.type = serial first here.

Rather than touching the commit, I suggest to remove the problematic
.type = serial from the match table. It is of no use anyway.


Regardless of whether .type = serial gets removed, it seems wrong for
of_match_node() to accept a .type-only match (or .name, or anything else
that doesn't involve .compatible) before it accepts a compatible match
other than the first in the compatible property.


Right, I thought about it and came to the same conclusion. I sent a
patch a second ago to prefer .compatible != NULL matches over those
with .compatible == NULL.

Would be great if Stephen can re-test that. If it solves the issue, I
can send a patch tomorrow.

Sebastian

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-11 Thread Stephen N Chivers
Sebastian Hesselbarth sebastian.hesselba...@gmail.com wrote on 
02/12/2014 10:46:36 AM:

 From: Sebastian Hesselbarth sebastian.hesselba...@gmail.com
 To: Scott Wood scottw...@freescale.com
 Cc: Kumar Gala ga...@kernel.crashing.org, Stephen N Chivers 
 schiv...@csc.com.au, Chris Proctor cproc...@csc.com.au, 
 linuxppc-dev@lists.ozlabs.org, Arnd Bergmann a...@arndb.de, 
 devicetree devicet...@vger.kernel.org
 Date: 02/12/2014 11:04 AM
 Subject: Re: Linux-3.14-rc2: Order of serial node compatibles in DTS 
files.
 
 On 02/12/2014 12:41 AM, Scott Wood wrote:
  On Tue, 2014-02-11 at 23:51 +0100, Sebastian Hesselbarth wrote:
  On 02/11/2014 11:33 PM, Kumar Gala wrote:
  Hmm,
 
  Wondering if this caused the issue:
 
  commit 105353145eafb3ea919f5cdeb652a9d8f270228e
  Author: Sebastian Hesselbarth sebastian.hesselba...@gmail.com
  Date:   Tue Dec 3 14:52:00 2013 +0100
 
OF: base: match each node compatible against all given matches 
first
 
  [adding Arnd on Cc]
 
  Could be. I checked tty/serial/of_serial.c and it does not provide a
  compatible for fsl,ns16550. Does reverting the patch fix the issue
  observed?
 
  I don't think the missing compatible is causing it, but of_serial
  provides a DT match for .type = serial just to fail later on
  with the error seen above.
 
  The commit in question reorders of_match_device in a way that match
  table order is not relevant anymore. This can cause it to match
  .type = serial first here.
 
  Rather than touching the commit, I suggest to remove the problematic
  .type = serial from the match table. It is of no use anyway.
 
  Regardless of whether .type = serial gets removed, it seems wrong 
for
  of_match_node() to accept a .type-only match (or .name, or anything 
else
  that doesn't involve .compatible) before it accepts a compatible match
  other than the first in the compatible property.
 
 Right, I thought about it and came to the same conclusion. I sent a
 patch a second ago to prefer .compatible != NULL matches over those
 with .compatible == NULL.
 
 Would be great if Stephen can re-test that. If it solves the issue, I
 can send a patch tomorrow.
Done.

But, the Interrupt Controller (MPIC)
goes AWOL and it is down hill from there.

The MPIC is specified in the DTS as:

mpic: pic@4 {
interrupt-controller;
#address-cells = 0;
#interrupt-cells = 2;
reg = 0x4 0x4;
compatible = chrp,open-pic;
device_type = open-pic;
big-endian;
};

The board support file has the standard mechanism for allocating
the PIC:

struct mpic *mpic;

mpic = mpic_alloc(NULL, 0, 0, 0, 256,  OpenPIC  );
BUG_ON(mpic == NULL);

mpic_init(mpic);

I checked for damage in applying the patch and it has applied
correctly.

Stephen Chivers,
CSC Australia Pty. Ltd.

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files.

2014-02-11 Thread Kevin Hao
On Wed, Feb 12, 2014 at 10:21:58AM +1000, Stephen N Chivers wrote:
 But, the Interrupt Controller (MPIC)
 goes AWOL and it is down hill from there.
 
 The MPIC is specified in the DTS as:
 
 mpic: pic@4 {
 interrupt-controller;
 #address-cells = 0;
 #interrupt-cells = 2;
 reg = 0x4 0x4;
 compatible = chrp,open-pic;
 device_type = open-pic;
 big-endian;
 };
 
 The board support file has the standard mechanism for allocating
 the PIC:
 
 struct mpic *mpic;
 
 mpic = mpic_alloc(NULL, 0, 0, 0, 256,  OpenPIC  );
 BUG_ON(mpic == NULL);
 
 mpic_init(mpic);
 
 I checked for damage in applying the patch and it has applied
 correctly.

How about the following fix?

diff --git a/drivers/of/base.c b/drivers/of/base.c
index ff85450d5683..ca91984d3c4b 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -730,32 +730,40 @@ out:
 }
 EXPORT_SYMBOL(of_find_node_with_property);
 
+static int of_match_type_name(const struct device_node *node,
+   const struct of_device_id *m)
+{
+   int match = 1;
+
+   if (m-name[0])
+   match = node-name  !strcmp(m-name, node-name);
+
+   if (m-type[0])
+   match = node-type  !strcmp(m-type, node-type);
+
+   return match;
+}
+
 static
 const struct of_device_id *__of_match_node(const struct of_device_id *matches,
   const struct device_node *node)
 {
const char *cp;
int cplen, l;
+   const struct of_device_id *m;
+   int match;
 
if (!matches)
return NULL;
 
cp = __of_get_property(node, compatible, cplen);
do {
-   const struct of_device_id *m = matches;
+   m = matches;
 
/* Check against matches with current compatible string */
-   while (m-name[0] || m-type[0] || m-compatible[0]) {
-   int match = 1;
-   if (m-name[0])
-   match = node-name
-!strcmp(m-name, node-name);
-   if (m-type[0])
-   match = node-type
-!strcmp(m-type, node-type);
-   if (m-compatible[0])
-   match = cp
-!of_compat_cmp(m-compatible, cp,
+   while (m-compatible[0]) {
+   match = of_match_type_name(node, m);
+   match = cp  !of_compat_cmp(m-compatible, cp,
strlen(m-compatible));
if (match)
return m;
@@ -770,6 +778,15 @@ const struct of_device_id *__of_match_node(const struct 
of_device_id *matches,
}
} while (cp  (cplen  0));
 
+   /* Check against matches without compatible string */
+   m = matches;
+   while (!m-compatible[0]  (m-name[0] || m-type[0])) {
+   match = of_match_type_name(node, m);
+   if (match)
+   return m;
+   m++;
+   }
+
return NULL;
 }


Thanks,
Kevin
 
 Stephen Chivers,
 CSC Australia Pty. Ltd.
 
 ___
 Linuxppc-dev mailing list
 Linuxppc-dev@lists.ozlabs.org
 https://lists.ozlabs.org/listinfo/linuxppc-dev


pgp8VuWp0SQuQ.pgp
Description: PGP signature
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev