Add support for STM32 TIMERS and STM32 PWM on STM32MP25

Add STM32MP13xx SPL and OpTee-OS start support
 Fix header misuse in stm32 reset drivers
 Fix STMicroelectronics spelling
 Fix clk-stm32h7 wrong macros used in register read
 Fix PRE_CON_BUF_ADDR on STM32MP13
 Fix clock identifier passed to struct scmi_clk_parent_set_in
 Fix stm32 reset for STM32F4/F7 and H7
 Enable OF_UPSTREAM_BUILD_VENDOR for stm32mp13_defconfig
 Add STM32MP23 SoC and stm32mp235f-dk board support
 -----BEGIN PGP SIGNATURE-----
 
 iQJQBAABCgA6FiEEXyrViUccKBz9c35Jysd4L3sz/6YFAmiLMDMcHHBhdHJpY2Uu
 Y2hvdGFyZEBmb3NzLnN0LmNvbQAKCRDKx3gvezP/piEgD/4iJisKm8VxHkbD8rHQ
 XBcew6H8fgjRxm+Df9SJd1FfiGcJDr84E91VLhfmZm+MmDLdI+Zwt21teDkEiAsk
 CLQcuJnCTPl0rQ4bteZQGrPAyUr7iMz+txwFCWor9hA3Om8nKZ/qvtXTzudJWZg9
 J1tneYMBOIknC4UUXJjbwWTLDyMJus32FxBm97ylPlDzWT9vci+BdiIFRt2W/Izh
 ETow6eKQf7UFhYSYc+sAoFr1BeUZCW/O+Omo+rj5ZcbG4jTfvNFeaAB3RUCeIigX
 44O3he6AQxFscjRYmvJhtITVCJFNlLLbVBo2CR3F2rvYNdtXEFMsksTiCwSkc3Yk
 tO+hMqO3NCsDXB4kIYvIsaK2tjuhFghmbKeg17cQyrXgnSaJM4hKumf1Tf8oGZWI
 76MwETlyPmjfYGvVGTghtrqAWAFcWhPB/GnGFmboe0xhM+CfNhKGK+Rt8YzT3zbS
 HYCuSsrfbbs2lAkUc1HOovNDWpDUlCbDadhH2TgQ3TODQWwce1EL+n3Cz0hOS3vR
 qD27G2YH7Ng//vkwQjK6wbVaS08cTWQeYgxpqRxG0pV64q6fY3qXcp1E8bECf0Br
 WbfUO6DEklnnOxX/u5annOVelRVDlnxVTEXFdFwDgkgWDm5SPWETcbszhqExAXIj
 kXNZmKIvStR4vlbbsdBkVYjJdw==
 =LafX
 -----END PGP SIGNATURE-----

Merge tag 'u-boot-stm32-20250731' of https://source.denx.de/u-boot/custodians/u-boot-stm

CI: https://source.denx.de/u-boot/custodians/u-boot-stm/-/pipelines/27236

- Add support for STM32 TIMERS and STM32 PWM on STM32MP25
- Add STM32MP13xx SPL and OpTee-OS start support
- Fix header misuse in stm32 reset drivers
- Fix STMicroelectronics spelling
- Fix clk-stm32h7 wrong macros used in register read
- Fix PRE_CON_BUF_ADDR on STM32MP13
- Fix clock identifier passed to struct scmi_clk_parent_set_in
- Fix stm32 reset for STM32F4/F7 and H7
- Enable OF_UPSTREAM_BUILD_VENDOR for stm32mp13_defconfig
- Add STM32MP23 SoC and stm32mp235f-dk board support
This commit is contained in:
Tom Rini 2025-07-31 08:45:50 -06:00
commit f5e968a28e
46 changed files with 1699 additions and 290 deletions

View File

@ -732,7 +732,6 @@ F: include/dt-bindings/clock/stm32fx-clock.h
F: include/dt-bindings/clock/stm32mp* F: include/dt-bindings/clock/stm32mp*
F: include/dt-bindings/pinctrl/stm32-pinfunc.h F: include/dt-bindings/pinctrl/stm32-pinfunc.h
F: include/dt-bindings/reset/stm32mp* F: include/dt-bindings/reset/stm32mp*
F: include/stm32-reset-core.h
F: include/stm32_rcc.h F: include/stm32_rcc.h
F: tools/logos/st.bmp F: tools/logos/st.bmp
F: tools/stm32image.c F: tools/stm32image.c

View File

@ -0,0 +1,187 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause
/*
* Copyright : STMicroelectronics 2018-2025
*/
#include <linux/stringify.h>
#ifdef CONFIG_SPL
&ddr {
config-DDR_MEM_COMPATIBLE {
bootph-all;
compatible = __stringify(st,DDR_MEM_COMPATIBLE);
st,mem-name = DDR_MEM_NAME;
st,mem-speed = <DDR_MEM_SPEED>;
st,mem-size = <DDR_MEM_SIZE>;
st,ctl-reg = <
DDR_MSTR
DDR_MRCTRL0
DDR_MRCTRL1
DDR_DERATEEN
DDR_DERATEINT
DDR_PWRCTL
DDR_PWRTMG
DDR_HWLPCTL
DDR_RFSHCTL0
DDR_RFSHCTL3
DDR_CRCPARCTL0
DDR_ZQCTL0
DDR_DFITMG0
DDR_DFITMG1
DDR_DFILPCFG0
DDR_DFIUPD0
DDR_DFIUPD1
DDR_DFIUPD2
DDR_DFIPHYMSTR
DDR_ODTMAP
DDR_DBG0
DDR_DBG1
DDR_DBGCMD
DDR_POISONCFG
DDR_PCCFG
>;
st,ctl-timing = <
DDR_RFSHTMG
DDR_DRAMTMG0
DDR_DRAMTMG1
DDR_DRAMTMG2
DDR_DRAMTMG3
DDR_DRAMTMG4
DDR_DRAMTMG5
DDR_DRAMTMG6
DDR_DRAMTMG7
DDR_DRAMTMG8
DDR_DRAMTMG14
DDR_ODTCFG
>;
st,ctl-map = <
DDR_ADDRMAP1
DDR_ADDRMAP2
DDR_ADDRMAP3
DDR_ADDRMAP4
DDR_ADDRMAP5
DDR_ADDRMAP6
DDR_ADDRMAP9
DDR_ADDRMAP10
DDR_ADDRMAP11
>;
/*
* Both st,ctl-perf and st,phy-reg differ
* between STM32MP13xx and STM32MP15xx due
* to 16bit and 32bit DRAM bus respectively
* on these SoCs.
*/
st,phy-timing = <
DDR_PTR0
DDR_PTR1
DDR_PTR2
DDR_DTPR0
DDR_DTPR1
DDR_DTPR2
DDR_MR0
DDR_MR1
DDR_MR2
DDR_MR3
>;
status = "okay";
};
};
#endif
#undef DDR_MEM_COMPATIBLE
#undef DDR_MEM_NAME
#undef DDR_MEM_SPEED
#undef DDR_MEM_SIZE
#undef DDR_MSTR
#undef DDR_MRCTRL0
#undef DDR_MRCTRL1
#undef DDR_DERATEEN
#undef DDR_DERATEINT
#undef DDR_PWRCTL
#undef DDR_PWRTMG
#undef DDR_HWLPCTL
#undef DDR_RFSHCTL0
#undef DDR_RFSHCTL3
#undef DDR_RFSHTMG
#undef DDR_CRCPARCTL0
#undef DDR_DRAMTMG0
#undef DDR_DRAMTMG1
#undef DDR_DRAMTMG2
#undef DDR_DRAMTMG3
#undef DDR_DRAMTMG4
#undef DDR_DRAMTMG5
#undef DDR_DRAMTMG6
#undef DDR_DRAMTMG7
#undef DDR_DRAMTMG8
#undef DDR_DRAMTMG14
#undef DDR_ZQCTL0
#undef DDR_DFITMG0
#undef DDR_DFITMG1
#undef DDR_DFILPCFG0
#undef DDR_DFIUPD0
#undef DDR_DFIUPD1
#undef DDR_DFIUPD2
#undef DDR_DFIPHYMSTR
#undef DDR_ADDRMAP1
#undef DDR_ADDRMAP2
#undef DDR_ADDRMAP3
#undef DDR_ADDRMAP4
#undef DDR_ADDRMAP5
#undef DDR_ADDRMAP6
#undef DDR_ADDRMAP9
#undef DDR_ADDRMAP10
#undef DDR_ADDRMAP11
#undef DDR_ODTCFG
#undef DDR_ODTMAP
#undef DDR_SCHED
#undef DDR_SCHED1
#undef DDR_PERFHPR1
#undef DDR_PERFLPR1
#undef DDR_PERFWR1
#undef DDR_DBG0
#undef DDR_DBG1
#undef DDR_DBGCMD
#undef DDR_POISONCFG
#undef DDR_PCCFG
#undef DDR_PCFGR_0
#undef DDR_PCFGW_0
#undef DDR_PCFGQOS0_0
#undef DDR_PCFGQOS1_0
#undef DDR_PCFGWQOS0_0
#undef DDR_PCFGWQOS1_0
#undef DDR_PCFGR_1
#undef DDR_PCFGW_1
#undef DDR_PCFGQOS0_1
#undef DDR_PCFGQOS1_1
#undef DDR_PCFGWQOS0_1
#undef DDR_PCFGWQOS1_1
#undef DDR_PGCR
#undef DDR_PTR0
#undef DDR_PTR1
#undef DDR_PTR2
#undef DDR_ACIOCR
#undef DDR_DXCCR
#undef DDR_DSGCR
#undef DDR_DCR
#undef DDR_DTPR0
#undef DDR_DTPR1
#undef DDR_DTPR2
#undef DDR_MR0
#undef DDR_MR1
#undef DDR_MR2
#undef DDR_MR3
#undef DDR_ODTCR
#undef DDR_ZQ0CR1
#undef DDR_DX0GCR
#undef DDR_DX1GCR
#undef DDR_DX2GCR
#undef DDR_DX3GCR

View File

@ -0,0 +1,49 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause
/*
* Copyright : STMicroelectronics 2018-2025
*/
#ifdef CONFIG_SPL
&ddr {
clocks = <&rcc AXIDCG>,
<&rcc DDRC1>,
<&rcc DDRPHYC>,
<&rcc DDRCAPB>,
<&rcc DDRPHYCAPB>;
clock-names = "axidcg",
"ddrc1",
"ddrphyc",
"ddrcapb",
"ddrphycapb";
config-DDR_MEM_COMPATIBLE {
st,ctl-perf = <
DDR_SCHED
DDR_SCHED1
DDR_PERFHPR1
DDR_PERFLPR1
DDR_PERFWR1
DDR_PCFGR_0
DDR_PCFGW_0
DDR_PCFGQOS0_0
DDR_PCFGQOS1_0
DDR_PCFGWQOS0_0
DDR_PCFGWQOS1_0
>;
st,phy-reg = <
DDR_PGCR
DDR_ACIOCR
DDR_DXCCR
DDR_DSGCR
DDR_DCR
DDR_ODTCR
DDR_ZQ0CR1
DDR_DX0GCR
DDR_DX1GCR
>;
};
};
#endif
#include "stm32mp1-ddr.dtsi"

View File

@ -0,0 +1,100 @@
// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
/*
* Copyright (C) 2025, DH electronics - All Rights Reserved
*
* STM32MP13xx DHSOM configuration
* 1x DDR3L 1Gb, 16-bit, 533MHz, Single Die Package in flyby topology.
* Reference used W631GU6MB15I from Winbond
*
* DDR type / Platform DDR3/3L
* freq 533MHz
* width 16
* datasheet 0 = W631GU6MB15I / DDR3-1333
* DDR density 2
* timing mode optimized
* address mapping : RBC
* Tc > + 85C : J
*/
#define DDR_MEM_COMPATIBLE ddr3l-dhsom-1066-888-bin-g-1x2gb-533mhz
#define DDR_MEM_NAME "DDR3-DDR3L 16bits 533000kHz"
#define DDR_MEM_SPEED 533000
#define DDR_MEM_SIZE 0x20000000
#define DDR_MSTR 0x00040401
#define DDR_MRCTRL0 0x00000010
#define DDR_MRCTRL1 0x00000000
#define DDR_DERATEEN 0x00000000
#define DDR_DERATEINT 0x00800000
#define DDR_PWRCTL 0x00000000
#define DDR_PWRTMG 0x00400010
#define DDR_HWLPCTL 0x00000000
#define DDR_RFSHCTL0 0x00210000
#define DDR_RFSHCTL3 0x00000000
#define DDR_RFSHTMG 0x0081008B
#define DDR_CRCPARCTL0 0x00000000
#define DDR_DRAMTMG0 0x121B2414
#define DDR_DRAMTMG1 0x000A041B
#define DDR_DRAMTMG2 0x0607080F
#define DDR_DRAMTMG3 0x0050400C
#define DDR_DRAMTMG4 0x07040607
#define DDR_DRAMTMG5 0x06060403
#define DDR_DRAMTMG6 0x02020002
#define DDR_DRAMTMG7 0x00000202
#define DDR_DRAMTMG8 0x00001005
#define DDR_DRAMTMG14 0x000000A0
#define DDR_ZQCTL0 0xC2000040
#define DDR_DFITMG0 0x02050105
#define DDR_DFITMG1 0x00000202
#define DDR_DFILPCFG0 0x07000000
#define DDR_DFIUPD0 0xC0400003
#define DDR_DFIUPD1 0x00000000
#define DDR_DFIUPD2 0x00000000
#define DDR_DFIPHYMSTR 0x00000000
#define DDR_ADDRMAP1 0x00080808
#define DDR_ADDRMAP2 0x00000000
#define DDR_ADDRMAP3 0x00000000
#define DDR_ADDRMAP4 0x00001F1F
#define DDR_ADDRMAP5 0x07070707
#define DDR_ADDRMAP6 0x0F070707
#define DDR_ADDRMAP9 0x00000000
#define DDR_ADDRMAP10 0x00000000
#define DDR_ADDRMAP11 0x00000000
#define DDR_ODTCFG 0x06000600
#define DDR_ODTMAP 0x00000001
#define DDR_SCHED 0x00000F01
#define DDR_SCHED1 0x00000000
#define DDR_PERFHPR1 0x00000001
#define DDR_PERFLPR1 0x04000200
#define DDR_PERFWR1 0x08000400
#define DDR_DBG0 0x00000000
#define DDR_DBG1 0x00000000
#define DDR_DBGCMD 0x00000000
#define DDR_POISONCFG 0x00000000
#define DDR_PCCFG 0x00000010
#define DDR_PCFGR_0 0x00000000
#define DDR_PCFGW_0 0x00000000
#define DDR_PCFGQOS0_0 0x00100009
#define DDR_PCFGQOS1_0 0x00000020
#define DDR_PCFGWQOS0_0 0x01100B03
#define DDR_PCFGWQOS1_0 0x01000200
#define DDR_PGCR 0x01442E02
#define DDR_PTR0 0x0022AA5B
#define DDR_PTR1 0x04841104
#define DDR_PTR2 0x042DA068
#define DDR_ACIOCR 0x10400812
#define DDR_DXCCR 0x00000C40
#define DDR_DSGCR 0xF200011F
#define DDR_DCR 0x0000000B
#define DDR_DTPR0 0x36D477D0
#define DDR_DTPR1 0x098B00D8
#define DDR_DTPR2 0x10023600
#define DDR_MR0 0x00000830
#define DDR_MR1 0x00000000
#define DDR_MR2 0x00000208
#define DDR_MR3 0x00000000
#define DDR_ODTCR 0x00010000
#define DDR_ZQ0CR1 0x00000038
#define DDR_DX0GCR 0x0000CE81
#define DDR_DX1GCR 0x0000CE81
#include "stm32mp13-ddr.dtsi"

