Skip to content

Commit b785ef9

Browse files
authored
[libcpu][aarch64]memory setup using memblock (RT-Thread#9092)
* memory setup using memblock * map pages later
1 parent ac26644 commit b785ef9

File tree

9 files changed

+112
-458
lines changed

9 files changed

+112
-458
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

+7-14
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
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
27-
#define memregion_request rt_fdt_commit_memregion_request
2828
#else
2929
#error Platform have not kernel parameters select interfaces!
3030
#endif
@@ -41,23 +41,16 @@ static int rootfs_mnt_init(void)
4141
if (!dev || !fstype)
4242
{
4343
const char *name = "initrd";
44-
rt_size_t mem_region_nr;
45-
rt_region_t *mem_region;
4644
rt_uint64_t initrd_start = 0, initrd_end = 0;
45+
struct rt_mmblk_reg *iter = RT_NULL;
4746

48-
if (!memregion_request(&mem_region, &mem_region_nr, RT_TRUE))
47+
rt_slist_for_each_entry(iter, &(rt_memblock_get_reserved()->reg_list), node)
4948
{
50-
while (mem_region_nr-- > 0)
49+
if (rt_strcmp(iter->memreg.name, name) == 0)
5150
{
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++;
51+
initrd_start = iter->memreg.start;
52+
initrd_end = iter->memreg.end;
53+
break;
6154
}
6255
}
6356

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-187
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
}
@@ -385,7 +300,6 @@ static void fdt_scan_reserved_memory(void)
385300
static rt_err_t fdt_scan_memory(void)
386301
{
387302
int nodeoffset, no;
388-
rt_region_t *region;
389303
rt_uint64_t base, size;
390304
rt_err_t err = -RT_EEMPTY;
391305

@@ -399,11 +313,9 @@ static rt_err_t fdt_scan_memory(void)
399313
break;
400314
}
401315

402-
reserve_memregion("memreserve", base, size);
316+
rt_memblock_reserve_memory("memreserve", base, base + size, MEMBLOCK_NONE);
403317
}
404318

405-
no = 0;
406-
407319
fdt_for_each_subnode(nodeoffset, _fdt, 0)
408320
{
409321
int len;
@@ -441,7 +353,8 @@ static rt_err_t fdt_scan_memory(void)
441353
continue;
442354
}
443355

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

446359
if (!err)
447360
{
@@ -451,8 +364,6 @@ static rt_err_t fdt_scan_memory(void)
451364
{
452365
LOG_W("Memory node(%d) ranges: %p - %p%s", no, base, base + size, " unable to record");
453366
}
454-
455-
++no;
456367
}
457368
}
458369

@@ -461,95 +372,6 @@ static rt_err_t fdt_scan_memory(void)
461372
fdt_scan_reserved_memory();
462373
}
463374

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-
553375
return err;
554376
}
555377

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

650472
if (!err)
651473
{
652-
commit_memregion("initrd", ranges[0], ranges[1] - ranges[0], RT_TRUE);
474+
rt_memblock_reserve_memory("initrd", ranges[0], ranges[1], MEMBLOCK_NONE);
653475
}
654476
}
655477
else if (!ranges)

0 commit comments

Comments
 (0)