[PATCH 1/2] ARM: stm32mp: ddrctl: add STM32MP131 RAM size querying support

Sascha Hauer sha at pengutronix.de
Wed Feb 23 03:29:20 PST 2022


On Mon, Feb 21, 2022 at 11:36:24AM +0100, Ahmad Fatoum wrote:
> Full buswidth for STM32MP131 means 2 byte wide, not 4 as the memory bus
> is restricted to 16-bit. Teach barebox the difference.
> 
> Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
> ---
>  arch/arm/mach-stm32mp/ddrctrl.c               | 26 ++++++++++++++-----
>  arch/arm/mach-stm32mp/include/mach/revision.h |  8 ++++++
>  2 files changed, 27 insertions(+), 7 deletions(-)

Applied, thanks

Sascha

> 
> diff --git a/arch/arm/mach-stm32mp/ddrctrl.c b/arch/arm/mach-stm32mp/ddrctrl.c
> index 93996d0afc79..7f0944d7e77c 100644
> --- a/arch/arm/mach-stm32mp/ddrctrl.c
> +++ b/arch/arm/mach-stm32mp/ddrctrl.c
> @@ -9,6 +9,7 @@
>  #include <mach/ddr_regs.h>
>  #include <mach/entry.h>
>  #include <mach/stm32.h>
> +#include <mach/revision.h>
>  #include <asm/barebox-arm.h>
>  #include <asm/memory.h>
>  #include <pbl.h>
> @@ -62,7 +63,8 @@ enum ddrctrl_buswidth {
>  };
>  
>  static unsigned long ddrctrl_addrmap_ramsize(struct stm32mp1_ddrctl __iomem *d,
> -					     enum ddrctrl_buswidth buswidth)
> +					     enum ddrctrl_buswidth buswidth,
> +					     unsigned nb_bytes)
>  {
>  	unsigned banks = 3, cols = 12, rows = 16;
>  	u32 reg;
> @@ -99,21 +101,26 @@ static unsigned long ddrctrl_addrmap_ramsize(struct stm32mp1_ddrctl __iomem *d,
>  	if (LINE_UNUSED(reg, ADDRMAP6_ROW_B13)) rows--;
>  	if (LINE_UNUSED(reg, ADDRMAP6_ROW_B12)) rows--;
>  
> -	return memory_sdram_size(cols, rows, BIT(banks), 4 / BIT(buswidth));
> +	return memory_sdram_size(cols, rows, BIT(banks), nb_bytes / BIT(buswidth));
>  }
>  
> -static inline unsigned ddrctrl_ramsize(void __iomem *base)
> +static inline unsigned ddrctrl_ramsize(void __iomem *base, unsigned nb_bytes)
>  {
>  	struct stm32mp1_ddrctl __iomem *ddrctl = base;
>  	unsigned buswidth = readl(&ddrctl->mstr) & DDRCTRL_MSTR_DATA_BUS_WIDTH_MASK;
>  	buswidth >>= DDRCTRL_MSTR_DATA_BUS_WIDTH_SHIFT;
>  
> -	return ddrctrl_addrmap_ramsize(ddrctl, buswidth);
> +	return ddrctrl_addrmap_ramsize(ddrctl, buswidth, nb_bytes);
>  }
>  
>  static inline unsigned stm32mp1_ddrctrl_ramsize(void)
>  {
> -	return ddrctrl_ramsize(IOMEM(STM32_DDRCTL_BASE));
> +	u32 nb_bytes = 4;
> +
> +	if (cpu_stm32_is_stm32mp13())
> +		nb_bytes /= 2;
> +
> +	return ddrctrl_ramsize(IOMEM(STM32_DDRCTL_BASE), nb_bytes);
>  }
>  
>  void __noreturn stm32mp1_barebox_entry(void *boarddata)
> @@ -126,17 +133,22 @@ static int stm32mp1_ddr_probe(struct device_d *dev)
>  {
>  	struct resource *iores;
>  	void __iomem *base;
> +	unsigned long nb_bytes;
>  
>  	iores = dev_request_mem_resource(dev, 0);
>  	if (IS_ERR(iores))
>  		return PTR_ERR(iores);
>  	base = IOMEM(iores->start);
>  
> -	return arm_add_mem_device("ram0", STM32_DDR_BASE, ddrctrl_ramsize(base));
> +	nb_bytes = (unsigned long)device_get_match_data(dev);
> +
> +	return arm_add_mem_device("ram0", STM32_DDR_BASE,
> +				  ddrctrl_ramsize(base, nb_bytes));
>  }
>  
>  static __maybe_unused struct of_device_id stm32mp1_ddr_dt_ids[] = {
> -	{ .compatible = "st,stm32mp1-ddr" },
> +	{ .compatible = "st,stm32mp1-ddr", .data = (void *)4 },
> +	{ .compatible = "st,stm32mp13-ddr", .data = (void *)2 },
>  	{ /* sentinel */ }
>  };
>  
> diff --git a/arch/arm/mach-stm32mp/include/mach/revision.h b/arch/arm/mach-stm32mp/include/mach/revision.h
> index 2ef8ef30c3ae..c141b925a156 100644
> --- a/arch/arm/mach-stm32mp/include/mach/revision.h
> +++ b/arch/arm/mach-stm32mp/include/mach/revision.h
> @@ -32,6 +32,14 @@
>  #define CPU_STM32MP151Fxx	0x050000AE
>  #define CPU_STM32MP151Dxx	0x050000AF
>  
> +#define cpu_stm32_is(mask, val) ({ \
> +	u32 type; \
> +	__stm32mp_get_cpu_type(&type) == 0 ? (type & mask) == val : 0; \
> +})
> +
> +#define cpu_stm32_is_stm32mp15() cpu_stm32_is(0xFFFF0000, 0x05000000)
> +#define cpu_stm32_is_stm32mp13() cpu_stm32_is(0xFFFF0000, 0x05010000)
> +
>  /* silicon revisions */
>  #define CPU_REV_A	0x1000
>  #define CPU_REV_B	0x2000
> -- 
> 2.30.2
> 
> 
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the barebox mailing list