OpenCloudOS-Kernel/arch/mips/loongson64
Huacai Chen 6ce48897ce MIPS: Loongson64: Add kexec/kdump support
Add kexec/kdump support for Loongson64 by:
1, Provide Loongson-specific kexec functions: loongson_kexec_prepare(),
   loongson_kexec_shutdown() and loongson_crash_shutdown();
2, Provide Loongson-specific assembly code in kexec_smp_wait();

To start Loongson64, The boot CPU needs 3 parameters:
fw_arg0: the number of arguments in cmdline (i.e., argc).
fw_arg1: structure holds cmdline such as "root=/dev/sda1 console=tty"
         (i.e., argv).
fw_arg2: environment (i.e., envp, additional boot parameters from LEFI).

Non-boot CPUs do not need one parameter as the IPI mailbox base address.
They query their own IPI mailbox to get PC, SP and GP in a loopi, until
the boot CPU brings them up.

loongson_kexec_prepare(): Setup cmdline for kexec/kdump. The kexec/kdump
cmdline comes from kexec's "append" option string. This structure will
be parsed in fw_init_cmdline() of arch/mips/fw/lib/cmdline.c. Both image
->control_code_page and the cmdline need to be in a safe memory region
(memory allocated by the old kernel may be corrupted by the new kernel).
In order to maintain compatibility for the old firmware, the low 2MB is
reserverd and safe for Loongson. So let KEXEC_CTRL_CODE and KEXEC_ARGV_
ADDR be here. LEFI parameters may be corrupted at runtime, so backup it
at mips_reboot_setup(), and then restore it at loongson_kexec_shutdown()
/loongson_crash_shutdown().

loongson_kexec_shutdown(): Wake up all present CPUs and let them go to
reboot_code_buffer. Pass the kexec parameters to kexec_args.

loongson_crash_shutdown(): Pass the kdump parameters to kexec_args.

The assembly part in kexec_smp_wait provide a routine as BIOS does, in
order to keep secondary CPUs in a querying loop.

The layout of low 2MB memory in our design:
0x80000000, the first MB, the first 64K, Exception vectors
0x80010000, the first MB, the second 64K, STR (suspend) data
0x80020000, the first MB, the third and fourth 64K, UEFI HOB
0x80040000, the first MB, the fifth 64K, RT-Thread for SMC
0x80100000, the second MB, the first 64K, KEXEC code
0x80108000, the second MB, the second 64K, KEXEC data

Cc: Eric Biederman <ebiederm@xmission.com>
Tested-by: Jinyang He <hejinyang@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@kernel.org>
Signed-off-by: Jinyang He <hejinyang@loongson.cn>
Signed-off-by: Youling Tang <tangyouling@loongson.cn>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
2021-04-16 09:18:06 +02:00
..
Kconfig MIPS: Loongson64: Mark RS780 HPET as broken 2020-04-20 19:37:01 +02:00
Makefile MIPS: Loongson64: Remove unused sysconf members 2021-03-12 11:09:09 +01:00
Platform Kbuild updates for v5.12 2021-02-25 10:17:31 -08:00
boardinfo.c MIPS: Loongson64: Add /sys/firmware/lefi/boardinfo 2020-10-27 12:46:06 +01:00
cop2-ex.c MIPS: Loongson-3: Fix fp register access if MSA enabled 2020-09-22 13:07:22 +02:00
cpucfg-emul.c MIPS: Unify naming style of vendor CP0.Config6 bits 2020-07-08 11:15:53 +02:00
dma.c dma-direct: rename and cleanup __phys_to_dma 2020-09-11 09:14:43 +02:00
env.c MIPS: Loongson64: Distinguish firmware dependencies DTB/LEFI 2021-03-25 10:44:01 +01:00
hpet.c MIPS: Replace setup_irq() by request_irq() 2020-03-05 16:47:35 +01:00
init.c MIPS: loongson64: fix bug when PAGE_SIZE > 16KB 2021-03-25 10:48:42 +01:00
numa.c MIPS: loongson64: alloc pglist_data at run time 2021-03-12 11:25:41 +01:00
pm.c MIPS: Loongson64: Move files to the top-level directory 2019-11-01 14:31:28 -07:00
reset.c MIPS: Loongson64: Add kexec/kdump support 2021-04-16 09:18:06 +02:00
setup.c MIPS: Loongson64: Load built-in dtbs 2020-03-25 16:07:12 +01:00
smp.c MIPS: loongson64: smp.c: Fix block comment coding style 2021-01-04 11:38:42 +01:00
smp.h MIPS: Loongson64: Move files to the top-level directory 2019-11-01 14:31:28 -07:00
time.c MIPS: Loongson64: Add support for the Loongson-2K1000 to get cpu_clock_freq 2021-03-25 10:44:01 +01:00
vbios_quirk.c MIPS: Loongson64: Switch to generic PCI driver 2020-05-27 13:01:56 +02:00