|
@@ -682,6 +682,59 @@ int __init_memblock memblock_reserve(phys_addr_t base, phys_addr_t size)
|
|
|
return memblock_reserve_region(base, size, MAX_NUMNODES, 0);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * memblock_mark_hotplug - Mark hotpluggable memory with flag MEMBLOCK_HOTPLUG.
|
|
|
+ * @base: the base phys addr of the region
|
|
|
+ * @size: the size of the region
|
|
|
+ *
|
|
|
+ * This function isolates region [@base, @base + @size), and mark it with flag
|
|
|
+ * MEMBLOCK_HOTPLUG.
|
|
|
+ *
|
|
|
+ * Return 0 on succees, -errno on failure.
|
|
|
+ */
|
|
|
+int __init_memblock memblock_mark_hotplug(phys_addr_t base, phys_addr_t size)
|
|
|
+{
|
|
|
+ struct memblock_type *type = &memblock.memory;
|
|
|
+ int i, ret, start_rgn, end_rgn;
|
|
|
+
|
|
|
+ ret = memblock_isolate_range(type, base, size, &start_rgn, &end_rgn);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ for (i = start_rgn; i < end_rgn; i++)
|
|
|
+ memblock_set_region_flags(&type->regions[i], MEMBLOCK_HOTPLUG);
|
|
|
+
|
|
|
+ memblock_merge_regions(type);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * memblock_clear_hotplug - Clear flag MEMBLOCK_HOTPLUG for a specified region.
|
|
|
+ * @base: the base phys addr of the region
|
|
|
+ * @size: the size of the region
|
|
|
+ *
|
|
|
+ * This function isolates region [@base, @base + @size), and clear flag
|
|
|
+ * MEMBLOCK_HOTPLUG for the isolated regions.
|
|
|
+ *
|
|
|
+ * Return 0 on succees, -errno on failure.
|
|
|
+ */
|
|
|
+int __init_memblock memblock_clear_hotplug(phys_addr_t base, phys_addr_t size)
|
|
|
+{
|
|
|
+ struct memblock_type *type = &memblock.memory;
|
|
|
+ int i, ret, start_rgn, end_rgn;
|
|
|
+
|
|
|
+ ret = memblock_isolate_range(type, base, size, &start_rgn, &end_rgn);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ for (i = start_rgn; i < end_rgn; i++)
|
|
|
+ memblock_clear_region_flags(&type->regions[i],
|
|
|
+ MEMBLOCK_HOTPLUG);
|
|
|
+
|
|
|
+ memblock_merge_regions(type);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* __next_free_mem_range - next function for for_each_free_mem_range()
|
|
|
* @idx: pointer to u64 loop variable
|