aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorKevin Hao <haokexin@gmail.com>2013-12-24 02:12:04 -0500
committerScott Wood <scottwood@freescale.com>2014-01-09 18:52:15 -0500
commit99739611e816716d912ae89a4354237fc39745a6 (patch)
tree5077031e3e94206cf8520145b6a6475a1886d50c /arch/powerpc
parent7c732cba3d9312882e82d91d5948261dfd5c8fe6 (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.S50
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 */
847get_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