Move __reserved_mem_alloc_in_range() and __reserved_mem_alloc_size() right after __reserved_mem_reserve_reg(), so the functions that reserve reserved regions are grouped together and defined before their use. No functional change. Signed-off-by: Marek Szyprowski --- drivers/of/of_reserved_mem.c | 262 +++++++++++++++++------------------ 1 file changed, 130 insertions(+), 132 deletions(-) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 8c9d6395d6a3..300fb236ab59 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -178,6 +178,136 @@ static int __init __reserved_mem_reserve_reg(unsigned long node, return 0; } +/* + * __reserved_mem_alloc_in_range() - allocate reserved memory described with + * 'alloc-ranges'. Choose bottom-up/top-down depending on nearby existing + * reserved regions to keep the reserved memory contiguous if possible. + */ +static int __init __reserved_mem_alloc_in_range(phys_addr_t size, + phys_addr_t align, phys_addr_t start, phys_addr_t end, bool nomap, + phys_addr_t *res_base) +{ + bool prev_bottom_up = memblock_bottom_up(); + bool bottom_up = false, top_down = false; + int ret, i; + + for (i = 0; i < reserved_mem_count; i++) { + struct reserved_mem *rmem = &reserved_mem[i]; + + /* Skip regions that were not reserved yet */ + if (rmem->size == 0) + continue; + + /* + * If range starts next to an existing reservation, use bottom-up: + * |....RRRR................RRRRRRRR..............| + * --RRRR------ + */ + if (start >= rmem->base && start <= (rmem->base + rmem->size)) + bottom_up = true; + + /* + * If range ends next to an existing reservation, use top-down: + * |....RRRR................RRRRRRRR..............| + * -------RRRR----- + */ + if (end >= rmem->base && end <= (rmem->base + rmem->size)) + top_down = true; + } + + /* Change setting only if either bottom-up or top-down was selected */ + if (bottom_up != top_down) + memblock_set_bottom_up(bottom_up); + + ret = early_init_dt_alloc_reserved_memory_arch(size, align, + start, end, nomap, res_base); + + /* Restore old setting if needed */ + if (bottom_up != top_down) + memblock_set_bottom_up(prev_bottom_up); + + return ret; +} + +/* + * __reserved_mem_alloc_size() - allocate reserved memory described by + * 'size', 'alignment' and 'alloc-ranges' properties. + */ +static int __init __reserved_mem_alloc_size(unsigned long node, const char *uname) +{ + phys_addr_t start = 0, end = 0; + phys_addr_t base = 0, align = 0, size; + int i, len; + const __be32 *prop; + bool nomap; + int ret; + + prop = of_get_flat_dt_prop(node, "size", &len); + if (!prop) + return -EINVAL; + + if (len != dt_root_size_cells * sizeof(__be32)) { + pr_err("invalid size property in '%s' node.\n", uname); + return -EINVAL; + } + size = dt_mem_next_cell(dt_root_size_cells, &prop); + + prop = of_get_flat_dt_prop(node, "alignment", &len); + if (prop) { + if (len != dt_root_addr_cells * sizeof(__be32)) { + pr_err("invalid alignment property in '%s' node.\n", + uname); + return -EINVAL; + } + align = dt_mem_next_cell(dt_root_addr_cells, &prop); + } + + nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; + + ret = fdt_validate_reserved_mem_node(node, &align); + if (ret && ret != -ENODEV) + return ret; + + prop = of_flat_dt_get_addr_size_prop(node, "alloc-ranges", &len); + if (prop) { + for (i = 0; i < len; i++) { + u64 b, s; + + of_flat_dt_read_addr_size(prop, i, &b, &s); + + start = b; + end = b + s; + + base = 0; + ret = __reserved_mem_alloc_in_range(size, align, + start, end, nomap, &base); + if (ret == 0) { + pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n", + uname, &base, + (unsigned long)(size / SZ_1M)); + break; + } + } + } else { + ret = early_init_dt_alloc_reserved_memory_arch(size, align, + 0, 0, nomap, &base); + if (ret == 0) + pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n", + uname, &base, (unsigned long)(size / SZ_1M)); + } + + if (base == 0) { + pr_err("failed to allocate memory for node '%s': size %lu MiB\n", + uname, (unsigned long)(size / SZ_1M)); + return -ENOMEM; + } + + fdt_fixup_reserved_mem_node(node, base, size); + fdt_init_reserved_mem_node(node, uname, base, size); + + return 0; +} + /* * __reserved_mem_check_root() - check if #size-cells, #address-cells provided * in /reserved-memory matches the values supported by the current implementation, @@ -316,8 +446,6 @@ void __init fdt_scan_reserved_mem_late(void) __rmem_check_for_overlap(); } -static int __init __reserved_mem_alloc_size(unsigned long node, const char *uname); - /* * fdt_scan_reserved_mem() - reserve and allocate memory occupied by * reserved memory regions. @@ -393,136 +521,6 @@ int __init fdt_scan_reserved_mem(void) return 0; } -/* - * __reserved_mem_alloc_in_range() - allocate reserved memory described with - * 'alloc-ranges'. Choose bottom-up/top-down depending on nearby existing - * reserved regions to keep the reserved memory contiguous if possible. - */ -static int __init __reserved_mem_alloc_in_range(phys_addr_t size, - phys_addr_t align, phys_addr_t start, phys_addr_t end, bool nomap, - phys_addr_t *res_base) -{ - bool prev_bottom_up = memblock_bottom_up(); - bool bottom_up = false, top_down = false; - int ret, i; - - for (i = 0; i < reserved_mem_count; i++) { - struct reserved_mem *rmem = &reserved_mem[i]; - - /* Skip regions that were not reserved yet */ - if (rmem->size == 0) - continue; - - /* - * If range starts next to an existing reservation, use bottom-up: - * |....RRRR................RRRRRRRR..............| - * --RRRR------ - */ - if (start >= rmem->base && start <= (rmem->base + rmem->size)) - bottom_up = true; - - /* - * If range ends next to an existing reservation, use top-down: - * |....RRRR................RRRRRRRR..............| - * -------RRRR----- - */ - if (end >= rmem->base && end <= (rmem->base + rmem->size)) - top_down = true; - } - - /* Change setting only if either bottom-up or top-down was selected */ - if (bottom_up != top_down) - memblock_set_bottom_up(bottom_up); - - ret = early_init_dt_alloc_reserved_memory_arch(size, align, - start, end, nomap, res_base); - - /* Restore old setting if needed */ - if (bottom_up != top_down) - memblock_set_bottom_up(prev_bottom_up); - - return ret; -} - -/* - * __reserved_mem_alloc_size() - allocate reserved memory described by - * 'size', 'alignment' and 'alloc-ranges' properties. - */ -static int __init __reserved_mem_alloc_size(unsigned long node, const char *uname) -{ - phys_addr_t start = 0, end = 0; - phys_addr_t base = 0, align = 0, size; - int i, len; - const __be32 *prop; - bool nomap; - int ret; - - prop = of_get_flat_dt_prop(node, "size", &len); - if (!prop) - return -EINVAL; - - if (len != dt_root_size_cells * sizeof(__be32)) { - pr_err("invalid size property in '%s' node.\n", uname); - return -EINVAL; - } - size = dt_mem_next_cell(dt_root_size_cells, &prop); - - prop = of_get_flat_dt_prop(node, "alignment", &len); - if (prop) { - if (len != dt_root_addr_cells * sizeof(__be32)) { - pr_err("invalid alignment property in '%s' node.\n", - uname); - return -EINVAL; - } - align = dt_mem_next_cell(dt_root_addr_cells, &prop); - } - - nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; - - ret = fdt_validate_reserved_mem_node(node, &align); - if (ret && ret != -ENODEV) - return ret; - - prop = of_flat_dt_get_addr_size_prop(node, "alloc-ranges", &len); - if (prop) { - for (i = 0; i < len; i++) { - u64 b, s; - - of_flat_dt_read_addr_size(prop, i, &b, &s); - - start = b; - end = b + s; - - base = 0; - ret = __reserved_mem_alloc_in_range(size, align, - start, end, nomap, &base); - if (ret == 0) { - pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n", - uname, &base, - (unsigned long)(size / SZ_1M)); - break; - } - } - } else { - ret = early_init_dt_alloc_reserved_memory_arch(size, align, - 0, 0, nomap, &base); - if (ret == 0) - pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n", - uname, &base, (unsigned long)(size / SZ_1M)); - } - - if (base == 0) { - pr_err("failed to allocate memory for node '%s': size %lu MiB\n", - uname, (unsigned long)(size / SZ_1M)); - return -ENOMEM; - } - - fdt_fixup_reserved_mem_node(node, base, size); - fdt_init_reserved_mem_node(node, uname, base, size); - - return 0; -} - extern const struct of_device_id __reservedmem_of_table[]; static const struct of_device_id __rmem_of_table_sentinel __used __section("__reservedmem_of_table_end"); -- 2.43.0