diff mbox series

[U-Boot] dm: pinctrl: Prevent (re-)configuring pins when already done before relocation

Message ID 20181218113050.6115-1-lukma@denx.de
State Accepted
Commit a7f4b4b344396590845e6552c82829ef68ef9f89
Delegated to: Tom Rini
Headers show
Series [U-Boot] dm: pinctrl: Prevent (re-)configuring pins when already done before relocation | expand

Commit Message

Lukasz Majewski Dec. 18, 2018, 11:30 a.m. UTC
This commit prevents from re-configuring pins if those were configured
before relocation.

Some pins - like UART or DDR must be setup before relocation
(as they have 'u-boot,dm-pre-reloc' property set in DTS). Without this
change, those pins are re-configured after relocation (pre_reloc_only = 0,
so we do not "continue").
Such behavior may be a problem for DDR PAD configuration, as they might
be already leveled/tuned with original setup).

Signed-off-by: Lukasz Majewski <lukma@denx.de>

---

 drivers/pinctrl/pinctrl-uclass.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Tom Rini Dec. 27, 2018, 3:47 p.m. UTC | #1
On Tue, Dec 18, 2018 at 12:30:50PM +0100, Lukasz Majewski wrote:

> This commit prevents from re-configuring pins if those were configured
> before relocation.
> 
> Some pins - like UART or DDR must be setup before relocation
> (as they have 'u-boot,dm-pre-reloc' property set in DTS). Without this
> change, those pins are re-configured after relocation (pre_reloc_only = 0,
> so we do not "continue").
> Such behavior may be a problem for DDR PAD configuration, as they might
> be already leveled/tuned with original setup).
> 
> Signed-off-by: Lukasz Majewski <lukma@denx.de>

Applied to u-boot/master, thanks!
Alex Kiernan Jan. 8, 2019, 5:49 p.m. UTC | #2
On Thu, Dec 27, 2018 at 3:49 PM Tom Rini <trini@konsulko.com> wrote:
>
> On Tue, Dec 18, 2018 at 12:30:50PM +0100, Lukasz Majewski wrote:
>
> > This commit prevents from re-configuring pins if those were configured
> > before relocation.
> >
> > Some pins - like UART or DDR must be setup before relocation
> > (as they have 'u-boot,dm-pre-reloc' property set in DTS). Without this
> > change, those pins are re-configured after relocation (pre_reloc_only = 0,
> > so we do not "continue").
> > Such behavior may be a problem for DDR PAD configuration, as they might
> > be already leveled/tuned with original setup).
> >
> > Signed-off-by: Lukasz Majewski <lukma@denx.de>
>
> Applied to u-boot/master, thanks!
>

I've bisected out to this commit and it's slightly broken things for
me on an AM3352. It all works fine so long as I boot MLO from MMC (so
the MMC is probed, pinctrl setup), but if I boot from UART then I get
to full U-Boot, MMC hasn't been probed and the pinmuxing isn't set up
for the MMC.
Lukasz Majewski Jan. 8, 2019, 10:52 p.m. UTC | #3
Hi Alex,

> On Thu, Dec 27, 2018 at 3:49 PM Tom Rini <trini@konsulko.com> wrote:
> >
> > On Tue, Dec 18, 2018 at 12:30:50PM +0100, Lukasz Majewski wrote:
> >  
> > > This commit prevents from re-configuring pins if those were
> > > configured before relocation.
> > >
> > > Some pins - like UART or DDR must be setup before relocation
> > > (as they have 'u-boot,dm-pre-reloc' property set in DTS). Without
> > > this change, those pins are re-configured after relocation
> > > (pre_reloc_only = 0, so we do not "continue").
> > > Such behavior may be a problem for DDR PAD configuration, as they
> > > might be already leveled/tuned with original setup).
> > >
> > > Signed-off-by: Lukasz Majewski <lukma@denx.de>  
> >
> > Applied to u-boot/master, thanks!
> >  
> 
> I've bisected out to this commit and it's slightly broken things for
> me on an AM3352. It all works fine so long as I boot MLO from MMC (so
> the MMC is probed, pinctrl setup), but if I boot from UART then I get
> to full U-Boot, MMC hasn't been probed and the pinmuxing isn't set up
> for the MMC.

I suppose that the pinmux node have set "u-boot,dm-pre-reloc"
property?

The problem is not with lack of eMMC probing - it is with pinctrl nodes
having "u-boot,dm-pre-reloc" set in DTS and the eMMC is probed after
MLO/SPL.
It looks like your use case implicitly depends on pinmux being
reconfigured no matter if we are pre-relocated (MLO) or afterwards.