View File

@ -17,6 +17,7 @@
pinctrl0 = &pinctrl; pinctrl0 = &pinctrl;
}; };
#if defined(CONFIG_TFABOOT)
firmware { firmware {
optee { optee {
bootph-all; bootph-all;
@ -27,6 +28,86 @@
psci { psci {
bootph-some-ram; bootph-some-ram;
}; };
#else
binman: binman {
multiple-images;
spl-stm32 {
filename = "u-boot-spl.stm32";
mkimage {
args = "-T stm32imagev2 -a 0x2ffe0000 -e 0x2ffe0000";
u-boot-spl {
no-write-symbols;
};
};
};
};
clocks {
bootph-all;
clk_hse: ck_hse {
bootph-all;
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <24000000>;
};
clk_hsi: ck_hsi {
bootph-all;
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <64000000>;
};
clk_lse: ck_lse {
bootph-all;
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <32768>;
};
clk_lsi: ck_lsi {
bootph-all;
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <32000>;
};
clk_csi: ck_csi {
bootph-all;
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <4000000>;
};
};
cpu0_opp_table: cpu0-opp-table {
compatible = "operating-points-v2";
opp-shared;
bootph-pre-ram;
opp-650000000 {
bootph-pre-ram;
opp-hz = /bits/ 64 <650000000>;
opp-microvolt = <1200000>;
opp-supported-hw = <0x1>;
};
opp-1000000000 {
bootph-pre-ram;
opp-hz = /bits/ 64 <1000000000>;
opp-microvolt = <1350000>;
opp-supported-hw = <0x2>;
};
};
reboot {
bootph-all;
compatible = "syscon-reboot";
regmap = <&rcc>;
offset = <0x114>;
mask = <0x1>;
};
#endif
soc { soc {
bootph-all; bootph-all;
@ -52,6 +133,14 @@
bootph-all; bootph-all;
}; };
#if !defined(CONFIG_TFABOOT)
&cpu0 {
nvmem-cells = <&part_number_otp>;
nvmem-cell-names = "part_number";
operating-points-v2 = <&cpu0_opp_table>;
};
#endif
&gpioa { &gpioa {
bootph-all; bootph-all;
}; };

View File

@ -3,7 +3,9 @@
* Copyright (C) 2024 Marek Vasut <marex@denx.de> * Copyright (C) 2024 Marek Vasut <marex@denx.de>
*/ */
#include <dt-bindings/clock/stm32mp13-clksrc.h>
#include "stm32mp13-u-boot.dtsi" #include "stm32mp13-u-boot.dtsi"
#include "stm32mp13-ddr3-dhsom-1x2Gb-1066-binG.dtsi"
/ { / {
aliases { aliases {
@ -18,8 +20,12 @@
}; };
}; };
&etzpc {
compatible = "simple-bus";
};
&flash0 { &flash0 {
bootph-pre-ram; bootph-all;
partitions { partitions {
compatible = "fixed-partitions"; compatible = "fixed-partitions";
@ -48,6 +54,138 @@
}; };
}; };
&i2c3 {
pinctrl-names = "default";
pinctrl-0 = <&i2c3_pins_a>;
};
&qspi {
bootph-all;
};
&qspi_clk_pins_a {
bootph-all;
pins {
bootph-all;
};
};
&qspi_bk1_pins_a {
bootph-all;
pins {
bootph-all;
};
};
&qspi_cs1_pins_a {
bootph-all;
pins {
bootph-all;
};
};
&pinctrl {
bootph-all;
i2c3_pins_a: i2c3-0 {
bootph-all;
pins {
bootph-all;
pinmux = <STM32_PINMUX('B', 8, AF5)>, /* I2C3_SCL */
<STM32_PINMUX('H', 14, AF4)>; /* I2C3_SDA */
bias-disable;
drive-open-drain;
slew-rate = <0>;
};
};
};
#if !defined(CONFIG_TFABOOT)
&rcc {
#address-cells = <1>;
#size-cells = <0>;
clocks = <&clk_hse>, <&clk_hsi>, <&clk_csi>, <&clk_lse>, <&clk_lsi>;
st,clksrc = <
CLK_MPU_PLL1P
CLK_AXI_PLL2P
CLK_MLAHBS_PLL3
CLK_PLL12_HSE
CLK_PLL3_HSE
CLK_PLL4_HSE
CLK_CKPER_HSE
CLK_RTC_LSE
CLK_MCO1_LSI
CLK_MCO2_HSI
>;
st,clkdiv = <
0 /*AXI*/
0 /*MLHAB*/
1 /*APB1*/
1 /*APB2*/
1 /*APB3*/
1 /*APB4*/
2 /*APB5*/
1 /*APB6*/
0 /*RTC*/
>;
st,pkcs = <
CLK_I2C12_HSI
CLK_I2C3_HSI
CLK_QSPI_PLL3R
CLK_SAES_AXI
CLK_SDMMC1_PLL3R
CLK_SDMMC2_PLL3R
CLK_STGEN_HSE
CLK_UART2_HSI
CLK_UART4_HSI
CLK_USBO_USBPHY
CLK_USBPHY_HSE
>;
/*
* cfg = < DIVM1 DIVN P Q R PQR(p,q,r) >;
* frac = < f >;
*
* PRQ(p,q,r) ... for p,q,r: 0-output disabled / 1-output enabled
* DIVN ... actually multiplier, but RCC_PLL1CFGR1 calls the field DIVN
* m ... for PLL1,2: m=2 ; for PLL3,4: m=1
* XTAL = 24 MHz
*
* VCO = ( XTAL / (DIVM1 + 1) ) * m * ( DIVN + 1 + ( f / 8192 ) )
* P = VCO / (P + 1)
* Q = VCO / (Q + 1)
* R = VCO / (R + 1)
*/
/* VCO = 1066.0 MHz => P = 266 (AXI), Q = 266, R = 533 (DDR) */
pll2: st,pll@1 {
compatible = "st,stm32mp1-pll";
reg = <1>;
cfg = < 2 65 1 1 0 PQR(1,1,1) >;
frac = < 0x1400 >;
bootph-all;
};
/* VCO = 600 MHz => P = 200, Q = 150, R = 200 */
pll3: st,pll@2 {
compatible = "st,stm32mp1-pll";
reg = <2>;
cfg = < 2 74 2 3 2 PQR(1,1,1) >;
bootph-all;
};
/* VCO = 750.0 MHz => P = 125, Q = 83, R = 75 */
pll4: st,pll@3 {
compatible = "st,stm32mp1-pll";
reg = <3>;
cfg = < 3 124 5 8 9 PQR(1,1,1) >;
bootph-all;
};
};
#endif
&sdmmc1 { &sdmmc1 {
status = "disabled"; status = "disabled";
}; };
@ -55,3 +193,23 @@
&usbotg_hs { &usbotg_hs {
u-boot,force-b-session-valid; u-boot,force-b-session-valid;
}; };
&vddcpu {
bootph-all;
};
&vdd_ddr {
bootph-all;
};
&vdd {
bootph-all;
};
&vddcore {
bootph-all;
};
&vref_ddr {
bootph-all;
};

View File

@ -2,8 +2,6 @@
/* /*
* Copyright : STMicroelectronics 2018 * Copyright : STMicroelectronics 2018
*/ */
#include <linux/stringify.h>
#ifdef CONFIG_SPL #ifdef CONFIG_SPL
&ddr { &ddr {
clocks = <&rcc AXIDCG>, clocks = <&rcc AXIDCG>,
@ -21,69 +19,6 @@
"ddrphycapb"; "ddrphycapb";
config-DDR_MEM_COMPATIBLE { config-DDR_MEM_COMPATIBLE {
bootph-all;
compatible = __stringify(st,DDR_MEM_COMPATIBLE);
st,mem-name = DDR_MEM_NAME;
st,mem-speed = <DDR_MEM_SPEED>;
st,mem-size = <DDR_MEM_SIZE>;
st,ctl-reg = <
DDR_MSTR
DDR_MRCTRL0
DDR_MRCTRL1
DDR_DERATEEN
DDR_DERATEINT
DDR_PWRCTL
DDR_PWRTMG
DDR_HWLPCTL
DDR_RFSHCTL0
DDR_RFSHCTL3
DDR_CRCPARCTL0
DDR_ZQCTL0
DDR_DFITMG0
DDR_DFITMG1
DDR_DFILPCFG0
DDR_DFIUPD0
DDR_DFIUPD1
DDR_DFIUPD2
DDR_DFIPHYMSTR
DDR_ODTMAP
DDR_DBG0
DDR_DBG1
DDR_DBGCMD
DDR_POISONCFG
DDR_PCCFG
>;
st,ctl-timing = <
DDR_RFSHTMG
DDR_DRAMTMG0
DDR_DRAMTMG1
DDR_DRAMTMG2
DDR_DRAMTMG3
DDR_DRAMTMG4
DDR_DRAMTMG5
DDR_DRAMTMG6
DDR_DRAMTMG7
DDR_DRAMTMG8
DDR_DRAMTMG14
DDR_ODTCFG
>;
st,ctl-map = <
DDR_ADDRMAP1
DDR_ADDRMAP2
DDR_ADDRMAP3
DDR_ADDRMAP4
DDR_ADDRMAP5
DDR_ADDRMAP6
DDR_ADDRMAP9
DDR_ADDRMAP10
DDR_ADDRMAP11
>;
st,ctl-perf = < st,ctl-perf = <
DDR_SCHED DDR_SCHED
DDR_SCHED1 DDR_SCHED1
@ -117,111 +52,8 @@
DDR_DX2GCR DDR_DX2GCR
DDR_DX3GCR DDR_DX3GCR
>; >;
st,phy-timing = <
DDR_PTR0
DDR_PTR1
DDR_PTR2
DDR_DTPR0
DDR_DTPR1
DDR_DTPR2
DDR_MR0
DDR_MR1
DDR_MR2
DDR_MR3
>;
status = "okay";
}; };
}; };
#endif #endif
#undef DDR_MEM_COMPATIBLE #include "stm32mp1-ddr.dtsi"
#undef DDR_MEM_NAME
#undef DDR_MEM_SPEED
#undef DDR_MEM_SIZE
#undef DDR_MSTR
#undef DDR_MRCTRL0
#undef DDR_MRCTRL1
#undef DDR_DERATEEN
#undef DDR_DERATEINT
#undef DDR_PWRCTL
#undef DDR_PWRTMG
#undef DDR_HWLPCTL
#undef DDR_RFSHCTL0
#undef DDR_RFSHCTL3
#undef DDR_RFSHTMG
#undef DDR_CRCPARCTL0
#undef DDR_DRAMTMG0
#undef DDR_DRAMTMG1
#undef DDR_DRAMTMG2
#undef DDR_DRAMTMG3
#undef DDR_DRAMTMG4
#undef DDR_DRAMTMG5
#undef DDR_DRAMTMG6
#undef DDR_DRAMTMG7
#undef DDR_DRAMTMG8
#undef DDR_DRAMTMG14
#undef DDR_ZQCTL0
#undef DDR_DFITMG0
#undef DDR_DFITMG1
#undef DDR_DFILPCFG0
#undef DDR_DFIUPD0
#undef DDR_DFIUPD1
#undef DDR_DFIUPD2
#undef DDR_DFIPHYMSTR
#undef DDR_ADDRMAP1
#undef DDR_ADDRMAP2
#undef DDR_ADDRMAP3
#undef DDR_ADDRMAP4
#undef DDR_ADDRMAP5
#undef DDR_ADDRMAP6
#undef DDR_ADDRMAP9
#undef DDR_ADDRMAP10
#undef DDR_ADDRMAP11
#undef DDR_ODTCFG
#undef DDR_ODTMAP
#undef DDR_SCHED
#undef DDR_SCHED1
#undef DDR_PERFHPR1
#undef DDR_PERFLPR1
#undef DDR_PERFWR1
#undef DDR_DBG0
#undef DDR_DBG1
#undef DDR_DBGCMD
#undef DDR_POISONCFG
#undef DDR_PCCFG
#undef DDR_PCFGR_0
#undef DDR_PCFGW_0
#undef DDR_PCFGQOS0_0
#undef DDR_PCFGQOS1_0
#undef DDR_PCFGWQOS0_0
#undef DDR_PCFGWQOS1_0
#undef DDR_PCFGR_1
#undef DDR_PCFGW_1
#undef DDR_PCFGQOS0_1
#undef DDR_PCFGQOS1_1
#undef DDR_PCFGWQOS0_1
#undef DDR_PCFGWQOS1_1
#undef DDR_PGCR
#undef DDR_PTR0
#undef DDR_PTR1
#undef DDR_PTR2
#undef DDR_ACIOCR
#undef DDR_DXCCR
#undef DDR_DSGCR
#undef DDR_DCR
#undef DDR_DTPR0
#undef DDR_DTPR1
#undef DDR_DTPR2
#undef DDR_MR0
#undef DDR_MR1
#undef DDR_MR2
#undef DDR_MR3
#undef DDR_ODTCR
#undef DDR_ZQ0CR1
#undef DDR_DX0GCR
#undef DDR_DX1GCR
#undef DDR_DX2GCR
#undef DDR_DX3GCR

View File

@ -0,0 +1,104 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause
/*
* Copyright : STMicroelectronics 2024
*/
/ {
aliases {
gpio0 = &gpioa;
gpio1 = &gpiob;
gpio2 = &gpioc;
gpio3 = &gpiod;
gpio4 = &gpioe;
gpio5 = &gpiof;
gpio6 = &gpiog;
gpio7 = &gpioh;
gpio8 = &gpioi;
gpio25 = &gpioz;
pinctrl0 = &pinctrl;
pinctrl1 = &pinctrl_z;
};
firmware {
optee {
bootph-all;
};
scmi {
bootph-all;
};
};
/* need PSCI for sysreset during board_f */
psci {
bootph-all;
};
soc@0 {
bootph-all;
};
};
&bsec {
bootph-all;
};
&gpioa {
bootph-all;
};
&gpiob {
bootph-all;
};
&gpioc {
bootph-all;
};
&gpiod {
bootph-all;
};
&gpioe {
bootph-all;
};
&gpiof {
bootph-all;
};
&gpiog {
bootph-all;
};
&gpioh {
bootph-all;
};
&gpioi {
bootph-all;
};
&gpioz {
bootph-all;
};
&pinctrl {
bootph-all;
};
&rcc {
bootph-all;
};
&rifsc {
bootph-all;
};
&scmi_clk {
bootph-all;
};
&syscfg {
bootph-all;
};

View File

@ -0,0 +1,27 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause
/*
* Copyright (C) STMicroelectronics 2024 - All Rights Reserved
*/
#include "stm32mp23-u-boot.dtsi"
/ {
config {
u-boot,boot-led = "led-blue";
u-boot,mmc-env-partition = "u-boot-env";
};
};
&usart2 {
bootph-all;
};
&usart2_pins_a {
bootph-all;
pins1 {
bootph-all;
};
pins2 {
bootph-all;
};
};

View File

@ -29,7 +29,7 @@
* *
* Currently valid part Names are (PART): * Currently valid part Names are (PART):
* M_NAND - Micron NAND * M_NAND - Micron NAND
* STNOR - STMicrolelctronics M29W128GL * STNOR - STMicroelectronics M29W128GL
*/ */
#define GPMC_SIZE_256M 0x0 #define GPMC_SIZE_256M 0x0
#define GPMC_SIZE_128M 0x8 #define GPMC_SIZE_128M 0x8

View File

@ -29,7 +29,7 @@
* *
* Currently valid part Names are (PART): * Currently valid part Names are (PART):
* M_NAND - Micron NAND * M_NAND - Micron NAND
* STNOR - STMicrolelctronics M29W128GL * STNOR - STMicroelectronics M29W128GL
*/ */
#define GPMC_SIZE_256M 0x0 #define GPMC_SIZE_256M 0x0
#define GPMC_SIZE_128M 0x8 #define GPMC_SIZE_128M 0x8

View File

@ -40,16 +40,19 @@ choice
config STM32MP13X config STM32MP13X
bool "Support STMicroelectronics STM32MP13x Soc" bool "Support STMicroelectronics STM32MP13x Soc"
select ARCH_EARLY_INIT_R select ARCH_EARLY_INIT_R
select ARM_SMCCC select ARM_SMCCC if TFABOOT
select ARCH_SUPPORT_PSCI if !TFABOOT
select BINMAN if !TFABOOT
select CPU_V7A select CPU_V7A
select CPU_V7_HAS_NONSEC select CPU_V7_HAS_NONSEC
select CPU_V7_HAS_VIRT select CPU_V7_HAS_VIRT
select OF_BOARD select OF_BOARD if TFABOOT
select OF_BOARD_SETUP select OF_BOARD_SETUP
select PINCTRL_STM32 select PINCTRL_STM32
select STM32_RCC select STM32_RCC
select STM32_RESET select STM32_RESET
select STM32_SERIAL select STM32_SERIAL
select SUPPORT_SPL if !TFABOOT
select SYS_ARCH_TIMER select SYS_ARCH_TIMER
imply CMD_NVEDIT_INFO imply CMD_NVEDIT_INFO
imply OF_UPSTREAM imply OF_UPSTREAM
@ -81,6 +84,32 @@ config STM32MP15X
STMicroelectronics MPU with core ARMv7 STMicroelectronics MPU with core ARMv7
dual core A7 for STM32MP157/3, monocore for STM32MP151 dual core A7 for STM32MP157/3, monocore for STM32MP151
config STM32MP23X
bool "Support STMicroelectronics STM32MP23x Soc"
select ARM64
select CLK_STM32MP25
select OF_BOARD
select PINCTRL_STM32
select STM32_RCC
select STM32_RESET
select STM32_SERIAL
select STM32MP_TAMP_NVMEM
select SYS_ARCH_TIMER
select TFABOOT
imply CLK_SCMI
imply CMD_NVEDIT_INFO
imply DM_REGULATOR
imply DM_REGULATOR_SCMI
imply OF_UPSTREAM
imply OPTEE
imply RESET_SCMI
imply SYSRESET_PSCI
imply TEE
imply VERSION_VARIABLE
help
Support of STMicroelectronics SOC STM32MP23x family
STMicroelectronics MPU with 2 * A53 core and 1 M33 core
config STM32MP25X config STM32MP25X
bool "Support STMicroelectronics STM32MP25x Soc" bool "Support STMicroelectronics STM32MP25x Soc"
select ARM64 select ARM64
@ -165,6 +194,7 @@ config MFD_STM32_TIMERS
source "arch/arm/mach-stm32mp/Kconfig.13x" source "arch/arm/mach-stm32mp/Kconfig.13x"
source "arch/arm/mach-stm32mp/Kconfig.15x" source "arch/arm/mach-stm32mp/Kconfig.15x"
source "arch/arm/mach-stm32mp/Kconfig.23x"
source "arch/arm/mach-stm32mp/Kconfig.25x" source "arch/arm/mach-stm32mp/Kconfig.25x"
source "arch/arm/mach-stm32mp/cmd_stm32prog/Kconfig" source "arch/arm/mach-stm32mp/cmd_stm32prog/Kconfig"

View File

@ -20,10 +20,11 @@ config TARGET_ST_STM32MP13X
endchoice endchoice
config TEXT_BASE config TEXT_BASE
default 0xC0000000 default 0xC0000000 if TFABOOT
default 0xC0100000 if !TFABOOT
config PRE_CON_BUF_ADDR config PRE_CON_BUF_ADDR
default 0xC0800000 default 0xC2FFF000
config PRE_CON_BUF_SZ config PRE_CON_BUF_SZ
default 4096 default 4096

View File

@ -0,0 +1,37 @@
if STM32MP23X
choice
prompt "STM32MP23x board select"
optional
config TARGET_ST_STM32MP23X
bool "STMicroelectronics STM32MP23x boards"
imply BOOTSTAGE
imply CMD_BOOTSTAGE
help
target the STMicroelectronics board with SOC STM32MP23x
managed by board/st/stm32mp2
The difference between board are managed with devicetree
endchoice
config TEXT_BASE
default 0x84000000
config PRE_CON_BUF_ADDR
default 0x84800000
config PRE_CON_BUF_SZ
default 4096
if DEBUG_UART
# debug on USART2 by default
config DEBUG_UART_BASE
default 0x400e0000
endif
source "board/st/stm32mp2/Kconfig"
endif

View File

@ -10,6 +10,7 @@ obj-y += soc.o
obj-$(CONFIG_STM32MP15X) += stm32mp1/ obj-$(CONFIG_STM32MP15X) += stm32mp1/
obj-$(CONFIG_STM32MP13X) += stm32mp1/ obj-$(CONFIG_STM32MP13X) += stm32mp1/
obj-$(CONFIG_STM32MP23X) += stm32mp2/
obj-$(CONFIG_STM32MP25X) += stm32mp2/ obj-$(CONFIG_STM32MP25X) += stm32mp2/
obj-$(CONFIG_MFD_STM32_TIMERS) += timers.o obj-$(CONFIG_MFD_STM32_TIMERS) += timers.o

View File

@ -171,7 +171,7 @@ static u8 get_key_nb(void)
if (IS_ENABLED(CONFIG_STM32MP15X)) if (IS_ENABLED(CONFIG_STM32MP15X))
return ARRAY_SIZE(stm32mp15_list); return ARRAY_SIZE(stm32mp15_list);
if (IS_ENABLED(CONFIG_STM32MP25X)) if (IS_ENABLED(CONFIG_STM32MP23X) || IS_ENABLED(CONFIG_STM32MP25X))
return ARRAY_SIZE(stm32mp25_list); return ARRAY_SIZE(stm32mp25_list);
} }
@ -183,7 +183,7 @@ static const struct stm32key *get_key(u8 index)
if (IS_ENABLED(CONFIG_STM32MP15X)) if (IS_ENABLED(CONFIG_STM32MP15X))
return &stm32mp15_list[index]; return &stm32mp15_list[index];
if (IS_ENABLED(CONFIG_STM32MP25X)) if (IS_ENABLED(CONFIG_STM32MP23X) || IS_ENABLED(CONFIG_STM32MP25X))
return &stm32mp25_list[index]; return &stm32mp25_list[index];
} }
@ -195,7 +195,7 @@ static u8 get_otp_close_state_nb(void)
if (IS_ENABLED(CONFIG_STM32MP15X)) if (IS_ENABLED(CONFIG_STM32MP15X))
return ARRAY_SIZE(stm32mp15_close_state_otp); return ARRAY_SIZE(stm32mp15_close_state_otp);
if (IS_ENABLED(CONFIG_STM32MP25X)) if (IS_ENABLED(CONFIG_STM32MP23X) || IS_ENABLED(CONFIG_STM32MP25X))
return ARRAY_SIZE(stm32mp25_close_state_otp); return ARRAY_SIZE(stm32mp25_close_state_otp);
} }
@ -207,7 +207,7 @@ static const struct otp_close *get_otp_close_state(u8 index)
if (IS_ENABLED(CONFIG_STM32MP15X)) if (IS_ENABLED(CONFIG_STM32MP15X))
return &stm32mp15_close_state_otp[index]; return &stm32mp15_close_state_otp[index];
if (IS_ENABLED(CONFIG_STM32MP25X)) if (IS_ENABLED(CONFIG_STM32MP23X) || IS_ENABLED(CONFIG_STM32MP25X))
return &stm32mp25_close_state_otp[index]; return &stm32mp25_close_state_otp[index];
} }

View File

@ -156,6 +156,8 @@ enum forced_boot_mode {
#endif #endif
#ifdef CONFIG_STM32MP13X #ifdef CONFIG_STM32MP13X
#define TAMP_BACKUP_MAGIC_NUMBER TAMP_BACKUP_REGISTER(4)
#define TAMP_BACKUP_BRANCH_ADDRESS TAMP_BACKUP_REGISTER(5)
#define TAMP_BOOTCOUNT TAMP_BACKUP_REGISTER(31) #define TAMP_BOOTCOUNT TAMP_BACKUP_REGISTER(31)
#define TAMP_BOOT_CONTEXT TAMP_BACKUP_REGISTER(30) #define TAMP_BOOT_CONTEXT TAMP_BACKUP_REGISTER(30)
#endif #endif
@ -163,7 +165,7 @@ enum forced_boot_mode {
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* CONFIG_STM32MP15X || CONFIG_STM32MP13X */ #endif /* CONFIG_STM32MP15X || CONFIG_STM32MP13X */
#ifdef CONFIG_STM32MP25X #if defined(CONFIG_STM32MP23X) || defined(CONFIG_STM32MP25X)
#define STM32_USART2_BASE 0x400E0000 #define STM32_USART2_BASE 0x400E0000
#define STM32_USART3_BASE 0x400F0000 #define STM32_USART3_BASE 0x400F0000
#define STM32_UART4_BASE 0x40100000 #define STM32_UART4_BASE 0x40100000
@ -188,7 +190,7 @@ enum forced_boot_mode {
/* TAMP registers zone 3 RIF 1 (RW) at 96*/ /* TAMP registers zone 3 RIF 1 (RW) at 96*/
#define TAMP_BOOT_CONTEXT TAMP_BACKUP_REGISTER(96) #define TAMP_BOOT_CONTEXT TAMP_BACKUP_REGISTER(96)
#endif /* STM32MP25X */ #endif /* defined(CONFIG_STM32MP23X) || defined(CONFIG_STM32MP25X) */
/* offset used for BSEC driver: misc_read and misc_write */ /* offset used for BSEC driver: misc_read and misc_write */
#define STM32_BSEC_SHADOW_OFFSET 0x0 #define STM32_BSEC_SHADOW_OFFSET 0x0
@ -212,14 +214,14 @@ enum forced_boot_mode {
#define BSEC_OTP_MAC 57 #define BSEC_OTP_MAC 57
#define BSEC_OTP_BOARD 60 #define BSEC_OTP_BOARD 60
#endif #endif
#ifdef CONFIG_STM32MP25X #if defined(CONFIG_STM32MP23X) || defined(CONFIG_STM32MP25X)
#define BSEC_OTP_SERIAL 5 #define BSEC_OTP_SERIAL 5
#define BSEC_OTP_RPN 9 #define BSEC_OTP_RPN 9
#define BSEC_OTP_REVID 102 #define BSEC_OTP_REVID 102
#define BSEC_OTP_PKG 122 #define BSEC_OTP_PKG 122
#define BSEC_OTP_BOARD 246 #define BSEC_OTP_BOARD 246
#define BSEC_OTP_MAC 247 #define BSEC_OTP_MAC 247
#endif #endif /* defined(CONFIG_STM32MP23X) || defined(CONFIG_STM32MP25X) */
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <asm/types.h> #include <asm/types.h>

View File

@ -30,29 +30,44 @@
#define CPU_STM32MP131Fxx 0x05010EC8 #define CPU_STM32MP131Fxx 0x05010EC8
#define CPU_STM32MP131Dxx 0x05010EC9 #define CPU_STM32MP131Dxx 0x05010EC9
/* ID for STM32MP23x = Device Part Number (RPN) (bit31:0) */
#define CPU_STM32MP235Cxx 0x00082182
#define CPU_STM32MP233Cxx 0x000B318E
#define CPU_STM32MP231Cxx 0x000B31EF
#define CPU_STM32MP235Axx 0x40082F82
#define CPU_STM32MP233Axx 0x400B3F8E
#define CPU_STM32MP231Axx 0x400B3FEF
#define CPU_STM32MP235Fxx 0x80082182
#define CPU_STM32MP233Fxx 0x800B318E
#define CPU_STM32MP231Fxx 0x800B31EF
#define CPU_STM32MP235Dxx 0xC0082F82
#define CPU_STM32MP233Dxx 0xC00B3F8E
#define CPU_STM32MP231Dxx 0xC00B3FEF
/* ID for STM32MP25x = Device Part Number (RPN) (bit31:0) */ /* ID for STM32MP25x = Device Part Number (RPN) (bit31:0) */
#define CPU_STM32MP257Cxx 0x00002000 #define CPU_STM32MP257Cxx 0x00002000
#define CPU_STM32MP255Cxx 0x00082000 #define CPU_STM32MP255Cxx 0x00082000
#define CPU_STM32MP253Cxx 0x000B2004 #define CPU_STM32MP253Cxx 0x000B2004
#define CPU_STM32MP251Cxx 0x000B3065 #define CPU_STM32MP251Cxx 0x000B3065
#define CPU_STM32MP257Axx 0x40002E00 #define CPU_STM32MP257Axx 0x40002E00
#define CPU_STM32MP255Axx 0x40082E00 #define CPU_STM32MP255Axx 0x40082E00
#define CPU_STM32MP253Axx 0x400B2E04 #define CPU_STM32MP253Axx 0x400B2E04
#define CPU_STM32MP251Axx 0x400B3E65 #define CPU_STM32MP251Axx 0x400B3E65
#define CPU_STM32MP257Fxx 0x80002000 #define CPU_STM32MP257Fxx 0x80002000
#define CPU_STM32MP255Fxx 0x80082000 #define CPU_STM32MP255Fxx 0x80082000
#define CPU_STM32MP253Fxx 0x800B2004 #define CPU_STM32MP253Fxx 0x800B2004
#define CPU_STM32MP251Fxx 0x800B3065 #define CPU_STM32MP251Fxx 0x800B3065
#define CPU_STM32MP257Dxx 0xC0002E00 #define CPU_STM32MP257Dxx 0xC0002E00
#define CPU_STM32MP255Dxx 0xC0082E00 #define CPU_STM32MP255Dxx 0xC0082E00
#define CPU_STM32MP253Dxx 0xC00B2E04 #define CPU_STM32MP253Dxx 0xC00B2E04
#define CPU_STM32MP251Dxx 0xC00B3E65 #define CPU_STM32MP251Dxx 0xC00B3E65
/* return CPU_STMP32MP...Xxx constants */ /* return CPU_STMP32MP...Xxx constants */
u32 get_cpu_type(void); u32 get_cpu_type(void);
#define CPU_DEV_STM32MP15 0x500 #define CPU_DEV_STM32MP15 0x500
#define CPU_DEV_STM32MP13 0x501 #define CPU_DEV_STM32MP13 0x501
#define CPU_DEV_STM32MP23 0x505
#define CPU_DEV_STM32MP25 0x505 #define CPU_DEV_STM32MP25 0x505
/* return CPU_DEV constants */ /* return CPU_DEV constants */
@ -87,6 +102,12 @@ u32 get_cpu_package(void);
#define STM32MP15_PKG_AD_TFBGA257 1 #define STM32MP15_PKG_AD_TFBGA257 1
#define STM32MP15_PKG_UNKNOWN 0 #define STM32MP15_PKG_UNKNOWN 0
/* package used for STM32MP23x */
#define STM32MP23_PKG_CUSTOM 0
#define STM32MP23_PKG_AL_VFBGA361 1
#define STM32MP23_PKG_AK_VFBGA424 3
#define STM32MP23_PKG_AJ_TFBGA361 7
/* package used for STM32MP25x */ /* package used for STM32MP25x */
#define STM32MP25_PKG_CUSTOM 0 #define STM32MP25_PKG_CUSTOM 0
#define STM32MP25_PKG_AL_VFBGA361 1 #define STM32MP25_PKG_AL_VFBGA361 1

View File

@ -29,6 +29,10 @@
#define TIM_DMAR 0x4C /* DMA register for transfer */ #define TIM_DMAR 0x4C /* DMA register for transfer */
#define TIM_TISEL 0x68 /* Input Selection */ #define TIM_TISEL 0x68 /* Input Selection */
#define TIM_HWCFGR2 0x3EC /* hardware configuration 2 Reg (MP25) */
#define TIM_HWCFGR1 0x3F0 /* hardware configuration 1 Reg (MP25) */
#define TIM_IPIDR 0x3F8 /* IP identification Reg (MP25) */
#define TIM_CR1_CEN BIT(0) /* Counter Enable */ #define TIM_CR1_CEN BIT(0) /* Counter Enable */
#define TIM_CR1_ARPE BIT(7) #define TIM_CR1_ARPE BIT(7)
#define TIM_CCER_CCXE (BIT(0) | BIT(4) | BIT(8) | BIT(12)) #define TIM_CCER_CCXE (BIT(0) | BIT(4) | BIT(8) | BIT(12))
@ -40,11 +44,16 @@
#define TIM_CCMR_M1 (BIT(6) | BIT(5)) /* Channel PWM Mode 1 */ #define TIM_CCMR_M1 (BIT(6) | BIT(5)) /* Channel PWM Mode 1 */
#define TIM_BDTR_MOE BIT(15) /* Main Output Enable */ #define TIM_BDTR_MOE BIT(15) /* Main Output Enable */
#define TIM_EGR_UG BIT(0) /* Update Generation */ #define TIM_EGR_UG BIT(0) /* Update Generation */
#define TIM_HWCFGR2_CNT_WIDTH GENMASK(15, 8) /* Counter width */
#define TIM_HWCFGR1_NB_OF_DT GENMASK(7, 4) /* Complementary outputs & dead-time generators */
#define MAX_TIM_PSC 0xFFFF #define MAX_TIM_PSC 0xFFFF
#define STM32MP25_TIM_IPIDR 0x00120002
struct stm32_timers_plat { struct stm32_timers_plat {
void __iomem *base; void __iomem *base;
u32 ipidr;
}; };
struct stm32_timers_priv { struct stm32_timers_priv {

View File

@ -28,7 +28,9 @@
* early TLB into the .data section so that it not get cleared * early TLB into the .data section so that it not get cleared
* with 16kB allignment (see TTBR0_BASE_ADDR_MASK) * with 16kB allignment (see TTBR0_BASE_ADDR_MASK)
*/ */
#if (!IS_ENABLED(CONFIG_XPL_BUILD) || !IS_ENABLED(CONFIG_STM32MP13X))
u8 early_tlb[PGTABLE_SIZE] __section(".data") __aligned(0x4000); u8 early_tlb[PGTABLE_SIZE] __section(".data") __aligned(0x4000);
#endif
u32 get_bootmode(void) u32 get_bootmode(void)
{ {
@ -95,18 +97,19 @@ void dram_bank_mmu_setup(int bank)
*/ */
static void early_enable_caches(void) static void early_enable_caches(void)
{ {
#if (!IS_ENABLED(CONFIG_XPL_BUILD) || !IS_ENABLED(CONFIG_STM32MP13X))
/* I-cache is already enabled in start.S: cpu_init_cp15 */ /* I-cache is already enabled in start.S: cpu_init_cp15 */
if (CONFIG_IS_ENABLED(SYS_DCACHE_OFF)) if (CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
return; return;
#if !(CONFIG_IS_ENABLED(SYS_ICACHE_OFF) && CONFIG_IS_ENABLED(SYS_DCACHE_OFF)) #if !(CONFIG_IS_ENABLED(SYS_ICACHE_OFF) && CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
gd->arch.tlb_size = PGTABLE_SIZE; gd->arch.tlb_size = PGTABLE_SIZE;
gd->arch.tlb_addr = (unsigned long)&early_tlb; gd->arch.tlb_addr = (unsigned long)&early_tlb;
#endif #endif
/* enable MMU (default configuration) */ /* enable MMU (default configuration) */
dcache_enable(); dcache_enable();
#endif
} }
/* /*

View File

@ -220,10 +220,11 @@ void board_init_f(ulong dummy)
* activate cache on DDR only when DDR is fully initialized * activate cache on DDR only when DDR is fully initialized
* to avoid speculative access and issue in get_ram_size() * to avoid speculative access and issue in get_ram_size()
*/ */
if (!CONFIG_IS_ENABLED(SYS_DCACHE_OFF)) if (!CONFIG_IS_ENABLED(SYS_DCACHE_OFF) && !IS_ENABLED(CONFIG_STM32MP13X)) {
mmu_set_region_dcache_behaviour(STM32_DDR_BASE, mmu_set_region_dcache_behaviour(STM32_DDR_BASE,
CONFIG_DDR_CACHEABLE_SIZE, CONFIG_DDR_CACHEABLE_SIZE,
DCACHE_DEFAULT_OPTION); DCACHE_DEFAULT_OPTION);
}
} }
void spl_board_prepare_for_boot(void) void spl_board_prepare_for_boot(void)

View File

@ -6,11 +6,59 @@
#define LOG_CATEGORY LOGC_ARCH #define LOG_CATEGORY LOGC_ARCH
#include <config.h> #include <config.h>
#include <cpu_func.h>
#include <log.h> #include <log.h>
#include <syscon.h> #include <syscon.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/system.h>
#include <asm/arch/bsec.h>
#include <asm/arch/stm32.h> #include <asm/arch/stm32.h>
#include <asm/arch/sys_proto.h> #include <asm/arch/sys_proto.h>
#include <dm/device.h>
#include <dm/uclass.h>
#include <linux/bitfield.h>
#include <malloc.h>
/* RCC register */
#define RCC_TZCR (STM32_RCC_BASE + 0x00)
#define RCC_BDCR (STM32_RCC_BASE + 0x400)
#define RCC_DBGCFGR (STM32_RCC_BASE + 0x468)
#define RCC_MP_APB5ENSETR (STM32_RCC_BASE + 0x740)
#define RCC_MP_AHB6ENSETR (STM32_RCC_BASE + 0x780)
#define RCC_BDCR_VSWRST BIT(31)
#define RCC_BDCR_RTCSRC GENMASK(17, 16)
#define RCC_DBGCFGR_DBGCKEN BIT(8)
/* DBGMCU register */
#define DBGMCU_APB4FZ1 (STM32_DBGMCU_BASE + 0x2c)
#define DBGMCU_APB4FZ1_IWDG2 BIT(2)
/* Security register */
#define ETZPC_TZMA1_SIZE (STM32_ETZPC_BASE + 0x04)
#define ETZPC_DECPROT0 (STM32_ETZPC_BASE + 0x10)
#define TZC_ACTION (STM32_TZC_BASE + 0x004)
#define TZC_GATE_KEEPER (STM32_TZC_BASE + 0x008)
#define TZC_REGION_BASE(n) (STM32_TZC_BASE + 0x100 + (0x20 * (n)))
#define TZC_REGION_TOP(n) (STM32_TZC_BASE + 0x108 + (0x20 * (n)))
#define TZC_REGION_ATTRIBUTE(n) (STM32_TZC_BASE + 0x110 + (0x20 * (n)))
#define TZC_REGION_ID_ACCESS(n) (STM32_TZC_BASE + 0x114 + (0x20 * (n)))
#define TAMP_CR1 (STM32_TAMP_BASE + 0x00)
#define PWR_CR1 (STM32_PWR_BASE + 0x00)
#define PWR_CR1_DBP BIT(8)
/* boot interface from Bootrom
* - boot instance = bit 31:16
* - boot device = bit 15:0
*/
#define BOOTROM_MODE_MASK GENMASK(15, 0)
#define BOOTROM_MODE_SHIFT 0
#define BOOTROM_INSTANCE_MASK GENMASK(31, 16)
#define BOOTROM_INSTANCE_SHIFT 16
/* SYSCFG register */ /* SYSCFG register */
#define SYSCFG_IDC_OFFSET 0x380 #define SYSCFG_IDC_OFFSET 0x380
@ -23,6 +71,162 @@
#define RPN_SHIFT 0 #define RPN_SHIFT 0
#define RPN_MASK GENMASK(11, 0) #define RPN_MASK GENMASK(11, 0)
static void security_init(void)
{
/* Disable the backup domain write protection */
/* the protection is enable at each reset by hardware */
/* And must be disable by software */
setbits_le32(PWR_CR1, PWR_CR1_DBP);
while (!(readl(PWR_CR1) & PWR_CR1_DBP))
;
/* If RTC clock isn't enable so this is a cold boot then we need
* to reset the backup domain
*/
if (!(readl(RCC_BDCR) & RCC_BDCR_RTCSRC)) {
setbits_le32(RCC_BDCR, RCC_BDCR_VSWRST);
while (!(readl(RCC_BDCR) & RCC_BDCR_VSWRST))
;
clrbits_le32(RCC_BDCR, RCC_BDCR_VSWRST);
}
/* allow non secure access in Write/Read for all peripheral */
writel(0, ETZPC_DECPROT0);
/* Open SYSRAM for no secure access */
writel(0x0, ETZPC_TZMA1_SIZE);
/* enable MCE clock */
writel(BIT(1), RCC_MP_AHB6ENSETR);
/* enable TZC clock */
writel(BIT(11), RCC_MP_APB5ENSETR);
/* Disable Filter 0 */
writel(0, TZC_GATE_KEEPER);
/* Region 0 set to no access by default */
/* bit 0 / 16 => nsaid0 read/write Enable
* bit 1 / 17 => nsaid1 read/write Enable
* ...
* bit 15 / 31 => nsaid15 read/write Enable
*/
writel(0xFFFFFFFF, TZC_REGION_ID_ACCESS(0));
/* bit 30 / 31 => Secure Global Enable : write/read */
writel(BIT(0) | BIT(30) | BIT(31), TZC_REGION_ATTRIBUTE(0));
writel(0xFFFFFFFF, TZC_REGION_ID_ACCESS(1));
writel(0xC0000000, TZC_REGION_BASE(1));
writel(0xDDFFFFFF, TZC_REGION_TOP(1));
writel(BIT(0) | BIT(30) | BIT(31), TZC_REGION_ATTRIBUTE(1));
writel(0x00000000, TZC_REGION_ID_ACCESS(2));
writel(0xDE000000, TZC_REGION_BASE(2));
writel(0xDFFFFFFF, TZC_REGION_TOP(2));
writel(BIT(0) | BIT(30) | BIT(31), TZC_REGION_ATTRIBUTE(2));
writel(0xFFFFFFFF, TZC_REGION_ID_ACCESS(3));
writel(0x00000000, TZC_REGION_BASE(3));
writel(0xBFFFFFFF, TZC_REGION_TOP(3));
writel(BIT(0) | BIT(30) | BIT(31), TZC_REGION_ATTRIBUTE(3));
/* Set Action */
writel(BIT(0), TZC_ACTION);
/* Enable Filter 0 */
writel(BIT(0), TZC_GATE_KEEPER);
/* RCC trust zone deactivated */
writel(0x0, RCC_TZCR);
/* TAMP: deactivate the internal tamper
* Bit 23 ITAMP8E: monotonic counter overflow
* Bit 20 ITAMP5E: RTC calendar overflow
* Bit 19 ITAMP4E: HSE monitoring
* Bit 18 ITAMP3E: LSE monitoring
* Bit 16 ITAMP1E: RTC power domain supply monitoring
*/
writel(0x0, TAMP_CR1);
}
/*
* Debug init
*/
void dbgmcu_init(void)
{
/*
* Freeze IWDG2 if Cortex-A7 is in debug mode
* done in TF-A for TRUSTED boot and
* DBGMCU access is controlled by BSEC_DENABLE.DBGSWENABLE
*/
if (bsec_dbgswenable()) {
setbits_le32(RCC_DBGCFGR, RCC_DBGCFGR_DBGCKEN);
setbits_le32(DBGMCU_APB4FZ1, DBGMCU_APB4FZ1_IWDG2);
}
}
void spl_board_init(void)
{
struct udevice *dev;
u8 *tlb;
int ret;
dbgmcu_init();
/* force probe of BSEC driver to shadow the upper OTP */
ret = uclass_get_device_by_driver(UCLASS_MISC, DM_DRIVER_GET(stm32mp_bsec), &dev);
if (ret)
log_warning("BSEC probe failed: %d\n", ret);
/* Enable Dcache here, now that DRAM is available */
if (IS_ENABLED(CONFIG_XPL_BUILD) && IS_ENABLED(CONFIG_STM32MP13X)) {
tlb = memalign(0x4000, PGTABLE_SIZE);
if (!tlb)
return;
gd->arch.tlb_size = PGTABLE_SIZE;
gd->arch.tlb_addr = (unsigned long)tlb;
dcache_enable();
}
}
/* get bootmode from ROM code boot context: saved in TAMP register */
static void update_bootmode(void)
{
u32 boot_mode;
u32 bootrom_itf = readl(get_stm32mp_rom_api_table());
u32 bootrom_device, bootrom_instance;
/* enable TAMP clock = RTCAPBEN */
writel(BIT(8), RCC_MP_APB5ENSETR);
/* read bootrom context */
bootrom_device =
(bootrom_itf & BOOTROM_MODE_MASK) >> BOOTROM_MODE_SHIFT;
bootrom_instance =
(bootrom_itf & BOOTROM_INSTANCE_MASK) >> BOOTROM_INSTANCE_SHIFT;
boot_mode =
((bootrom_device << BOOT_TYPE_SHIFT) & BOOT_TYPE_MASK) |
((bootrom_instance << BOOT_INSTANCE_SHIFT) &
BOOT_INSTANCE_MASK);
/* save the boot mode in TAMP backup register */
clrsetbits_le32(TAMP_BOOT_CONTEXT,
TAMP_BOOT_MODE_MASK,
boot_mode << TAMP_BOOT_MODE_SHIFT);
}
/* weak function: STM32MP15x mach init for boot without TFA */
void stm32mp_cpu_init(void)
{
if (IS_ENABLED(CONFIG_XPL_BUILD)) {
security_init();
update_bootmode();
}
}
static u32 read_idc(void) static u32 read_idc(void)
{ {
void *syscfg = syscon_get_first_range(STM32MP_SYSCON_SYSCFG); void *syscfg = syscon_get_first_range(STM32MP_SYSCON_SYSCFG);

View File

@ -7,4 +7,5 @@ obj-y += cpu.o
obj-y += arm64-mmu.o obj-y += arm64-mmu.o
obj-y += rifsc.o obj-y += rifsc.o
obj-$(CONFIG_OF_SYSTEM_SETUP) += fdt.o obj-$(CONFIG_OF_SYSTEM_SETUP) += fdt.o
obj-$(CONFIG_STM32MP23X) += stm32mp23x.o
obj-$(CONFIG_STM32MP25X) += stm32mp25x.o obj-$(CONFIG_STM32MP25X) += stm32mp25x.o

View File

@ -0,0 +1,191 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause
/*
* Copyright (C) 2025, STMicroelectronics - All Rights Reserved
*/
#define LOG_CATEGORY LOGC_ARCH
#include <log.h>
#include <syscon.h>
#include <asm/io.h>
#include <asm/arch/stm32.h>
#include <asm/arch/sys_proto.h>
/* SYSCFG register */
#define SYSCFG_DEVICEID_OFFSET 0x6400
#define SYSCFG_DEVICEID_DEV_ID_MASK GENMASK(11, 0)
#define SYSCFG_DEVICEID_DEV_ID_SHIFT 0
/* Revision ID = OTP102[5:0] 6 bits : 3 for Major / 3 for Minor*/
#define REVID_SHIFT 0
#define REVID_MASK GENMASK(5, 0)
/* Device Part Number (RPN) = OTP9 */
#define RPN_SHIFT 0
#define RPN_MASK GENMASK(31, 0)
/* Package = bit 0:2 of OTP122 => STM32MP23_PKG defines
* - 000: Custom package
* - 011: TFBGA361 => AL = 10x10, 361 balls pith 0.5mm
* - 100: TFBGA424 => AK = 14x14, 424 balls pith 0.5mm
* - 101: TFBGA436 => AI = 18x18, 436 balls pith 0.5mm
* - others: Reserved
*/
#define PKG_SHIFT 0
#define PKG_MASK GENMASK(2, 0)
static u32 read_deviceid(void)
{
void *syscfg = syscon_get_first_range(STM32MP_SYSCON_SYSCFG);
return readl(syscfg + SYSCFG_DEVICEID_OFFSET);
}
u32 get_cpu_dev(void)
{
return (read_deviceid() & SYSCFG_DEVICEID_DEV_ID_MASK) >> SYSCFG_DEVICEID_DEV_ID_SHIFT;
}
u32 get_cpu_rev(void)
{
return get_otp(BSEC_OTP_REVID, REVID_SHIFT, REVID_MASK);
}
/* Get Device Part Number (RPN) from OTP */
u32 get_cpu_type(void)
{
return get_otp(BSEC_OTP_RPN, RPN_SHIFT, RPN_MASK);
}
/* Get Package options from OTP */
u32 get_cpu_package(void)
{
return get_otp(BSEC_OTP_PKG, PKG_SHIFT, PKG_MASK);
}
int get_eth_nb(void)
{
int nb_eth;
switch (get_cpu_type()) {
case CPU_STM32MP235Fxx:
fallthrough;
case CPU_STM32MP235Dxx:
fallthrough;
case CPU_STM32MP235Cxx:
fallthrough;
case CPU_STM32MP235Axx:
fallthrough;
case CPU_STM32MP233Fxx:
fallthrough;
case CPU_STM32MP233Dxx:
fallthrough;
case CPU_STM32MP233Cxx:
fallthrough;
case CPU_STM32MP233Axx:
nb_eth = 2; /* dual ETH */
break;
case CPU_STM32MP231Fxx:
fallthrough;
case CPU_STM32MP231Dxx:
fallthrough;
case CPU_STM32MP231Cxx:
fallthrough;
case CPU_STM32MP231Axx:
nb_eth = 1; /* single ETH */
break;
default:
nb_eth = 0;
break;
}
return nb_eth;
}
void get_soc_name(char name[SOC_NAME_SIZE])
{
char *cpu_s, *cpu_r, *package;
cpu_s = "????";
cpu_r = "?";
package = "??";
if (get_cpu_dev() == CPU_DEV_STM32MP23) {
switch (get_cpu_type()) {
case CPU_STM32MP235Fxx:
cpu_s = "235F";
break;
case CPU_STM32MP235Dxx:
cpu_s = "235D";
break;
case CPU_STM32MP235Cxx:
cpu_s = "235C";
break;
case CPU_STM32MP235Axx:
cpu_s = "235A";
break;
case CPU_STM32MP233Fxx:
cpu_s = "233F";
break;
case CPU_STM32MP233Dxx:
cpu_s = "233D";
break;
case CPU_STM32MP233Cxx:
cpu_s = "233C";
break;
case CPU_STM32MP233Axx:
cpu_s = "233A";
break;
case CPU_STM32MP231Fxx:
cpu_s = "231F";
break;
case CPU_STM32MP231Dxx:
cpu_s = "231D";
break;
case CPU_STM32MP231Cxx:
cpu_s = "231C";
break;
case CPU_STM32MP231Axx:
cpu_s = "231A";
break;
default:
cpu_s = "23??";
break;
}
/* REVISION */
switch (get_cpu_rev()) {
case OTP_REVID_1:
cpu_r = "A";
break;
case OTP_REVID_2:
cpu_r = "B";
break;
case OTP_REVID_2_1:
cpu_r = "Y";
break;
case OTP_REVID_2_2:
cpu_r = "X";
break;
default:
break;
}
/* PACKAGE */
switch (get_cpu_package()) {
case STM32MP23_PKG_CUSTOM:
package = "XX";
break;
case STM32MP23_PKG_AL_VFBGA361:
package = "AL";
break;
case STM32MP23_PKG_AK_VFBGA424:
package = "AK";
break;
case STM32MP23_PKG_AJ_TFBGA361:
package = "AJ";
break;
default:
break;
}
}
snprintf(name, SOC_NAME_SIZE, "STM32MP%s%s Rev.%s", cpu_s, package, cpu_r);
}

View File

@ -10,6 +10,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/arch/timers.h> #include <asm/arch/timers.h>
#include <dm/device_compat.h> #include <dm/device_compat.h>
#include <linux/bitfield.h>
static void stm32_timers_get_arr_size(struct udevice *dev) static void stm32_timers_get_arr_size(struct udevice *dev)
{ {
@ -29,6 +30,33 @@ static void stm32_timers_get_arr_size(struct udevice *dev)
writel(arr, plat->base + TIM_ARR); writel(arr, plat->base + TIM_ARR);
} }
static int stm32_timers_probe_hwcfgr(struct udevice *dev)
{
struct stm32_timers_plat *plat = dev_get_plat(dev);
struct stm32_timers_priv *priv = dev_get_priv(dev);
u32 val;
if (!plat->ipidr) {
/* fallback to legacy method for probing counter width */
stm32_timers_get_arr_size(dev);
return 0;
}
val = readl(plat->base + TIM_IPIDR);
/* Sanity check on IP identification register */
if (val != plat->ipidr) {
dev_err(dev, "Unexpected identification: %u\n", val);
return -EINVAL;
}
val = readl(plat->base + TIM_HWCFGR2);
/* Counter width in bits, max reload value is BIT(width) - 1 */
priv->max_arr = BIT(FIELD_GET(TIM_HWCFGR2_CNT_WIDTH, val)) - 1;
dev_dbg(dev, "TIM width: %ld\n", FIELD_GET(TIM_HWCFGR2_CNT_WIDTH, val));
return 0;
}
static int stm32_timers_of_to_plat(struct udevice *dev) static int stm32_timers_of_to_plat(struct udevice *dev)
{ {
struct stm32_timers_plat *plat = dev_get_plat(dev); struct stm32_timers_plat *plat = dev_get_plat(dev);
@ -38,6 +66,7 @@ static int stm32_timers_of_to_plat(struct udevice *dev)
dev_err(dev, "can't get address\n"); dev_err(dev, "can't get address\n");
return -ENOENT; return -ENOENT;
} }
plat->ipidr = (u32)dev_get_driver_data(dev);
return 0; return 0;
} }
@ -60,13 +89,16 @@ static int stm32_timers_probe(struct udevice *dev)
priv->rate = clk_get_rate(&clk); priv->rate = clk_get_rate(&clk);
stm32_timers_get_arr_size(dev); ret = stm32_timers_probe_hwcfgr(dev);
if (ret)
clk_disable(&clk);
return ret; return ret;
} }
static const struct udevice_id stm32_timers_ids[] = { static const struct udevice_id stm32_timers_ids[] = {
{ .compatible = "st,stm32-timers" }, { .compatible = "st,stm32-timers" },
{ .compatible = "st,stm32mp25-timers", .data = STM32MP25_TIM_IPIDR },
{} {}
}; };

View File

@ -1,7 +1,7 @@
config CMD_STBOARD config CMD_STBOARD
bool "stboard - command for OTP board information" bool "stboard - command for OTP board information"
depends on ARCH_STM32MP depends on ARCH_STM32MP
default y if TARGET_ST_STM32MP25X || TARGET_ST_STM32MP15X || TARGET_ST_STM32MP13X default y if TARGET_ST_STM32MP13X || TARGET_ST_STM32MP15X || TARGET_ST_STM32MP23X || TARGET_ST_STM32MP25X
help help
This compile the stboard command to This compile the stboard command to
read and write the board in the OTP. read and write the board in the OTP.

View File

@ -14,8 +14,19 @@
#include <power/pmic.h> #include <power/pmic.h>
#include <power/stpmic1.h> #include <power/stpmic1.h>
static bool is_stm32mp13xx(void)
{
if (!IS_ENABLED(CONFIG_STM32MP13X))
return false;
return of_machine_is_compatible("st,stm32mp131") ||
of_machine_is_compatible("st,stm32mp133") ||
of_machine_is_compatible("st,stm32mp135");
}
int board_ddr_power_init(enum ddr_type ddr_type) int board_ddr_power_init(enum ddr_type ddr_type)
{ {
bool is_mp13 = is_stm32mp13xx();
struct udevice *dev; struct udevice *dev;
bool buck3_at_1800000v = false; bool buck3_at_1800000v = false;
int ret; int ret;
@ -30,18 +41,21 @@ int board_ddr_power_init(enum ddr_type ddr_type)
switch (ddr_type) { switch (ddr_type) {
case STM32MP_DDR3: case STM32MP_DDR3:
/* VTT = Set LDO3 to sync mode */ /* VTT = Set LDO3 to sync mode */
ret = pmic_reg_read(dev, STPMIC1_LDOX_MAIN_CR(STPMIC1_LDO3)); if (!is_mp13) {
if (ret < 0) /* Enable VTT only on STM32MP15xx */
return ret; ret = pmic_reg_read(dev, STPMIC1_LDOX_MAIN_CR(STPMIC1_LDO3));
if (ret < 0)
return ret;
ret &= ~STPMIC1_LDO3_MODE; ret &= ~STPMIC1_LDO3_MODE;
ret &= ~STPMIC1_LDO12356_VOUT_MASK; ret &= ~STPMIC1_LDO12356_VOUT_MASK;
ret |= STPMIC1_LDO_VOUT(STPMIC1_LDO3_DDR_SEL); ret |= STPMIC1_LDO_VOUT(STPMIC1_LDO3_DDR_SEL);
ret = pmic_reg_write(dev, STPMIC1_LDOX_MAIN_CR(STPMIC1_LDO3), ret = pmic_reg_write(dev, STPMIC1_LDOX_MAIN_CR(STPMIC1_LDO3),
ret); ret);
if (ret < 0) if (ret < 0)
return ret; return ret;
}
/* VDD_DDR = Set BUCK2 to 1.35V */ /* VDD_DDR = Set BUCK2 to 1.35V */
ret = pmic_clrsetbits(dev, ret = pmic_clrsetbits(dev,
@ -69,11 +83,14 @@ int board_ddr_power_init(enum ddr_type ddr_type)
mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS); mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);
/* Enable VTT = LDO3 */ /* Enable VTT = LDO3 */
ret = pmic_clrsetbits(dev, if (!is_mp13) {
STPMIC1_LDOX_MAIN_CR(STPMIC1_LDO3), /* Enable VTT only on STM32MP15xx */
STPMIC1_LDO_ENA, STPMIC1_LDO_ENA); ret = pmic_clrsetbits(dev,
if (ret < 0) STPMIC1_LDOX_MAIN_CR(STPMIC1_LDO3),
return ret; STPMIC1_LDO_ENA, STPMIC1_LDO_ENA);
if (ret < 0)
return ret;
}
mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS); mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);

View File

@ -9,17 +9,32 @@
#include <asm/arch/stm32.h> #include <asm/arch/stm32.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#if IS_ENABLED(CONFIG_STM32MP13X)
#define RCC_MP_APB1ENSETR (STM32_RCC_BASE + 0x0700)
#define RCC_MP_AHB4ENSETR (STM32_RCC_BASE + 0x0768)
#elif IS_ENABLED(CONFIG_STM32MP15X)
#define RCC_MP_APB1ENSETR (STM32_RCC_BASE + 0x0A00) #define RCC_MP_APB1ENSETR (STM32_RCC_BASE + 0x0A00)
#define RCC_MP_AHB4ENSETR (STM32_RCC_BASE + 0x0A28) #define RCC_MP_AHB4ENSETR (STM32_RCC_BASE + 0x0A28)
#endif
#define GPIOA_BASE 0x50002000
#define GPIOG_BASE 0x50008000 #define GPIOG_BASE 0x50008000
void board_debug_uart_init(void) void board_debug_uart_init(void)
{ {
if (CONFIG_DEBUG_UART_BASE == STM32_UART4_BASE) { if (CONFIG_DEBUG_UART_BASE != STM32_UART4_BASE)
/* UART4 clock enable */ return;
setbits_le32(RCC_MP_APB1ENSETR, BIT(16));
/* UART4 clock enable */
setbits_le32(RCC_MP_APB1ENSETR, BIT(16));
if (IS_ENABLED(CONFIG_STM32MP13X)) {
/* GPIOA clock enable */
writel(BIT(0), RCC_MP_AHB4ENSETR);
/* GPIO configuration for DH boards: Uart4 TX = A9 */
writel(0xfffbffff, GPIOA_BASE + 0x00);
writel(0x00000080, GPIOA_BASE + 0x24);
} else if (IS_ENABLED(CONFIG_STM32MP15X)) {
/* GPIOG clock enable */ /* GPIOG clock enable */
writel(BIT(6), RCC_MP_AHB4ENSETR); writel(BIT(6), RCC_MP_AHB4ENSETR);
/* GPIO configuration for ST boards: Uart4 TX = G11 */ /* GPIO configuration for ST boards: Uart4 TX = G11 */

View File

@ -1,3 +1,17 @@
if TARGET_ST_STM32MP23X
config SYS_BOARD
default "stm32mp2"
config SYS_VENDOR
default "st"
config SYS_CONFIG_NAME
default "stm32mp23_st_common"
source "board/st/common/Kconfig"
endif
if TARGET_ST_STM32MP25X if TARGET_ST_STM32MP25X
config SYS_BOARD config SYS_BOARD

View File

@ -48,6 +48,8 @@ CONFIG_CMD_EXT4_WRITE=y
CONFIG_CMD_LOG=y CONFIG_CMD_LOG=y
CONFIG_CMD_UBI=y CONFIG_CMD_UBI=y
CONFIG_OF_LIVE=y CONFIG_OF_LIVE=y
CONFIG_OF_UPSTREAM_BUILD_VENDOR=y
CONFIG_OF_UPSTREAM_VENDOR="st"
CONFIG_ENV_IS_NOWHERE=y CONFIG_ENV_IS_NOWHERE=y
CONFIG_ENV_IS_IN_MMC=y CONFIG_ENV_IS_IN_MMC=y
CONFIG_ENV_REDUNDANT=y CONFIG_ENV_REDUNDANT=y

View File

@ -2,7 +2,6 @@
CONFIG_ARM=y CONFIG_ARM=y
CONFIG_ARCH_STM32MP=y CONFIG_ARCH_STM32MP=y
CONFIG_TFABOOT=y
CONFIG_SYS_MALLOC_F_LEN=0x1c0000 CONFIG_SYS_MALLOC_F_LEN=0x1c0000
CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc0400000 CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc0400000
CONFIG_ENV_OFFSET=0x3E0000 CONFIG_ENV_OFFSET=0x3E0000
@ -12,11 +11,16 @@ CONFIG_DDR_CACHEABLE_SIZE=0x8000000
CONFIG_TARGET_ST_STM32MP13X=y CONFIG_TARGET_ST_STM32MP13X=y
CONFIG_ENV_OFFSET_REDUND=0x3F0000 CONFIG_ENV_OFFSET_REDUND=0x3F0000
CONFIG_STM32MP15_PWR=y CONFIG_STM32MP15_PWR=y
# CONFIG_ARMV7_NONSEC is not set CONFIG_ARMV7_NONSEC=y
CONFIG_ARMV7_BOOT_SEC_DEFAULT=y
CONFIG_ARMV7_PSCI_NR_CPUS=2
# CONFIG_ARMV7_LPAE is not set
CONFIG_SYS_MEMTEST_START=0xc0000000 CONFIG_SYS_MEMTEST_START=0xc0000000
CONFIG_SYS_MEMTEST_END=0xc4000000 CONFIG_SYS_MEMTEST_END=0xc4000000
CONFIG_SYS_MEM_TOP_HIDE=0x2000000
CONFIG_BOOTSTAGE_RECORD_COUNT=100 CONFIG_BOOTSTAGE_RECORD_COUNT=100
CONFIG_BOOTDELAY=3 CONFIG_BOOTDELAY=3
CONFIG_BOOTM_OPTEE=y
CONFIG_SYS_CONSOLE_IS_IN_ENV=y CONFIG_SYS_CONSOLE_IS_IN_ENV=y
CONFIG_CMD_ASKENV=y CONFIG_CMD_ASKENV=y
CONFIG_CMD_ERASEENV=y CONFIG_CMD_ERASEENV=y
@ -31,20 +35,28 @@ CONFIG_ENV_IS_NOWHERE=y
CONFIG_ENV_IS_IN_MMC=y CONFIG_ENV_IS_IN_MMC=y
CONFIG_ENV_MMC_USE_DT=y CONFIG_ENV_MMC_USE_DT=y
CONFIG_ENV_SPI_MAX_HZ=50000000 CONFIG_ENV_SPI_MAX_HZ=50000000
CONFIG_CLK_SCMI=y
CONFIG_SET_DFU_ALT_INFO=y CONFIG_SET_DFU_ALT_INFO=y
CONFIG_SYS_I2C_EEPROM_ADDR=0x50 CONFIG_SYS_I2C_EEPROM_ADDR=0x50
CONFIG_ENV_MMC_DEVICE_INDEX=0 CONFIG_ENV_MMC_DEVICE_INDEX=0
CONFIG_ENV_MMC_EMMC_HW_PARTITION=1 CONFIG_ENV_MMC_EMMC_HW_PARTITION=1
CONFIG_PHY_REALTEK=y CONFIG_PHY_REALTEK=y
CONFIG_DM_REGULATOR_SCMI=y
CONFIG_RESET_SCMI=y
CONFIG_DM_RNG=y CONFIG_DM_RNG=y
CONFIG_RNG_STM32=y CONFIG_RNG_STM32=y
CONFIG_SYSRESET_PSCI=y
CONFIG_TEE=y
CONFIG_OPTEE=y
# CONFIG_OPTEE_TA_AVB is not set
CONFIG_USB_ONBOARD_HUB=y CONFIG_USB_ONBOARD_HUB=y
CONFIG_USB_HUB_DEBOUNCE_TIMEOUT=2000 CONFIG_USB_HUB_DEBOUNCE_TIMEOUT=2000
CONFIG_ERRNO_STR=y CONFIG_ERRNO_STR=y
CONFIG_OPTEE_LIB=y
CONFIG_OPTEE_IMAGE=y
CONFIG_OPTEE_TZDRAM_SIZE=0x02000000
CONFIG_SPL_TEXT_BASE=0x2FFE0000
CONFIG_SPL_CLK_CCF=y
CONFIG_SPL_CLK_COMPOSITE_CCF=y
# CONFIG_SPL_SHA1 is not set
# CONFIG_SPL_SHA256 is not set
CONFIG_SPL_HAVE_INIT_STACK=y
CONFIG_SPL_SYS_MALLOC_F_LEN=0x8000
CONFIG_SPL_PINCTRL=y
CONFIG_SPL_PINCTRL_GENERIC=y
CONFIG_SPL_PINMUX=y
CONFIG_SPL_PINCONF=y
CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000

View File

@ -2,10 +2,6 @@
# CONFIG_ARMV7_VIRT is not set # CONFIG_ARMV7_VIRT is not set
# CONFIG_BINMAN_FDT is not set # CONFIG_BINMAN_FDT is not set
# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_SPL_PARTITION_UUIDS is not set
# CONFIG_SPL_PINCTRL_FULL is not set
# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
CONFIG_BOARD_EARLY_INIT_F=y CONFIG_BOARD_EARLY_INIT_F=y
CONFIG_BOARD_SIZE_LIMIT=1441792 CONFIG_BOARD_SIZE_LIMIT=1441792
CONFIG_BOOTCOUNT_BOOTLIMIT=3 CONFIG_BOOTCOUNT_BOOTLIMIT=3
@ -20,9 +16,7 @@ CONFIG_CMD_STM32PROG_OTP=y
CONFIG_CONSOLE_MUX=y CONFIG_CONSOLE_MUX=y
CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc0100000 CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc0100000
CONFIG_DM_HWSPINLOCK=y CONFIG_DM_HWSPINLOCK=y
CONFIG_DM_REGULATOR_STM32_VREFBUF=y
CONFIG_HAS_BOARD_SIZE_LIMIT=y CONFIG_HAS_BOARD_SIZE_LIMIT=y
CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
CONFIG_HWSPINLOCK_STM32=y CONFIG_HWSPINLOCK_STM32=y
CONFIG_KS8851_MLL=y CONFIG_KS8851_MLL=y
CONFIG_OF_SPL_REMOVE_PROPS="interrupts interrupt-names interrupts-extended interrupt-controller \\\#interrupt-cells interrupt-parent dmas dma-names assigned-clocks assigned-clock-rates assigned-clock-parents hwlocks access-controllers" CONFIG_OF_SPL_REMOVE_PROPS="interrupts interrupt-names interrupts-extended interrupt-controller \\\#interrupt-cells interrupt-parent dmas dma-names assigned-clocks assigned-clock-rates assigned-clock-parents hwlocks access-controllers"
@ -31,42 +25,7 @@ CONFIG_PINCTRL_STMFX=y
CONFIG_REMOTEPROC_STM32_COPRO=y CONFIG_REMOTEPROC_STM32_COPRO=y
CONFIG_SERVERIP="192.168.1.1" CONFIG_SERVERIP="192.168.1.1"
CONFIG_SF_DEFAULT_SPEED=50000000 CONFIG_SF_DEFAULT_SPEED=50000000
CONFIG_SPL=y
CONFIG_SPL_BLOCK_CACHE=y
CONFIG_SPL_BOOTCOUNT_LIMIT=y
CONFIG_SPL_CUSTOM_SYS_MALLOC_ADDR=0xc0300000
CONFIG_SPL_DFU=y
CONFIG_SPL_DM_REGULATOR=y
CONFIG_SPL_DM_REGULATOR_STPMIC1=y
CONFIG_SPL_DM_SPI=y
CONFIG_SPL_DM_SPI_FLASH=y
CONFIG_SPL_DM_USB_GADGET=y
CONFIG_SPL_ENV_IS_NOWHERE=y
CONFIG_SPL_ENV_SUPPORT=y
CONFIG_SPL_FOOTPRINT_LIMIT=y
CONFIG_SPL_HAS_CUSTOM_MALLOC_START=y
CONFIG_SPL_I2C=y
CONFIG_SPL_LEGACY_IMAGE_FORMAT=y
CONFIG_SPL_LOAD_FIT=y
CONFIG_SPL_LOAD_FIT_ADDRESS=0xc1000000
CONFIG_SPL_MAX_FOOTPRINT=0x3db00
CONFIG_SPL_MMC=y
CONFIG_SPL_MTD=y
CONFIG_SPL_PHY=y
CONFIG_SPL_POWER=y
CONFIG_SPL_RAM_DEVICE=y
CONFIG_SPL_SPI=y
CONFIG_SPL_SPI_FLASH_MTD=y
CONFIG_SPL_SPI_FLASH_SUPPORT=y
CONFIG_SPL_HAVE_INIT_STACK=y
CONFIG_SPL_STACK=0x30000000
CONFIG_SPL_SYS_MALLOC=y
CONFIG_SPL_SYS_MALLOC_SIZE=0x1d00000
CONFIG_SPL_SYS_MMCSD_RAW_MODE=y
CONFIG_SPL_TEXT_BASE=0x2FFC2500
CONFIG_SPL_USB_GADGET=y
CONFIG_STM32_ADC=y CONFIG_STM32_ADC=y
CONFIG_SYSRESET_SYSCON=y
CONFIG_SYS_BOOTCOUNT_ADDR=0x5C00A14C CONFIG_SYS_BOOTCOUNT_ADDR=0x5C00A14C
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION=0x3 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION=0x3
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y
@ -77,3 +36,10 @@ CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000
CONFIG_TARGET_DH_STM32MP1_PDK2=y CONFIG_TARGET_DH_STM32MP1_PDK2=y
CONFIG_USE_SERVERIP=y CONFIG_USE_SERVERIP=y
CONFIG_WATCHDOG_AUTOSTART=y CONFIG_WATCHDOG_AUTOSTART=y
CONFIG_SPI_FLASH_MACRONIX=y
CONFIG_SPI_FLASH_SPANSION=y
CONFIG_SPI_FLASH_STMICRO=y
CONFIG_SPL_LEGACY_IMAGE_FORMAT=y
CONFIG_SPL_TEXT_BASE=0x2FFC2500
CONFIG_SPL_BLOCK_CACHE=y
CONFIG_SPL_MMC=y

View File

@ -0,0 +1,82 @@
CONFIG_ARM=y
CONFIG_ARCH_STM32MP=y
CONFIG_SYS_MALLOC_F_LEN=0x600000
CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x90000000
CONFIG_ENV_OFFSET=0x900000
CONFIG_ENV_SECT_SIZE=0x40000
CONFIG_DEFAULT_DEVICE_TREE="st/stm32mp235f-dk"
CONFIG_SYS_BOOTM_LEN=0x2000000
CONFIG_SYS_LOAD_ADDR=0x84000000
CONFIG_STM32MP23X=y
CONFIG_DDR_CACHEABLE_SIZE=0x10000000
CONFIG_CMD_STM32KEY=y
CONFIG_ENV_OFFSET_REDUND=0x940000
CONFIG_TARGET_ST_STM32MP23X=y
CONFIG_SYS_MEMTEST_START=0x84000000
CONFIG_SYS_MEMTEST_END=0x88000000
CONFIG_API=y
CONFIG_SYS_MMC_MAX_DEVICE=3
CONFIG_FIT=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_BOOTDELAY=1
CONFIG_BOOTCOMMAND="run bootcmd_stm32mp"
CONFIG_SYS_PROMPT="STM32MP> "
# CONFIG_CMD_BDI is not set
CONFIG_CMD_BOOTZ=y
CONFIG_CMD_ADTIMG=y
# CONFIG_CMD_ELF is not set
CONFIG_CMD_MEMINFO=y
CONFIG_CMD_MEMTEST=y
CONFIG_CMD_CLK=y
CONFIG_CMD_FUSE=y
CONFIG_CMD_GPIO=y
# CONFIG_CMD_LOADB is not set
CONFIG_CMD_MMC=y
CONFIG_CMD_CACHE=y
CONFIG_CMD_TIME=y
CONFIG_CMD_RNG=y
CONFIG_CMD_TIMER=y
CONFIG_CMD_REGULATOR=y
CONFIG_CMD_LOG=y
CONFIG_CMD_UBI=y
CONFIG_OF_LIVE=y
CONFIG_OF_UPSTREAM_BUILD_VENDOR=y
CONFIG_OF_UPSTREAM_VENDOR="st"
CONFIG_ENV_IS_NOWHERE=y
CONFIG_ENV_IS_IN_MMC=y
CONFIG_ENV_IS_IN_SPI_FLASH=y
CONFIG_ENV_IS_IN_UBI=y
CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
CONFIG_ENV_UBI_PART="UBI"
CONFIG_ENV_UBI_VOLUME="uboot_config"
CONFIG_ENV_UBI_VOLUME_REDUND="uboot_config_r"
CONFIG_SYS_MMC_ENV_DEV=-1
CONFIG_NO_NET=y
CONFIG_SYS_64BIT_LBA=y
CONFIG_BUTTON=y
CONFIG_BUTTON_GPIO=y
CONFIG_GPIO_HOG=y
CONFIG_DM_I2C=y
CONFIG_SYS_I2C_STM32F7=y
CONFIG_LED=y
CONFIG_LED_GPIO=y
CONFIG_SUPPORT_EMMC_BOOT=y
CONFIG_STM32_SDMMC2=y
CONFIG_MTD=y
CONFIG_USE_SYS_MAX_FLASH_BANKS=y
CONFIG_SPI_FLASH=y
CONFIG_PINCONF=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_REGULATOR_GPIO=y
CONFIG_RAM=y
# CONFIG_STM32MP1_DDR is not set
CONFIG_DM_RNG=y
CONFIG_SERIAL_RX_BUFFER=y
CONFIG_SPI=y
CONFIG_DM_SPI=y
# CONFIG_OPTEE_TA_AVB is not set
CONFIG_WDT=y
CONFIG_WDT_STM32MP=y
CONFIG_WDT_ARM_SMC=y
# CONFIG_UBIFS_SILENCE_DEBUG_DUMP is not set
CONFIG_ERRNO_STR=y

View File

@ -9,6 +9,7 @@ CONFIG_SYS_BOOTM_LEN=0x2000000
CONFIG_SYS_LOAD_ADDR=0x84000000 CONFIG_SYS_LOAD_ADDR=0x84000000
CONFIG_STM32MP25X=y CONFIG_STM32MP25X=y
CONFIG_DDR_CACHEABLE_SIZE=0x10000000 CONFIG_DDR_CACHEABLE_SIZE=0x10000000
CONFIG_MFD_STM32_TIMERS=y
CONFIG_ENV_OFFSET_REDUND=0x940000 CONFIG_ENV_OFFSET_REDUND=0x940000
CONFIG_TARGET_ST_STM32MP25X=y CONFIG_TARGET_ST_STM32MP25X=y
CONFIG_SYS_MEMTEST_START=0x84000000 CONFIG_SYS_MEMTEST_START=0x84000000
@ -29,6 +30,7 @@ CONFIG_CMD_MEMTEST=y
CONFIG_CMD_CLK=y CONFIG_CMD_CLK=y
CONFIG_CMD_FUSE=y CONFIG_CMD_FUSE=y
CONFIG_CMD_GPIO=y CONFIG_CMD_GPIO=y
CONFIG_CMD_PWM=y
# CONFIG_CMD_LOADB is not set # CONFIG_CMD_LOADB is not set
CONFIG_CMD_MMC=y CONFIG_CMD_MMC=y
CONFIG_CMD_CACHE=y CONFIG_CMD_CACHE=y
@ -65,6 +67,8 @@ CONFIG_SPI_FLASH=y
CONFIG_PINCONF=y CONFIG_PINCONF=y
CONFIG_DM_REGULATOR_FIXED=y CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_REGULATOR_GPIO=y CONFIG_DM_REGULATOR_GPIO=y
CONFIG_DM_PWM=y
CONFIG_PWM_STM32=y
CONFIG_RAM=y CONFIG_RAM=y
# CONFIG_STM32MP1_DDR is not set # CONFIG_STM32MP1_DDR is not set
CONFIG_DM_RNG=y CONFIG_DM_RNG=y

View File

@ -2,6 +2,10 @@
# CONFIG_CMD_EXPORTENV is not set # CONFIG_CMD_EXPORTENV is not set
# CONFIG_EFI_LOADER is not set # CONFIG_EFI_LOADER is not set
# CONFIG_ISO_PARTITION is not set # CONFIG_ISO_PARTITION is not set
# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_SPL_PARTITION_UUIDS is not set
# CONFIG_SPL_PINCTRL_FULL is not set
# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
CONFIG_BOOTCOMMAND="run bootcmd_stm32mp" CONFIG_BOOTCOMMAND="run bootcmd_stm32mp"
CONFIG_BOOTCOUNT_LIMIT=y CONFIG_BOOTCOUNT_LIMIT=y
CONFIG_CMD_BOOTCOUNT=y CONFIG_CMD_BOOTCOUNT=y
@ -38,6 +42,7 @@ CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_REGULATOR_GPIO=y CONFIG_DM_REGULATOR_GPIO=y
CONFIG_DM_REGULATOR_STPMIC1=y CONFIG_DM_REGULATOR_STPMIC1=y
CONFIG_DM_REGULATOR_STM32_VREFBUF=y
CONFIG_DM_RTC=y CONFIG_DM_RTC=y
CONFIG_DM_SPI=y CONFIG_DM_SPI=y
CONFIG_DM_SPI_FLASH=y CONFIG_DM_SPI_FLASH=y
@ -49,6 +54,7 @@ CONFIG_ENV_SIZE=0x4000
CONFIG_FAT_WRITE=y CONFIG_FAT_WRITE=y
CONFIG_FIT=y CONFIG_FIT=y
CONFIG_GPIO_HOG=y CONFIG_GPIO_HOG=y
CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
CONFIG_I2C_EEPROM=y CONFIG_I2C_EEPROM=y
CONFIG_IPV6=y CONFIG_IPV6=y
CONFIG_IP_DEFRAG=y CONFIG_IP_DEFRAG=y
@ -58,6 +64,7 @@ CONFIG_MTD=y
CONFIG_NET_RANDOM_ETHADDR=y CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_OF_LIVE=y CONFIG_OF_LIVE=y
CONFIG_OF_UPSTREAM=y CONFIG_OF_UPSTREAM=y
CONFIG_OF_SPL_REMOVE_PROPS="interrupts interrupt-names interrupts-extended interrupt-controller \\\#interrupt-cells interrupt-parent dmas dma-names assigned-clocks assigned-clock-rates assigned-clock-parents hwlocks"
CONFIG_PHY=y CONFIG_PHY=y
CONFIG_PHY_STM32_USBPHYC=y CONFIG_PHY_STM32_USBPHYC=y
CONFIG_PINCONF=y CONFIG_PINCONF=y
@ -66,17 +73,39 @@ CONFIG_PROT_TCP_SACK=y
CONFIG_RTC_STM32=y CONFIG_RTC_STM32=y
CONFIG_SERIAL_RX_BUFFER=y CONFIG_SERIAL_RX_BUFFER=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_SPI_FLASH_MACRONIX=y
CONFIG_SPI_FLASH_MTD=y CONFIG_SPI_FLASH_MTD=y
CONFIG_SPI_FLASH_SFDP_SUPPORT=y CONFIG_SPI_FLASH_SFDP_SUPPORT=y
CONFIG_SPI_FLASH_SPANSION=y
CONFIG_SPI_FLASH_STMICRO=y
CONFIG_SPI_FLASH_WINBOND=y CONFIG_SPI_FLASH_WINBOND=y
CONFIG_SPL=y
CONFIG_SPL_BOOTCOUNT_LIMIT=y
CONFIG_SPL_CUSTOM_SYS_MALLOC_ADDR=0xc0300000
CONFIG_SPL_DFU=y
CONFIG_SPL_DM_SPI=y
CONFIG_SPL_DM_SPI_FLASH=y
CONFIG_SPL_ENV_IS_NOWHERE=y
CONFIG_SPL_ENV_SUPPORT=y
CONFIG_SPL_FOOTPRINT_LIMIT=y
CONFIG_SPL_HAS_CUSTOM_MALLOC_START=y
CONFIG_SPL_I2C=y
CONFIG_SPL_LOAD_FIT=y
CONFIG_SPL_LOAD_FIT_ADDRESS=0xc1000000
CONFIG_SPL_MAX_FOOTPRINT=0x3db00
CONFIG_SPL_MTD=y
CONFIG_SPL_PHY=y
CONFIG_SPL_POWER=y
CONFIG_SPL_RAM_DEVICE=y
CONFIG_SPL_SPI=y
CONFIG_SPL_SPI_FLASH_MTD=y
CONFIG_SPL_SPI_FLASH_SUPPORT=y
CONFIG_SPL_STACK=0x30000000
CONFIG_SPL_SYS_MALLOC=y
CONFIG_SPL_SYS_MALLOC_SIZE=0x1d00000
CONFIG_STM32_FMC2_EBI=y CONFIG_STM32_FMC2_EBI=y
CONFIG_STM32_QSPI=y CONFIG_STM32_QSPI=y
CONFIG_STM32_SDMMC2=y CONFIG_STM32_SDMMC2=y
CONFIG_STM32_SPI=y CONFIG_STM32_SPI=y
CONFIG_SUPPORT_EMMC_BOOT=y CONFIG_SUPPORT_EMMC_BOOT=y
CONFIG_SYSRESET_SYSCON=y
CONFIG_SYS_BOOTCOUNT_MAGIC=0xB0C40000 CONFIG_SYS_BOOTCOUNT_MAGIC=0xB0C40000
CONFIG_SYS_BOOTM_LEN=0x2000000 CONFIG_SYS_BOOTM_LEN=0x2000000
CONFIG_SYS_DISABLE_AUTOLOAD=y CONFIG_SYS_DISABLE_AUTOLOAD=y

View File

@ -336,8 +336,8 @@ static int scmi_clk_probe(struct udevice *dev)
static int __scmi_clk_set_parent(struct clk *clk, struct clk *parent) static int __scmi_clk_set_parent(struct clk *clk, struct clk *parent)
{ {
struct scmi_clk_parent_set_in in = { struct scmi_clk_parent_set_in in = {
.clock_id = clk->id, .clock_id = clk_get_id(clk),
.parent_clk = parent->id, .parent_clk = clk_get_id(parent),
}; };
struct scmi_clk_parent_set_out out; struct scmi_clk_parent_set_out out;
struct scmi_msg msg = SCMI_MSG_IN(SCMI_PROTOCOL_ID_CLOCK, struct scmi_msg msg = SCMI_MSG_IN(SCMI_PROTOCOL_ID_CLOCK,

View File

@ -549,8 +549,8 @@ static u32 stm32_get_PLL1_rate(struct stm32_rcc_regs *regs,
divr1 = readl(&regs->pll1divr) & RCC_PLL1DIVR_DIVR1_MASK; divr1 = readl(&regs->pll1divr) & RCC_PLL1DIVR_DIVR1_MASK;
divr1 = (divr1 >> RCC_PLL1DIVR_DIVR1_SHIFT) + 1; divr1 = (divr1 >> RCC_PLL1DIVR_DIVR1_SHIFT) + 1;
fracn1 = readl(&regs->pll1fracr) & RCC_PLL1DIVR_DIVR1_MASK; fracn1 = readl(&regs->pll1fracr) & RCC_PLL1FRACR_FRACN1_MASK;
fracn1 = fracn1 & RCC_PLL1DIVR_DIVR1_SHIFT; fracn1 = (fracn1 >> RCC_PLL1FRACR_FRACN1_SHIFT) + 1;
vco = (pllsrc / divm1) * divn1; vco = (pllsrc / divm1) * divn1;
rate = (pllsrc * fracn1) / (divm1 * 8192); rate = (pllsrc * fracn1) / (divm1 * 8192);

View File

@ -12,6 +12,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/arch/timers.h> #include <asm/arch/timers.h>
#include <dm/device_compat.h> #include <dm/device_compat.h>
#include <linux/bitfield.h>
#include <linux/time.h> #include <linux/time.h>
#define CCMR_CHANNEL_SHIFT 8 #define CCMR_CHANNEL_SHIFT 8
@ -157,7 +158,14 @@ static void stm32_pwm_detect_complementary(struct udevice *dev)
{ {
struct stm32_timers_plat *plat = dev_get_plat(dev_get_parent(dev)); struct stm32_timers_plat *plat = dev_get_plat(dev_get_parent(dev));
struct stm32_pwm_priv *priv = dev_get_priv(dev); struct stm32_pwm_priv *priv = dev_get_priv(dev);
u32 ccer; u32 ccer, val;
if (plat->ipidr) {
/* Simply read from HWCFGR the number of complementary outputs (MP25). */
val = readl(plat->base + TIM_HWCFGR1);
priv->have_complementary_output = !!FIELD_GET(TIM_HWCFGR1_NB_OF_DT, val);
return;
}
/* /*
* If complementary bit doesn't exist writing 1 will have no * If complementary bit doesn't exist writing 1 will have no
@ -192,6 +200,7 @@ static const struct pwm_ops stm32_pwm_ops = {
static const struct udevice_id stm32_pwm_ids[] = { static const struct udevice_id stm32_pwm_ids[] = {
{ .compatible = "st,stm32-pwm" }, { .compatible = "st,stm32-pwm" },
{ .compatible = "st,stm32mp25-pwm" },
{ } { }
}; };

View File

@ -16,7 +16,7 @@ config RESET_STM32MP1
config RESET_STM32MP25 config RESET_STM32MP25
bool "Enable the STM32MP25 reset" bool "Enable the STM32MP25 reset"
depends on STM32MP25X depends on STM32MP23X || STM32MP25X
default y default y
help help
Support for reset controllers on STMicroelectronics STM32MP2 family SoCs. Support for reset controllers on STMicroelectronics STM32MP2 family SoCs.

View File

@ -6,7 +6,7 @@
#include <dm.h> #include <dm.h>
#include <reset-uclass.h> #include <reset-uclass.h>
#include <stm32-reset-core.h> #include "stm32-reset-core.h"
#include <stm32_rcc.h> #include <stm32_rcc.h>
#include <dm/device_compat.h> #include <dm/device_compat.h>
#include <linux/iopoll.h> #include <linux/iopoll.h>

View File

@ -5,7 +5,7 @@
*/ */
#include <dm.h> #include <dm.h>
#include <stm32-reset-core.h> #include "stm32-reset-core.h"
/* Reset clear offset for STM32MP RCC */ /* Reset clear offset for STM32MP RCC */
#define RCC_CLR_OFFSET 0x4 #define RCC_CLR_OFFSET 0x4

View File

@ -5,7 +5,7 @@
*/ */
#include <dm.h> #include <dm.h>
#include <stm32-reset-core.h> #include "stm32-reset-core.h"
#include <stm32mp25_rcc.h> #include <stm32mp25_rcc.h>
#include <dt-bindings/reset/st,stm32mp25-rcc.h> #include <dt-bindings/reset/st,stm32mp25-rcc.h>

View File

@ -5,7 +5,7 @@
*/ */
#include <dm.h> #include <dm.h>
#include <stm32-reset-core.h> #include "stm32-reset-core.h"
/* Timeout for deassert */ /* Timeout for deassert */
#define STM32_DEASSERT_TIMEOUT_US 10000 #define STM32_DEASSERT_TIMEOUT_US 10000
@ -19,7 +19,7 @@ static const struct stm32_reset_cfg *stm32_get_reset_line(struct reset_ctl *rese
ptr_line->offset = bank; ptr_line->offset = bank;
ptr_line->bit_idx = offset; ptr_line->bit_idx = offset;
ptr_line->set_clr = true; ptr_line->set_clr = false;
return ptr_line; return ptr_line;
} }

View File

@ -0,0 +1,130 @@
/* SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause */
/*
* Copyright (C) 2025, STMicroelectronics - All Rights Reserved
*
* Configuration settings for the STM32MP23x CPU
*/
#ifndef __CONFIG_STM32MP23_COMMMON_H
#define __CONFIG_STM32MP23_COMMMON_H
#include <linux/sizes.h>
#include <asm/arch/stm32.h>
/*
* Configuration of the external SRAM memory used by U-Boot
*/
#define CFG_SYS_SDRAM_BASE STM32_DDR_BASE
/*
* For booting Linux, use the first 256 MB of memory, since this is
* the maximum mapped by the Linux kernel during initialization.
*/
#define CFG_SYS_BOOTMAPSZ SZ_256M
#define STM32MP_FIP_IMAGE_GUID \
EFI_GUID(0x19d5df83, 0x11b0, 0x457b, 0xbe, 0x2c, \
0x75, 0x59, 0xc1, 0x31, 0x42, 0xa5)
/*****************************************************************************/
#ifdef CONFIG_DISTRO_DEFAULTS
/*****************************************************************************/
#ifdef CONFIG_NET
#define BOOT_TARGET_PXE(func) func(PXE, pxe, na)
#else
#define BOOT_TARGET_PXE(func)
#endif
#ifdef CONFIG_CMD_MMC
#define BOOT_TARGET_MMC0(func) func(MMC, mmc, 0)
#define BOOT_TARGET_MMC1(func) func(MMC, mmc, 1)
#define BOOT_TARGET_MMC2(func) func(MMC, mmc, 2)
#else
#define BOOT_TARGET_MMC0(func)
#define BOOT_TARGET_MMC1(func)
#define BOOT_TARGET_MMC2(func)
#endif
#ifdef CONFIG_CMD_UBIFS
#define BOOT_TARGET_UBIFS(func) func(UBIFS, ubifs, 0, UBI, boot)
#else
#define BOOT_TARGET_UBIFS(func)
#endif
#ifdef CONFIG_CMD_USB
#define BOOT_TARGET_USB(func) func(USB, usb, 0)
#else
#define BOOT_TARGET_USB(func)
#endif
#define BOOT_TARGET_DEVICES(func) \
BOOT_TARGET_MMC1(func) \
BOOT_TARGET_UBIFS(func) \
BOOT_TARGET_MMC0(func) \
BOOT_TARGET_MMC2(func) \
BOOT_TARGET_USB(func) \
BOOT_TARGET_PXE(func)
/*
* default bootcmd for stm32mp23:
* for serial/usb: execute the stm32prog command
* for mmc boot (eMMC, SD card), distro boot on the same mmc device
* for NAND or SPI-NAND boot, distro boot with UBIFS on UBI partition
* for other boot, use the default distro order in ${boot_targets}
*/
#define STM32MP_BOOTCMD "bootcmd_stm32mp=" \
"echo \"Boot over ${boot_device}${boot_instance}!\";" \
"if test ${boot_device} = serial || test ${boot_device} = usb;" \
"then stm32prog ${boot_device} ${boot_instance}; " \
"else " \
"run env_check;" \
"if test ${boot_device} = mmc;" \
"then env set boot_targets \"mmc${boot_instance}\"; fi;" \
"if test ${boot_device} = nand ||" \
" test ${boot_device} = spi-nand ;" \
"then env set boot_targets ubifs0; fi;" \
"run distro_bootcmd;" \
"fi;\0"
#ifndef STM32MP_BOARD_EXTRA_ENV
#define STM32MP_BOARD_EXTRA_ENV
#endif
#define STM32MP_EXTRA \
"env_check=if env info -p -d -q; then env save; fi\0" \
"boot_net_usb_start=true\0"
/*
* memory layout for 96MB uncompressed/compressed kernel,
* 1M fdt, 1M script, 1M pxe and 1M for overlay
* and the ramdisk at the end.
*/
#define __KERNEL_COMP_ADDR_R __stringify(0x84000000)
#define __KERNEL_COMP_SIZE_R __stringify(0x04000000)
#define __KERNEL_ADDR_R __stringify(0x8a000000)
#define __FDT_ADDR_R __stringify(0x90000000)
#define __SCRIPT_ADDR_R __stringify(0x90100000)
#define __PXEFILE_ADDR_R __stringify(0x90200000)
#define __FDTOVERLAY_ADDR_R __stringify(0x90300000)
#define __RAMDISK_ADDR_R __stringify(0x90400000)
#define STM32MP_MEM_LAYOUT \
"kernel_addr_r=" __KERNEL_ADDR_R "\0" \
"fdt_addr_r=" __FDT_ADDR_R "\0" \
"scriptaddr=" __SCRIPT_ADDR_R "\0" \
"pxefile_addr_r=" __PXEFILE_ADDR_R "\0" \
"fdtoverlay_addr_r=" __FDTOVERLAY_ADDR_R "\0" \
"ramdisk_addr_r=" __RAMDISK_ADDR_R "\0" \
"kernel_comp_addr_r=" __KERNEL_COMP_ADDR_R "\0" \
"kernel_comp_size=" __KERNEL_COMP_SIZE_R "\0"
#include <config_distro_bootcmd.h>
#define CFG_EXTRA_ENV_SETTINGS \
STM32MP_MEM_LAYOUT \
STM32MP_BOOTCMD \
BOOTENV \
STM32MP_EXTRA \
STM32MP_BOARD_EXTRA_ENV
#endif
#endif /* __CONFIG_STM32MP23_COMMMON_H */

View File

@ -0,0 +1,51 @@
/* SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause */
/*
* Copyright (C) 2025, STMicroelectronics - All Rights Reserved
*
* Configuration settings for the STMicroelectonics STM32MP23x boards
*/
#ifndef __CONFIG_STM32MP23_ST_COMMON_H__
#define __CONFIG_STM32MP23_ST_COMMON_H__
#define STM32MP_BOARD_EXTRA_ENV \
"usb_pgood_delay=2000\0" \
"console=ttySTM0\0"
#include <configs/stm32mp23_common.h>
#ifdef CFG_EXTRA_ENV_SETTINGS
/*
* default bootcmd for stm32mp23 STMicroelectronics boards:
* for serial/usb: execute the stm32prog command
* for mmc boot (eMMC, SD card), distro boot on the same mmc device
* for nand or spi-nand boot, distro boot with ubifs on UBI partition or
* sdcard
* for nor boot, distro boot on SD card = mmc0 ONLY !
*/
#define ST_STM32MP23_BOOTCMD "bootcmd_stm32mp=" \
"echo \"Boot over ${boot_device}${boot_instance}!\";" \
"if test ${boot_device} = serial || test ${boot_device} = usb;" \
"then stm32prog ${boot_device} ${boot_instance}; " \
"else " \
"run env_check;" \
"if test ${boot_device} = mmc;" \
"then env set boot_targets \"mmc${boot_instance}\"; fi;" \
"if test ${boot_device} = nand ||" \
" test ${boot_device} = spi-nand ;" \
"then env set boot_targets ubifs0 mmc0; fi;" \
"if test ${boot_device} = nor;" \
"then env set boot_targets mmc0; fi;" \
"run distro_bootcmd;" \
"fi;\0"
#undef CFG_EXTRA_ENV_SETTINGS
#define CFG_EXTRA_ENV_SETTINGS \
STM32MP_MEM_LAYOUT \
ST_STM32MP23_BOOTCMD \
BOOTENV \
STM32MP_EXTRA \
STM32MP_BOARD_EXTRA_ENV
#endif
#endif

View File

@ -2,7 +2,7 @@
/* /*
* Copyright (C) 2022, STMicroelectronics - All Rights Reserved * Copyright (C) 2022, STMicroelectronics - All Rights Reserved
* *
* Configuration settings for the STMicroelectonics STM32MP25x boards * Configuration settings for the STMicroelectronics STM32MP25x boards
*/ */
#ifndef __CONFIG_STM32MP25_ST_COMMON_H__ #ifndef __CONFIG_STM32MP25_ST_COMMON_H__