Boot kernel with kexec on socfpga

I use MitySOM-5CSX dev kit (cyclone v)and i would like to boot to a different kernel using kexec.

In my configuration:

KERNEL : https://github.com/altera-opensource/linux-socfpga/archive/socfpga-4.9.76-ltsi-rt.zip 
COMPILER : https://releases.linaro.org/archive/14.04/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.bz2

In the kernel configuration kexec is enabled 
zcat /proc/config.gz |grep KEXEC
CONFIG_KEXEC_CORE=y
CONFIG_KEXEC=y

and the default kernel cmdline is

# cat /proc/cmdline 
root=/dev/mmcblk0p3 rootwait rw earlycon

First the kernel is loaded

# kexec -d -l zImagebkx --dtb=socfpga_cyclone5_mitysom5csx_devkit.dtb --command-line="root=/dev/mmcblk0p3 rw rootwait earlycon" 
kernel: 0xb69a8008 kernel_size: 0x4a55c8
MEMORY RANGES
0000000000000000-000000003fffffff (0)
zImage header: 0x016f2818 0x00000000 0x004a55c8
zImage size 0x4a55c8, file size 0x4a55c8
kexec_load: entry = 0x8000 flags = 0x280000
nr_segments = 2
segment[0].buf   = 0xb69a8008
segment[0].bufsz = 0x4a55c8
segment[0].mem   = 0x8000
segment[0].memsz = 0x4a6000
segment[1].buf   = 0x48fb0
segment[1].bufsz = 0x7cf4
segment[1].mem   = 0x1744000
segment[1].memsz = 0x8000

and then try to start a new kernel

# kexec -d -e 
[ 1047.666926] kexec_core: Starting new kernel
[ 1047.671121] Disabling non-boot CPUs ...
[ 1047.728309] CPU1: shutdown
[ 1047.731981] Bye!

And then nothing. Finally after a while the board reboots automatically to U-boot

the kexec version used is

# kexec --version 
kexec-tools 2.0.14

The above kernel boots normally with uboot and i can see output in ttyS0.

Does anyone have a successful experience with booting a socfpga kernel with kexec ?

It has been done successfully. In case you hadn’t seen this link yet, and in case it helps:
https://patchwork.kernel.org/patch/6504321/

I have seen this link and you are right it means that kexec is working in cyclone5 socfpga but i still do not have any results .

I have also used the latest kexec tool 2.0.19 with no luck .


#./kexec --version 
kexec-tools 2.0.19

#./kexec -d  -c -l zImagebkx --dtb=socfpga_cyclone5_mitysom5csx_devkit.dtb --command-line="console=ttyS0,115200 root=/dev/mmcblk0p3 rw rootwait"
syscall kexec_file_load not available.
kernel: 0xb6ab1008 kernel_size: 0x4a55c8
MEMORY RANGES
0000000000000000-000000003fffffff (0)
zImage header: 0x016f2818 0x00000000 0x004a55c8
zImage size 0x4a55c8, file size 0x4a55c8
zImage requires 0x004b65c8 bytes
Kernel: address=0x00008000 size=0x0178fce8
DT    : address=0x01799000 size=0x00007d00
kexec_load: entry = 0x8000 flags = 0x280000
nr_segments = 2
segment[0].buf   = 0xb6ab1008
segment[0].bufsz = 0x4a55cc
segment[0].mem   = 0x8000
segment[0].memsz = 0x4a6000
segment[1].buf   = 0x8e630
segment[1].bufsz = 0x7d00
segment[1].mem   = 0x1799000
segment[1].memsz = 0x8000

and then try to start the new new kernel but

# kexec -d -e 
[  127.922829] kexec_core: Starting new kernel
[  127.927024] Disabling non-boot CPUs ...
[  127.976277] CPU1: shutdown
[  127.979899] Bye!

and then nothing no messages on console.

In continuation to the setup described in the above comments i
enabled in kernel (socfpga-4.9.76-ltsi-rt) configuration “Kernel Hacking” -> "Kernel low-level debugging functions " and the kexeced kernel seems to get decompressed but then still hangs

 
kexec -d -e 
[  134.110855] kexec_core: Starting new kernel
[  134.115064] Disabling non-boot CPUs ...
[  134.176961] CPU1: shutdown
[  134.180624] Bye!
Uncompressing Linux... done, booting the kernel.

The “Uncompressing Linux… done, booting the kernel.” message means tha the kexeced kernel starts to execute and reaches at least at line 546 of “/arch/arm/boot/compressed/head.S” file executing the following instruction:

bl decompress_kernel

using kernel 4.1.22 from https://github.com/dlaut/linux-socfpga and applying the patch described on comment 2 (https://patchwork.kernel.org/patch/6504321/) i managed to kexec 4.9.76 kernel from 4.1.22 using the same kexec-tools 2.0.19.

root@node1:/mnt/test#uname -a 
Linux node1 4.1.22-ltsi-altera #2 SMP PREEMPT Mon Jul 29 12:38:06 EEST 2019 armv7l GNU/Linux

root@node1:/mnt/test# kexec -d -e
[   46.306102] kexec: Starting new kernel
[   46.309928] Disabling non-boot CPUs ...
[   46.306102] kexec: Starting new kernel
[   46.378053] CPU1: shutdown
[   46.381875] Bye!
Uncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.9.76-rt61-ltsi-altera (aggelis@corei5) (gcc version 4.8.3 20140401 (prerelease) (crosstool-NG l9
[    0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt:Machine model: MitySOM-5CSX Altera SOCFPGA Cyclone V
[    0.000000] cma: Reserved 16 MiB at 0x3f000000
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] percpu: Embedded 15 pages/cpu @ef6bf000 s29184 r8192 d24064 u61440
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 260416
[    0.000000] Kernel command line: root=/dev/mmcblk0p3 rootwait
[    0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
[    0.000000] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] allocated 1048576 bytes of page_ext

The kexec patch applied on the 4.1.22 kernel is already present in 4.9.76 kernel. So did something break in kexec implementation in later 4 series kernels? Unforunatelly using the older 4.1.22 kernel is not an option in my case.

Did you manage to get any further with kexec?

I’m trying to do something similar on an Arria 10 device with the 5.4.44 kernel (was using 4.19 but that had issues elsewhere). I get the same symptom you did, “Bye!” then all goes quiet. Adding “earlycon” to the command line args I do get the “Uncompressing Linux…” but then it blocks and eventually u-boot kicks in.