available.
                        It will be ignored if crashkernel=X is specified.
        crashkernel=size[KMG],low
-                       [KNL, X86-64] range under 4G. When crashkernel=X,high
+                       [KNL, X86-64, ARM64] range under 4G. When crashkernel=X,high
                        is passed, kernel could allocate physical memory region
                        above 4G, that cause second kernel crash on system
                        that require some amount of low memory, e.g. swiotlb
                        requires at least 64M+32K low memory, also enough extra
                        low memory is needed to make sure DMA buffers for 32-bit
                        devices won't run out. Kernel would try to allocate
-                       at least 256M below 4G automatically.
+                       default size of memory below 4G automatically. The default
+                       size is platform dependent.
+                         --> x86: max(swiotlb_size_or_default() + 8MiB, 256MiB)
+                         --> arm64: 128MiB
                        This one lets the user specify own low range under 4G
                        for second kernel instead.
                        0: to disable low allocation.
                        It will be ignored when crashkernel=X,high is not used
                        or memory reserved is below 4G.
 
-                       [KNL, ARM64] range in low memory.
-                       This one lets the user specify a low range in the
-                       DMA zone for the crash dump kernel.
-                       It will be ignored when crashkernel=X,high is not used
-                       or memory reserved is located in the DMA zones.
-
        cryptomgr.notests
                        [KNL] Disable crypto self-tests
 
 
 #define CRASH_ADDR_LOW_MAX             arm64_dma_phys_limit
 #define CRASH_ADDR_HIGH_MAX            (PHYS_MASK + 1)
 
+#define DEFAULT_CRASH_KERNEL_LOW_SIZE  (128UL << 20)
+
 static int __init reserve_crashkernel_low(unsigned long long low_size)
 {
        unsigned long long low_base;
                 * is not allowed.
                 */
                ret = parse_crashkernel_low(cmdline, 0, &crash_low_size, &crash_base);
-               if (ret && (ret != -ENOENT))
+               if (ret == -ENOENT)
+                       crash_low_size = DEFAULT_CRASH_KERNEL_LOW_SIZE;
+               else if (ret)
                        return;
 
                crash_max = CRASH_ADDR_HIGH_MAX;
                return;
        }
 
-       if ((crash_base >= CRASH_ADDR_LOW_MAX) &&
+       if ((crash_base > CRASH_ADDR_LOW_MAX - crash_low_size) &&
             crash_low_size && reserve_crashkernel_low(crash_low_size)) {
                memblock_phys_free(crash_base, crash_size);
                return;