diff options
| author | zms123456 <[email protected]> | 2024-06-26 14:36:49 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-06-26 14:36:49 +0800 |
| commit | b785ef9ed76fcf97d3f2d59e02bfaa8b5f6cc74e (patch) | |
| tree | 30056616a80720abecb7186ed1ac4a585f4674d3 /components/mm | |
| parent | ac2664438d0d1048be46cb110549b90213a0e57a (diff) | |
[libcpu][aarch64]memory setup using memblock (#9092)
* memory setup using memblock
* map pages later
Diffstat (limited to 'components/mm')
| -rw-r--r-- | components/mm/mm_memblock.c | 79 | ||||
| -rw-r--r-- | components/mm/mm_memblock.h | 4 |
2 files changed, 51 insertions, 32 deletions
diff --git a/components/mm/mm_memblock.c b/components/mm/mm_memblock.c index 8ec0867942..77ef4ddbe0 100644 --- a/components/mm/mm_memblock.c +++ b/components/mm/mm_memblock.c @@ -112,9 +112,9 @@ rt_inline void _reg_remove_after(struct rt_mmblk_reg *prev) /* adding overlapped regions is banned */ static rt_err_t _memblock_add_range(struct rt_memblock *memblock, - char *name, rt_size_t start, rt_size_t end, mm_flag_t flag) + const char *name, rt_size_t start, rt_size_t end, mm_flag_t flag) { - struct rt_mmblk_reg *reg, *reg_next; + struct rt_mmblk_reg *reg = RT_NULL, *reg_next = RT_NULL; rt_slist_t sentinel; rt_region_t new_region; @@ -153,7 +153,7 @@ static rt_err_t _memblock_add_range(struct rt_memblock *memblock, return _reg_insert_after(reg, &new_region, flag); } -rt_err_t rt_memblock_add_memory(char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags) +rt_err_t rt_memblock_add_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags) { LOG_D("add physical address range [%p-%p) with flag 0x%x" \ " to overall memory regions\n", base, base + size, flag); @@ -161,7 +161,7 @@ rt_err_t rt_memblock_add_memory(char *name, rt_size_t start, rt_size_t end, mmbl return _memblock_add_range(&mmblk_memory, name, start, end, flags); } -rt_err_t rt_memblock_reserve_memory(char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags) +rt_err_t rt_memblock_reserve_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags) { LOG_D("add physical address range [%p-%p) to reserved memory regions\n",\ base, base + size); @@ -319,7 +319,7 @@ static void _next_free_region(struct rt_mmblk_reg **m, struct rt_mmblk_reg **r, /* merge normal memory regions */ static void _memblock_merge_memory(void) { - struct rt_mmblk_reg *reg; + struct rt_mmblk_reg *reg = RT_NULL; rt_slist_for_each_entry(reg, &(mmblk_memory.reg_list), node) { @@ -333,43 +333,62 @@ static void _memblock_merge_memory(void) } } -/* free all available memory to buddy system */ -static void _memblock_free_all(void) +void rt_memblock_setup_memory_environment(void) { - rt_region_t reg; + struct rt_mmblk_reg *iter = RT_NULL, *start_reg = RT_NULL, *end_reg = RT_NULL; + rt_region_t reg = {0}; rt_size_t mem = 0; struct rt_mmblk_reg *m, *r; + void *err; - for_each_free_region(m, r, MEMBLOCK_NONE, ®.start, ®.end) - { - reg.start -= PV_OFFSET; - reg.end -= PV_OFFSET; - rt_page_install(reg); + _memblock_merge_memory(); - LOG_D("region [%p-%p) added to buddy system\n", reg.start, reg.end); - mem += reg.end - reg.start; - } + LOG_I("System memory:"); - LOG_D("0x%lx(%ld) bytes memory added to buddy system\n", mem, mem); -} + rt_slist_for_each_entry(iter, &(mmblk_memory.reg_list), node) + { + LOG_I(" %-*.s [%p, %p]", RT_NAME_MAX, iter->memreg.name, iter->memreg.start, iter->memreg.end); + } -void rt_memblock_setup_memory_environment(void) -{ - struct rt_mmblk_reg *reg, *start_reg, *end_reg; - rt_err_t err = RT_EOK; + LOG_I("Reserved memory:"); - _memblock_merge_memory(); - rt_slist_for_each_entry(reg, &(mmblk_reserved.reg_list), node) + rt_slist_for_each_entry(iter, &(mmblk_reserved.reg_list), node) { - if (reg->flags != MEMBLOCK_NONE) - { - err = _memblock_separate_range(&mmblk_memory, reg->memreg.start, reg->memreg.end, &start_reg, &end_reg); - RT_ASSERT(err == RT_EOK); + LOG_I(" %-*.s [%p, %p]", RT_NAME_MAX, iter->memreg.name, iter->memreg.start, iter->memreg.end); - _memblock_set_flag(start_reg, end_reg, reg->flags); + if (iter->flags != MEMBLOCK_NONE) + { + _memblock_separate_range(&mmblk_memory, iter->memreg.start, iter->memreg.end, &start_reg, &end_reg); + _memblock_set_flag(start_reg, end_reg, iter->flags); } } - _memblock_free_all(); + + /* install usable memory to system page */ + for_each_free_region(m, r, MEMBLOCK_NONE, ®.start, ®.end) + { + reg.start = RT_ALIGN(reg.start, ARCH_PAGE_SIZE); + reg.end = RT_ALIGN_DOWN(reg.end, ARCH_PAGE_SIZE); + + if (reg.start >= reg.end) + continue; + + LOG_I("physical memory region [%p-%p] installed to system page", reg.start, reg.end); + + reg.start -= PV_OFFSET; + reg.end -= PV_OFFSET; + + struct rt_mm_va_hint hint = {.flags = MMF_MAP_FIXED, + .limit_start = rt_kernel_space.start, + .limit_range_size = rt_kernel_space.size, + .map_size = reg.end - reg.start, + .prefer = (void *)reg.start}; + + rt_aspace_map_phy(&rt_kernel_space, &hint, MMU_MAP_K_RWCB, (reg.start + PV_OFFSET) >> MM_PAGE_SHIFT, &err); + rt_page_install(reg); + mem += reg.end - reg.start; + } + + LOG_I("%ld MB memory installed to system page", mem/1000000); } #ifdef UTEST_MM_API_TC diff --git a/components/mm/mm_memblock.h b/components/mm/mm_memblock.h index da9c7a679b..cb2185d866 100644 --- a/components/mm/mm_memblock.h +++ b/components/mm/mm_memblock.h @@ -56,7 +56,7 @@ struct rt_memblock * @param end the size of the physical address range * @param flags the flags of the region */ -rt_err_t rt_memblock_add_memory(char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags); +rt_err_t rt_memblock_add_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags); /** * @brief Add a physical address range to the reserved memory region @@ -68,7 +68,7 @@ rt_err_t rt_memblock_add_memory(char *name, rt_size_t start, rt_size_t end, mmbl * @param end the size of the physical address range * @param flags the flags of the region */ -rt_err_t rt_memblock_reserve_memory(char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags); +rt_err_t rt_memblock_reserve_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags); /** * @brief To conclude the management of memory by the memblock. |
