Registered User mNo edit summary Tag: 2017 source edit |
Registered User m (remove "Cortex-A35 master boot" chapter, useless for v6 and wording to review) Tag: 2017 source edit |
||
(11 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
{{ApplicableFor | |||
|MPUs list=STM32MP13x, STM32MP15x, STM32MP25x | |MPUs list=STM32MP13x, STM32MP15x, STM32MP21x, STM32MP23x, STM32MP25x | ||
|MPUs checklist=STM32MP13x,STM32MP15x, STM32MP25x | |MPUs checklist=STM32MP13x, STM32MP15x, STM32MP21x, STM32MP23x, STM32MP25x | ||
}} | }} | ||
==Article purpose== | ==Article purpose== | ||
The purpose of this article is to: | The purpose of this article is to: | ||
Line 14: | Line 11: | ||
==Peripheral overview== | ==Peripheral overview== | ||
The '''DDRCTRL''' and '''DDRPHYC''' peripherals are used to configure the physical interface to the external DDR memory. Access to the DDR memory can be filtered via the [[TZC internal peripheral|TZC]] controller (on {{MicroprocessorDevice | device=15}} and {{MicroprocessorDevice | device=13}}) or via [[RISAF internal peripheral|RISAF]] (on {{MicroprocessorDevice | device= | The '''DDRCTRL''' and '''DDRPHYC''' peripherals are used to configure the physical interface to the external DDR memory. Access to the DDR memory can be filtered via the [[TZC internal peripheral|TZC]] controller (on {{MicroprocessorDevice | device=15}} and {{MicroprocessorDevice | device=13}}) or via [[RISAF internal peripheral|RISAF]] (on {{MicroprocessorDevice | device=2}}). | ||
Notice that it is possible to perform DDR bandwidth measurement thanks to the [[DDRPERFM internal peripheral]]. | Notice that it is possible to perform DDR bandwidth measurement thanks to the [[DDRPERFM internal peripheral]]. | ||
Line 25: | Line 22: | ||
===Boot time assignment=== | ===Boot time assignment=== | ||
The DDRCTRL and DDRPHYC peripherals are kept secure and used by the [[Boot chain overview|FSBL]] to initialize the access to the DDR where it loads the [[U-Boot overview|SSBL (U-Boot)]] for execution.<br /> | The DDRCTRL and DDRPHYC peripherals are kept secure and used by the [[Boot chain overview|FSBL]] to initialize the access to the DDR where it loads the [[U-Boot overview|SSBL (U-Boot)]] for execution.<br /> | ||
STMicroelectronics wishes to make the DDR memory configuration as easy as possible, for this reason a dedicated application note (<ref>[[ | STMicroelectronics wishes to make the DDR memory configuration as easy as possible, for this reason a dedicated application note (<ref>[[STM32_MPU_resources#AN5168|AN5168 - DDR configuration on STM32MP1 series MPU]]</ref> on {{MicroprocessorDevice | device=15}} and {{MicroprocessorDevice | device=13}}, <ref>[[STM32_MPU_resources#AN5723|AN5723 - DDR configuration on STM32MP2 series MPU]]</ref> on {{MicroprocessorDevice | device=2}}) has been published and a '''DDR tuning''' function is available in [[STM32CubeMX]] tool in order to generate the [[Device tree|device tree]] configuration that is given to the [[Boot chain overview|FSBL]] to perform this initialization. | ||
====On {{MicroprocessorDevice | device=1}}==== | ====On {{MicroprocessorDevice | device=1}}==== | ||
Line 42: | Line 39: | ||
====On {{MicroprocessorDevice | device=2}}==== | ====On {{MicroprocessorDevice | device=2}}==== | ||
{{#lst:STM32MP2_internal_peripherals_assignment_table_template|stm32mp2_a35_boottime}} | {{#lst:STM32MP2_internal_peripherals_assignment_table_template|stm32mp2_a35_boottime}} | ||
<section begin=stm32mp25_a35_boottime /> | <section begin=stm32mp21_a35_boottime/><section begin=stm32mp23_a35_boottime/><section begin=stm32mp25_a35_boottime/> | ||
| rowspan="1" | Core/RAM | | rowspan="1" | Core/RAM | ||
| rowspan="1" | [[DDRCTRL_and_DDRPHYC internal peripherals |DDRCTRL]] | | rowspan="1" | [[DDRCTRL_and_DDRPHYC internal peripherals |DDRCTRL]] | ||
| DDR | | DDR | ||
| | | | ||
| <span title=" | | <span title="system peripheral" style="font-size:21px">✓</span> | ||
| <span title="assignable peripheral but not supported" style="font-size:21px">⬚</span> | | <span title="assignable peripheral but not supported" style="font-size:21px">⬚</span> | ||
| | | | ||
|- | |- | ||
<section end=stm32mp25_a35_boottime /> | <section end=stm32mp21_a35_boottime/><section end=stm32mp23_a35_boottime/><section end=stm32mp25_a35_boottime/> | ||
|} | |} | ||
Line 59: | Line 57: | ||
* On {{MicroprocessorDevice | device=13}}, [[STM32 MPU OP-TEE overview|OP-TEE]] is default located in DDR and it jumps into [[TF-A_BL2_overview|TF-A BL2]] FSBL resident code in SYSRAM to configure the DDRCTRL and DDRPHYC | * On {{MicroprocessorDevice | device=13}}, [[STM32 MPU OP-TEE overview|OP-TEE]] is default located in DDR and it jumps into [[TF-A_BL2_overview|TF-A BL2]] FSBL resident code in SYSRAM to configure the DDRCTRL and DDRPHYC | ||
* On {{MicroprocessorDevice | device=15}}, [[STM32 MPU OP-TEE overview|OP-TEE]] is either located in SYSRAM (so it embeds the services to configure the DDRCTRL and DDRPHYC) or in DDR (see previous {{MicroprocessorDevice | device=13}} case) | * On {{MicroprocessorDevice | device=15}}, [[STM32 MPU OP-TEE overview|OP-TEE]] is either located in SYSRAM (so it embeds the services to configure the DDRCTRL and DDRPHYC) or in DDR (see previous {{MicroprocessorDevice | device=13}} case) | ||
* On {{MicroprocessorDevice | device= | * On {{MicroprocessorDevice | device=2}}, [[STM32 MPU OP-TEE overview|OP-TEE]] is default located in DDR and it jumps into [[TF-A_BL31_overview|TF-A BL31]] secure monitor resident code in SYSRAM to configure the DDRCTRL and DDRPHYC | ||
On Standby exit, the [[STM32 MPU ROM code overview|ROM code]] loads the [[Boot chain overview|FSBL]] that again configures the DDRCTRL and DDRPHYC before proceeding with the wake-up procedure. | On Standby exit, the [[STM32 MPU ROM code overview|ROM code]] loads the [[Boot chain overview|FSBL]] that again configures the DDRCTRL and DDRPHYC before proceeding with the wake-up procedure. | ||
Line 65: | Line 63: | ||
DDR memory access is controlled by: | DDR memory access is controlled by: | ||
* [[TZC internal peripheral|TZC]] controller on {{MicroprocessorDevice | device=13}} and on {{MicroprocessorDevice | device=15}} | * [[TZC internal peripheral|TZC]] controller on {{MicroprocessorDevice | device=13}} and on {{MicroprocessorDevice | device=15}} | ||
* [[RISAF internal peripheral|RISAF]] on {{MicroprocessorDevice | device= | * [[RISAF internal peripheral|RISAF]] on {{MicroprocessorDevice | device=2}} | ||
====On {{MicroprocessorDevice | device=13}}==== | ====On {{MicroprocessorDevice | device=13}}==== | ||
Line 92: | Line 90: | ||
|- | |- | ||
<section end=stm32mp15_runtime /> | <section end=stm32mp15_runtime /> | ||
|} | |||
====On {{MicroprocessorDevice | device=21}}==== | |||
{{#lst:STM32MP2_internal_peripherals_assignment_table_template|stm32mp21_runtime}} | |||
<section begin=stm32mp21_a35_runtime /> | |||
| rowspan="1" | Core/RAM | |||
| rowspan="1" | [[DDRCTRL_and_DDRPHYC internal peripherals | DDRCTRL]] | |||
| DDR | |||
| <span title="system peripheral" style="font-size:21px">✓</span><sup>OP-TEE</sup><br/> <span title="system peripheral" style="font-size:21px">✓</span><sup>TF-A BL31</sup> | |||
| <span title="assignable peripheral but not supported" style="font-size:21px">⬚</span> | |||
| <span title="assignable peripheral" style="font-size:21px">☐</span> | |||
| <span title="assignable peripheral but not supported" style="font-size:21px">⬚</span> | |||
| | |||
|- | |||
<section end=stm32mp21_a35_runtime /> | |||
|} | |||
====On {{MicroprocessorDevice | device=23}}==== | |||
{{#lst:STM32MP2_internal_peripherals_assignment_table_template|stm32mp23_runtime}} | |||
<section begin=stm32mp23_a35_runtime /> | |||
| rowspan="1" | Core/RAM | |||
| rowspan="1" | [[DDRCTRL_and_DDRPHYC internal peripherals | DDRCTRL]] | |||
| DDR | |||
| <span title="system peripheral" style="font-size:21px">✓</span><sup>OP-TEE</sup><br/> <span title="system peripheral" style="font-size:21px">✓</span><sup>TF-A BL31</sup> | |||
| <span title="assignable peripheral but not supported" style="font-size:21px">⬚</span> | |||
| <span title="assignable peripheral" style="font-size:21px">☐</span> | |||
| <span title="assignable peripheral but not supported" style="font-size:21px">⬚</span> | |||
| | |||
|- | |||
<section end=stm32mp23_a35_runtime /> | |||
|} | |} | ||
Line 100: | Line 128: | ||
| rowspan="1" | [[DDRCTRL_and_DDRPHYC internal peripherals | DDRCTRL]] | | rowspan="1" | [[DDRCTRL_and_DDRPHYC internal peripherals | DDRCTRL]] | ||
| DDR | | DDR | ||
| <span title=" | | <span title="system peripheral" style="font-size:21px">✓</span><sup>OP-TEE</sup><br/> <span title="system peripheral" style="font-size:21px">✓</span><sup>TF-A BL31</sup> | ||
| <span title="assignable peripheral but not supported" style="font-size:21px">⬚</span> | | <span title="assignable peripheral but not supported" style="font-size:21px">⬚</span> | ||
| <span title="assignable peripheral" style="font-size:21px">☐</span> | | <span title="assignable peripheral" style="font-size:21px">☐</span> | ||
Line 123: | Line 151: | ||
** {{CodeSource | OP-TEE_OS | core/arch/arm/plat-stm32mp1/drivers/stm32mp1_ddrc.c}} | ** {{CodeSource | OP-TEE_OS | core/arch/arm/plat-stm32mp1/drivers/stm32mp1_ddrc.c}} | ||
===On {{MicroprocessorDevice | device= | ===On {{MicroprocessorDevice | device=2}}=== | ||
* '''TF-A BL2''': | * '''TF-A BL2''': | ||
** {{CodeSource | TF-A | drivers/st/ddr/}} ((files with stm32mp2_ and stm32mp_ prefixes) | ** {{CodeSource | TF-A | drivers/st/ddr/}} ((files with stm32mp2_ and stm32mp_ prefixes) |
Latest revision as of 16:41, 22 October 2024
1. Article purpose[edit | edit source]
The purpose of this article is to:
- briefly introduce the DDRCTRL and DDRPHYC peripherals and their main features,
- indicate the peripheral instances assignment at boot time and their assignment at runtime (including whether instances can be allocated to secure contexts),
- list the software frameworks and drivers managing the peripherals,
- explain how to configure the peripherals.
2. Peripheral overview[edit | edit source]
The DDRCTRL and DDRPHYC peripherals are used to configure the physical interface to the external DDR memory. Access to the DDR memory can be filtered via the TZC controller (on STM32MP15x lines and STM32MP13x lines
) or via RISAF (on STM32MP2 series).
Notice that it is possible to perform DDR bandwidth measurement thanks to the DDRPERFM internal peripheral.
Refer to the STM32 MPU reference manuals for the complete list of features, and to the software frameworks and drivers, introduced below, to see which features are implemented.
3. Peripheral usage[edit | edit source]
This chapter is applicable in the scope of the OpenSTLinux BSP running on the Arm® Cortex®-A processor(s), and the STM32CubeMPU Package running on the Arm® Cortex®-M processor.
3.1. Boot time assignment[edit | edit source]
The DDRCTRL and DDRPHYC peripherals are kept secure and used by the FSBL to initialize the access to the DDR where it loads the SSBL (U-Boot) for execution.
STMicroelectronics wishes to make the DDR memory configuration as easy as possible, for this reason a dedicated application note ([1] on STM32MP15x lines and STM32MP13x lines
, [2] on STM32MP2 series) has been published and a DDR tuning function is available in STM32CubeMX tool in order to generate the device tree configuration that is given to the FSBL to perform this initialization.
3.1.1. On STM32MP1 series[edit | edit source]
Click on to expand or collapse the legend...
Domain | Peripheral | Boot time allocation | Comment ![]() | |||
---|---|---|---|---|---|---|
Instance | Cortex-A7 secure (ROM code) |
Cortex-A7 secure (TF-A BL2) |
Cortex-A7 non-secure (U-Boot) | |||
Core/RAM | DDRCTRL | DDR | ☑ | ⬚ |
3.1.2. On STM32MP2 series[edit | edit source]
Click on to expand or collapse the legend...
Domain | Peripheral | Boot time allocation | Comment ![]() | |||
---|---|---|---|---|---|---|
Instance | Cortex-A35 secure (ROM code) |
Cortex-A35 secure (TF-A BL2) |
Cortex-A35 non-secure (U-Boot) | |||
Core/RAM | DDRCTRL | DDR | ✓ | ⬚ |
3.2. Runtime assignment[edit | edit source]
The DDRCTRL and DDRPHYC peripherals are accessed at runtime by the secure monitor (from the FSBL or OP-TEE) to put the DDR in self-refresh state before going into Stop or Standby low power mode:
- On STM32MP13x lines
, OP-TEE is default located in DDR and it jumps into TF-A BL2 FSBL resident code in SYSRAM to configure the DDRCTRL and DDRPHYC
- On STM32MP15x lines
, OP-TEE is either located in SYSRAM (so it embeds the services to configure the DDRCTRL and DDRPHYC) or in DDR (see previous STM32MP13x lines
case)
- On STM32MP2 series, OP-TEE is default located in DDR and it jumps into TF-A BL31 secure monitor resident code in SYSRAM to configure the DDRCTRL and DDRPHYC
On Standby exit, the ROM code loads the FSBL that again configures the DDRCTRL and DDRPHYC before proceeding with the wake-up procedure.
DDR memory access is controlled by:
3.2.1. On STM32MP13x lines
[edit | edit source]
Click on to expand or collapse the legend...
Domain | Peripheral | Runtime allocation | Comment ![]() | ||
---|---|---|---|---|---|
Instance | Cortex-A7 secure (OP-TEE) |
Cortex-A7 non-secure (Linux) | |||
Core/RAM | DDRCTRL | DDR | ☑ | ⬚ |
3.2.2. On STM32MP15x lines
[edit | edit source]
Click on to expand or collapse the legend...
Domain | Peripheral | Runtime allocation | Comment ![]() | |||
---|---|---|---|---|---|---|
Instance | Cortex-A7 secure (OP-TEE) |
Cortex-A7 non-secure (Linux) |
Cortex-M4 (STM32Cube) | |||
Core/RAM | DDRCTRL | DDR | ☑ | ⬚ |
3.2.3. On STM32MP21 unknown microprocessor device[edit | edit source]
| rowspan="1" | Core/RAM
| rowspan="1" | DDRCTRL
| DDR
| ✓OP-TEE
✓TF-A BL31
| ⬚
| ☐
| ⬚
|
|-
|}
3.2.4. On STM32MP23 unknown microprocessor device[edit | edit source]
| rowspan="1" | Core/RAM
| rowspan="1" | DDRCTRL
| DDR
| ✓OP-TEE
✓TF-A BL31
| ⬚
| ☐
| ⬚
|
|-
|}
3.2.5. On STM32MP25x lines
[edit | edit source]
Click on to expand or collapse the legend...
Domain | Peripheral | Runtime allocation | Comment ![]() | |||||
---|---|---|---|---|---|---|---|---|
Instance | Cortex-A35 secure (OP-TEE / TF-A BL31) |
Cortex-A35 non-secure (Linux) |
Cortex-M33 secure (TF-M) |
Cortex-M33 non-secure (STM32Cube) |
Cortex-M0+![]() (STM32Cube) | |||
Core/RAM | DDRCTRL | DDR | ✓OP-TEE ✓TF-A BL31 |
⬚ | ☐ | ⬚ |
4. Software frameworks and drivers[edit | edit source]
Below are listed the software frameworks and drivers managing the DDRCTRL and DDRPHYC peripherals for the embedded software components (mainly low power sequences, initialization is always handled by TF-A BL2).
4.1. On STM32MP13x lines
[edit | edit source]
- TF-A BL2:
- drivers/st/ddr/ (files with stm32mp1_ and stm32mp_ prefixes)
4.2. On STM32MP15x lines
[edit | edit source]
- TF-A BL2: (and TF-A BL32 if OP-TEE is in DDR)
- drivers/st/ddr/ (files with stm32mp1_ and stm32mp_ prefixes)
- OP-TEE: (if OP-TEE is in SYSRAM)
4.3. On STM32MP2 series[edit | edit source]
- TF-A BL2:
- drivers/st/ddr/ ((files with stm32mp2_ and stm32mp_ prefixes)
- drivers/st/ddr/phy/phyinit/src/
- drivers/st/ddr/phy/phyinit/usercustom/
- DDR FW binary <ddr_type>_pmu_train.bin is present in TF-A directory drivers/st/ddr/phy/firmware/bin/stm32mp2/ and in GIT repository: https://github.com/STMicroelectronics/stm32-ddr-phy-binary
5. How to assign and configure the peripheral[edit | edit source]
The DDRCTRL and DDRPHYC device tree configuration is generated via STM32CubeMX tool, according to the DDR characteristics (type, size, frequency, speed grade). This configuration is applied during boot time by the FSBL (see boot chain overview).
6. References[edit | edit source]