Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 7e319bf

Browse files
committedJun 24, 2024·
memory setup using memblock
1 parent 22b5e5f commit 7e319bf

File tree

9 files changed

+107
-451
lines changed

9 files changed

+107
-451
lines changed
 

‎bsp/qemu-virt64-aarch64/drivers/board.c

-7
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,5 @@ extern size_t MMUTable[];
2121

2222
void rt_hw_board_init(void)
2323
{
24-
rt_fdt_commit_memregion_early(&(rt_region_t)
25-
{
26-
.name = "memheap",
27-
.start = (rt_size_t)rt_kmem_v2p(HEAP_BEGIN),
28-
.end = (rt_size_t)rt_kmem_v2p(HEAP_END),
29-
}, RT_TRUE);
30-
3124
rt_hw_common_setup();
3225
}

‎components/drivers/core/mnt.c

+6-11
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <msh.h>
2222
#endif
2323
#include <ioremap.h>
24+
#include <mm_memblock.h>
2425

2526
#ifdef RT_USING_OFW
2627
#define bootargs_select rt_ofw_bootargs_select
@@ -45,19 +46,13 @@ static int rootfs_mnt_init(void)
4546
rt_region_t *mem_region;
4647
rt_uint64_t initrd_start = 0, initrd_end = 0;
4748

48-
if (!memregion_request(&mem_region, &mem_region_nr, RT_TRUE))
49+
rt_slist_for_each_entry(iter, &(rt_memblock_get_reserved()->reg_list), node)
4950
{
50-
while (mem_region_nr-- > 0)
51+
if (rt_strcmp(iter->memreg.name, name) == 0)
5152
{
52-
if (mem_region->name == name || !rt_strcmp(mem_region->name, name))
53-
{
54-
initrd_start = mem_region->start;
55-
initrd_end = mem_region->end;
56-
57-
break;
58-
}
59-
60-
mem_region++;
53+
initrd_start = iter->memreg.start;
54+
initrd_end = iter->memreg.end;
55+
break;
6156
}
6257
}
6358

‎components/drivers/ofw/Kconfig

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ menuconfig RT_USING_OFW
33
select RT_USING_ADT
44
select RT_USING_ADT_REF
55
select RT_USING_ADT_BITMAP
6+
select RT_USING_MEMBLOCK
67
depends on RT_USING_DM
78
default n
89

‎components/drivers/ofw/fdt.c

+9-186
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#include <drivers/ofw_raw.h>
1616
#include <drivers/core/dm.h>
1717

18+
#include <mm_memblock.h>
19+
1820
#define DBG_TAG "rtdm.ofw"
1921
#define DBG_LVL DBG_INFO
2022
#include <rtdbg.h>
@@ -29,9 +31,6 @@ RT_OFW_SYMBOL_TYPE_RANGE(earlycon, struct rt_fdt_earlycon_id, _earlycon_start =
2931
#define ARCH_INIT_MEMREGION_NR 128
3032
#endif
3133

32-
static rt_region_t _memregion[ARCH_INIT_MEMREGION_NR] rt_section(".bss.noclean.memregion");
33-
static int _memregion_front_idx = 0, _memregion_last_idx = RT_ARRAY_SIZE(_memregion) - 1;
34-
3534
static void *_fdt = RT_NULL;
3635
static rt_phandle _phandle_min;
3736
static rt_phandle _phandle_max;
@@ -140,71 +139,6 @@ rt_bool_t rt_fdt_device_is_available(void *fdt, int nodeoffset)
140139
return ret;
141140
}
142141

