const char *type = of_get_flat_dt_prop(node, "device_type", NULL);
        const __be32 *reg, *endp;
        int l;
+       bool hotpluggable;
 
        /* We are scanning "memory" nodes only */
        if (type == NULL) {
                return 0;
 
        endp = reg + (l / sizeof(__be32));
+       hotpluggable = of_get_flat_dt_prop(node, "hotpluggable", NULL);
 
        pr_debug("memory scan node %s, reg size %d,\n", uname, l);
 
                    (unsigned long long)size);
 
                early_init_dt_add_memory_arch(base, size);
+
+               if (!hotpluggable)
+                       continue;
+
+               if (early_init_dt_mark_hotplug_memory_arch(base, size))
+                       pr_warn("failed to mark hotplug range 0x%llx - 0x%llx\n",
+                               base, base + size);
        }
 
        return 0;
        memblock_add(base, size);
 }
 
+int __init __weak early_init_dt_mark_hotplug_memory_arch(u64 base, u64 size)
+{
+       return memblock_mark_hotplug(base, size);
+}
+
 int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
                                        phys_addr_t size, bool nomap)
 {
        WARN_ON(1);
 }
 
+int __init __weak early_init_dt_mark_hotplug_memory_arch(u64 base, u64 size)
+{
+       return -ENOSYS;
+}
+
 int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
                                        phys_addr_t size, bool nomap)
 {
 
 extern void early_init_fdt_scan_reserved_mem(void);
 extern void early_init_fdt_reserve_self(void);
 extern void early_init_dt_add_memory_arch(u64 base, u64 size);
+extern int early_init_dt_mark_hotplug_memory_arch(u64 base, u64 size);
 extern int early_init_dt_reserve_memory_arch(phys_addr_t base, phys_addr_t size,
                                             bool no_map);
 extern void * early_init_dt_alloc_memory_arch(u64 size, u64 align);