[PATCH 12/16] ram: stm32mp1: add support of STM32MP13x

Patrice CHOTARD patrice.chotard at foss.st.com
Fri May 20 09:09:10 CEST 2022


HI Patrick

On 5/6/22 16:06, Patrick Delaunay wrote:
> Add support for new compatible "st,stm32mp13-ddr" to manage the
> DDR sub system (Controller and PHY) in STM32MP13x SOC:
> - only one AXI port
> - support of 16 port output (MEMC_DRAM_DATA_WIDTH = 2)
> 
> The STM32MP15x SOC have 2 AXI ports and 32 bits support.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay at foss.st.com>
> ---
> 
>  .../memory-controllers/st,stm32mp1-ddr.txt    | 49 +++++++++++++++----
>  drivers/ram/stm32mp1/stm32mp1_ram.c           | 28 +++++++----
>  2 files changed, 57 insertions(+), 20 deletions(-)
> 
> diff --git a/doc/device-tree-bindings/memory-controllers/st,stm32mp1-ddr.txt b/doc/device-tree-bindings/memory-controllers/st,stm32mp1-ddr.txt
> index 926e3e83b3..e6ea8d0ef5 100644
> --- a/doc/device-tree-bindings/memory-controllers/st,stm32mp1-ddr.txt
> +++ b/doc/device-tree-bindings/memory-controllers/st,stm32mp1-ddr.txt
> @@ -3,7 +3,8 @@ ST,stm32mp1 DDR3/LPDDR2/LPDDR3 Controller (DDRCTRL and DDRPHYC)
>  --------------------
>  Required properties:
>  --------------------
> -- compatible	: Should be "st,stm32mp1-ddr"
> +- compatible	: Should be "st,stm32mp1-ddr" for STM32MP15x
> +		  Should be "st,stm32mp13-ddr" for STM32MP13x
>  - reg		: controleur (DDRCTRL) and phy (DDRPHYC) base address
>  - clocks	: controller clocks handle
>  - clock-names	: associated controller clock names
> @@ -13,6 +14,8 @@ Required properties:
>  the next attributes are DDR parameters, they are generated by DDR tools
>  included in STM32 Cube tool
>  
> +They are required only in SPL, when TFABOOT is not activated.
> +
>  info attributes:
>  ----------------
>  - st,mem-name	: name for DDR configuration, simple string for information
> @@ -24,7 +27,7 @@ controlleur attributes:
>  -----------------------
>  - st,ctl-reg	: controleur values depending of the DDR type
>  		  (DDR3/LPDDR2/LPDDR3)
> -	for STM32MP15x: 25 values are requested in this order
> +	for STM32MP15x and STM32MP13x: 25 values are requested in this order
>  		MSTR
>  		MRCTRL0
>  		MRCTRL1
> @@ -53,7 +56,7 @@ controlleur attributes:
>  
>  - st,ctl-timing	: controleur values depending of frequency and timing parameter
>  		  of DDR
> -	for STM32MP15x: 12 values are requested in this order
> +	for STM32MP15x and STM32MP13x: 12 values are requested in this order
>  		RFSHTMG
>  		DRAMTMG0
>  		DRAMTMG1
> @@ -68,7 +71,7 @@ controlleur attributes:
>  		ODTCFG
>  
>  - st,ctl-map	: controleur values depending of address mapping
> -	for STM32MP15x: 9 values are requested in this order
> +	for STM32MP15x and STM32MP13x: 9 values are requested in this order
>  		ADDRMAP1
>  		ADDRMAP2
>  		ADDRMAP3
> @@ -99,6 +102,19 @@ controlleur attributes:
>  		PCFGWQOS0_1
>  		PCFGWQOS1_1
>  
> +	for STM32MP13x: 11 values are requested in this order
> +		SCHED
> +		SCHED1
> +		PERFHPR1
> +		PERFLPR1
> +		PERFWR1
> +		PCFGR_0
> +		PCFGW_0
> +		PCFGQOS0_0
> +		PCFGQOS1_0
> +		PCFGWQOS0_0
> +		PCFGWQOS1_0
> +
>  phyc attributes:
>  ----------------
>  - st,phy-reg	: phy values depending of the DDR type (DDR3/LPDDR2/LPDDR3)
> @@ -115,8 +131,19 @@ phyc attributes:
>  		DX2GCR
>  		DX3GCR
>  
> +	for STM32MP13x: 9 values are requested in this order
> +		PGCR
> +		ACIOCR
> +		DXCCR
> +		DSGCR
> +		DCR
> +		ODTCR
> +		ZQ0CR1
> +		DX0GCR
> +		DX1GCR
> +
>  - st,phy-timing	: phy values depending of frequency and timing parameter of DDR
> -	for STM32MP15x: 10 values are requested in this order
> +	for STM32MP15x and STM32MP13x: 10 values are requested in this order
>  		PTR0
>  		PTR1
>  		PTR2
> @@ -128,16 +155,18 @@ phyc attributes:
>  		MR2
>  		MR3
>  
> +	for STM32MP13x: 6 values are requested in this order
> +		DX0DLLCR
> +		DX0DQTR
> +		DX0DQSTR
> +		DX1DLLCR
> +		DX1DQTR
> +		DX1DQSTR
>  Example:
>  
>  / {
>  	soc {
> -		u-boot,dm-spl;
> -
>  		ddr: ddr at 0x5A003000{
> -			u-boot,dm-spl;
> -			u-boot,dm-pre-reloc;
> -
>  			compatible = "st,stm32mp1-ddr";
>  
>  			reg = <0x5A003000 0x550
> diff --git a/drivers/ram/stm32mp1/stm32mp1_ram.c b/drivers/ram/stm32mp1/stm32mp1_ram.c
> index 49b1262461..a6c19af972 100644
> --- a/drivers/ram/stm32mp1/stm32mp1_ram.c
> +++ b/drivers/ram/stm32mp1/stm32mp1_ram.c
> @@ -230,29 +230,29 @@ static u8 get_nb_col(struct stm32mp1_ddrctl *ctl, u8 data_bus_width)
>  
>  	reg = readl(&ctl->addrmap3);
>  	/* addrmap3.addrmap_col_b6 */
> -	val = (reg & GENMASK(3, 0)) >> 0;
> +	val = (reg & GENMASK(4, 0)) >> 0;
>  	if (val <= 7)
>  		bits++;
>  	/* addrmap3.addrmap_col_b7 */
> -	val = (reg & GENMASK(11, 8)) >> 8;
> +	val = (reg & GENMASK(12, 8)) >> 8;
>  	if (val <= 7)
>  		bits++;
>  	/* addrmap3.addrmap_col_b8 */
> -	val = (reg & GENMASK(19, 16)) >> 16;
> +	val = (reg & GENMASK(20, 16)) >> 16;
>  	if (val <= 7)
>  		bits++;
>  	/* addrmap3.addrmap_col_b9 */
> -	val = (reg & GENMASK(27, 24)) >> 24;
> +	val = (reg & GENMASK(28, 24)) >> 24;
>  	if (val <= 7)
>  		bits++;
>  
>  	reg = readl(&ctl->addrmap4);
>  	/* addrmap4.addrmap_col_b10 */
> -	val = (reg & GENMASK(3, 0)) >> 0;
> +	val = (reg & GENMASK(4, 0)) >> 0;
>  	if (val <= 7)
>  		bits++;
>  	/* addrmap4.addrmap_col_b11 */
> -	val = (reg & GENMASK(11, 8)) >> 8;
> +	val = (reg & GENMASK(12, 8)) >> 8;
>  	if (val <= 7)
>  		bits++;
>  
> @@ -296,21 +296,24 @@ static u8 get_nb_row(struct stm32mp1_ddrctl *ctl)
>  	reg = readl(&ctl->addrmap6);
>  	/* addrmap6.addrmap_row_b12 */
>  	val = (reg & GENMASK(3, 0)) >> 0;
> -	if (val <= 7)
> +	if (val <= 11)
>  		bits++;
>  	/* addrmap6.addrmap_row_b13 */
>  	val = (reg & GENMASK(11, 8)) >> 8;
> -	if (val <= 7)
> +	if (val <= 11)
>  		bits++;
>  	/* addrmap6.addrmap_row_b14 */
>  	val = (reg & GENMASK(19, 16)) >> 16;
> -	if (val <= 7)
> +	if (val <= 11)
>  		bits++;
>  	/* addrmap6.addrmap_row_b15 */
>  	val = (reg & GENMASK(27, 24)) >> 24;
> -	if (val <= 7)
> +	if (val <= 11)
>  		bits++;
>  
> +	if (reg & BIT(31))
> +		printf("warning: LPDDR3_6GB_12GB is not supported\n");
> +
>  	return bits;
>  }
>  
> @@ -392,12 +395,17 @@ static struct ram_ops stm32mp1_ddr_ops = {
>  	.get_info = stm32mp1_ddr_get_info,
>  };
>  
> +static const struct stm32mp1_ddr_cfg stm32mp13x_ddr_cfg = {
> +	.nb_bytes = 2,
> +};
> +
>  static const struct stm32mp1_ddr_cfg stm32mp15x_ddr_cfg = {
>  	.nb_bytes = 4,
>  };
>  
>  static const struct udevice_id stm32mp1_ddr_ids[] = {
>  	{ .compatible = "st,stm32mp1-ddr", .data = (ulong)&stm32mp15x_ddr_cfg},
> +	{ .compatible = "st,stm32mp13-ddr", .data = (ulong)&stm32mp13x_ddr_cfg},
>  	{ }
>  };
>  
Reviewed-by: Patrice Chotard <patrice.chotard at foss.st.com>

Thanks
Patrice


More information about the U-Boot mailing list