15
15
#include <drivers/ofw_raw.h>
16
16
#include <drivers/core/dm.h>
17
17
18
+ #include <mm_memblock.h>
19
+
18
20
#define DBG_TAG "rtdm.ofw"
19
21
#define DBG_LVL DBG_INFO
20
22
#include <rtdbg.h>
@@ -29,9 +31,6 @@ RT_OFW_SYMBOL_TYPE_RANGE(earlycon, struct rt_fdt_earlycon_id, _earlycon_start =
29
31
#define ARCH_INIT_MEMREGION_NR 128
30
32
#endif
31
33
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
-
35
34
static void * _fdt = RT_NULL ;
36
35
static rt_phandle _phandle_min ;
37
36
static rt_phandle _phandle_max ;
@@ -140,71 +139,6 @@ rt_bool_t rt_fdt_device_is_available(void *fdt, int nodeoffset)
140
139
return ret ;
141
140
}
142
141
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
-
208
142
rt_err_t rt_fdt_prefetch (void * fdt )
209
143
{
210
144
rt_err_t err = - RT_ERROR ;
@@ -256,26 +190,6 @@ rt_err_t rt_fdt_scan_root(void)
256
190
return err ;
257
191
}
258
192
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
-
279
193
static rt_err_t fdt_reserved_mem_check_root (int nodeoffset )
280
194
{
281
195
rt_err_t err = RT_EOK ;
@@ -331,8 +245,9 @@ static rt_err_t fdt_reserved_memory_reg(int nodeoffset, const char *uname)
331
245
continue ;
332
246
}
333
247
248
+ rt_bool_t is_nomap = fdt_getprop (_fdt , nodeoffset , "no-map" , RT_NULL ) ? RT_TRUE : RT_FALSE ;
334
249
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 );
336
251
337
252
len -= t_len ;
338
253
}
@@ -371,7 +286,7 @@ static void fdt_scan_reserved_memory(void)
371
286
372
287
if (err == - RT_EEMPTY && fdt_getprop (_fdt , child , "size" , RT_NULL ))
373
288
{
374
- reserve_memregion ( fdt_get_name ( _fdt , child , RT_NULL ), 0 , 0 );
289
+ LOG_E ( "Allocating reserved memory in setup is not yet supported" );
375
290
}
376
291
}
377
292
}
@@ -385,7 +300,6 @@ static void fdt_scan_reserved_memory(void)
385
300
static rt_err_t fdt_scan_memory (void )
386
301
{
387
302
int nodeoffset , no ;
388
- rt_region_t * region ;
389
303
rt_uint64_t base , size ;
390
304
rt_err_t err = - RT_EEMPTY ;
391
305
@@ -399,11 +313,9 @@ static rt_err_t fdt_scan_memory(void)
399
313
break ;
400
314
}
401
315
402
- reserve_memregion ("memreserve" , base , size );
316
+ rt_memblock_reserve_memory ("memreserve" , base , base + size , MEMBLOCK_NONE );
403
317
}
404
318
405
- no = 0 ;
406
-
407
319
fdt_for_each_subnode (nodeoffset , _fdt , 0 )
408
320
{
409
321
int len ;
@@ -441,7 +353,8 @@ static rt_err_t fdt_scan_memory(void)
441
353
continue ;
442
354
}
443
355
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 );
445
358
446
359
if (!err )
447
360
{
@@ -451,8 +364,6 @@ static rt_err_t fdt_scan_memory(void)
451
364
{
452
365
LOG_W ("Memory node(%d) ranges: %p - %p%s" , no , base , base + size , " unable to record" );
453
366
}
454
-
455
- ++ no ;
456
367
}
457
368
}
458
369
@@ -461,95 +372,6 @@ static rt_err_t fdt_scan_memory(void)
461
372
fdt_scan_reserved_memory ();
462
373
}
463
374
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
-
553
375
return err ;
554
376
}
555
377
@@ -649,7 +471,7 @@ static rt_err_t fdt_scan_initrd(rt_uint64_t *ranges, const char *name, const cha
649
471
650
472
if (!err )
651
473
{
652
- commit_memregion ("initrd" , ranges [0 ], ranges [1 ] - ranges [ 0 ], RT_TRUE );
474
+ rt_memblock_reserve_memory ("initrd" , ranges [0 ], ranges [1 ], MEMBLOCK_NONE );
653
475
}
654
476
}
655
477
else if (!ranges )
0 commit comments