143-
rt_err_t rt_fdt_commit_memregion_early(rt_region_t *region, rt_bool_t is_reserved)
144-
{
145-
rt_err_t err = RT_EOK;
146-
147-
if (region && region->name)
148-
{
149-
if (_memregion_front_idx < _memregion_last_idx)
150-
{
151-
int idx;
152-
153-
if (!_memregion_front_idx && _memregion_last_idx == RT_ARRAY_SIZE(_memregion) - 1)
154-
{
155-
for (int i = 0; i < RT_ARRAY_SIZE(_memregion); ++i)
156-
{
157-
_memregion[i].name = RT_NULL;
158-
}
159-
}
160-
161-
idx = is_reserved ? _memregion_last_idx-- : _memregion_front_idx++;
162-
163-
rt_memcpy(&_memregion[idx], region, sizeof(*region));
164-
}
165-
else
166-
{
167-
err = -RT_EEMPTY;
168-
}
169-
}
170-
else
171-
{
172-
err = -RT_EINVAL;
173-
}
174-
175-
return err;
176-
}
177-
178-
rt_err_t rt_fdt_commit_memregion_request(rt_region_t **out_region, rt_size_t *out_nr, rt_bool_t is_reserved)
179-
{
180-
rt_err_t err = RT_EOK;
181-
182-
if (out_region && out_nr)
183-
{
184-
if (is_reserved)
185-
{
186-
*out_region = &_memregion[_memregion_last_idx + 1];
187-
*out_nr = RT_ARRAY_SIZE(_memregion) - 1 - _memregion_last_idx;
188-
}
189-
else
190-
{
191-
*out_region = &_memregion[0];
192-
*out_nr = _memregion_front_idx;
193-
}
194-
195-
if (*out_nr == 0)
196-
{
197-
err = -RT_EEMPTY;
198-
}
199-
}
200-
else
201-
{
202-
err = -RT_EINVAL;
203-
}
204-
205-
return err;
206-
}
207-
208142
rt_err_t rt_fdt_prefetch(void *fdt)
209143
{
210144
rt_err_t err = -RT_ERROR;
@@ -256,26 +190,6 @@ rt_err_t rt_fdt_scan_root(void)
256190
return err;
257191
}
258192

259-
rt_inline rt_err_t commit_memregion(const char *name, rt_uint64_t base, rt_uint64_t size, rt_bool_t is_reserved)
260-
{
261-
return rt_fdt_commit_memregion_early(&(rt_region_t)
262-
{
263-
.name = name,
264-
.start = (rt_size_t)base,
265-
.end = (rt_size_t)(base + size),
266-
}, is_reserved);
267-
}
268-
269-
static rt_err_t reserve_memregion(const char *name, rt_uint64_t base, rt_uint64_t size)
270-
{
271-
if (commit_memregion(name, base, size, RT_TRUE) == -RT_EEMPTY)
272-
{
273-
LOG_W("Reserved memory: %p - %p%s", base, base + size, " unable to record");
274-
}
275-
276-
return RT_EOK;
277-
}
278-
279193
static rt_err_t fdt_reserved_mem_check_root(int nodeoffset)
280194
{
281195
rt_err_t err = RT_EOK;
@@ -331,8 +245,9 @@ static rt_err_t fdt_reserved_memory_reg(int nodeoffset, const char *uname)
331245
continue;
332246
}
333247

248+
rt_bool_t is_nomap = fdt_getprop(_fdt, nodeoffset, "no-map", RT_NULL) ? RT_TRUE : RT_FALSE;
334249
base = rt_fdt_translate_address(_fdt, nodeoffset, base);
335-
reserve_memregion(fdt_get_name(_fdt, nodeoffset, RT_NULL), base, size);
250+
rt_memblock_reserve_memory(uname, base, base + size, is_nomap);
336251

337252
len -= t_len;
338253
}
@@ -371,7 +286,7 @@ static void fdt_scan_reserved_memory(void)
371286

372287
if (err == -RT_EEMPTY && fdt_getprop(_fdt, child, "size", RT_NULL))
373288
{
374-
reserve_memregion(fdt_get_name(_fdt, child, RT_NULL), 0, 0);
289+
LOG_E("Allocating reserved memory in setup is not yet supported");
375290
}
376291
}
377292
}
@@ -399,11 +314,9 @@ static rt_err_t fdt_scan_memory(void)
399314
break;
400315
}
401316