As stated in the commit message above - for DDR pads it is dangerous to
re-configure them.

I'm wondering as in the device_probe() @ drivers/core/device.c the
DM_FLAG_ACTIVATED is checked. This should be enough to prevent
re-checking (of the DDR pins).

Anyway, this will not fix the issue you mentioned. 

I've put Simon to CC, maybe he would have some input?


Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
Alex Kiernan Jan. 8, 2019, 11:13 p.m. UTC | #4
On Tue, Jan 8, 2019 at 10:52 PM Lukasz Majewski <lukma@denx.de> wrote:
>
> Hi Alex,
>
> > On Thu, Dec 27, 2018 at 3:49 PM Tom Rini <trini@konsulko.com> wrote:
> > >
> > > On Tue, Dec 18, 2018 at 12:30:50PM +0100, Lukasz Majewski wrote:
> > >
> > > > This commit prevents from re-configuring pins if those were
> > > > configured before relocation.
> > > >
> > > > Some pins - like UART or DDR must be setup before relocation
> > > > (as they have 'u-boot,dm-pre-reloc' property set in DTS). Without
> > > > this change, those pins are re-configured after relocation
> > > > (pre_reloc_only = 0, so we do not "continue").
> > > > Such behavior may be a problem for DDR PAD configuration, as they
> > > > might be already leveled/tuned with original setup).
> > > >
> > > > Signed-off-by: Lukasz Majewski <lukma@denx.de>
> > >
> > > Applied to u-boot/master, thanks!
> > >
> >
> > I've bisected out to this commit and it's slightly broken things for
> > me on an AM3352. It all works fine so long as I boot MLO from MMC (so
> > the MMC is probed, pinctrl setup), but if I boot from UART then I get
> > to full U-Boot, MMC hasn't been probed and the pinmuxing isn't set up
> > for the MMC.
>
> I suppose that the pinmux node have set "u-boot,dm-pre-reloc"
> property?
>

Yeah, well "u-boot,dm-spl", though now I re-read the docs I guess
that's equivalent to "u-boot,dm-pre-reloc" as I've no TPL.

> The problem is not with lack of eMMC probing - it is with pinctrl nodes
> having "u-boot,dm-pre-reloc" set in DTS and the eMMC is probed after
> MLO/SPL.
> It looks like your use case implicitly depends on pinmux being
> reconfigured no matter if we are pre-relocated (MLO) or afterwards.
>

Yes, that's a much clearer description...
Lukasz Majewski Jan. 8, 2019, 11:24 p.m. UTC | #5
Hi Alex,

> On Tue, Jan 8, 2019 at 10:52 PM Lukasz Majewski <lukma@denx.de> wrote:
> >
> > Hi Alex,
> >  
> > > On Thu, Dec 27, 2018 at 3:49 PM Tom Rini <trini@konsulko.com>
> > > wrote:  
> > > >
> > > > On Tue, Dec 18, 2018 at 12:30:50PM +0100, Lukasz Majewski wrote:
> > > >  
> > > > > This commit prevents from re-configuring pins if those were
> > > > > configured before relocation.
> > > > >
> > > > > Some pins - like UART or DDR must be setup before relocation
> > > > > (as they have 'u-boot,dm-pre-reloc' property set in DTS).
> > > > > Without this change, those pins are re-configured after
> > > > > relocation (pre_reloc_only = 0, so we do not "continue").
> > > > > Such behavior may be a problem for DDR PAD configuration, as
> > > > > they might be already leveled/tuned with original setup).
> > > > >
> > > > > Signed-off-by: Lukasz Majewski <lukma@denx.de>  
> > > >
> > > > Applied to u-boot/master, thanks!
> > > >  
> > >
> > > I've bisected out to this commit and it's slightly broken things
> > > for me on an AM3352. It all works fine so long as I boot MLO from
> > > MMC (so the MMC is probed, pinctrl setup), but if I boot from
> > > UART then I get to full U-Boot, MMC hasn't been probed and the
> > > pinmuxing isn't set up for the MMC.  
> >
> > I suppose that the pinmux node have set "u-boot,dm-pre-reloc"
> > property?
> >  
> 
> Yeah, well "u-boot,dm-spl", though now I re-read the docs I guess
> that's equivalent to "u-boot,dm-pre-reloc" as I've no TPL.

I do need to check this -> as in my case I do have
"u-boot,dm-pre-reloc" property. And yes, in my case I do not have TPL
too (just SPL).

