[PATCH v2] arm: mvebu: update RTC values for PCIe memory wrappers
Stefan Roese
sr at denx.de
Fri Feb 28 10:39:06 CET 2020
On 26.02.20 07:53, Chris Packham wrote:
> From: Chris Packham <chris.packham at alliedtelesis.co.nz>
>
> Update the RTC (Read Timing Control) values for PCIe memory wrappers
> following an ERRATA (ERRATA# TDB). This means the PCIe accesses will
> used slower memory Read Timing, to allow more efficient energy
> consumption, in order to lower the minimum VDD of the memory. Will lead
> to more robust memory when voltage drop occurs (VDDSEG)
>
> The code is based on changes from Marvell's U-Boot, specifically:
>
> https://github.com/MarvellEmbeddedProcessors/u-boot-marvell/commit/20cd2704072512de176e048970f2883db901674b
> https://github.com/MarvellEmbeddedProcessors/u-boot-marvell/commit/eb608a7c8dd0d42b87601a61b9c0cc5615ab94b2
> https://github.com/MarvellEmbeddedProcessors/u-boot-marvell/commit/c4af19ae2bf08cf6e450e741ce4f04d402a5cb6b
>
> Signed-off-by: Chris Packham <chris.packham at alliedtelesis.co.nz>
> Signed-off-by: Chris Packham <judge.packham at gmail.com>
Reviewed-by: Stefan Roese <sr at denx.de>
Thanks,
Stefan
> ---
> I've signed-off using both my email addresses. I normally do u-boot
> stuff via gmail for convenience but this is definitely a work thing.
>
> Changes in v2:
> - drop duplicated link in commit message
>
> arch/arm/mach-mvebu/include/mach/cpu.h | 2 ++
> arch/arm/mach-mvebu/serdes/a38x/sys_env_lib.c | 17 +++++++++++++++++
> arch/arm/mach-mvebu/serdes/a38x/sys_env_lib.h | 13 +++++++++++++
> arch/arm/mach-mvebu/spl.c | 3 +++
> 4 files changed, 35 insertions(+)
>
> diff --git a/arch/arm/mach-mvebu/include/mach/cpu.h b/arch/arm/mach-mvebu/include/mach/cpu.h
> index 2e2d72aac892..fa7c81754b8f 100644
> --- a/arch/arm/mach-mvebu/include/mach/cpu.h
> +++ b/arch/arm/mach-mvebu/include/mach/cpu.h
> @@ -166,8 +166,10 @@ int ddr3_init(void);
> /* Auto Voltage Scaling */
> #if defined(CONFIG_ARMADA_38X) || defined(CONFIG_ARMADA_39X)
> void mv_avs_init(void);
> +void mv_rtc_config(void);
> #else
> static inline void mv_avs_init(void) {}
> +static inline void mv_rtc_config(void) {}
> #endif
>
> /*
> diff --git a/arch/arm/mach-mvebu/serdes/a38x/sys_env_lib.c b/arch/arm/mach-mvebu/serdes/a38x/sys_env_lib.c
> index e9dd096ad0f5..3c4c7e01a1cd 100644
> --- a/arch/arm/mach-mvebu/serdes/a38x/sys_env_lib.c
> +++ b/arch/arm/mach-mvebu/serdes/a38x/sys_env_lib.c
> @@ -257,6 +257,23 @@ u8 sys_env_device_rev_get(void)
> return (value & (REVISON_ID_MASK)) >> REVISON_ID_OFFS;
> }
>
> +void mv_rtc_config(void)
> +{
> + u32 i, val;
> +
> + if (!(IS_ENABLED(CONFIG_ARMADA_38X) || IS_ENABLED(CONFIG_ARMADA_39X)))
> + return;
> +
> + /* Activate pipe0 for read/write transaction, and set XBAR client number #1 */
> + val = 0x1 << DFX_PIPE_SELECT_PIPE0_ACTIVE_OFFS |
> + 0x1 << DFX_PIPE_SELECT_XBAR_CLIENT_SEL_OFFS;
> + writel(val, MVEBU_DFX_BASE);
> +
> + /* Set new RTC value for all memory wrappers */
> + for (i = 0; i < RTC_MEMORY_WRAPPER_COUNT; i++)
> + reg_write(RTC_MEMORY_WRAPPER_REG(i), RTC_MEMORY_WRAPPER_CTRL_VAL);
> +}
> +
> void mv_avs_init(void)
> {
> u32 sar_freq;
> diff --git a/arch/arm/mach-mvebu/serdes/a38x/sys_env_lib.h b/arch/arm/mach-mvebu/serdes/a38x/sys_env_lib.h
> index 1774a5b780ca..17cd811331d2 100644
> --- a/arch/arm/mach-mvebu/serdes/a38x/sys_env_lib.h
> +++ b/arch/arm/mach-mvebu/serdes/a38x/sys_env_lib.h
> @@ -150,6 +150,19 @@
> #define MPP_UART1_SET_MASK (~(0xff000))
> #define MPP_UART1_SET_DATA (0x66000)
>
> +#define DFX_PIPE_SELECT_PIPE0_ACTIVE_OFFS 0
> +/* DFX_PIPE_SELECT_XBAR_CLIENT_SEL_OFFS: Since address completion in 14bit
> + * address mode, and given that [14:8] => [19:13], the 2 lower bits [9:8] =>
> + * [14:13] are dismissed. hence field offset is also shifted to 10
> + */
> +#define DFX_PIPE_SELECT_XBAR_CLIENT_SEL_OFFS 10
> +
> +#define RTC_MEMORY_CTRL_REG_BASE 0xE6000
> +#define RTC_MEMORY_WRAPPER_COUNT 8
> +#define RTC_MEMORY_WRAPPER_REG(i) (RTC_MEMORY_CTRL_REG_BASE + ((i) * 0x40))
> +#define RTC_MEMORY_CTRL_PDLVMC_FIELD_OFFS 6
> +#define RTC_MEMORY_WRAPPER_CTRL_VAL (0x1 << RTC_MEMORY_CTRL_PDLVMC_FIELD_OFFS)
> +
> #define AVS_DEBUG_CNTR_REG 0xe4124
> #define AVS_DEBUG_CNTR_DEFAULT_VALUE 0x08008073
>
> diff --git a/arch/arm/mach-mvebu/spl.c b/arch/arm/mach-mvebu/spl.c
> index a99bf166fd85..70fef3b573d9 100644
> --- a/arch/arm/mach-mvebu/spl.c
> +++ b/arch/arm/mach-mvebu/spl.c
> @@ -130,6 +130,9 @@ void board_init_f(ulong dummy)
> /* Initialize Auto Voltage Scaling */
> mv_avs_init();
>
> + /* Update read timing control for PCIe */
> + mv_rtc_config();
> +
> /*
> * Return to the BootROM to continue the Marvell xmodem
> * UART boot protocol. As initiated by the kwboot tool.
>
Viele Grüße,
Stefan
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de
More information about the U-Boot
mailing list