• Home
  • Raw
  • Download

Lines Matching +full:reserved +full:- +full:memory

1 // SPDX-License-Identifier: GPL-2.0+
3 * Device tree based initialization code for reserved memory.
5 * Copyright (c) 2013, 2015 The Linux Foundation. All Rights Reserved.
12 #define pr_fmt(fmt) "OF: reserved mem: " fmt
42 return -ENOMEM; in early_init_dt_alloc_reserved_memory_arch()
49 return -ENOMEM; in early_init_dt_alloc_reserved_memory_arch()
62 pr_err("Reserved memory not supported, ignoring region 0x%llx%s\n", in early_init_dt_alloc_reserved_memory_arch()
64 return -ENOSYS; in early_init_dt_alloc_reserved_memory_arch()
69 * res_mem_save_node() - save fdt node for second pass initialization
81 rmem->fdt_node = node; in fdt_reserved_mem_save_node()
82 rmem->name = uname; in fdt_reserved_mem_save_node()
83 rmem->base = base; in fdt_reserved_mem_save_node()
84 rmem->size = size; in fdt_reserved_mem_save_node()
91 * res_mem_alloc_size() - allocate reserved memory described by 'size', 'align'
92 * and 'alloc-ranges' properties
107 return -EINVAL; in __reserved_mem_alloc_size()
111 return -EINVAL; in __reserved_mem_alloc_size()
115 nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; in __reserved_mem_alloc_size()
122 return -EINVAL; in __reserved_mem_alloc_size()
129 && of_flat_dt_is_compatible(node, "shared-dma-pool") in __reserved_mem_alloc_size()
131 && !of_get_flat_dt_prop(node, "no-map", NULL)) { in __reserved_mem_alloc_size()
133 max_t(unsigned long, MAX_ORDER - 1, pageblock_order); in __reserved_mem_alloc_size()
138 prop = of_get_flat_dt_prop(node, "alloc-ranges", &len); in __reserved_mem_alloc_size()
142 pr_err("invalid alloc-ranges property in '%s', skipping node.\n", in __reserved_mem_alloc_size()
144 return -EINVAL; in __reserved_mem_alloc_size()
157 pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n", in __reserved_mem_alloc_size()
162 len -= t_len; in __reserved_mem_alloc_size()
169 pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n", in __reserved_mem_alloc_size()
174 pr_info("failed to allocate memory for node '%s'\n", uname); in __reserved_mem_alloc_size()
175 return -ENOMEM; in __reserved_mem_alloc_size()
188 * res_mem_init_node() - call region specific reserved memory init code
196 reservedmem_of_init_fn initfn = i->data; in __reserved_mem_init_node()
197 const char *compat = i->compatible; in __reserved_mem_init_node()
199 if (!of_flat_dt_is_compatible(rmem->fdt_node, compat)) in __reserved_mem_init_node()
204 rmem->name, compat); in __reserved_mem_init_node()
208 return -ENOENT; in __reserved_mem_init_node()
215 if (ra->base < rb->base) in __rmem_cmp()
216 return -1; in __rmem_cmp()
218 if (ra->base > rb->base) in __rmem_cmp()
233 for (i = 0; i < reserved_mem_count - 1; i++) { in __rmem_check_for_overlap()
238 if (!(this->base && next->base)) in __rmem_check_for_overlap()
240 if (this->base + this->size > next->base) { in __rmem_check_for_overlap()
243 this_end = this->base + this->size; in __rmem_check_for_overlap()
244 next_end = next->base + next->size; in __rmem_check_for_overlap()
245 pr_err("OVERLAP DETECTED!\n%s (%pa--%pa) overlaps with %s (%pa--%pa)\n", in __rmem_check_for_overlap()
246 this->name, &this->base, &this_end, in __rmem_check_for_overlap()
247 next->name, &next->base, &next_end); in __rmem_check_for_overlap()
253 * fdt_init_reserved_mem - allocate and init all saved reserved memory regions
259 /* check for overlapping reserved regions */ in fdt_init_reserved_mem()
264 unsigned long node = rmem->fdt_node; in fdt_init_reserved_mem()
273 rmem->phandle = of_read_number(prop, len/4); in fdt_init_reserved_mem()
275 if (rmem->size == 0) in fdt_init_reserved_mem()
276 err = __reserved_mem_alloc_size(node, rmem->name, in fdt_init_reserved_mem()
277 &rmem->base, &rmem->size); in fdt_init_reserved_mem()
287 if (!node->phandle) in __find_rmem()
291 if (reserved_mem[i].phandle == node->phandle) in __find_rmem()
306 * of_reserved_mem_device_init_by_idx() - assign reserved memory region to
309 * @np: Pointer to the device_node with 'reserved-memory' property
312 * This function assigns respective DMA-mapping operations based on reserved
313 * memory region specified by 'memory-region' property in @np node to the @dev
314 * device. When driver needs to use more than one reserved memory region, it
329 return -EINVAL; in of_reserved_mem_device_init_by_idx()
331 target = of_parse_phandle(np, "memory-region", idx); in of_reserved_mem_device_init_by_idx()
333 return -ENODEV; in of_reserved_mem_device_init_by_idx()
338 if (!rmem || !rmem->ops || !rmem->ops->device_init) in of_reserved_mem_device_init_by_idx()
339 return -EINVAL; in of_reserved_mem_device_init_by_idx()
343 return -ENOMEM; in of_reserved_mem_device_init_by_idx()
345 ret = rmem->ops->device_init(rmem, dev); in of_reserved_mem_device_init_by_idx()
347 rd->dev = dev; in of_reserved_mem_device_init_by_idx()
348 rd->rmem = rmem; in of_reserved_mem_device_init_by_idx()
351 list_add(&rd->list, &of_rmem_assigned_device_list); in of_reserved_mem_device_init_by_idx()
354 * using reserved memory in of_reserved_mem_device_init_by_idx()
358 dev_info(dev, "assigned reserved memory node %s\n", rmem->name); in of_reserved_mem_device_init_by_idx()
368 * of_reserved_mem_device_release() - release reserved memory device structures
371 * This function releases structures allocated for memory region handling for
381 if (rd->dev == dev) { in of_reserved_mem_device_release()
382 rmem = rd->rmem; in of_reserved_mem_device_release()
383 list_del(&rd->list); in of_reserved_mem_device_release()
390 if (!rmem || !rmem->ops || !rmem->ops->device_release) in of_reserved_mem_device_release()
393 rmem->ops->device_release(rmem, dev); in of_reserved_mem_device_release()
398 * of_reserved_mem_lookup() - acquire reserved_mem from a device node
399 * @np: node pointer of the desired reserved-memory region
411 if (!np->full_name) in of_reserved_mem_lookup()
414 name = kbasename(np->full_name); in of_reserved_mem_lookup()