> 
> > The problem is not with lack of eMMC probing - it is with pinctrl
> > nodes having "u-boot,dm-pre-reloc" set in DTS and the eMMC is
> > probed after MLO/SPL.
> > It looks like your use case implicitly depends on pinmux being
> > reconfigured no matter if we are pre-relocated (MLO) or afterwards.
> >  
> 
> Yes, that's a much clearer description...

Frankly, your mail opened my eyes to a use case which was handled (I
assume on purpose) with the old code - the "cross" boot with pinmux
and devices.

For example boot from UART (MLO/SPL) and then continue with eMMC (which
require pinmux).

> 




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
Alex Kiernan Jan. 12, 2019, 9:30 a.m. UTC | #6
On Tue, Jan 8, 2019 at 11:24 PM Lukasz Majewski <lukma@denx.de> wrote:
>
> Hi Alex,
>
> > On Tue, Jan 8, 2019 at 10:52 PM Lukasz Majewski <lukma@denx.de> wrote:
> > >
> > > Hi Alex,
> > >
> > > > On Thu, Dec 27, 2018 at 3:49 PM Tom Rini <trini@konsulko.com>
> > > > wrote:
> > > > >
> > > > > On Tue, Dec 18, 2018 at 12:30:50PM +0100, Lukasz Majewski wrote:
> > > > >
> > > > > > This commit prevents from re-configuring pins if those were
> > > > > > configured before relocation.
> > > > > >
> > > > > > Some pins - like UART or DDR must be setup before relocation
> > > > > > (as they have 'u-boot,dm-pre-reloc' property set in DTS).
> > > > > > Without this change, those pins are re-configured after
> > > > > > relocation (pre_reloc_only = 0, so we do not "continue").
> > > > > > Such behavior may be a problem for DDR PAD configuration, as
> > > > > > they might be already leveled/tuned with original setup).
> > > > > >
> > > > > > Signed-off-by: Lukasz Majewski <lukma@denx.de>
> > > > >
> > > > > Applied to u-boot/master, thanks!
> > > > >
> > > >
> > > > I've bisected out to this commit and it's slightly broken things
> > > > for me on an AM3352. It all works fine so long as I boot MLO from
> > > > MMC (so the MMC is probed, pinctrl setup), but if I boot from
> > > > UART then I get to full U-Boot, MMC hasn't been probed and the
> > > > pinmuxing isn't set up for the MMC.
> > >
> > > I suppose that the pinmux node have set "u-boot,dm-pre-reloc"
> > > property?
> > >
> >
> > Yeah, well "u-boot,dm-spl", though now I re-read the docs I guess
> > that's equivalent to "u-boot,dm-pre-reloc" as I've no TPL.
>
> I do need to check this -> as in my case I do have
> "u-boot,dm-pre-reloc" property. And yes, in my case I do not have TPL
> too (just SPL).
>
> >
> > > The problem is not with lack of eMMC probing - it is with pinctrl
> > > nodes having "u-boot,dm-pre-reloc" set in DTS and the eMMC is
> > > probed after MLO/SPL.
> > > It looks like your use case implicitly depends on pinmux being
> > > reconfigured no matter if we are pre-relocated (MLO) or afterwards.
> > >
> >
> > Yes, that's a much clearer description...
>
> Frankly, your mail opened my eyes to a use case which was handled (I
> assume on purpose) with the old code - the "cross" boot with pinmux
> and devices.
>
> For example boot from UART (MLO/SPL) and then continue with eMMC (which
> require pinmux).
>

So I guess this needs something like a bloblist to communicate the
initialisation state between MLO/SPL and u-boot, which I've not the
faintest idea where to start on.

Horrible as they are, is a CONFIG symbol a possibility whilst we
figure out how to solve this properly?

I guess another option would be an additional two properties that give
the two behaviours, but that feels like something we don't want long
term.


--
Alex Kiernan
Lukasz Majewski Jan. 12, 2019, 9:45 p.m. UTC | #7
Hi Alex,

