diff options
author | Kevin Hao <haokexin@gmail.com> | 2013-12-24 02:12:04 -0500 |
---|---|---|
committer | Scott Wood <scottwood@freescale.com> | 2014-01-09 18:52:15 -0500 |
commit | 99739611e816716d912ae89a4354237fc39745a6 (patch) | |
tree | 5077031e3e94206cf8520145b6a6475a1886d50c /arch/powerpc | |
parent | 7c732cba3d9312882e82d91d5948261dfd5c8fe6 (diff) |
powerpc/fsl_booke: introduce get_phys_addr function
Move the codes which translate a effective address to physical address
to a separate function. So it can be reused by other code.
Signed-off-by: Kevin Hao <haokexin@gmail.com>
Signed-off-by: Scott Wood <scottwood@freescale.com>
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/kernel/head_fsl_booke.S | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index 09921a5197c6..196950f29c00 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S | |||
@@ -65,26 +65,9 @@ _ENTRY(_start); | |||
65 | nop | 65 | nop |
66 | 66 | ||
67 | /* Translate device tree address to physical, save in r30/r31 */ | 67 | /* Translate device tree address to physical, save in r30/r31 */ |
68 | mfmsr r16 | 68 | bl get_phys_addr |
69 | mfspr r17,SPRN_PID | 69 | mr r30,r3 |
70 | rlwinm r17,r17,16,0x3fff0000 /* turn PID into MAS6[SPID] */ | 70 | mr r31,r4 |
71 | rlwimi r17,r16,28,0x00000001 /* turn MSR[DS] into MAS6[SAS] */ | ||
72 | mtspr SPRN_MAS6,r17 | ||
73 | |||
74 | tlbsx 0,r3 /* must succeed */ | ||
75 | |||
76 | mfspr r16,SPRN_MAS1 | ||
77 | mfspr r20,SPRN_MAS3 | ||
78 | rlwinm r17,r16,25,0x1f /* r17 = log2(page size) */ | ||
79 | li r18,1024 | ||
80 | slw r18,r18,r17 /* r18 = page size */ | ||
81 | addi r18,r18,-1 | ||
82 | and r19,r3,r18 /* r19 = page offset */ | ||
83 | andc r31,r20,r18 /* r31 = page base */ | ||
84 | or r31,r31,r19 /* r31 = devtree phys addr */ | ||
85 | #ifdef CONFIG_PHYS_64BIT | ||
86 | mfspr r30,SPRN_MAS7 | ||
87 | #endif | ||
88 | 71 | ||
89 | li r25,0 /* phys kernel start (low) */ | 72 | li r25,0 /* phys kernel start (low) */ |
90 | li r24,0 /* CPU number */ | 73 | li r24,0 /* CPU number */ |
@@ -858,6 +841,33 @@ KernelSPE: | |||
858 | #endif /* CONFIG_SPE */ | 841 | #endif /* CONFIG_SPE */ |
859 | 842 | ||
860 | /* | 843 | /* |
844 | * Translate the effec addr in r3 to phys addr. The phys addr will be put | ||
845 | * into r3(higher 32bit) and r4(lower 32bit) | ||
846 | */ | ||
847 | get_phys_addr: | ||
848 | mfmsr r8 | ||
849 | mfspr r9,SPRN_PID | ||
850 | rlwinm r9,r9,16,0x3fff0000 /* turn PID into MAS6[SPID] */ | ||
851 | rlwimi r9,r8,28,0x00000001 /* turn MSR[DS] into MAS6[SAS] */ | ||
852 | mtspr SPRN_MAS6,r9 | ||
853 | |||
854 | tlbsx 0,r3 /* must succeed */ | ||
855 | |||
856 | mfspr r8,SPRN_MAS1 | ||
857 | mfspr r12,SPRN_MAS3 | ||
858 | rlwinm r9,r8,25,0x1f /* r9 = log2(page size) */ | ||
859 | li r10,1024 | ||
860 | slw r10,r10,r9 /* r10 = page size */ | ||
861 | addi r10,r10,-1 | ||
862 | and r11,r3,r10 /* r11 = page offset */ | ||
863 | andc r4,r12,r10 /* r4 = page base */ | ||
864 | or r4,r4,r11 /* r4 = devtree phys addr */ | ||
865 | #ifdef CONFIG_PHYS_64BIT | ||
866 | mfspr r3,SPRN_MAS7 | ||
867 | #endif | ||
868 | blr | ||
869 | |||
870 | /* | ||
861 | * Global functions | 871 | * Global functions |
862 | */ | 872 | */ |
863 | 873 | ||