#define MIN_BOOT_MEM   (((RMA_END < (0x1UL << 28)) ? (0x1UL << 28) : RMA_END) \
                        + (0x1UL << 26))
 
+/* The upper limit percentage for user specified boot memory size (25%) */
+#define MAX_BOOT_MEM_RATIO                     4
+
 #define memblock_num_regions(memblock_type)    (memblock.memblock_type.cnt)
 
 /* Firmware provided dump sections */
 
        ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
                                &size, &base);
        if (ret == 0 && size > 0) {
+               unsigned long max_size;
+
                if (fw_dump.reserve_bootvar)
                        pr_info("Using 'crashkernel=' parameter for memory reservation.\n");
 
                fw_dump.reserve_bootvar = (unsigned long)size;
+
+               /*
+                * Adjust if the boot memory size specified is above
+                * the upper limit.
+                */
+               max_size = memblock_phys_mem_size() / MAX_BOOT_MEM_RATIO;
+               if (fw_dump.reserve_bootvar > max_size) {
+                       fw_dump.reserve_bootvar = max_size;
+                       pr_info("Adjusted boot memory size to %luMB\n",
+                               (fw_dump.reserve_bootvar >> 20));
+               }
+
                return fw_dump.reserve_bootvar;
        } else if (fw_dump.reserve_bootvar) {
                /*
        }
 
        /* divide by 20 to get 5% of value */
-       size = memblock_end_of_DRAM() / 20;
+       size = memblock_phys_mem_size() / 20;
 
        /* round it down in multiples of 256 */
        size = size & ~0x0FFFFFFFUL;