xref: /kvm-unit-tests/lib/alloc_phys.h (revision dee4223b46b90103b2fd953764e3e430802a9624)
1dc47ac61SPaolo Bonzini #ifndef _ALLOC_PHYS_H_
2dc47ac61SPaolo Bonzini #define _ALLOC_PHYS_H_
3dc47ac61SPaolo Bonzini /*
4dc47ac61SPaolo Bonzini  * phys_alloc is a very simple allocator which allows physical memory
5dc47ac61SPaolo Bonzini  * to be partitioned into regions until all memory is allocated.
6dc47ac61SPaolo Bonzini  *
7dc47ac61SPaolo Bonzini  * Note: This is such a simple allocator that there is no way to free
8dc47ac61SPaolo Bonzini  * a region. For more complicated memory management a single region
9dc47ac61SPaolo Bonzini  * can be allocated, but then have its memory managed by a more
10dc47ac61SPaolo Bonzini  * sophisticated allocator, e.g. a page allocator.
11dc47ac61SPaolo Bonzini  *
12dc47ac61SPaolo Bonzini  * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
13dc47ac61SPaolo Bonzini  *
14dc47ac61SPaolo Bonzini  * This work is licensed under the terms of the GNU LGPL, version 2.
15dc47ac61SPaolo Bonzini  */
16dc47ac61SPaolo Bonzini #include "libcflat.h"
17dc47ac61SPaolo Bonzini 
18dc47ac61SPaolo Bonzini #define DEFAULT_MINIMUM_ALIGNMENT 32
19dc47ac61SPaolo Bonzini 
20dc47ac61SPaolo Bonzini /*
21dc47ac61SPaolo Bonzini  * phys_alloc_init creates the initial free memory region of size @size
22dc47ac61SPaolo Bonzini  * at @base. The minimum alignment is set to DEFAULT_MINIMUM_ALIGNMENT.
23dc47ac61SPaolo Bonzini  */
24dc47ac61SPaolo Bonzini extern void phys_alloc_init(phys_addr_t base, phys_addr_t size);
25dc47ac61SPaolo Bonzini 
26dc47ac61SPaolo Bonzini /*
27dc47ac61SPaolo Bonzini  * phys_alloc_set_minimum_alignment sets the minimum alignment to
28dc47ac61SPaolo Bonzini  * @align.
29dc47ac61SPaolo Bonzini  */
30dc47ac61SPaolo Bonzini extern void phys_alloc_set_minimum_alignment(phys_addr_t align);
31dc47ac61SPaolo Bonzini 
32dc47ac61SPaolo Bonzini /*
33dc47ac61SPaolo Bonzini  * phys_alloc_show outputs all currently allocated regions with the
34dc47ac61SPaolo Bonzini  * following format
35dc47ac61SPaolo Bonzini  *   <start_addr>-<end_addr> [<USED|FREE>]
36dc47ac61SPaolo Bonzini  */
37dc47ac61SPaolo Bonzini extern void phys_alloc_show(void);
38dc47ac61SPaolo Bonzini 
39937e2392SPaolo Bonzini /*
402b527259SAndrew Jones  * phys_alloc_get_unused allocates all remaining memory from the region
412b527259SAndrew Jones  * passed to phys_alloc_init, returning the newly allocated memory's base
42*dee4223bSClaudio Imbrenda  * and top addresses. phys_alloc_get_unused will still return base and top
432b527259SAndrew Jones  * when no free memory is remaining, but base will equal top.
44937e2392SPaolo Bonzini  */
45937e2392SPaolo Bonzini extern void phys_alloc_get_unused(phys_addr_t *p_base, phys_addr_t *p_top);
46937e2392SPaolo Bonzini 
4748a0145fSPaolo Bonzini /*
4848a0145fSPaolo Bonzini  * Search for memory that can only be used when the MMU is on, and reinitialize
4948a0145fSPaolo Bonzini  * the physical memory allocator using it.
5048a0145fSPaolo Bonzini  */
5148a0145fSPaolo Bonzini extern void find_highmem(void);
5248a0145fSPaolo Bonzini 
53dc47ac61SPaolo Bonzini #endif /* _ALLOC_PHYS_H_ */
54