402-
reserve_memregion("memreserve", base, size);
317+
rt_memblock_reserve_memory("memreserve", base, base + size, MEMBLOCK_NONE);
403318
}
404319

405-
no = 0;
406-
407320
fdt_for_each_subnode(nodeoffset, _fdt, 0)
408321
{
409322
int len;
@@ -441,7 +354,8 @@ static rt_err_t fdt_scan_memory(void)
441354
continue;
442355
}
443356

444-
err = commit_memregion(name, base, size, RT_FALSE);
357+
bool is_hotpluggable = fdt_getprop(_fdt, nodeoffset, "hotpluggable", RT_NULL) ? RT_TRUE : RT_FALSE;
358+
err = rt_memblock_add_memory(name, base, base + size, is_hotpluggable);
445359

446360
if (!err)
447361
{
@@ -451,8 +365,6 @@ static rt_err_t fdt_scan_memory(void)
451365
{
452366
LOG_W("Memory node(%d) ranges: %p - %p%s", no, base, base + size, " unable to record");
453367
}
454-
455-
++no;
456368
}
457369
}
458370

@@ -461,95 +373,6 @@ static rt_err_t fdt_scan_memory(void)
461373
fdt_scan_reserved_memory();
462374
}
463375

464-
region = &_memregion[0];
465-
466-
for (no = 0; region->name; ++region)
467-
{
468-
/* We need check the memory region now. */
469-
for (int i = RT_ARRAY_SIZE(_memregion) - 1; i > no; --i)
470-
{
471-
rt_region_t *res_region = &_memregion[i];
472-
473-
if (!res_region->name)
474-
{
475-
break;
476-
}
477-
478-
/*
479-
* +--------+ +--------+
480-
* | memory | | memory |
481-
* +--------+ +----------+ +----------+ +--------+
482-
* | reserved | | reserved |
483-
* +----------+ +----------+
484-
*/
485-
if (res_region->start >= region->end || res_region->end <= region->start)
486-
{
487-
/* No adjustments needed */
488-
continue;
489-
}
490-
491-
/*
492-
* case 0: case 1:
493-
* +------------------+ +----------+
494-
* | memory | | memory |
495-
* +---+----------+---+ +---+----------+---+
496-
* | reserved | | reserved |
497-
* +----------+ +---+----------+---+
498-
*
499-
* case 2: case 3:
500-
* +------------------+ +------------------+
501-
* | memory | | memory |
502-
* +--------------+---+------+ +------+---+--------------+
503-
* | reserved | | reserved |
504-
* +----------+ +----------+
505-
*/
506-
if (res_region->start > region->start)
507-
{
508-
if (res_region->end < region->end)
509-
{
510-
/* case 0 */
511-
rt_size_t new_size = region->end - res_region->end;
512-
513-
region->end = res_region->start;
514-
515-
/* Commit part next block */
516-
err = commit_memregion(region->name, res_region->end, new_size, RT_FALSE);
517-
518-
if (!err)
519-
{
520-
++no;
521-
522-
/* Scan again */
523-
region = &_memregion[0];
524-
--region;
525-
526-
break;
527-
}
528-
}
529-
else
530-
{
531-
/* case 2 */
532-
region->end = res_region->start;
533-
}
534-
}
535-
else
536-
{
537-
if (res_region->end < region->end)
538-
{
539-
/* case 3 */
540-
region->start = res_region->end;
541-
}
542-
else
543-
{
544-
/* case 1 */
545-
region->name = RT_NULL;
546-
547-
break;
548-
}
549-
}
550-
}
551-
}
552-
553376
return err;
554377
}
555378

@@ -649,7 +472,7 @@ static rt_err_t fdt_scan_initrd(rt_uint64_t *ranges, const char *name, const cha
649472

650473
if (!err)
651474
{
652-
commit_memregion("initrd", ranges[0], ranges[1] - ranges[0], RT_TRUE);
475+
rt_memblock_reserve_memory("initrd", ranges[0], ranges[1], MEMBLOCK_NONE);
653476
}
654477
}
655478
else if (!ranges)

