@@ -556,7 +556,8 @@ unsigned long get_free_page(void)
556556}
557557
558558static int _map_single_page_2M (unsigned long * lv0_tbl , unsigned long va ,
559- unsigned long pa , unsigned long attr )
559+ unsigned long pa , unsigned long attr ,
560+ rt_bool_t flush )
560561{
561562 int level ;
562563 unsigned long * cur_lv_tbl = lv0_tbl ;
@@ -585,6 +586,10 @@ static int _map_single_page_2M(unsigned long *lv0_tbl, unsigned long va,
585586 }
586587 rt_memset ((char * )page , 0 , ARCH_PAGE_SIZE );
587588 cur_lv_tbl [off ] = page | MMU_TYPE_TABLE ;
589+ if (flush )
590+ {
591+ rt_hw_cpu_dcache_ops (RT_HW_CACHE_FLUSH , cur_lv_tbl + off , sizeof (void * ));
592+ }
588593 }
589594 page = cur_lv_tbl [off ];
590595 if ((page & MMU_TYPE_MASK ) == MMU_TYPE_BLOCK )
@@ -600,6 +605,10 @@ static int _map_single_page_2M(unsigned long *lv0_tbl, unsigned long va,
600605 off = (va >> ARCH_SECTION_SHIFT );
601606 off &= MMU_LEVEL_MASK ;
602607 cur_lv_tbl [off ] = pa ;
608+ if (flush )
609+ {
610+ rt_hw_cpu_dcache_ops (RT_HW_CACHE_FLUSH , cur_lv_tbl + off , sizeof (void * ));
611+ }
603612 return 0 ;
604613}
605614
@@ -633,7 +642,7 @@ void *rt_ioremap_early(void *paddr, size_t size)
633642
634643 while (count -- > 0 )
635644 {
636- if (_map_single_page_2M (tbl , base , base , MMU_MAP_K_DEVICE ))
645+ if (_map_single_page_2M (tbl , base , base , MMU_MAP_K_DEVICE , RT_TRUE ))
637646 {
638647 return RT_NULL ;
639648 }
@@ -661,7 +670,7 @@ static int _init_map_2M(unsigned long *lv0_tbl, unsigned long va,
661670 }
662671 for (i = 0 ; i < count ; i ++ )
663672 {
664- ret = _map_single_page_2M (lv0_tbl , va , pa , attr );
673+ ret = _map_single_page_2M (lv0_tbl , va , pa , attr , RT_FALSE );
665674 va += ARCH_SECTION_SIZE ;
666675 pa += ARCH_SECTION_SIZE ;
667676 if (ret != 0 )
0 commit comments