[PATCH v2 0/1] Enable reset_cpu() in SPL for ZynqMP

From: Lukas Funke lukas.funke@weidmueller.com
This series enables the CPU reset in the SPL for ZynqMP based platforms. This only works if CONFIG_SYSRESET is disabled. This is usually the case since the the regular sysreset requires bl31 firmware to be loaded in order to hand the sysreset over to PMU firmware. In SPL we can talk to the PMU firmware directly and request a CPU reset.
Changes in v2: - Drop 2/2 since reworking ZYNQMP_FIRMWARE dependency is out-of-scope
Lukas Funke (1): xilinx: zynqmp: Enable reset_cpu() in SPL
board/xilinx/zynqmp/zynqmp.c | 9 +++++++++ 1 file changed, 9 insertions(+)

From: Lukas Funke lukas.funke@weidmueller.com
This commit enables SPL to reset the CPU via PMU-firmware. The usual reset mechanism requires bl31 to be loaded which may not be the case in SPL.
Signed-off-by: Lukas Funke lukas.funke@weidmueller.com ---
Changes in v2: - Drop 2/2 since reworking ZYNQMP_FIRMWARE dependency is out-of-scope
board/xilinx/zynqmp/zynqmp.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c index f370fb7347a..a129b1dbbbc 100644 --- a/board/xilinx/zynqmp/zynqmp.c +++ b/board/xilinx/zynqmp/zynqmp.c @@ -40,6 +40,7 @@ #include <linux/bitops.h> #include <linux/delay.h> #include <linux/sizes.h> +#include <dt-bindings/reset/xlnx-zynqmp-resets.h> #include "../common/board.h"
#include "pm_cfg_obj.h" @@ -285,6 +286,14 @@ int dram_init(void) #if !CONFIG_IS_ENABLED(SYSRESET) void reset_cpu(void) { + if (!IS_ENABLED(CONFIG_ZYNQMP_FIRMWARE)) { + log_warning("reset failed: ZYNQMP_FIRMWARE disabled"); + return; + } + + xilinx_pm_request(PM_RESET_ASSERT, + ZYNQMP_PM_RESET_START + ZYNQMP_RESET_SOFT, + PM_RESET_ACTION_ASSERT, 0, 0, NULL); } #endif

On 6/4/24 15:59, lukas.funke-oss@weidmueller.com wrote:
From: Lukas Funke lukas.funke@weidmueller.com
This commit enables SPL to reset the CPU via PMU-firmware. The usual reset mechanism requires bl31 to be loaded which may not be the case in SPL.
Signed-off-by: Lukas Funke lukas.funke@weidmueller.com
Changes in v2:
Drop 2/2 since reworking ZYNQMP_FIRMWARE dependency is out-of-scope
board/xilinx/zynqmp/zynqmp.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c index f370fb7347a..a129b1dbbbc 100644 --- a/board/xilinx/zynqmp/zynqmp.c +++ b/board/xilinx/zynqmp/zynqmp.c @@ -40,6 +40,7 @@ #include <linux/bitops.h> #include <linux/delay.h> #include <linux/sizes.h> +#include <dt-bindings/reset/xlnx-zynqmp-resets.h> #include "../common/board.h"
#include "pm_cfg_obj.h" @@ -285,6 +286,14 @@ int dram_init(void) #if !CONFIG_IS_ENABLED(SYSRESET) void reset_cpu(void) {
- if (!IS_ENABLED(CONFIG_ZYNQMP_FIRMWARE)) {
log_warning("reset failed: ZYNQMP_FIRMWARE disabled");
return;
- }
- xilinx_pm_request(PM_RESET_ASSERT,
ZYNQMP_PM_RESET_START + ZYNQMP_RESET_SOFT,
Isn't it easier to use ZYNQMP_PM_RESET_SOFT directly? Also you can remove that include above to dt binding.
The rest looks good. If you want to make nicer I would put there a comment that in case of !CONFIG_ZYNQMP_FIRMWARE xilinx_pm_request is not present compiler removes it because of return inside if. If defined in SPL case xilinx_pm_request will send command over IPI.
Thanks, Michal
participants (2)
-
lukas.funke-oss@weidmueller.com
-
Michal Simek