‎components/mm/mm_memblock.c

+56-28
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,9 @@ rt_inline void _reg_remove_after(struct rt_mmblk_reg *prev)
112112

113113
/* adding overlapped regions is banned */
114114
static rt_err_t _memblock_add_range(struct rt_memblock *memblock,
115-
char *name, rt_size_t start, rt_size_t end, mm_flag_t flag)
115+
const char *name, rt_size_t start, rt_size_t end, mm_flag_t flag)
116116
{
117-
struct rt_mmblk_reg *reg, *reg_next;
117+
struct rt_mmblk_reg *reg = RT_NULL, *reg_next = RT_NULL;
118118
rt_slist_t sentinel;
119119
rt_region_t new_region;
120120

@@ -153,15 +153,15 @@ static rt_err_t _memblock_add_range(struct rt_memblock *memblock,
153153
return _reg_insert_after(reg, &new_region, flag);
154154
}
155155

156-
rt_err_t rt_memblock_add_memory(char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags)
156+
rt_err_t rt_memblock_add_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags)
157157
{
158158
LOG_D("add physical address range [%p-%p) with flag 0x%x" \
159159
" to overall memory regions\n", base, base + size, flag);
160160

161161
return _memblock_add_range(&mmblk_memory, name, start, end, flags);
162162
}
163163

