@@ -660,18 +660,19 @@ void __init create_pgd_mapping(pgd_t *pgdp,
660
660
create_pgd_next_mapping (nextp , va , pa , sz , prot );
661
661
}
662
662
663
- static uintptr_t __init best_map_size (phys_addr_t base , phys_addr_t size )
663
+ static uintptr_t __init best_map_size (phys_addr_t pa , uintptr_t va ,
664
+ phys_addr_t size )
664
665
{
665
- if (!(base & (PGDIR_SIZE - 1 )) && size >= PGDIR_SIZE )
666
+ if (!(pa & ( PGDIR_SIZE - 1 )) && !( va & (PGDIR_SIZE - 1 )) && size >= PGDIR_SIZE )
666
667
return PGDIR_SIZE ;
667
668
668
- if (!(base & (P4D_SIZE - 1 )) && size >= P4D_SIZE )
669
+ if (!(pa & ( P4D_SIZE - 1 )) && !( va & (P4D_SIZE - 1 )) && size >= P4D_SIZE )
669
670
return P4D_SIZE ;
670
671
671
- if (!(base & (PUD_SIZE - 1 )) && size >= PUD_SIZE )
672
+ if (!(pa & ( PUD_SIZE - 1 )) && !( va & (PUD_SIZE - 1 )) && size >= PUD_SIZE )
672
673
return PUD_SIZE ;
673
674
674
- if (!(base & (PMD_SIZE - 1 )) && size >= PMD_SIZE )
675
+ if (!(pa & ( PMD_SIZE - 1 )) && !( va & (PMD_SIZE - 1 )) && size >= PMD_SIZE )
675
676
return PMD_SIZE ;
676
677
677
678
return PAGE_SIZE ;
@@ -1177,7 +1178,7 @@ static void __init create_linear_mapping_range(phys_addr_t start,
1177
1178
for (pa = start ; pa < end ; pa += map_size ) {
1178
1179
va = (uintptr_t )__va (pa );
1179
1180
map_size = fixed_map_size ? fixed_map_size :
1180
- best_map_size (pa , end - pa );
1181
+ best_map_size (pa , va , end - pa );
1181
1182
1182
1183
create_pgd_mapping (swapper_pg_dir , va , pa , map_size ,
1183
1184
pgprot_from_va (va ));
0 commit comments