3030
3131#include "../kernel/head.h"
3232
33- unsigned long kernel_virt_addr = KERNEL_LINK_ADDR ;
34- EXPORT_SYMBOL (kernel_virt_addr );
33+ struct kernel_mapping kernel_map __ro_after_init ;
34+ EXPORT_SYMBOL (kernel_map );
35+ #ifdef CONFIG_XIP_KERNEL
36+ #define kernel_map (*(struct kernel_mapping *)XIP_FIXUP(&kernel_map))
37+ #endif
38+
3539#ifdef CONFIG_XIP_KERNEL
36- #define kernel_virt_addr (*((unsigned long *)XIP_FIXUP(&kernel_virt_addr)))
3740extern char _xiprom [], _exiprom [];
3841#endif
3942
@@ -211,25 +214,6 @@ static struct pt_alloc_ops _pt_ops __initdata;
211214#define pt_ops _pt_ops
212215#endif
213216
214- /* Offset between linear mapping virtual address and kernel load address */
215- unsigned long va_pa_offset __ro_after_init ;
216- EXPORT_SYMBOL (va_pa_offset );
217- #ifdef CONFIG_XIP_KERNEL
218- #define va_pa_offset (*((unsigned long *)XIP_FIXUP(&va_pa_offset)))
219- #endif
220- /* Offset between kernel mapping virtual address and kernel load address */
221- #ifdef CONFIG_64BIT
222- unsigned long va_kernel_pa_offset __ro_after_init ;
223- EXPORT_SYMBOL (va_kernel_pa_offset );
224- #endif
225- #ifdef CONFIG_XIP_KERNEL
226- #define va_kernel_pa_offset (*((unsigned long *)XIP_FIXUP(&va_kernel_pa_offset)))
227- #endif
228- unsigned long va_kernel_xip_pa_offset __ro_after_init ;
229- EXPORT_SYMBOL (va_kernel_xip_pa_offset );
230- #ifdef CONFIG_XIP_KERNEL
231- #define va_kernel_xip_pa_offset (*((unsigned long *)XIP_FIXUP(&va_kernel_xip_pa_offset)))
232- #endif
233217unsigned long pfn_base __ro_after_init ;
234218EXPORT_SYMBOL (pfn_base );
235219
@@ -345,7 +329,7 @@ static pmd_t *__init get_pmd_virt_late(phys_addr_t pa)
345329
346330static phys_addr_t __init alloc_pmd_early (uintptr_t va )
347331{
348- BUG_ON ((va - kernel_virt_addr ) >> PGDIR_SHIFT );
332+ BUG_ON ((va - kernel_map . virt_addr ) >> PGDIR_SHIFT );
349333
350334 return (uintptr_t )early_pmd ;
351335}
@@ -510,36 +494,24 @@ static __init pgprot_t pgprot_from_va(uintptr_t va)
510494#error "setup_vm() is called from head.S before relocate so it should not use absolute addressing."
511495#endif
512496
513- static uintptr_t load_pa __initdata ;
514- uintptr_t load_sz ;
515- #ifdef CONFIG_XIP_KERNEL
516- #define load_pa (*((uintptr_t *)XIP_FIXUP(&load_pa)))
517- #define load_sz (*((uintptr_t *)XIP_FIXUP(&load_sz)))
518- #endif
519-
520497#ifdef CONFIG_XIP_KERNEL
521- static uintptr_t xiprom __initdata ;
522- static uintptr_t xiprom_sz __initdata ;
523- #define xiprom_sz (*((uintptr_t *)XIP_FIXUP(&xiprom_sz)))
524- #define xiprom (*((uintptr_t *)XIP_FIXUP(&xiprom)))
525-
526498static void __init create_kernel_page_table (pgd_t * pgdir , uintptr_t map_size ,
527499 __always_unused bool early )
528500{
529501 uintptr_t va , end_va ;
530502
531503 /* Map the flash resident part */
532- end_va = kernel_virt_addr + xiprom_sz ;
533- for (va = kernel_virt_addr ; va < end_va ; va += map_size )
504+ end_va = kernel_map . virt_addr + kernel_map . xiprom_sz ;
505+ for (va = kernel_map . virt_addr ; va < end_va ; va += map_size )
534506 create_pgd_mapping (pgdir , va ,
535- xiprom + (va - kernel_virt_addr ),
507+ kernel_map . xiprom + (va - kernel_map . virt_addr ),
536508 map_size , PAGE_KERNEL_EXEC );
537509
538510 /* Map the data in RAM */
539- end_va = kernel_virt_addr + XIP_OFFSET + load_sz ;
540- for (va = kernel_virt_addr + XIP_OFFSET ; va < end_va ; va += map_size )
511+ end_va = kernel_map . virt_addr + XIP_OFFSET + kernel_map . size ;
512+ for (va = kernel_map . virt_addr + XIP_OFFSET ; va < end_va ; va += map_size )
541513 create_pgd_mapping (pgdir , va ,
542- load_pa + (va - (kernel_virt_addr + XIP_OFFSET )),
514+ kernel_map . phys_addr + (va - (kernel_map . virt_addr + XIP_OFFSET )),
543515 map_size , PAGE_KERNEL );
544516}
545517#else
@@ -548,10 +520,10 @@ static void __init create_kernel_page_table(pgd_t *pgdir, uintptr_t map_size,
548520{
549521 uintptr_t va , end_va ;
550522
551- end_va = kernel_virt_addr + load_sz ;
552- for (va = kernel_virt_addr ; va < end_va ; va += map_size )
523+ end_va = kernel_map . virt_addr + kernel_map . size ;
524+ for (va = kernel_map . virt_addr ; va < end_va ; va += map_size )
553525 create_pgd_mapping (pgdir , va ,
554- load_pa + (va - kernel_virt_addr ),
526+ kernel_map . phys_addr + (va - kernel_map . virt_addr ),
555527 map_size ,
556528 early ?
557529 PAGE_KERNEL_EXEC : pgprot_from_va (va ));
@@ -566,25 +538,27 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)
566538 pmd_t fix_bmap_spmd , fix_bmap_epmd ;
567539#endif
568540
541+ kernel_map .virt_addr = KERNEL_LINK_ADDR ;
542+
569543#ifdef CONFIG_XIP_KERNEL
570- xiprom = (uintptr_t )CONFIG_XIP_PHYS_ADDR ;
571- xiprom_sz = (uintptr_t )(& _exiprom ) - (uintptr_t )(& _xiprom );
544+ kernel_map . xiprom = (uintptr_t )CONFIG_XIP_PHYS_ADDR ;
545+ kernel_map . xiprom_sz = (uintptr_t )(& _exiprom ) - (uintptr_t )(& _xiprom );
572546
573- load_pa = (uintptr_t )CONFIG_PHYS_RAM_BASE ;
574- load_sz = (uintptr_t )(& _end ) - (uintptr_t )(& _sdata );
547+ kernel_map . phys_addr = (uintptr_t )CONFIG_PHYS_RAM_BASE ;
548+ kernel_map . size = (uintptr_t )(& _end ) - (uintptr_t )(& _sdata );
575549
576- va_kernel_xip_pa_offset = kernel_virt_addr - xiprom ;
550+ kernel_map . va_kernel_xip_pa_offset = kernel_map . virt_addr - kernel_map . xiprom ;
577551#else
578- load_pa = (uintptr_t )(& _start );
579- load_sz = (uintptr_t )(& _end ) - load_pa ;
552+ kernel_map . phys_addr = (uintptr_t )(& _start );
553+ kernel_map . size = (uintptr_t )(& _end ) - kernel_map . phys_addr ;
580554#endif
581555
582- va_pa_offset = PAGE_OFFSET - load_pa ;
556+ kernel_map . va_pa_offset = PAGE_OFFSET - kernel_map . phys_addr ;
583557#ifdef CONFIG_64BIT
584- va_kernel_pa_offset = kernel_virt_addr - load_pa ;
558+ kernel_map . va_kernel_pa_offset = kernel_map . virt_addr - kernel_map . phys_addr ;
585559#endif
586560
587- pfn_base = PFN_DOWN (load_pa );
561+ pfn_base = PFN_DOWN (kernel_map . phys_addr );
588562
589563 /*
590564 * Enforce boot alignment requirements of RV32 and
@@ -594,7 +568,7 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)
594568
595569 /* Sanity check alignment and size */
596570 BUG_ON ((PAGE_OFFSET % PGDIR_SIZE ) != 0 );
597- BUG_ON ((load_pa % map_size ) != 0 );
571+ BUG_ON ((kernel_map . phys_addr % map_size ) != 0 );
598572
599573 pt_ops .alloc_pte = alloc_pte_early ;
600574 pt_ops .get_pte_virt = get_pte_virt_early ;
@@ -611,19 +585,19 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)
611585 create_pmd_mapping (fixmap_pmd , FIXADDR_START ,
612586 (uintptr_t )fixmap_pte , PMD_SIZE , PAGE_TABLE );
613587 /* Setup trampoline PGD and PMD */
614- create_pgd_mapping (trampoline_pg_dir , kernel_virt_addr ,
588+ create_pgd_mapping (trampoline_pg_dir , kernel_map . virt_addr ,
615589 (uintptr_t )trampoline_pmd , PGDIR_SIZE , PAGE_TABLE );
616590#ifdef CONFIG_XIP_KERNEL
617- create_pmd_mapping (trampoline_pmd , kernel_virt_addr ,
618- xiprom , PMD_SIZE , PAGE_KERNEL_EXEC );
591+ create_pmd_mapping (trampoline_pmd , kernel_map . virt_addr ,
592+ kernel_map . xiprom , PMD_SIZE , PAGE_KERNEL_EXEC );
619593#else
620- create_pmd_mapping (trampoline_pmd , kernel_virt_addr ,
621- load_pa , PMD_SIZE , PAGE_KERNEL_EXEC );
594+ create_pmd_mapping (trampoline_pmd , kernel_map . virt_addr ,
595+ kernel_map . phys_addr , PMD_SIZE , PAGE_KERNEL_EXEC );
622596#endif
623597#else
624598 /* Setup trampoline PGD */
625- create_pgd_mapping (trampoline_pg_dir , kernel_virt_addr ,
626- load_pa , PGDIR_SIZE , PAGE_KERNEL_EXEC );
599+ create_pgd_mapping (trampoline_pg_dir , kernel_map . virt_addr ,
600+ kernel_map . phys_addr , PGDIR_SIZE , PAGE_KERNEL_EXEC );
627601#endif
628602
629603 /*
0 commit comments