> On Tue, Jan 8, 2019 at 11:24 PM Lukasz Majewski <lukma@denx.de> wrote:
> >
> > Hi Alex,
> >  
> > > On Tue, Jan 8, 2019 at 10:52 PM Lukasz Majewski <lukma@denx.de>
> > > wrote:  
> > > >
> > > > Hi Alex,
> > > >  
> > > > > On Thu, Dec 27, 2018 at 3:49 PM Tom Rini <trini@konsulko.com>
> > > > > wrote:  
> > > > > >
> > > > > > On Tue, Dec 18, 2018 at 12:30:50PM +0100, Lukasz Majewski
> > > > > > wrote: 
> > > > > > > This commit prevents from re-configuring pins if those
> > > > > > > were configured before relocation.
> > > > > > >
> > > > > > > Some pins - like UART or DDR must be setup before
> > > > > > > relocation (as they have 'u-boot,dm-pre-reloc' property
> > > > > > > set in DTS). Without this change, those pins are
> > > > > > > re-configured after relocation (pre_reloc_only = 0, so we
> > > > > > > do not "continue"). Such behavior may be a problem for
> > > > > > > DDR PAD configuration, as they might be already
> > > > > > > leveled/tuned with original setup).
> > > > > > >
> > > > > > > Signed-off-by: Lukasz Majewski <lukma@denx.de>  
> > > > > >
> > > > > > Applied to u-boot/master, thanks!
> > > > > >  
> > > > >
> > > > > I've bisected out to this commit and it's slightly broken
> > > > > things for me on an AM3352. It all works fine so long as I
> > > > > boot MLO from MMC (so the MMC is probed, pinctrl setup), but
> > > > > if I boot from UART then I get to full U-Boot, MMC hasn't
> > > > > been probed and the pinmuxing isn't set up for the MMC.  
> > > >
> > > > I suppose that the pinmux node have set "u-boot,dm-pre-reloc"
> > > > property?
> > > >  
> > >
> > > Yeah, well "u-boot,dm-spl", though now I re-read the docs I guess
> > > that's equivalent to "u-boot,dm-pre-reloc" as I've no TPL.  
> >
> > I do need to check this -> as in my case I do have
> > "u-boot,dm-pre-reloc" property. And yes, in my case I do not have
> > TPL too (just SPL).
> >  
> > >  
> > > > The problem is not with lack of eMMC probing - it is with
> > > > pinctrl nodes having "u-boot,dm-pre-reloc" set in DTS and the
> > > > eMMC is probed after MLO/SPL.
> > > > It looks like your use case implicitly depends on pinmux being
> > > > reconfigured no matter if we are pre-relocated (MLO) or
> > > > afterwards. 
> > >
> > > Yes, that's a much clearer description...  
> >
> > Frankly, your mail opened my eyes to a use case which was handled (I
> > assume on purpose) with the old code - the "cross" boot with pinmux
> > and devices.
> >
> > For example boot from UART (MLO/SPL) and then continue with eMMC
> > (which require pinmux).
> >  
> 
> So I guess this needs something like a bloblist to communicate the
> initialisation state between MLO/SPL and u-boot,

Yes. IMHO this is one way to do it. There is already a
DM_FLAG_ACTIVATED, which indicates if the device was probed. However,
it is not "dragged" from MLO / SPL to u-boot.img

However, I think that we shall introduce a new flag -
DM_FLAG_CONFIGURE_ONCE [*], which would indicate that the device need
single configuration. 

This flag could be used with DM_PINMUX driver, to avoid
re-configuration.

The idea would be to use bloblist (only when [*] is set) to pass tuples:
(driver_name, config_status) 

and in the core of DM just check if we shall re-configure the driver or
not.

> which I've not the
> faintest idea where to start on.
> 
> Horrible as they are, is a CONFIG symbol a possibility whilst we
> figure out how to solve this properly?

The bloblist can be activated with CONFIG_BLOBLIST

> 
> I guess another option would be an additional two properties that give
> the two behaviours, but that feels like something we don't want long
> term.

As we strive to use as little "u-boot,XXXXXX" extra properties to avoid
problems with Linux re-sync, I think that we shall use bloblist.

> 
> 
> --
> Alex Kiernan




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
Simon Glass Jan. 16, 2019, 9:35 p.m. UTC | #8
Hi Lukasz,