164-
rt_err_t rt_memblock_reserve_memory(char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags)
164+
rt_err_t rt_memblock_reserve_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags)
165165
{
166166
LOG_D("add physical address range [%p-%p) to reserved memory regions\n",\
167167
base, base + size);
@@ -319,7 +319,7 @@ static void _next_free_region(struct rt_mmblk_reg **m, struct rt_mmblk_reg **r,
319319
/* merge normal memory regions */
320320
static void _memblock_merge_memory(void)
321321
{
322-
struct rt_mmblk_reg *reg;
322+
struct rt_mmblk_reg *reg = RT_NULL;
323323

324324
rt_slist_for_each_entry(reg, &(mmblk_memory.reg_list), node)
325325
{
@@ -333,43 +333,71 @@ static void _memblock_merge_memory(void)
333333
}
334334
}
335335

336-
/* free all available memory to buddy system */
337-
static void _memblock_free_all(void)
336+
void rt_memblock_setup_memory_environment(void)
338337
{
339-
rt_region_t reg;
338+
struct rt_mmblk_reg *iter = RT_NULL, *start_reg = RT_NULL, *end_reg = RT_NULL;
339+
static struct mem_desc platform_mem_desc = {0};
340+
rt_region_t platform_mem_region = {.start = ~0UL,
341+
.end = 0};
342+
rt_region_t reg = {0};
340343
rt_size_t mem = 0;
341344
struct rt_mmblk_reg *m, *r;
342345

343-
for_each_free_region(m, r, MEMBLOCK_NONE, &reg.start, &reg.end)
346+
_memblock_merge_memory();
347+
348+
LOG_I("System memory:");
349+
350+
rt_slist_for_each_entry(iter, &(mmblk_memory.reg_list), node)
344351
{
345-
reg.start -= PV_OFFSET;
346-
reg.end -= PV_OFFSET;
347-
rt_page_install(reg);
352+
LOG_I(" %-*.s [%p, %p]", RT_NAME_MAX, iter->memreg.name, iter->memreg.start, iter->memreg.end);
348353

349-
LOG_D("region [%p-%p) added to buddy system\n", reg.start, reg.end);
350-
mem += reg.end - reg.start;
354+
if (platform_mem_region.start > iter->memreg.start)
355+
{
356+
platform_mem_region.start = iter->memreg.start;
357+
}
358+
359+
if (platform_mem_region.end < iter->memreg.end)
360+
{
361+
platform_mem_region.end = iter->memreg.end;
362+
}
351363
}
352364

353-
LOG_D("0x%lx(%ld) bytes memory added to buddy system\n", mem, mem);
354-
}
365+
/* create MMU mapping of system memory */
366+
platform_mem_region.start = RT_ALIGN_DOWN(platform_mem_region.start, ARCH_PAGE_SIZE);
367+
platform_mem_region.end = RT_ALIGN(platform_mem_region.end, ARCH_PAGE_SIZE);
355368

356-
void rt_memblock_setup_memory_environment(void)
357-
{
358-
struct rt_mmblk_reg *reg, *start_reg, *end_reg;
359-
rt_err_t err = RT_EOK;
369+
platform_mem_desc.paddr_start = platform_mem_region.start;
370+
platform_mem_desc.vaddr_start = platform_mem_region.start - PV_OFFSET;
371+
platform_mem_desc.vaddr_end = platform_mem_region.end - PV_OFFSET - 1;
372+
platform_mem_desc.attr = NORMAL_MEM;
360373

361-
_memblock_merge_memory();
362-
rt_slist_for_each_entry(reg, &(mmblk_reserved.reg_list), node)
374+
rt_hw_mmu_setup(&rt_kernel_space, &platform_mem_desc, 1);
375+
376+
LOG_I("Reserved memory:");
377+
378+
rt_slist_for_each_entry(iter, &(mmblk_reserved.reg_list), node)
363379
{
364-
if (reg->flags != MEMBLOCK_NONE)
365-
{
366-
err = _memblock_separate_range(&mmblk_memory, reg->memreg.start, reg->memreg.end, &start_reg, &end_reg);
367-
RT_ASSERT(err == RT_EOK);
380+
LOG_I(" %-*.s [%p, %p]", RT_NAME_MAX, iter->memreg.name, iter->memreg.start, iter->memreg.end);
368381

369-
_memblock_set_flag(start_reg, end_reg, reg->flags);
382+
if (iter->flags != MEMBLOCK_NONE)
383+
{
384+
_memblock_separate_range(&mmblk_memory, iter->memreg.start, iter->memreg.end, &start_reg, &end_reg);
385+
_memblock_set_flag(start_reg, end_reg, iter->flags);
370386
}
371387
}
372-
_memblock_free_all();
388+
389+
/* install usable memory to system page */
390+
for_each_free_region(m, r, MEMBLOCK_NONE, &reg.start, &reg.end)
391+
{
392+
LOG_I("physical memory region [%p-%p] installed to system page", reg.start, reg.end);
393+
394+
reg.start -= PV_OFFSET;
395+
reg.end -= PV_OFFSET;
396+
rt_page_install(reg);
397+
mem += reg.end - reg.start;
398+
}
399+
400+
LOG_I("%ld MB memory installed to system page", mem/1000000);
373401
}
374402

375403
#ifdef UTEST_MM_API_TC

‎components/mm/mm_memblock.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ struct rt_memblock
5656
* @param end the size of the physical address range
5757
* @param flags the flags of the region
5858
*/
59-
rt_err_t rt_memblock_add_memory(char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags);
59+
rt_err_t rt_memblock_add_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags);
6060

6161
/**
6262
* @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
6868
* @param end the size of the physical address range
6969
* @param flags the flags of the region
7070
*/
71-
rt_err_t rt_memblock_reserve_memory(char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags);
71+
rt_err_t rt_memblock_reserve_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags);
7272

7373
/**
7474
* @brief To conclude the management of memory by the memblock.

‎examples/utest/configs/rtsmart/base.conf

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
CONFIG_UTEST_MEMHEAP_TC=y
2+
CONFIG_UTEST_MM_API_TC=y
23

34
# dependencies
45
CONFIG_RT_USING_SMART=y

‎libcpu/Kconfig

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ if ARCH_ARMV8 && ARCH_CPU_64BIT
1717
select ARCH_USING_HW_THREAD_SELF
1818
default y if RT_USING_OFW
1919
default n
20+
config ARCH_HEAP_SIZE
21+
hex "Size of system heap"
22+
default 0x4000000
23+
config ARCH_INIT_PAGE_SIZE
24+
hex "Size of init page region"
25+
default 0x200000
2026
endmenu
2127
endif
2228

‎libcpu/aarch64/common/setup.c

+26-217
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <rtdevice.h>
2626
#include <gic.h>
2727
#include <gicv3.h>
28+
#include <mm_memblock.h>
2829

2930
#define SIZE_KB 1024
3031
#define SIZE_MB (1024 * SIZE_KB)
@@ -198,38 +199,13 @@ rt_inline void cpu_info_init(void)
198199
#endif /* RT_USING_HWTIMER */
199200
}
200201

