25
25
#include <rtdevice.h>
26
26
#include <gic.h>
27
27
#include <gicv3.h>
28
+ #include <mm_memblock.h>
28
29
29
30
#define SIZE_KB 1024
30
31
#define SIZE_MB (1024 * SIZE_KB)
@@ -198,38 +199,13 @@ rt_inline void cpu_info_init(void)
198
199
#endif /* RT_USING_HWTIMER */
199
200
}
200
201
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
-
225
202
void rt_hw_common_setup (void )
226
203
{
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 };
233
209
234
210
system_vectors_init ();
235
211
@@ -239,61 +215,28 @@ void rt_hw_common_setup(void)
239
215
rt_hw_mmu_map_init (& rt_kernel_space , (void * )0xffffd0000000 , 0x10000000 , MMUTable , 0 );
240
216
#endif
241
217
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 );
244
226
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 );
248
231
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 ;
255
234
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 ));
267
236
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 );
297
240
298
241
if (rt_fdt_prefetch (fdt_ptr ))
299
242
{
@@ -307,143 +250,9 @@ void rt_hw_common_setup(void)
307
250
308
251
rt_fdt_scan_memory ();
309
252
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 ();
342
254
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 );
447
256
448
257
rt_fdt_unflatten ();
449
258
0 commit comments