static inline int fadump_add_crash_memory(unsigned long long base,
                                          unsigned long long end)
 {
+       u64  start, size;
+       bool is_adjacent = false;
+
        if (base == end)
                return 0;
 
-       if (crash_mem_ranges == max_crash_mem_ranges) {
-               int ret;
+       /*
+        * Fold adjacent memory ranges to bring down the memory ranges/
+        * PT_LOAD segments count.
+        */
+       if (crash_mem_ranges) {
+               start = crash_memory_ranges[crash_mem_ranges - 1].base;
+               size = crash_memory_ranges[crash_mem_ranges - 1].size;
 
-               ret = allocate_crash_memory_ranges();
-               if (ret)
-                       return ret;
+               if ((start + size) == base)
+                       is_adjacent = true;
+       }
+       if (!is_adjacent) {
+               /* resize the array on reaching the limit */
+               if (crash_mem_ranges == max_crash_mem_ranges) {
+                       int ret;
+
+                       ret = allocate_crash_memory_ranges();
+                       if (ret)
+                               return ret;
+               }
+
+               start = base;
+               crash_memory_ranges[crash_mem_ranges].base = start;
+               crash_mem_ranges++;
        }
 
+       crash_memory_ranges[crash_mem_ranges - 1].size = (end - start);
        pr_debug("crash_memory_range[%d] [%#016llx-%#016llx], %#llx bytes\n",
-               crash_mem_ranges, base, end - 1, (end - base));
-       crash_memory_ranges[crash_mem_ranges].base = base;
-       crash_memory_ranges[crash_mem_ranges].size = end - base;
-       crash_mem_ranges++;
+               (crash_mem_ranges - 1), start, end - 1, (end - start));
        return 0;
 }
 
 
        pr_debug("Setup crash memory ranges.\n");
        crash_mem_ranges = 0;
+
+       /* allocate memory for crash memory ranges for the first time */
+       if (!max_crash_mem_ranges) {
+               ret = allocate_crash_memory_ranges();
+               if (ret)
+                       return ret;
+       }
+
        /*
         * add the first memory chunk (RMA_START through boot_memory_size) as
         * a separate memory chunk. The reason is, at the time crash firmware