diff options
Diffstat (limited to 'common/pmem.c')
| -rw-r--r-- | common/pmem.c | 136 |
1 files changed, 71 insertions, 65 deletions
diff --git a/common/pmem.c b/common/pmem.c index 4c965cf..6ef89bc 100644 --- a/common/pmem.c +++ b/common/pmem.c @@ -8,25 +8,28 @@ #include <libfdt.h> /* NOTE: these are all for pnum_t, i.e. O0_SHIFT is from 0 */ -#define __foreach_page(var, start, end, attr, neg)\ - for(size_t i = num_indexes(start); i < num_elems(end); ++i)\ - if(var->attr[i] == (mm_info_t)(-1)) continue;\ - else for(pnum_t page = i * MM_OINFO_WIDTH, j = 0;\ - j < (pnum_t)MIN((end) - i * MM_OINFO_WIDTH, MM_OINFO_WIDTH);\ - ++j, ++page)\ - if(neg(__is_nset(var->attr[i], j))) +#define __foreach_page(var, start, end, attr, neg) \ + for (size_t i = num_indexes(start); i < num_elems(end); ++i) \ + if (var->attr[i] == (mm_info_t)(-1)) \ + continue; \ + else \ + for (pnum_t page = i * MM_OINFO_WIDTH, j = 0; \ + j < (pnum_t)MIN((end)-i * MM_OINFO_WIDTH, \ + MM_OINFO_WIDTH); \ + ++j, ++page) \ + if (neg(__is_nset(var->attr[i], j))) #define NEG ! -#define foreach_full_page(var, start, order)\ +#define foreach_full_page(var, start, order) \ __foreach_page(var, start, var->entries, full, ) -#define foreach_not_full_page(var, start, order)\ +#define foreach_not_full_page(var, start, order) \ __foreach_page(var, start, var->entries, full, NEG) -#define foreach_used_page(var, start, order)\ +#define foreach_used_page(var, start, order) \ __foreach_page(var, start, var->entries, used, ) -#define foreach_not_used_page(var, start, order)\ +#define foreach_not_used_page(var, start, order) \ __foreach_page(var, start, var->entries, used, NEG) typedef uint32_t mm_info_t; @@ -55,8 +58,8 @@ struct mm_pmap_t { static struct mm_pmap_t *pmap = 0; -static void __mark_free(mm_node_t * op, pnum_t pnum, enum mm_order tgt, - enum mm_order src, enum mm_order dst) +static void __mark_free(mm_node_t *op, pnum_t pnum, enum mm_order tgt, + enum mm_order src, enum mm_order dst) { size_t idx = pnum_to_index(pnum, src); @@ -67,7 +70,7 @@ static void __mark_free(mm_node_t * op, pnum_t pnum, enum mm_order tgt, } struct mm_branch_t *o = (struct mm_branch_t *)op; - if(src != tgt) + if (src != tgt) __mark_free(o->next[idx], pnum, tgt, src - 1, dst); /* freeing a page results in always clearing a full bit? */ @@ -87,15 +90,15 @@ void free_page(enum mm_order order, pm_t paddr) for (size_t j = 0; j < omap->order; ++j) __mark_free(omap->orders[j], - pm_to_pnum(paddr - omap->base), - order, omap->order, j); + pm_to_pnum(paddr - omap->base), order, + omap->order, j); return; } } -static bool __mark_used(mm_node_t * op, pnum_t pnum, enum mm_order tgt, - enum mm_order src, enum mm_order dst) +static bool __mark_used(mm_node_t *op, pnum_t pnum, enum mm_order tgt, + enum mm_order src, enum mm_order dst) { size_t idx = pnum_to_index(pnum, src); @@ -141,21 +144,22 @@ void mark_used(enum mm_order order, pm_t paddr) for (size_t j = 0; j <= omap->order; ++j) __mark_used(omap->orders[j], - pm_to_pnum(paddr - omap->base), - order, omap->order, j); + pm_to_pnum(paddr - omap->base), order, + omap->order, j); return; } } -static pnum_t __enum_order(mm_node_t * op, pnum_t offset, - enum mm_order src, enum mm_order dst) +static pnum_t __enum_order(mm_node_t *op, pnum_t offset, enum mm_order src, + enum mm_order dst) { size_t idx = pnum_to_index(offset, src); if (src == dst) { struct mm_leaf_t *o = (struct mm_leaf_t *)op; - foreach_not_used_page(o, idx, src) { + foreach_not_used_page(o, idx, src) + { return page << __o_offset(src); } @@ -163,11 +167,12 @@ static pnum_t __enum_order(mm_node_t * op, pnum_t offset, } struct mm_branch_t *o = (struct mm_branch_t *)op; - foreach_not_full_page(o, idx, src) { + foreach_not_full_page(o, idx, src) + { /* if the suggested search index is full, the following level * would get an incorrect offset if trying to follow the original * suggestion. */ - if (page != (pnum_t) idx) + if (page != (pnum_t)idx) offset = 0; pnum_t ret = __enum_order(o->next[page], offset, src - 1, dst); @@ -195,8 +200,8 @@ pm_t alloc_page(enum mm_order order, pm_t offset) if (offset != 0) base = offset - omap->base; - pnum = __enum_order(omap->orders[order], - pm_to_pnum(base), omap->order, order); + pnum = __enum_order(omap->orders[order], pm_to_pnum(base), + omap->order, order); if (!(pnum < 0)) break; @@ -211,43 +216,43 @@ pm_t alloc_page(enum mm_order order, pm_t offset) } /* unfortunate that populating the mm info is so complicated */ -static pm_t __populate_order(mm_node_t ** op, pm_t cont, - enum mm_order src, enum mm_order dst, size_t num) +static pm_t __populate_order(mm_node_t **op, pm_t cont, enum mm_order src, + enum mm_order dst, size_t num) { if (src == dst) { - struct mm_leaf_t *o = (struct mm_leaf_t *) - move_forward(cont, sizeof(struct mm_leaf_t)); + struct mm_leaf_t *o = (struct mm_leaf_t *)move_forward( + cont, sizeof(struct mm_leaf_t)); o->entries = num; - o->used = (mm_info_t *) move_forward(cont, state_elems(num)); + o->used = (mm_info_t *)move_forward(cont, state_elems(num)); memset(o->used, 0, state_elems(num)); - *op = (mm_node_t *) o; + *op = (mm_node_t *)o; return cont; } - struct mm_branch_t *o = (struct mm_branch_t *) - move_forward(cont, sizeof(struct mm_branch_t)); + struct mm_branch_t *o = (struct mm_branch_t *)move_forward( + cont, sizeof(struct mm_branch_t)); o->entries = num; - o->full = (mm_info_t *) move_forward(cont, state_elems(num)); - o->next = (mm_node_t **) move_forward(cont, next_elems(num)); + o->full = (mm_info_t *)move_forward(cont, state_elems(num)); + o->next = (mm_node_t **)move_forward(cont, next_elems(num)); memset(o->full, 0, state_elems(num)); memset(o->next, 0, next_elems(num)); for (size_t i = 0; i < num; ++i) { - cont = __populate_order(&o->next[i], cont, - src - 1, dst, __o_width(src - 1)); + cont = __populate_order(&o->next[i], cont, src - 1, dst, + __o_width(src - 1)); } - *op = (mm_node_t *) o; + *op = (mm_node_t *)o; return cont; } static pm_t __probe_order(pm_t cont, enum mm_order src, enum mm_order dst, - size_t num) + size_t num) { - if(src == dst){ + if (src == dst) { cont += sizeof(struct mm_leaf_t); cont += state_elems(num); return cont; @@ -257,29 +262,29 @@ static pm_t __probe_order(pm_t cont, enum mm_order src, enum mm_order dst, cont += state_elems(num); cont += next_elems(num); - for(size_t i = 0; i < num; ++i) + for (size_t i = 0; i < num; ++i) cont = __probe_order(cont, src - 1, dst, __o_width(src - 1)); return cont; } -static pm_t __populate_omap(struct mm_omap_t **omap, pm_t cont, - pm_t base, size_t entries, enum mm_order order) +static pm_t __populate_omap(struct mm_omap_t **omap, pm_t cont, pm_t base, + size_t entries, enum mm_order order) { - struct mm_omap_t *lomap = (struct mm_omap_t *) - move_forward(cont, sizeof(struct mm_omap_t)); + struct mm_omap_t *lomap = (struct mm_omap_t *)move_forward( + cont, sizeof(struct mm_omap_t)); memset(lomap, 0, sizeof(struct mm_omap_t)); - lomap->orders = (mm_node_t **) move_forward(cont, - (order + 1) * sizeof(mm_node_t **)); + lomap->orders = (mm_node_t **)move_forward( + cont, (order + 1) * sizeof(mm_node_t **)); memset(lomap->orders, 0, (order + 1) * sizeof(mm_node_t **)); lomap->order = order; lomap->base = base; for (size_t i = 0; i <= order; ++i) - cont = __populate_order(&lomap->orders[i], cont, - order, i, entries); + cont = __populate_order(&lomap->orders[i], cont, order, i, + entries); *omap = lomap; return cont; @@ -290,7 +295,7 @@ static pm_t __probe_omap(pm_t cont, size_t entries, enum mm_order order) cont += sizeof(struct mm_omap_t); cont += (order + 1) * sizeof(mm_node_t **); - for(size_t i = 0; i <= order; ++i) + for (size_t i = 0; i <= order; ++i) cont = __probe_order(cont, order, i, entries); return cont; @@ -310,8 +315,8 @@ pm_t populate_pmap(pm_t ram_base, size_t ram_size, pm_t cont) if (entries == 0) continue; - cont = __populate_omap(&pmap->omap[i], cont, - ram_region, entries, i); + cont = __populate_omap(&pmap->omap[i], cont, ram_region, + entries, i); ram_left -= __mm_sizes[i] * entries; ram_region += (__mm_sizes[i] * entries); @@ -332,9 +337,9 @@ pm_t probe_pmap(pm_t ram_base, size_t ram_size) pm_t ram_region = ram_base; size_t ram_left = ram_size; - for(ssize_t i = __mm_max_order; i >= MM_O0; --i){ + for (ssize_t i = __mm_max_order; i >= MM_O0; --i) { size_t entries = ram_left / __mm_sizes[i]; - if(entries == 0) + if (entries == 0) continue; cont = __probe_omap(cont, entries, i); @@ -350,13 +355,13 @@ static void __mark_area_used(pm_t base, pm_t top) { size_t area_left = top - base; pm_t runner = base; - while(area_left >= BASE_PAGE_SIZE){ + while (area_left >= BASE_PAGE_SIZE) { mark_used(BASE_PAGE, runner); runner += BASE_PAGE_SIZE; area_left -= BASE_PAGE_SIZE; } - if(area_left != 0) + if (area_left != 0) mark_used(BASE_PAGE, runner); } @@ -364,11 +369,12 @@ static void __mark_reserved_mem(void *fdt) { int rmem_offset = fdt_path_offset(fdt, "/reserved-memory/mmode_resv0"); struct cell_info ci = get_reginfo(fdt, "/reserved-memory/mmode_resv0"); - uint8_t *rmem_reg = (uint8_t *)fdt_getprop(fdt, rmem_offset, "reg", NULL); + uint8_t *rmem_reg = + (uint8_t *)fdt_getprop(fdt, rmem_offset, "reg", NULL); pm_t base = (pm_t)fdt_load_int_ptr(ci.addr_cells, rmem_reg); - if(ci.addr_cells == 2) + if (ci.addr_cells == 2) rmem_reg += sizeof(fdt64_t); else rmem_reg += sizeof(fdt32_t); @@ -385,7 +391,7 @@ static pm_t __get_ramtop(void *fdt) pm_t base = (pm_t)fdt_load_int_ptr(ci.addr_cells, mem_reg); - if(ci.addr_cells == 2) + if (ci.addr_cells == 2) mem_reg += sizeof(fdt64_t); else mem_reg += sizeof(fdt32_t); @@ -409,7 +415,7 @@ void init_pmem(void *fdt) { size_t max_order = 0; size_t base_bits = 0; - size_t bits[NUM_ORDERS] = {0}; + size_t bits[NUM_ORDERS] = { 0 }; stat_pmem_conf(fdt, &max_order, &base_bits, bits); init_mem(max_order, bits, base_bits); @@ -426,9 +432,9 @@ void init_pmem(void *fdt) size_t probe_size = probe_pmap(ram_base, ram_size); size_t actual_size = populate_pmap(ram_base, ram_size, pmap_base); - if(probe_size != actual_size) - bug("probe_size (%#lx) != actual_size (%#lx)\n", - probe_size, actual_size); + if (probe_size != actual_size) + bug("probe_size (%#lx) != actual_size (%#lx)\n", probe_size, + actual_size); /* mark init stack, this should be unmapped once we get to executing * processes */ |
