diff -drupN a/kernel/panic.c b/kernel/panic.c
--- a/kernel/panic.c	2018-08-06 17:23:04.000000000 +0300
+++ b/kernel/panic.c	2022-06-12 05:28:14.000000000 +0300
@@ -24,7 +24,12 @@
 #include <linux/init.h>
 #include <linux/nmi.h>
 #include <linux/console.h>
+#include <linux/cpu.h>
+#include <linux/cpumask.h>
+#include <linux/arisc/arisc.h>
+#include <asm/cacheflush.h>
 #include <linux/bug.h>
+#include <linux/sunxi-dump.h>
 
 #define PANIC_TIMER_STEP 100
 #define PANIC_BLINK_SPD 18
@@ -40,6 +45,13 @@ int panic_on_warn __read_mostly;
 int panic_timeout = CONFIG_PANIC_TIMEOUT;
 EXPORT_SYMBOL_GPL(panic_timeout);
 
+#ifdef CONFIG_SUNXI_DUMP
+int sunxi_dump = 1;
+#else
+int sunxi_dump;
+#endif
+EXPORT_SYMBOL_GPL(sunxi_dump);
+
 ATOMIC_NOTIFIER_HEAD(panic_notifier_list);
 
 EXPORT_SYMBOL(panic_notifier_list);
@@ -285,6 +297,27 @@ void panic(const char *fmt, ...)
 	}
 #endif
 	pr_emerg("---[ end Kernel panic - not syncing: %s\n", buf);
+
+	if (sunxi_dump) {
+		unsigned int i;
+
+		flush_cache_all();
+		sunxi_dump_group_dump();
+
+		for (i = 0; i < num_possible_cpus(); i++) {
+			if (i == smp_processor_id())
+				continue;
+
+			while (1) {
+				if (!cpu_online(i))
+					break;
+				mdelay(10);
+			}
+		}
+		pr_emerg("crashdump enter\n");
+		arisc_set_crashdump_mode();
+	}
+
 	local_irq_enable();
 	for (i = 0; ; i += PANIC_TIMER_STEP) {
 		touch_softlockup_watchdog();