public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Paul Kocialkowski <paulk@sys-base.io>
To: Andre Przywara <andre.przywara@arm.com>
Cc: Mikhail Kalashnikov <iuncuim@gmail.com>,
	Philippe Simons <simons.philippe@gmail.com>,
	Jagan Teki <jagan@amarulasolutions.com>,
	Tom Rini <trini@konsulko.com>,
	Jernej Skrabec <jernej.skrabec@gmail.com>,
	"Kory Maincent (TI.com)" <kory.maincent@bootlin.com>,
	Cody Eksal <masterr3c0rd@epochal.quest>,
	Samuel Holland <samuel@sholland.org>,
	u-boot@lists.denx.de
Subject: Re: [PATCH v2] sunxi: H616: dram: fix LPDDR3 TRP6 parsing
Date: Fri, 10 Apr 2026 17:54:42 +0200	[thread overview]
Message-ID: <adkdQlPDTruj3OcI@shepard> (raw)
In-Reply-To: <20260409233304.2eeaa3fc@ryzen.lan>

[-- Attachment #1: Type: text/plain, Size: 9768 bytes --]

Hi Andre,

On Thu 09 Apr 26, 23:34, Andre Przywara wrote:
> On Thu, 9 Apr 2026 17:10:19 +0200
> Paul Kocialkowski <contact@paulk.fr> wrote:
> 
> Hi Paul, Mikhail,
> 
> thanks for the reply!
> 
> > Hi,
> > 
> > On Thu 09 Apr 26, 13:48, Mikhail Kalashnikov wrote:
> > > On 4/8/26 00:47, Philippe Simons wrote:  
> > > > From: Jernej Skrabec <jernej.skrabec@gmail.com>
> > > > 
> > > > Allwinner's BSP DRAM code uses parameter TPR6, presumably containing
> > > > some "Vref" parameter, to encode the values for *all* four supported DRAM
> > > > types. The code selects one byte based on the DRAM type used at runtime.
> > > > To allow copying DRAM parameters from vendor firmware, we used this value
> > > > and its encoding, but wrongly: the proper order of bytes is DDR3, DDR4,
> > > > LPDDR3, LPDDR4, from LSB to MSB, cf. the A523 and A133 DRAM code.
> > > > 
> > > > Correct the masking for LPDDR3 to fix DRAM operation on some boards
> > > > using this DRAM type.
> > > > 
> > > > With LPDDR3 TRP6 parsing fixed, adapt default DRAM_SUNXI_TPR6 value.
> > > > Also change LPDDR4 default value to 0x38 used by A523 boards.
> > > > 
> > > > Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
> > > > [adjusted commit message, update default value]
> > > > Signed-off-by: Philippe Simons <simons.philippe@gmail.com>
> > > > ---
> > > >   arch/arm/mach-sunxi/Kconfig            | 2 +-
> > > >   arch/arm/mach-sunxi/dram_sun50i_h616.c | 2 +-
> > > >   2 files changed, 2 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
> > > > index e979ee4a2cc..a1ddc6a1fc8 100644
> > > > --- a/arch/arm/mach-sunxi/Kconfig
> > > > +++ b/arch/arm/mach-sunxi/Kconfig
> > > > @@ -144,7 +144,7 @@ config DRAM_SUNXI_TPR3
> > > >   config DRAM_SUNXI_TPR6
> > > >   	hex "DRAM TPR6 parameter"
> > > > -	default 0x3300c080
> > > > +	default 0x38c00080  
> > > I don't think this will be a good solution. The changes in this series
> > > were originally made to improve compatibility with the vendor driver,
> > > but now you are introducing an additional inconsistency by closing the
> > > previous one. The default values are not just arbitrary values — they
> > > are part of the vendor code that was obtained through binary analysis.
> > > https://lore.kernel.org/all/20231018172109.085cce24@donnerap.manchester.arm.com/
> >
> > I tend to agree with you, it feels like the default value was taken from the
> > reference code while the field parsing was just an issue that was introduced
> > with the h616 code. So it should not affect the defaut value, which was likely
> > mistakenly parsed before.
> 
> Yes, that Tanix TX1 uses a wrong value because of this, but that's
> about the only effect, I'd say.
> 
> It seems like at this point the "default" value is just a convenience
> value we introduced to avoid naming the same repeated TPR6 value in
> every defconfig, as per my email. But it's a pure mainline U-Boot
> technicality at this point, and we could easily just provide an
> explicit value in each defconfig. I came up with this table, for the
> currently mainline supported boards:
> 
> board name		SoC	TPR6 value	type	Vref value
> ------------------------------------------------------------------
> liontron-h-a133l	A133	0x48000000	LPDDR4  48xxxxxx
> anbernic_rg35xx_h700	H616	0x40808080      LPDDR4  40xxxxxx
> orangepi_zero2		H616	0x3300c080 d	DDR3    xxxxxx80
> orangepi_zero2w		H616	0x48808080	LPDDR4  48xxxxxx
> orangepi_zero3		H616	0x44000000	LPDDR4  44xxxxxx
> tanix_tx1		H616	0x2fb08080	LPDDR3  xxb0xxxx
> transpeed-8k618-t	H616	0x3300c080 d	DDR3    xxxxxx80
> x96_mate		H616	0x3300c080 d	DDR3    xxxxxx80
> x96q			H616	0x3300c080 d	DDR3    xxxxxx80
> yuzukihd-chameleon	H616	0x33808080	DDR3    xxxxxx80
> avaota-a1		A523	0x38000000	LPDDR4  38xxxxxx
> orangepi_4a		A523	0x38000000	LPDDR4  38xxxxxx
> radxa-cubie-a5e		A523	0x38000000	LPDDR4  38xxxxxx
> x96q_pro_plus		A523	0x3380807e	DDR3    xxxxxx7e

A few more entries for board I could get running (not submitted yet):

board name		SoC	TPR6 value	type	Vref value
------------------------------------------------------------------
baijie-helperboard-a133	A133	0x48000000	LPDDR4	48xxxxxx
logicom-la-tab-129	A133	0x2fb88080	LPDDR3	xxb8xxxx
kickpi-k5c		A133	0x33808080	DDR3	xxxxxx80
dshanpi-rosx		R818	0x48000000	LPDDR4	48xxxxxx

> So the default value is just used for the old H616 DDR3 boards, where
> only the LSB matters.
> 
> So what about dropping the default completely, since now it spans three
> SoCs already, and finding some reasonable default for all of them will
> become more complicated?

Yes honestly this is the only DRAM TPR value that has a non-zero default in
Kconfig and it feels a bit weird. I'm in favor of explicitly defining all the
board-specific parameters in the configs and using zero as Kconfig default.

> And maybe you can confirm: this should not affect compatibility with
> vendor parameters at all, I think they always contain an explicit TPR6
> value, and "no TPR6 value provided" is not a thing?

Yes I've always seen an explicit value defined, and since it's part of the
dram_para array, there has to be something. However the A133 code has fallback
values when it gets a zero from dram_para:
https://source.denx.de/u-boot/custodians/u-boot-sunxi/-/blob/master/arch/arm/mach-sunxi/dram_sun50i_a133.c?ref_type=heads#L598

This doesn't seem to be the case in the H616 and A523 code. The default is 0x80
for DDR3/DDR4/LPDDR3 and 0x33 for LPDDR4. I'm not sure this is really a thing
that boards might actually rely on though. I would rather be in favor of
removing it too to avoid confusion.

> > > There are several options here:
> > > 1. If our goal is to improve compatibility, then we should not change
> > > the default values for LPDDR4, and only keep the changes for LPDDR3.
> 
> Fair, I don't really care about the MSB, the new value I suggested
> seemed just like the most common value (see the table above). But it's
> pointless, since those boards provide an explicit value, and don't use
> the default.
>
> > > 2. Add the changes from option 2, and additionally introduce the default
> > > values for the A523 platform that I made during the initial binary
> > > analysis but for some reason did not get merged into mainline.
> > > (https://github.com/iuncuim/u-boot/blob/b17c5c8911a4fce328b01e6332632a9ccd88ebc6/arch/arm/mach-sunxi/Kconfig#L102)
> 
> Sorry, but this value doesn't seem right: The LPDDR4 boards use 0x38,
> not 0x33, and the DDR3 board uses 0x7e, not 0x80. I don't know about
> other boards, but this value don't seem to help - and it's unneeded
> anyway, as the A523 board already provide an explicit TPR6 - and new
> boards could do as well.

I think we should just drop the default value instead of trying to make sense
of what that default should be for different platforms.

> > It would be good to have different defaults for different platforms yes.
> > Note that the a133 code has some fallback with defaults when the extracted
> > field in tpr6 is zero. Maybe they should be used as default value for a133.
> > We probably still need to keep these fallbacks in the code in case some
> > board-specific tpr6 value does have zeroes and relies on this behavior.
> > 
> > > 3. If we accept the incompatibility between the vendor driver and
> > > the mainline driver, then this patch series is unnecessary because
> > > they introduce additional inconsistency with the vendor driver.  
> > 
> > We definitely want to be able to take the dram parameter values straight from
> > the BSP and put them directly into our Kconfig. Changing the order of fields
> > would make porting new boards very painful so it should be avoided.
> 
> Yes, I agree, we should take the DRAM parameters values verbatim. But
> as explained above, I think the Kconfig default is a different matter.
> For simplicity, I'd say we drop it and add TPR6 values into the
> affected defconfigs. Providing separate defaults for different SoC just
> makes things more complicated - for no reason.

Agreed.

All the best,

Paul

> > 
> > > I think option two is the most correct, but option one is also suitable,
> > > since the DRAM driver for the A523 only supports DDR3 and LPDDR4,
> > > and the default values in this case are the same as for the H616
> > > (A523 is 0x33808080, H616 is 0x33c00080).  
> > 
> > I suggest we keep the current default (without moving the lpddr3 bits) for h616
> > and add new defaults in Kconfig for a523 and a133.
> > 
> > > >   	help
> > > >   	  TPR6 value from vendor DRAM settings.
> > > > diff --git a/arch/arm/mach-sunxi/dram_sun50i_h616.c b/arch/arm/mach-sunxi/dram_sun50i_h616.c
> > > > index 3345c9b8e82..42a0550e015 100644
> > > > --- a/arch/arm/mach-sunxi/dram_sun50i_h616.c
> > > > +++ b/arch/arm/mach-sunxi/dram_sun50i_h616.c
> > > > @@ -975,7 +975,7 @@ static bool mctl_phy_init(const struct dram_para *para,
> > > >   		val = para->tpr6 & 0xff;
> > > >   		break;
> > > >   	case SUNXI_DRAM_TYPE_LPDDR3:
> > > > -		val = para->tpr6 >> 8 & 0xff;
> > > > +		val = para->tpr6 >> 16 & 0xff;  
> > 
> > This change is definitely necessary though.
> 
> Yes, absolutely.
> 
> 
> Cheers,
> Andre
> 
> > 
> > > >   		break;
> > > >   	case SUNXI_DRAM_TYPE_LPDDR4:
> > > >   		val = para->tpr6 >> 24 & 0xff;  
> > 
> > All the best,
> > 
> > Paul
> > 
> 

-- 
Paul Kocialkowski,

Free software developer - https://www.paulk.fr/
Independent contractor - sys-base - https://www.sys-base.io/

Contributor to fully free software support for selected hardware.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

      reply	other threads:[~2026-04-10 15:54 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-07 16:47 [PATCH v2] sunxi: H616: dram: fix LPDDR3 TRP6 parsing Philippe Simons
2026-04-09  5:48 ` Mikhail Kalashnikov
2026-04-09 15:10   ` Paul Kocialkowski
2026-04-09 21:34     ` Andre Przywara
2026-04-10 15:54       ` Paul Kocialkowski [this message]

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=adkdQlPDTruj3OcI@shepard \
    --to=paulk@sys-base.io \
    --cc=andre.przywara@arm.com \
    --cc=iuncuim@gmail.com \
    --cc=jagan@amarulasolutions.com \
    --cc=jernej.skrabec@gmail.com \
    --cc=kory.maincent@bootlin.com \
    --cc=masterr3c0rd@epochal.quest \
    --cc=samuel@sholland.org \
    --cc=simons.philippe@gmail.com \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /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