Skip to content

Commit 2c08624

Browse files
committed
memory setup using memblock
1 parent 22b5e5f commit 2c08624

File tree

5 files changed

+92
-425
lines changed

5 files changed

+92
-425
lines changed

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

+50-22
Original file line numberDiff line numberDiff line change
@@ -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
{
338+
struct rt_mmblk_reg *iter, *start_reg, *end_reg;
339+
static struct mem_desc platform_mem_desc = {0};
340+
rt_region_t platform_mem_region = {.start = ~0UL,
341+
.end = 0};
339342
rt_region_t reg;
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

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 0x8000000
23+
config ARCH_INIT_PAGE_SIZE
24+
hex "Size of init page region"
25+
default 0x200000
2026
endmenu
2127
endif
2228

0 commit comments

Comments
 (0)