Lines Matching +full:alloc +full:- +full:ranges
1 // SPDX-License-Identifier: GPL-2.0+
44 return -ENOMEM; in early_init_dt_alloc_reserved_memory_arch()
60 * fdt_reserved_mem_save_node() - save fdt node for second pass initialization
72 rmem->fdt_node = node; in fdt_reserved_mem_save_node()
73 rmem->name = uname; in fdt_reserved_mem_save_node()
74 rmem->base = base; in fdt_reserved_mem_save_node()
75 rmem->size = size; in fdt_reserved_mem_save_node()
82 * __reserved_mem_alloc_in_range() - allocate reserved memory described with
83 * 'alloc-ranges'. Choose bottom-up/top-down depending on nearby existing
98 if (rmem->size == 0) in __reserved_mem_alloc_in_range()
102 * If range starts next to an existing reservation, use bottom-up: in __reserved_mem_alloc_in_range()
104 * --RRRR------ in __reserved_mem_alloc_in_range()
106 if (start >= rmem->base && start <= (rmem->base + rmem->size)) in __reserved_mem_alloc_in_range()
110 * If range ends next to an existing reservation, use top-down: in __reserved_mem_alloc_in_range()
112 * -------RRRR----- in __reserved_mem_alloc_in_range()
114 if (end >= rmem->base && end <= (rmem->base + rmem->size)) in __reserved_mem_alloc_in_range()
118 /* Change setting only if either bottom-up or top-down was selected */ in __reserved_mem_alloc_in_range()
133 * __reserved_mem_alloc_size() - allocate reserved memory described by
134 * 'size', 'alignment' and 'alloc-ranges' properties.
149 return -EINVAL; in __reserved_mem_alloc_size()
153 return -EINVAL; in __reserved_mem_alloc_size()
162 return -EINVAL; in __reserved_mem_alloc_size()
167 nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; in __reserved_mem_alloc_size()
171 && of_flat_dt_is_compatible(node, "shared-dma-pool") in __reserved_mem_alloc_size()
176 prop = of_get_flat_dt_prop(node, "alloc-ranges", &len); in __reserved_mem_alloc_size()
180 pr_err("invalid alloc-ranges property in '%s', skipping node.\n", in __reserved_mem_alloc_size()
182 return -EINVAL; in __reserved_mem_alloc_size()
200 len -= t_len; in __reserved_mem_alloc_size()
214 return -ENOMEM; in __reserved_mem_alloc_size()
227 * __reserved_mem_init_node() - call region specific reserved memory init code
233 int ret = -ENOENT; in __reserved_mem_init_node()
236 reservedmem_of_init_fn initfn = i->data; in __reserved_mem_init_node()
237 const char *compat = i->compatible; in __reserved_mem_init_node()
239 if (!of_flat_dt_is_compatible(rmem->fdt_node, compat)) in __reserved_mem_init_node()
245 rmem->name, compat); in __reserved_mem_init_node()
256 if (ra->base < rb->base) in __rmem_cmp()
257 return -1; in __rmem_cmp()
259 if (ra->base > rb->base) in __rmem_cmp()
267 if (ra->size < rb->size) in __rmem_cmp()
268 return -1; in __rmem_cmp()
269 if (ra->size > rb->size) in __rmem_cmp()
272 if (ra->fdt_node < rb->fdt_node) in __rmem_cmp()
273 return -1; in __rmem_cmp()
274 if (ra->fdt_node > rb->fdt_node) in __rmem_cmp()
289 for (i = 0; i < reserved_mem_count - 1; i++) { in __rmem_check_for_overlap()
295 if (this->base + this->size > next->base) { in __rmem_check_for_overlap()
298 this_end = this->base + this->size; in __rmem_check_for_overlap()
299 next_end = next->base + next->size; in __rmem_check_for_overlap()
300 pr_err("OVERLAP DETECTED!\n%s (%pa--%pa) overlaps with %s (%pa--%pa)\n", in __rmem_check_for_overlap()
301 this->name, &this->base, &this_end, in __rmem_check_for_overlap()
302 next->name, &next->base, &next_end); in __rmem_check_for_overlap()
308 * fdt_init_reserved_mem() - allocate and init all saved reserved memory regions
319 unsigned long node = rmem->fdt_node; in fdt_init_reserved_mem()
325 nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; in fdt_init_reserved_mem()
330 rmem->phandle = of_read_number(prop, len/4); in fdt_init_reserved_mem()
332 if (rmem->size == 0) in fdt_init_reserved_mem()
333 err = __reserved_mem_alloc_size(node, rmem->name, in fdt_init_reserved_mem()
334 &rmem->base, &rmem->size); in fdt_init_reserved_mem()
337 if (err != 0 && err != -ENOENT) { in fdt_init_reserved_mem()
339 rmem->name); in fdt_init_reserved_mem()
341 memblock_clear_nomap(rmem->base, rmem->size); in fdt_init_reserved_mem()
343 memblock_phys_free(rmem->base, in fdt_init_reserved_mem()
344 rmem->size); in fdt_init_reserved_mem()
346 phys_addr_t end = rmem->base + rmem->size - 1; in fdt_init_reserved_mem()
351 &rmem->base, &end, (unsigned long)(rmem->size / SZ_1K), in fdt_init_reserved_mem()
353 reusable ? "reusable" : "non-reusable", in fdt_init_reserved_mem()
354 rmem->name ? rmem->name : "unknown"); in fdt_init_reserved_mem()
364 if (!node->phandle) in __find_rmem()
368 if (reserved_mem[i].phandle == node->phandle) in __find_rmem()
383 * of_reserved_mem_device_init_by_idx() - assign reserved memory region to
386 * @np: Pointer to the device_node with 'reserved-memory' property
389 * This function assigns respective DMA-mapping operations based on reserved
390 * memory region specified by 'memory-region' property in @np node to the @dev
406 return -EINVAL; in of_reserved_mem_device_init_by_idx()
408 target = of_parse_phandle(np, "memory-region", idx); in of_reserved_mem_device_init_by_idx()
410 return -ENODEV; in of_reserved_mem_device_init_by_idx()
420 if (!rmem || !rmem->ops || !rmem->ops->device_init) in of_reserved_mem_device_init_by_idx()
421 return -EINVAL; in of_reserved_mem_device_init_by_idx()
425 return -ENOMEM; in of_reserved_mem_device_init_by_idx()
427 ret = rmem->ops->device_init(rmem, dev); in of_reserved_mem_device_init_by_idx()
429 rd->dev = dev; in of_reserved_mem_device_init_by_idx()
430 rd->rmem = rmem; in of_reserved_mem_device_init_by_idx()
433 list_add(&rd->list, &of_rmem_assigned_device_list); in of_reserved_mem_device_init_by_idx()
436 dev_info(dev, "assigned reserved memory node %s\n", rmem->name); in of_reserved_mem_device_init_by_idx()
446 * of_reserved_mem_device_init_by_name() - assign named reserved memory region
449 * @np: pointer to the device node with 'memory-region' property
452 * Returns: 0 on success or a negative error-code on failure.
458 int idx = of_property_match_string(np, "memory-region-names", name); in of_reserved_mem_device_init_by_name()
465 * of_reserved_mem_device_release() - release reserved memory device structures
478 if (rd->dev == dev) in of_reserved_mem_device_release()
479 list_move_tail(&rd->list, &release_list); in of_reserved_mem_device_release()
484 if (rd->rmem && rd->rmem->ops && rd->rmem->ops->device_release) in of_reserved_mem_device_release()
485 rd->rmem->ops->device_release(rd->rmem, dev); in of_reserved_mem_device_release()
493 * of_reserved_mem_lookup() - acquire reserved_mem from a device node
494 * @np: node pointer of the desired reserved-memory region
506 if (!np->full_name) in of_reserved_mem_lookup()
509 name = kbasename(np->full_name); in of_reserved_mem_lookup()