Re: [PATCH] arm64: dts: renesas: r8a779g0: Fix graph_child_address warnings from capture pipeline

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Dec 09, 2024 at 04:35:36PM +0100, Niklas Söderlund wrote:
> Hi Rob,
> 
> Sorry to bother you but I wonder if you could help me understand why the 
> dtc checker warns for the issues I tried to work around in this patch,
> and if possible how I can improve my solution to get rid of the 
> warnings.
> 
> This patch addresses the same problem for a few different devices. I 
> will focus on the last one (/soc/isp@fed00000/ports/port@0) for my 
> question, but all warnings here have the same issue.
> 
> I have a port node the represents a sink for a video input. This sink 
> can either be connected to source A or source B, but not both at the 
> same time. So each possible source is represented by an endpoint in the 
> port node. Each endpoint have specific register address on the port bus 
> that is described in the bindings as they map to different physical pins 
> on the hardware.
> 
> The issue I have is that not all hardware configurations have both 
> source A and B populated. All combinations of A, B and C are possible 
> depending on the platform.
> 
> A)
>     ports {
>         ...
>         port@0 {
>             ...
>             sourceA: endpoint@0 {
>                 reg = <0>
>             };
>             sourceB: endpoint@1 {
>                 reg = <1>
>             };
>         };
>     };
> 
> B)
>     ports {
>         ...
>         port@0 {
>             ...
>             sourceA: endpoint@0 {
>                 reg = <0>
>             };
>         };
>     };
> 
> C)
>     ports {
>         ...
>         port@0 {
>             ...
>             sourceB: endpoint@1 {
>                 reg = <1>
>             };
>         };
>     };
> 
> For option A and C the checker is happy, but for option B the warnings 
> this patch tries to address are triggered. While reading the 
> dtc/checks.c I find check_graph_child_address() is the one that is 
> triggering the warning. And this function explicitly checks for port 
> buses with a single endpoint with a register value of 0.
> 
> This check was added way back in 2018 in commit df536831d02c ("checks: 
> add graph binding checks"). But I can't find any information on the 
> specifics. Is this design a bad idea for port buses for some reason I 
> don't understand? AFIU this design is possible on other type of buses? 
> And do you have any guidance on how I can dig myself out of this hole?

Don't.

The check is only with W=1. It is for cases where there is never more 
than 1 endpoint. dtc can't distinguish when that is the case, so there's 
going to be cases to ignore. Perhaps we could demote it W=2, but I'd 
prefer not to. Making W=1 warning free may be a platform goal, but 
that's not an overall go. If we fix something everywhere, then the check 
is promoted.

Rob

> 
> Thanks for your help.
> 
> On 2024-10-16 15:48:19 +0200, Niklas Söderlund wrote:
> > The bindings for the R-Car video capture pipeline uses ports and
> > endpoints to describe which IP is wired up and present on the different
> > SoCs. It is needed to describe both which instance of an IP is
> > connected, and to which port. The bindings try to be as reusable as
> > possible across the different R-Car generations.
> > 
> > For example R-Car VIN IP bindings have three ports, where two of them
> > can have multiple endpoints. Not all ports or endpoints are physically
> > present on each generation and/or model of R-Car SoCs.
> > 
> > The users of the VIN bindings needs to know not only that a port have
> > one, or more, endpoints but also which particular hardware instance it
> > is. The bindings defines endpoint indexes to correspond to particular
> > hardware instances that can be routed to a port to describe this.
> > 
> > This design leads to warnings when compiling the DTB if a port that can
> > describe more then one endpoint only describes a single endpoint. And
> > that endpoint corresponds to be the hardware the bindings defined to
> > index 0. For example compiling R-Car V4H which includes r8a779g0.dtsi,
> > 
> >    ../r8a779g0.dtsi:1200.12-1210.7: Warning (graph_child_address): /soc/video@e6ef0000/ports/port@2: graph node has single child node 'endpoint@0', #address-cells/#size-cells are not necessary
> >    ../r8a779g0.dtsi:1228.12-1238.7: Warning (graph_child_address): /soc/video@e6ef1000/ports/port@2: graph node has single child node 'endpoint@0', #address-cells/#size-cells are not necessary
> >    ../r8a779g0.dtsi:1256.12-1266.7: Warning (graph_child_address): /soc/video@e6ef2000/ports/port@2: graph node has single child node 'endpoint@0', #address-cells/#size-cells are not necessary
> >    ../r8a779g0.dtsi:1284.12-1294.7: Warning (graph_child_address): /soc/video@e6ef3000/ports/port@2: graph node has single child node 'endpoint@0', #address-cells/#size-cells are not necessary
> >    ../r8a779g0.dtsi:1312.12-1322.7: Warning (graph_child_address): /soc/video@e6ef4000/ports/port@2: graph node has single child node 'endpoint@0', #address-cells/#size-cells are not necessary
> >    ../r8a779g0.dtsi:1340.12-1350.7: Warning (graph_child_address): /soc/video@e6ef5000/ports/port@2: graph node has single child node 'endpoint@0', #address-cells/#size-cells are not necessary
> >    ../r8a779g0.dtsi:1368.12-1378.7: Warning (graph_child_address): /soc/video@e6ef6000/ports/port@2: graph node has single child node 'endpoint@0', #address-cells/#size-cells are not necessary
> >    ../r8a779g0.dtsi:1396.12-1406.7: Warning (graph_child_address): /soc/video@e6ef7000/ports/port@2: graph node has single child node 'endpoint@0', #address-cells/#size-cells are not necessary
> >    ../r8a779g0.dtsi:2076.12-2086.7: Warning (graph_child_address): /soc/isp@fed00000/ports/port@0: graph node has single child node 'endpoint@0', #address-cells/#size-cells are
> > 
> > To avoid these warnings define all possible endpoints for each port in
> > the video capture pipeline, but only set the remote-endpoint property if
> > there is hardware present. This takes care of the warnings, but it also
> > adds empty endpoints that are not connected to anything on that
> > particular SoC.
> > 
> > Suggested-by: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>
> > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx>
> > ---
> > Hi Geert,
> > 
> > This only addresses the warnings on V4H. More boards do trigger these
> > warnings but before I address them I thought it was a good idea we
> > agreed if this is a good way forward.
> > 
> > In this design I have defined every possible endpoint for the ports
> > involved. This might be a bit excessive as we define endpoints that are
> > not physically possible for V4H. For example V4H only have 2 CSISP
> > instances, while the bindings allow for up-to 4 CSISP as that is
> > possible on V3U which the CSISP bindings are shared with.
> > 
> > I'm not sure where to best draw the line. Only adding empty endpoints if
> > they are possible on the SoC sounds good, but what if we get a board
> > with only a single CSISP for example? That would be a single endpoint
> > with an index of 0, this triggering the warning.
> > 
> > Maybe do the minimum and only define an extra endpoint for ports that
> > trigger the warning? And if it nots pysically possible for that SoC add
> > a comment? This feels wrong however.
> > 
> > Let me know what you think. But it would be nice to get rid of these
> > warnings one way or another.
> > 
> > Kind Regards,
> > Niklas
> > ---
> >  arch/arm64/boot/dts/renesas/r8a779g0.dtsi | 200 ++++++++++++++++++++++
> >  1 file changed, 200 insertions(+)
> > 
> > diff --git a/arch/arm64/boot/dts/renesas/r8a779g0.dtsi b/arch/arm64/boot/dts/renesas/r8a779g0.dtsi
> > index 61c6b8022ffd..e3079562fe65 100644
> > --- a/arch/arm64/boot/dts/renesas/r8a779g0.dtsi
> > +++ b/arch/arm64/boot/dts/renesas/r8a779g0.dtsi
> > @@ -1364,6 +1364,18 @@ vin00isp0: endpoint@0 {
> >  						reg = <0>;
> >  						remote-endpoint = <&isp0vin00>;
> >  					};
> > +
> > +					vin00isp1: endpoint@1 {
> > +						reg = <1>;
> > +					};
> > +
> > +					vin00isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin00isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1393,6 +1405,18 @@ vin01isp0: endpoint@0 {
> >  						reg = <0>;
> >  						remote-endpoint = <&isp0vin01>;
> >  					};
> > +
> > +					vin01isp1: endpoint@1 {
> > +						reg = <1>;
> > +					};
> > +
> > +					vin01isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin01isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1422,6 +1446,18 @@ vin02isp0: endpoint@0 {
> >  						reg = <0>;
> >  						remote-endpoint = <&isp0vin02>;
> >  					};
> > +
> > +					vin02isp1: endpoint@1 {
> > +						reg = <1>;
> > +					};
> > +
> > +					vin02isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin02isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1451,6 +1487,18 @@ vin03isp0: endpoint@0 {
> >  						reg = <0>;
> >  						remote-endpoint = <&isp0vin03>;
> >  					};
> > +
> > +					vin03isp1: endpoint@1 {
> > +						reg = <1>;
> > +					};
> > +
> > +					vin03isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin03isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1480,6 +1528,18 @@ vin04isp0: endpoint@0 {
> >  						reg = <0>;
> >  						remote-endpoint = <&isp0vin04>;
> >  					};
> > +
> > +					vin04isp1: endpoint@1 {
> > +						reg = <1>;
> > +					};
> > +
> > +					vin04isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin04isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1509,6 +1569,18 @@ vin05isp0: endpoint@0 {
> >  						reg = <0>;
> >  						remote-endpoint = <&isp0vin05>;
> >  					};
> > +
> > +					vin05isp1: endpoint@1 {
> > +						reg = <1>;
> > +					};
> > +
> > +					vin05isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin05isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1538,6 +1610,18 @@ vin06isp0: endpoint@0 {
> >  						reg = <0>;
> >  						remote-endpoint = <&isp0vin06>;
> >  					};
> > +
> > +					vin06isp1: endpoint@1 {
> > +						reg = <1>;
> > +					};
> > +
> > +					vin06isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin06isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1567,6 +1651,18 @@ vin07isp0: endpoint@0 {
> >  						reg = <0>;
> >  						remote-endpoint = <&isp0vin07>;
> >  					};
> > +
> > +					vin07isp1: endpoint@1 {
> > +						reg = <1>;
> > +					};
> > +
> > +					vin07isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin07isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1592,10 +1688,22 @@ port@2 {
> >  
> >  					reg = <2>;
> >  
> > +					vin08isp0: endpoint@0 {
> > +						reg = <0>;
> > +					};
> > +
> >  					vin08isp1: endpoint@1 {
> >  						reg = <1>;
> >  						remote-endpoint = <&isp1vin08>;
> >  					};
> > +
> > +					vin08isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin08isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1621,10 +1729,22 @@ port@2 {
> >  
> >  					reg = <2>;
> >  
> > +					vin09isp0: endpoint@0 {
> > +						reg = <0>;
> > +					};
> > +
> >  					vin09isp1: endpoint@1 {
> >  						reg = <1>;
> >  						remote-endpoint = <&isp1vin09>;
> >  					};
> > +
> > +					vin09isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin09isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1650,10 +1770,22 @@ port@2 {
> >  
> >  					reg = <2>;
> >  
> > +					vin10isp0: endpoint@0 {
> > +						reg = <0>;
> > +					};
> > +
> >  					vin10isp1: endpoint@1 {
> >  						reg = <1>;
> >  						remote-endpoint = <&isp1vin10>;
> >  					};
> > +
> > +					vin10isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin10isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1679,10 +1811,22 @@ port@2 {
> >  
> >  					reg = <2>;
> >  
> > +					vin11isp0: endpoint@0 {
> > +						reg = <0>;
> > +					};
> > +
> >  					vin11isp1: endpoint@1 {
> >  						reg = <1>;
> >  						remote-endpoint = <&isp1vin11>;
> >  					};
> > +
> > +					vin11isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin11isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1708,10 +1852,22 @@ port@2 {
> >  
> >  					reg = <2>;
> >  
> > +					vin12isp0: endpoint@0 {
> > +						reg = <0>;
> > +					};
> > +
> >  					vin12isp1: endpoint@1 {
> >  						reg = <1>;
> >  						remote-endpoint = <&isp1vin12>;
> >  					};
> > +
> > +					vin12isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin12isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1737,10 +1893,22 @@ port@2 {
> >  
> >  					reg = <2>;
> >  
> > +					vin13isp0: endpoint@0 {
> > +						reg = <0>;
> > +					};
> > +
> >  					vin13isp1: endpoint@1 {
> >  						reg = <1>;
> >  						remote-endpoint = <&isp1vin13>;
> >  					};
> > +
> > +					vin13isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin13isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1766,10 +1934,22 @@ port@2 {
> >  
> >  					reg = <2>;
> >  
> > +					vin14isp0: endpoint@0 {
> > +						reg = <0>;
> > +					};
> > +
> >  					vin14isp1: endpoint@1 {
> >  						reg = <1>;
> >  						remote-endpoint = <&isp1vin14>;
> >  					};
> > +
> > +					vin14isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin14isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -1795,10 +1975,22 @@ port@2 {
> >  
> >  					reg = <2>;
> >  
> > +					vin15isp0: endpoint@0 {
> > +						reg = <0>;
> > +					};
> > +
> >  					vin15isp1: endpoint@1 {
> >  						reg = <1>;
> >  						remote-endpoint = <&isp1vin15>;
> >  					};
> > +
> > +					vin15isp2: endpoint@2 {
> > +						reg = <2>;
> > +					};
> > +
> > +					vin15isp3: endpoint@3 {
> > +						reg = <3>;
> > +					};
> >  				};
> >  			};
> >  		};
> > @@ -2251,6 +2443,10 @@ isp0csi40: endpoint@0 {
> >  						reg = <0>;
> >  						remote-endpoint = <&csi40isp0>;
> >  					};
> > +
> > +					isp0csi41: endpoint@1 {
> > +						reg = <1>;
> > +					};
> >  				};
> >  
> >  				port@1 {
> > @@ -2331,6 +2527,10 @@ port@0 {
> >  
> >  					reg = <0>;
> >  
> > +					isp1csi40: endpoint@0 {
> > +						reg = <0>;
> > +					};
> > +
> >  					isp1csi41: endpoint@1 {
> >  						reg = <1>;
> >  						remote-endpoint = <&csi41isp1>;
> > -- 
> > 2.46.2
> > 
> 
> -- 
> Kind Regards,
> Niklas Söderlund




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux