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/pinctrl/stm32-pinfunc.h
F: include/dt-bindings/reset/stm32mp*
F: include/stm32-reset-core.h
F: include/stm32_rcc.h
F: tools/logos/st.bmp
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;
};
#if defined(CONFIG_TFABOOT)
firmware {
optee {
bootph-all;
@ -27,6 +28,86 @@
psci {
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 {
bootph-all;
@ -52,6 +133,14 @@
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 {
bootph-all;
};

View File

@ -3,7 +3,9 @@
* Copyright (C) 2024 Marek Vasut <marex@denx.de>
*/
#include <dt-bindings/clock/stm32mp13-clksrc.h>
#include "stm32mp13-u-boot.dtsi"
#include "stm32mp13-ddr3-dhsom-1x2Gb-1066-binG.dtsi"
/ {
aliases {
@ -18,8 +20,12 @@
};
};
&etzpc {
compatible = "simple-bus";
};
&flash0 {
bootph-pre-ram;
bootph-all;
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 {
status = "disabled";
};
@ -55,3 +193,23 @@
&usbotg_hs {
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
*/
#include <linux/stringify.h>
#ifdef CONFIG_SPL
&ddr {
clocks = <&rcc AXIDCG>,
@ -21,69 +19,6 @@
"ddrphycapb";
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 = <
DDR_SCHED
DDR_SCHED1
@ -117,111 +52,8 @@
DDR_DX2GCR
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
#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
#include "stm32mp1-ddr.dtsi"

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):
* M_NAND - Micron NAND
* STNOR - STMicrolelctronics M29W128GL
* STNOR - STMicroelectronics M29W128GL
*/
#define GPMC_SIZE_256M 0x0
#define GPMC_SIZE_128M 0x8

View File

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

View File

@ -40,16 +40,19 @@ choice
config STM32MP13X
bool "Support STMicroelectronics STM32MP13x Soc"
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_V7_HAS_NONSEC
select CPU_V7_HAS_VIRT
select OF_BOARD
select OF_BOARD if TFABOOT
select OF_BOARD_SETUP
select PINCTRL_STM32
select STM32_RCC
select STM32_RESET
select STM32_SERIAL
select SUPPORT_SPL if !TFABOOT
select SYS_ARCH_TIMER
imply CMD_NVEDIT_INFO
imply OF_UPSTREAM
@ -81,6 +84,32 @@ config STM32MP15X
STMicroelectronics MPU with core ARMv7
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
bool "Support STMicroelectronics STM32MP25x Soc"
select ARM64
@ -165,6 +194,7 @@ config MFD_STM32_TIMERS
source "arch/arm/mach-stm32mp/Kconfig.13x"
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/cmd_stm32prog/Kconfig"

View File

@ -20,10 +20,11 @@ config TARGET_ST_STM32MP13X
endchoice
config TEXT_BASE
default 0xC0000000
default 0xC0000000 if TFABOOT
default 0xC0100000 if !TFABOOT
config PRE_CON_BUF_ADDR
default 0xC0800000
default 0xC2FFF000
config PRE_CON_BUF_SZ
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_STM32MP13X) += stm32mp1/
obj-$(CONFIG_STM32MP23X) += stm32mp2/
obj-$(CONFIG_STM32MP25X) += stm32mp2/
obj-$(CONFIG_MFD_STM32_TIMERS) += timers.o

View File

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

View File

@ -156,6 +156,8 @@ enum forced_boot_mode {
#endif
#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_BOOT_CONTEXT TAMP_BACKUP_REGISTER(30)
#endif
@ -163,7 +165,7 @@ enum forced_boot_mode {
#endif /* __ASSEMBLY__ */
#endif /* CONFIG_STM32MP15X || CONFIG_STM32MP13X */
#ifdef CONFIG_STM32MP25X
#if defined(CONFIG_STM32MP23X) || defined(CONFIG_STM32MP25X)
#define STM32_USART2_BASE 0x400E0000
#define STM32_USART3_BASE 0x400F0000
#define STM32_UART4_BASE 0x40100000
@ -188,7 +190,7 @@ enum forced_boot_mode {
/* TAMP registers zone 3 RIF 1 (RW) at 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 */
#define STM32_BSEC_SHADOW_OFFSET 0x0
@ -212,14 +214,14 @@ enum forced_boot_mode {
#define BSEC_OTP_MAC 57
#define BSEC_OTP_BOARD 60
#endif
#ifdef CONFIG_STM32MP25X
#if defined(CONFIG_STM32MP23X) || defined(CONFIG_STM32MP25X)
#define BSEC_OTP_SERIAL 5
#define BSEC_OTP_RPN 9
#define BSEC_OTP_REVID 102
#define BSEC_OTP_PKG 122
#define BSEC_OTP_BOARD 246
#define BSEC_OTP_MAC 247
#endif
#endif /* defined(CONFIG_STM32MP23X) || defined(CONFIG_STM32MP25X) */
#ifndef __ASSEMBLY__
#include <asm/types.h>

View File

@ -30,29 +30,44 @@
#define CPU_STM32MP131Fxx 0x05010EC8
#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) */
#define CPU_STM32MP257Cxx 0x00002000
#define CPU_STM32MP255Cxx 0x00082000
#define CPU_STM32MP253Cxx 0x000B2004
#define CPU_STM32MP251Cxx 0x000B3065
#define CPU_STM32MP257Axx 0x40002E00
#define CPU_STM32MP255Axx 0x40082E00
#define CPU_STM32MP253Axx 0x400B2E04
#define CPU_STM32MP251Axx 0x400B3E65
#define CPU_STM32MP257Fxx 0x80002000
#define CPU_STM32MP255Fxx 0x80082000
#define CPU_STM32MP253Fxx 0x800B2004
#define CPU_STM32MP251Fxx 0x800B3065
#define CPU_STM32MP257Dxx 0xC0002E00
#define CPU_STM32MP255Dxx 0xC0082E00
#define CPU_STM32MP253Dxx 0xC00B2E04
#define CPU_STM32MP251Dxx 0xC00B3E65
#define CPU_STM32MP257Cxx 0x00002000
#define CPU_STM32MP255Cxx 0x00082000
#define CPU_STM32MP253Cxx 0x000B2004
#define CPU_STM32MP251Cxx 0x000B3065
#define CPU_STM32MP257Axx 0x40002E00
#define CPU_STM32MP255Axx 0x40082E00
#define CPU_STM32MP253Axx 0x400B2E04
#define CPU_STM32MP251Axx 0x400B3E65
#define CPU_STM32MP257Fxx 0x80002000
#define CPU_STM32MP255Fxx 0x80082000
#define CPU_STM32MP253Fxx 0x800B2004
#define CPU_STM32MP251Fxx 0x800B3065
#define CPU_STM32MP257Dxx 0xC0002E00
#define CPU_STM32MP255Dxx 0xC0082E00
#define CPU_STM32MP253Dxx 0xC00B2E04
#define CPU_STM32MP251Dxx 0xC00B3E65
/* return CPU_STMP32MP...Xxx constants */
u32 get_cpu_type(void);
#define CPU_DEV_STM32MP15 0x500
#define CPU_DEV_STM32MP13 0x501
#define CPU_DEV_STM32MP23 0x505
#define CPU_DEV_STM32MP25 0x505
/* return CPU_DEV constants */
@ -87,6 +102,12 @@ u32 get_cpu_package(void);
#define STM32MP15_PKG_AD_TFBGA257 1
#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 */
#define STM32MP25_PKG_CUSTOM 0
#define STM32MP25_PKG_AL_VFBGA361 1

View File

@ -29,6 +29,10 @@
#define TIM_DMAR 0x4C /* DMA register for transfer */
#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_ARPE BIT(7)
#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_BDTR_MOE BIT(15) /* Main Output Enable */
#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 STM32MP25_TIM_IPIDR 0x00120002
struct stm32_timers_plat {
void __iomem *base;
u32 ipidr;
};
struct stm32_timers_priv {

View File

@ -28,7 +28,9 @@
* early TLB into the .data section so that it not get cleared
* 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);
#endif
u32 get_bootmode(void)
{
@ -95,18 +97,19 @@ void dram_bank_mmu_setup(int bank)
*/
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 */
if (CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
return;
#if !(CONFIG_IS_ENABLED(SYS_ICACHE_OFF) && CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
gd->arch.tlb_size = PGTABLE_SIZE;
gd->arch.tlb_addr = (unsigned long)&early_tlb;
gd->arch.tlb_size = PGTABLE_SIZE;
gd->arch.tlb_addr = (unsigned long)&early_tlb;
#endif
/* enable MMU (default configuration) */
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
* 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,
CONFIG_DDR_CACHEABLE_SIZE,
DCACHE_DEFAULT_OPTION);
}
}
void spl_board_prepare_for_boot(void)

View File

@ -6,11 +6,59 @@
#define LOG_CATEGORY LOGC_ARCH
#include <config.h>
#include <cpu_func.h>
#include <log.h>
#include <syscon.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/arch/bsec.h>
#include <asm/arch/stm32.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 */
#define SYSCFG_IDC_OFFSET 0x380
@ -23,6 +71,162 @@
#define RPN_SHIFT 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)
{
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 += rifsc.o
obj-$(CONFIG_OF_SYSTEM_SETUP) += fdt.o
obj-$(CONFIG_STM32MP23X) += stm32mp23x.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/arch/timers.h>
#include <dm/device_compat.h>
#include <linux/bitfield.h>
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);
}
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)
{
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");
return -ENOENT;
}
plat->ipidr = (u32)dev_get_driver_data(dev);
return 0;
}
@ -60,13 +89,16 @@ static int stm32_timers_probe(struct udevice *dev)
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;
}
static const struct udevice_id stm32_timers_ids[] = {
{ .compatible = "st,stm32-timers" },
{ .compatible = "st,stm32mp25-timers", .data = STM32MP25_TIM_IPIDR },
{}
};

View File

@ -1,7 +1,7 @@
config CMD_STBOARD
bool "stboard - command for OTP board information"
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
This compile the stboard command to
read and write the board in the OTP.

View File

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

View File

@ -9,17 +9,32 @@
#include <asm/arch/stm32.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_AHB4ENSETR (STM32_RCC_BASE + 0x0A28)
#endif
#define GPIOA_BASE 0x50002000
#define GPIOG_BASE 0x50008000
void board_debug_uart_init(void)
{
if (CONFIG_DEBUG_UART_BASE == STM32_UART4_BASE) {
/* UART4 clock enable */
setbits_le32(RCC_MP_APB1ENSETR, BIT(16));
if (CONFIG_DEBUG_UART_BASE != STM32_UART4_BASE)
return;
/* 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 */
writel(BIT(6), RCC_MP_AHB4ENSETR);
/* 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
config SYS_BOARD

View File

@ -48,6 +48,8 @@ CONFIG_CMD_EXT4_WRITE=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_REDUNDANT=y

View File

@ -2,7 +2,6 @@
CONFIG_ARM=y
CONFIG_ARCH_STM32MP=y
CONFIG_TFABOOT=y
CONFIG_SYS_MALLOC_F_LEN=0x1c0000
CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc0400000
CONFIG_ENV_OFFSET=0x3E0000
@ -12,11 +11,16 @@ CONFIG_DDR_CACHEABLE_SIZE=0x8000000
CONFIG_TARGET_ST_STM32MP13X=y
CONFIG_ENV_OFFSET_REDUND=0x3F0000
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_END=0xc4000000
CONFIG_SYS_MEM_TOP_HIDE=0x2000000
CONFIG_BOOTSTAGE_RECORD_COUNT=100
CONFIG_BOOTDELAY=3
CONFIG_BOOTM_OPTEE=y
CONFIG_SYS_CONSOLE_IS_IN_ENV=y
CONFIG_CMD_ASKENV=y
CONFIG_CMD_ERASEENV=y
@ -31,20 +35,28 @@ CONFIG_ENV_IS_NOWHERE=y
CONFIG_ENV_IS_IN_MMC=y
CONFIG_ENV_MMC_USE_DT=y
CONFIG_ENV_SPI_MAX_HZ=50000000
CONFIG_CLK_SCMI=y
CONFIG_SET_DFU_ALT_INFO=y
CONFIG_SYS_I2C_EEPROM_ADDR=0x50
CONFIG_ENV_MMC_DEVICE_INDEX=0
CONFIG_ENV_MMC_EMMC_HW_PARTITION=1
CONFIG_PHY_REALTEK=y
CONFIG_DM_REGULATOR_SCMI=y
CONFIG_RESET_SCMI=y
CONFIG_DM_RNG=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_HUB_DEBOUNCE_TIMEOUT=2000
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_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_SIZE_LIMIT=1441792
CONFIG_BOOTCOUNT_BOOTLIMIT=3
@ -20,9 +16,7 @@ CONFIG_CMD_STM32PROG_OTP=y
CONFIG_CONSOLE_MUX=y
CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc0100000
CONFIG_DM_HWSPINLOCK=y
CONFIG_DM_REGULATOR_STM32_VREFBUF=y
CONFIG_HAS_BOARD_SIZE_LIMIT=y
CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
CONFIG_HWSPINLOCK_STM32=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"
@ -31,42 +25,7 @@ CONFIG_PINCTRL_STMFX=y
CONFIG_REMOTEPROC_STM32_COPRO=y
CONFIG_SERVERIP="192.168.1.1"
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_SYSRESET_SYSCON=y
CONFIG_SYS_BOOTCOUNT_ADDR=0x5C00A14C
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION=0x3
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_USE_SERVERIP=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_STM32MP25X=y
CONFIG_DDR_CACHEABLE_SIZE=0x10000000
CONFIG_MFD_STM32_TIMERS=y
CONFIG_ENV_OFFSET_REDUND=0x940000
CONFIG_TARGET_ST_STM32MP25X=y
CONFIG_SYS_MEMTEST_START=0x84000000
@ -29,6 +30,7 @@ CONFIG_CMD_MEMTEST=y
CONFIG_CMD_CLK=y
CONFIG_CMD_FUSE=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_PWM=y
# CONFIG_CMD_LOADB is not set
CONFIG_CMD_MMC=y
CONFIG_CMD_CACHE=y
@ -65,6 +67,8 @@ CONFIG_SPI_FLASH=y
CONFIG_PINCONF=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_REGULATOR_GPIO=y
CONFIG_DM_PWM=y
CONFIG_PWM_STM32=y
CONFIG_RAM=y
# CONFIG_STM32MP1_DDR is not set
CONFIG_DM_RNG=y

View File

@ -2,6 +2,10 @@
# CONFIG_CMD_EXPORTENV is not set
# CONFIG_EFI_LOADER 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_BOOTCOUNT_LIMIT=y
CONFIG_CMD_BOOTCOUNT=y
@ -38,6 +42,7 @@ CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_REGULATOR_GPIO=y
CONFIG_DM_REGULATOR_STPMIC1=y
CONFIG_DM_REGULATOR_STM32_VREFBUF=y
CONFIG_DM_RTC=y
CONFIG_DM_SPI=y
CONFIG_DM_SPI_FLASH=y
@ -49,6 +54,7 @@ CONFIG_ENV_SIZE=0x4000
CONFIG_FAT_WRITE=y
CONFIG_FIT=y
CONFIG_GPIO_HOG=y
CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
CONFIG_I2C_EEPROM=y
CONFIG_IPV6=y
CONFIG_IP_DEFRAG=y
@ -58,6 +64,7 @@ CONFIG_MTD=y
CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_OF_LIVE=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_STM32_USBPHYC=y
CONFIG_PINCONF=y
@ -66,17 +73,39 @@ CONFIG_PROT_TCP_SACK=y
CONFIG_RTC_STM32=y
CONFIG_SERIAL_RX_BUFFER=y
CONFIG_SPI=y
CONFIG_SPI_FLASH_MACRONIX=y
CONFIG_SPI_FLASH_MTD=y
CONFIG_SPI_FLASH_SFDP_SUPPORT=y
CONFIG_SPI_FLASH_SPANSION=y
CONFIG_SPI_FLASH_STMICRO=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_QSPI=y
CONFIG_STM32_SDMMC2=y
CONFIG_STM32_SPI=y
CONFIG_SUPPORT_EMMC_BOOT=y
CONFIG_SYSRESET_SYSCON=y
CONFIG_SYS_BOOTCOUNT_MAGIC=0xB0C40000
CONFIG_SYS_BOOTM_LEN=0x2000000
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)
{
struct scmi_clk_parent_set_in in = {
.clock_id = clk->id,
.parent_clk = parent->id,
.clock_id = clk_get_id(clk),
.parent_clk = clk_get_id(parent),
};
struct scmi_clk_parent_set_out out;
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 = (divr1 >> RCC_PLL1DIVR_DIVR1_SHIFT) + 1;
fracn1 = readl(&regs->pll1fracr) & RCC_PLL1DIVR_DIVR1_MASK;
fracn1 = fracn1 & RCC_PLL1DIVR_DIVR1_SHIFT;
fracn1 = readl(&regs->pll1fracr) & RCC_PLL1FRACR_FRACN1_MASK;
fracn1 = (fracn1 >> RCC_PLL1FRACR_FRACN1_SHIFT) + 1;
vco = (pllsrc / divm1) * divn1;
rate = (pllsrc * fracn1) / (divm1 * 8192);

View File

@ -12,6 +12,7 @@
#include <asm/io.h>
#include <asm/arch/timers.h>
#include <dm/device_compat.h>
#include <linux/bitfield.h>
#include <linux/time.h>
#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_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
@ -192,6 +200,7 @@ static const struct pwm_ops stm32_pwm_ops = {
static const struct udevice_id stm32_pwm_ids[] = {
{ .compatible = "st,stm32-pwm" },
{ .compatible = "st,stm32mp25-pwm" },
{ }
};

View File

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

View File

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

View File

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

View File

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

View File

@ -5,7 +5,7 @@
*/
#include <dm.h>
#include <stm32-reset-core.h>
#include "stm32-reset-core.h"
/* Timeout for deassert */
#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->bit_idx = offset;
ptr_line->set_clr = true;
ptr_line->set_clr = false;
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
*
* Configuration settings for the STMicroelectonics STM32MP25x boards
* Configuration settings for the STMicroelectronics STM32MP25x boards
*/
#ifndef __CONFIG_STM32MP25_ST_COMMON_H__