On Sat, 12 Jan 2019 at 14:46, Lukasz Majewski <lukma@denx.de> wrote:
>
> Hi Alex,
>
> > On Tue, Jan 8, 2019 at 11:24 PM Lukasz Majewski <lukma@denx.de> wrote:
> > >
> > > Hi Alex,
> > >
> > > > On Tue, Jan 8, 2019 at 10:52 PM Lukasz Majewski <lukma@denx.de>
> > > > wrote:
> > > > >
> > > > > Hi Alex,
> > > > >
> > > > > > On Thu, Dec 27, 2018 at 3:49 PM Tom Rini <trini@konsulko.com>
> > > > > > wrote:
> > > > > > >
> > > > > > > On Tue, Dec 18, 2018 at 12:30:50PM +0100, Lukasz Majewski
> > > > > > > wrote:
> > > > > > > > This commit prevents from re-configuring pins if those
> > > > > > > > were configured before relocation.
> > > > > > > >
> > > > > > > > Some pins - like UART or DDR must be setup before
> > > > > > > > relocation (as they have 'u-boot,dm-pre-reloc' property
> > > > > > > > set in DTS). Without this change, those pins are
> > > > > > > > re-configured after relocation (pre_reloc_only = 0, so we
> > > > > > > > do not "continue"). Such behavior may be a problem for
> > > > > > > > DDR PAD configuration, as they might be already
> > > > > > > > leveled/tuned with original setup).
> > > > > > > >
> > > > > > > > Signed-off-by: Lukasz Majewski <lukma@denx.de>
> > > > > > >
> > > > > > > Applied to u-boot/master, thanks!
> > > > > > >
> > > > > >
> > > > > > I've bisected out to this commit and it's slightly broken
> > > > > > things for me on an AM3352. It all works fine so long as I
> > > > > > boot MLO from MMC (so the MMC is probed, pinctrl setup), but
> > > > > > if I boot from UART then I get to full U-Boot, MMC hasn't
> > > > > > been probed and the pinmuxing isn't set up for the MMC.
> > > > >
> > > > > I suppose that the pinmux node have set "u-boot,dm-pre-reloc"
> > > > > property?
> > > > >
> > > >
> > > > Yeah, well "u-boot,dm-spl", though now I re-read the docs I guess
> > > > that's equivalent to "u-boot,dm-pre-reloc" as I've no TPL.
> > >
> > > I do need to check this -> as in my case I do have
> > > "u-boot,dm-pre-reloc" property. And yes, in my case I do not have
> > > TPL too (just SPL).
> > >
> > > >
> > > > > The problem is not with lack of eMMC probing - it is with
> > > > > pinctrl nodes having "u-boot,dm-pre-reloc" set in DTS and the
> > > > > eMMC is probed after MLO/SPL.
> > > > > It looks like your use case implicitly depends on pinmux being
> > > > > reconfigured no matter if we are pre-relocated (MLO) or
> > > > > afterwards.
> > > >
> > > > Yes, that's a much clearer description...
> > >
> > > Frankly, your mail opened my eyes to a use case which was handled (I
> > > assume on purpose) with the old code - the "cross" boot with pinmux
> > > and devices.
> > >
> > > For example boot from UART (MLO/SPL) and then continue with eMMC
> > > (which require pinmux).
> > >
> >
> > So I guess this needs something like a bloblist to communicate the
> > initialisation state between MLO/SPL and u-boot,
>
> Yes. IMHO this is one way to do it. There is already a
> DM_FLAG_ACTIVATED, which indicates if the device was probed. However,
> it is not "dragged" from MLO / SPL to u-boot.img
>
> However, I think that we shall introduce a new flag -
> DM_FLAG_CONFIGURE_ONCE [*], which would indicate that the device need
> single configuration.
>
> This flag could be used with DM_PINMUX driver, to avoid
> re-configuration.
>
> The idea would be to use bloblist (only when [*] is set) to pass tuples:
> (driver_name, config_status)

That seems reasonable, but I don't like the idea of using a name.
Could we have some sort of numeric value instead?

>
> and in the core of DM just check if we shall re-configure the driver or
> not.
>
> > which I've not the
> > faintest idea where to start on.
> >
> > Horrible as they are, is a CONFIG symbol a possibility whilst we
> > figure out how to solve this properly?
>
> The bloblist can be activated with CONFIG_BLOBLIST
>
> >
> > I guess another option would be an additional two properties that give
> > the two behaviours, but that feels like something we don't want long
> > term.
>
> As we strive to use as little "u-boot,XXXXXX" extra properties to avoid
> problems with Linux re-sync, I think that we shall use bloblist.

Regards,
Simon
diff mbox series

Patch

diff --git a/drivers/pinctrl/pinctrl-uclass.c b/drivers/pinctrl/pinctrl-uclass.c
index 6db0445067..29c910c55f 100644
--- a/drivers/pinctrl/pinctrl-uclass.c
+++ b/drivers/pinctrl/pinctrl-uclass.c
@@ -117,9 +117,9 @@  static int pinconfig_post_bind(struct udevice *dev)
 	int ret;
 
 	dev_for_each_subnode(node, dev) {
-		if (pre_reloc_only &&
-		    !ofnode_pre_reloc(node))
+		if (pre_reloc_only ^ ofnode_pre_reloc(node))
 			continue;
+
 		/*
 		 * If this node has "compatible" property, this is not
 		 * a pin configuration node, but a normal device. skip.