aboutsummaryrefslogtreecommitdiff
path: root/include/apos/mem.h
blob: 1486400bbf29b726515d6dcff08588209765dbe1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifndef APOS_MEM_H
#define APOS_MEM_H

/**
 * @file mem.h
 * Generic memory, common to both physical and virtual memory.
 */

#include <apos/utils.h>
#include <apos/types.h>

#define MM_OINFO_WIDTH (sizeof(mm_info_t) * 8)

#define pnum_to_index(pnum, order)                                             \
	(((pnum) >> __o_offset(order)) & (__o_width(order) - 1))
#define pm_to_index(paddr, \
	            order)       (pnum_to_index(pm_to_pnum(paddr), (order)))
#define pm_to_pnum(paddr)               ((paddr) >> __mm_page_shift)
#define pnum_to_paddr(pnum)             ((pnum) << __mm_page_shift)

#define move_forward(var, num)          (((var) += (num)) - (num))

#define move_paddr(paddr, base, offset) ((((pm_t)(paddr)) - (base)) + (offset))
#define num_elems(num)                  (((num) + MM_OINFO_WIDTH - 1) / \
	                                 MM_OINFO_WIDTH)
#define num_indexes(num)                ((num) / MM_OINFO_WIDTH)
#define index_elems(num)                ((num) / MM_OINFO_WIDTH)
#define state_elems(num)                (sizeof(mm_info_t) * (num_elems(num)))
#define next_elems(num)                 (sizeof(void *) * (num))
#define max_index(order)                (__o_width(order) - 1)

#define __o_offset(order)               (__mm_shifts[order])
#define __o_width(order)                (__mm_widths[order])
#define __o_size(order)                 (__mm_sizes[order])
#define __o_elems(order)                (__mm_widths[order] / MM_OINFO_WIDTH)

#define __o_container(idx)              ((idx) / MM_OINFO_WIDTH)
#define __o_bit(idx)                    ((idx) & (MM_OINFO_WIDTH - 1))

#define __va(x)                         (void *)(((uintptr_t)(x)) + VM_DMAP - \
	                                         RAM_BASE)
#define __pa(x)                         (void *)(((uintptr_t)(x)) - VM_DMAP + \
	                                         RAM_BASE)
#define __page(x)                       ((x) / BASE_PAGE_SIZE)
#define __addr(x)                       ((x)*BASE_PAGE_SIZE)
#define __pages(x)                                                             \
	(is_aligned((x), BASE_PAGE_SIZE) ? __page((x)) :                       \
	 __page((x) + BASE_PAGE_SIZE))
#define __bytes(x) (__addr(x))

/** Memory region is used. */
#define MR_USED    (1 << 8)
/** Memory region is shared. */
#define MR_SHARED  (1 << 9)
/** Owner of shared region. */
#define MR_OWNED   (1 << 10)
/** Copy on write. */
#define MR_COW     (1 << 11)
/** Don't free memory on flush. */
#define MR_KEEP    (1 << 12)

extern size_t __mm_shifts[10];
extern size_t __mm_widths[10];
extern size_t __mm_sizes[10];

extern size_t __mm_page_shift;
extern size_t __mm_max_order;

#define NUM_ORDERS 10
enum mm_order {
	MM_O0,
	MM_O1,
	MM_O2,
	MM_O3,
	MM_O4,
	MM_O5,
	MM_O6,
	MM_O7,
	MM_O8,
	MM_O9,
};

typedef ssize_t pnum_t;
void init_mem(size_t max_order, size_t shifts[10], size_t page_shift);
enum mm_mode get_mmode(void *fdt);

#define BASE_PAGE_SIZE (__o_size(BASE_PAGE))
#define BASE_PAGE      (MM_O0)

#endif /* APOS_MEM_H */