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-
3534static void * _fdt = RT_NULL ;
3635static rt_phandle _phandle_min ;
3736static 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-
208142rt_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-
279193static 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 )
0 commit comments