201-
rt_inline rt_bool_t is_kernel_aspace(const char *name)
202-
{
203-
static char * const names[] =
204-
{
205-
"kernel",
206-
"memheap",
207-
};
208-
209-
if (!name)
210-
{
211-
return RT_FALSE;
212-
}
213-
214-
for (int i = 0; i < RT_ARRAY_SIZE(names); ++i)
215-
{
216-
if (!rt_strcmp(names[i], name))
217-
{
218-
return RT_TRUE;
219-
}
220-
}
221-
222-
return RT_FALSE;
223-
}
224-
225202
void rt_hw_common_setup(void)
226203
{
227-
rt_size_t mem_region_nr;
228-
rt_region_t *mem_region;
229-
rt_size_t page_best_start;
230-
rt_region_t platform_mem_region;
231-
static struct mem_desc platform_mem_desc;
232-
void *kernel_start, *kernel_end, *memheap_start = RT_NULL, *memheap_end = RT_NULL;
204+
rt_size_t kernel_start, kernel_end;
205+
rt_size_t heap_start, heap_end;
206+
rt_size_t init_page_start, init_page_end;
207+
rt_size_t fdt_start, fdt_end;
208+
rt_region_t init_page_region = { 0 };
233209

234210
system_vectors_init();
235211

@@ -239,61 +215,28 @@ void rt_hw_common_setup(void)
239215
rt_hw_mmu_map_init(&rt_kernel_space, (void*)0xffffd0000000, 0x10000000, MMUTable, 0);
240216
#endif
241217

242-
kernel_start = rt_kmem_v2p((void *)&_start) - 64;
243-
kernel_end = rt_kmem_v2p((void *)&_end);
218+
kernel_start = RT_ALIGN_DOWN((rt_size_t)rt_kmem_v2p((void *)&_start) - 64, ARCH_PAGE_SIZE);
219+
kernel_end = RT_ALIGN((rt_size_t)rt_kmem_v2p((void *)&_end), ARCH_PAGE_SIZE);
220+
heap_start = kernel_end;
221+
heap_end = RT_ALIGN(heap_start + ARCH_HEAP_SIZE, ARCH_PAGE_SIZE);
222+
init_page_start = heap_end;
223+
init_page_end = RT_ALIGN(init_page_start + ARCH_INIT_PAGE_SIZE, ARCH_PAGE_SIZE);
224+
fdt_start = init_page_end;
225+
fdt_end = RT_ALIGN(fdt_start + fdt_size, ARCH_PAGE_SIZE);
244226

245-
if (!rt_fdt_commit_memregion_request(&mem_region, &mem_region_nr, RT_TRUE))
246-
{
247-
const char *name = "memheap";
227+
rt_memblock_reserve_memory("kernel", kernel_start, kernel_end, MEMBLOCK_NONE);
228+
rt_memblock_reserve_memory("memheap", heap_start, heap_end, MEMBLOCK_NONE);
229+
rt_memblock_reserve_memory("init-page", init_page_start, init_page_end, MEMBLOCK_NONE);
230+
rt_memblock_reserve_memory("fdt", fdt_start, fdt_end, MEMBLOCK_NONE);
248231

249-
while (mem_region_nr --> 0)
250-
{
251-
if (mem_region->name == name || !rt_strcmp(mem_region->name, name))
252-
{
253-
memheap_start = (void *)mem_region->start;
254-
memheap_end = (void *)mem_region->end;
232+
rt_memmove((void *)(fdt_start - PV_OFFSET), (void *)(fdt_ptr - PV_OFFSET), fdt_size);
233+
fdt_ptr = (void *)fdt_start;
255234

256-
break;
257-
}
258-
mem_region++;
259-
}
260-
}
261-
262-
page_best_start = (rt_size_t)(memheap_end ? : kernel_end);
263-
264-
if (memheap_end && fdt_ptr > kernel_start)
265-
{
266-
rt_memmove(memheap_end - PV_OFFSET, fdt_ptr - PV_OFFSET, fdt_size);
235+
rt_system_heap_init((void *)(heap_start - PV_OFFSET), (void *)(heap_end - PV_OFFSET));
267236

268-
fdt_ptr = memheap_end;
269-
270-
page_best_start = (rt_size_t)fdt_ptr + fdt_size;
271-
}
272-
273-
rt_fdt_commit_memregion_early(&(rt_region_t)
274-
{
275-
.name = "fdt",
276-
.start = (rt_size_t)fdt_ptr,
277-
.end = (rt_size_t)(fdt_ptr + fdt_size),
278-
}, RT_TRUE);
279-
280-
fdt_ptr -= PV_OFFSET;
281-
282-
rt_fdt_commit_memregion_early(&(rt_region_t)
283-
{
284-
.name = "kernel",
285-
.start = (rt_size_t)kernel_start,
286-
.end = (rt_size_t)kernel_end,
287-
}, RT_TRUE);
288-
289-
#ifndef RT_USING_SMART
290-
rt_fdt_commit_memregion_early(&(rt_region_t)
291-
{
292-
.name = "null",
293-
.start = (rt_size_t)RT_NULL,
294-
.end = (rt_size_t)RT_NULL + ARCH_PAGE_SIZE,
295-
}, RT_TRUE);
296-
#endif /* !RT_USING_SMART */
237+
init_page_region.start = init_page_start - PV_OFFSET;
238+
init_page_region.end = init_page_end - PV_OFFSET;
239+
rt_page_init(init_page_region);
297240

298241
if (rt_fdt_prefetch(fdt_ptr))
299242
{
@@ -307,143 +250,9 @@ void rt_hw_common_setup(void)
307250

308251
rt_fdt_scan_memory();
309252

310-
if (memheap_start && memheap_end)
311-
{
312-
rt_system_heap_init(memheap_start - PV_OFFSET, memheap_end - PV_OFFSET);
313-
}
314-
315-
platform_mem_region.start = ~0UL;
316-
platform_mem_region.end = 0;
317-
318-
if (!rt_fdt_commit_memregion_request(&mem_region, &mem_region_nr, RT_TRUE))
319-
{
320-
LOG_I("Reserved memory:");
321-
322-
while (mem_region_nr --> 0)
323-
{
324-
if (is_kernel_aspace(mem_region->name))
325-
{
326-
if (platform_mem_region.start > mem_region->start)
327-
{
328-
platform_mem_region.start = mem_region->start;
329-
}
330-
331-
if (platform_mem_region.end < mem_region->end)
332-
{
333-
platform_mem_region.end = mem_region->end;
334-
}
335-
}
336-
337-
LOG_I(" %-*.s [%p, %p]", RT_NAME_MAX, mem_region->name, mem_region->start, mem_region->end);
338-
339-
++mem_region;
340-
}
341-
}
253+
rt_memblock_setup_memory_environment();
342254

343-
if (!rt_fdt_commit_memregion_request(&mem_region, &mem_region_nr, RT_FALSE))
344-
{
345-
rt_ubase_t best_offset = ~0UL;
346-
rt_region_t *usable_mem_region = mem_region, *page_region = RT_NULL;
347-
rt_region_t init_page_region = { 0 };
348-
rt_region_t defer_hi = { 0 };
349-
rt_err_t error;
350-
351-
LOG_I("Usable memory:");
352-
353-
for (int i = 0; i < mem_region_nr; ++i, ++mem_region)
354-
{
355-
if (!mem_region->name)
356-
{
357-
continue;
358-
}
359-
360-
if (platform_mem_region.start > mem_region->start)
361-
{
362-
platform_mem_region.start = mem_region->start;
363-
}
364-
365-
if (platform_mem_region.end < mem_region->end)
366-
{
367-
platform_mem_region.end = mem_region->end;
368-
}
369-
370-
if (mem_region->start >= page_best_start &&
371-
mem_region->start - page_best_start < best_offset &&
372-
/* MUST >= 1MB */
373-
mem_region->end - mem_region->start >= SIZE_MB)
374-
{
375-
page_region = mem_region;
376-
377-
best_offset = page_region->start - page_best_start;
378-
}
379-
380-
LOG_I(" %-*.s [%p, %p]", RT_NAME_MAX, mem_region->name, mem_region->start, mem_region->end);
381-
382-
}
383-
384-
RT_ASSERT(page_region != RT_NULL);
385-
386-
/* don't map more than ARCH_EARLY_MAP_SIZE */
387-
if (page_region->end - page_region->start > ARCH_PAGE_INIT_THRESHOLD)
388-
{
389-
defer_hi.name = page_region->name;
390-
defer_hi.end = page_region->end;
391-
defer_hi.start = RT_ALIGN_DOWN(page_region->start + ARCH_PAGE_INIT_THRESHOLD,
392-
ARCH_SECTION_SIZE);
393-
page_region->end = defer_hi.start;
394-
}
395-
396-
init_page_region.start = page_region->start - PV_OFFSET;
397-
init_page_region.end = page_region->end - PV_OFFSET;
398-
399-
rt_page_init(init_page_region);
400-
401-
platform_mem_region.start = RT_ALIGN(platform_mem_region.start, ARCH_PAGE_SIZE);
402-
platform_mem_region.end = RT_ALIGN_DOWN(platform_mem_region.end, ARCH_PAGE_SIZE);
403-
RT_ASSERT(platform_mem_region.end - platform_mem_region.start != 0);
404-
405-
platform_mem_desc.paddr_start = platform_mem_region.start;
406-
platform_mem_desc.vaddr_start = platform_mem_region.start - PV_OFFSET;
407-
platform_mem_desc.vaddr_end = platform_mem_region.end - PV_OFFSET - 1;
408-
platform_mem_desc.attr = NORMAL_MEM;
409-
410-
rt_hw_mmu_setup(&rt_kernel_space, &platform_mem_desc, 1);
411-
412-
rt_fdt_earlycon_kick(FDT_EARLYCON_KICK_UPDATE);
413-
414-
mem_region = usable_mem_region;
415-
416-
if (defer_hi.start)
417-
{
418-
/* to virt address */
419-
init_page_region.start = defer_hi.start - PV_OFFSET;
420-
init_page_region.end = defer_hi.end - PV_OFFSET;
421-
error = rt_page_install(init_page_region);
422-
423-
if (error)
424-
{
425-
LOG_W("Deferred page installation FAILED:");
426-
LOG_W(" %-*.s [%p, %p]", RT_NAME_MAX,
427-
defer_hi.name, defer_hi.start, defer_hi.end);
428-
}
429-
else
430-
{
431-
LOG_I("Deferred page installation SUCCEED:");
432-
LOG_I(" %-*.s [%p, %p]", RT_NAME_MAX,
433-
defer_hi.name, defer_hi.start, defer_hi.end);
434-
}
435-
}
436-
437-
for (int i = 0; i < mem_region_nr; ++i, ++mem_region)
438-
{
439-
if (mem_region != page_region && mem_region->name)
440-
{
441-
init_page_region.start = mem_region->start - PV_OFFSET;
442-
init_page_region.end = mem_region->end - PV_OFFSET;
443-
rt_page_install(init_page_region);
444-
}
445-
}
446-
}
255+
rt_fdt_earlycon_kick(FDT_EARLYCON_KICK_UPDATE);
447256

448257
rt_fdt_unflatten();
449258

0 commit comments

Comments
 (0)
Please sign in to comment.