|
@@ -1015,6 +1015,7 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,
|
|
|
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) {
|
|
@@ -1034,6 +1035,7 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,
|
|
|
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);
|
|
|
|
|
@@ -1049,6 +1051,13 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,
|
|
|
(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;
|
|
@@ -1146,6 +1155,11 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size)
|
|
|
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)
|
|
|
{
|
|
@@ -1168,6 +1182,11 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size)
|
|
|
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)
|
|
|
{
|