omap: Fix DEBUG_LL uart to access phys addr when MMU isn't enable
authorJason Wang <jason77.wang@gmail.com>
Tue, 3 Aug 2010 03:44:18 +0000 (11:44 +0800)
committerTony Lindgren <tony@atomide.com>
Wed, 4 Aug 2010 09:17:53 +0000 (12:17 +0300)
Now we use a memory address to store the debug port info, So we need
to read/write this address when we choose DEBUG_LL. When MMU isn't
enable(I.E. the begining part of init stage of the linux kernel boot),
we need to access physical address instead of virtual address,
otherwise the kernel will crash.

Signed-off-by: Jason Wang <jason77.wang@gmail.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap1/include/mach/debug-macro.S
arch/arm/mach-omap2/include/mach/debug-macro.S

index e8a8cf36b7f0fa28c952989258645eb9ee89e7cf..671408eb4ab42f8d0128f125c546a8b2405bc9d0 100644 (file)
@@ -33,7 +33,7 @@ omap_uart_virt:       .word   0x0
                /* Use omap_uart_phys/virt if already configured */
 9:             mrc     p15, 0, \rx, c1, c0
                tst     \rx, #1                 @ MMU enabled?
-               ldreq   \rx, =omap_uart_phys    @ physical base address
+               ldreq   \rx, =__virt_to_phys(omap_uart_phys)    @ physical base address
                ldrne   \rx, =omap_uart_virt    @ virtual base
                ldr     \rx, [\rx, #0]
                cmp     \rx, #0                 @ is port configured?
@@ -68,11 +68,15 @@ omap_uart_virt:     .word   0x0
 
                /* Store both phys and virt address for the uart */
 98:            add     \rx, \rx, #0xff000000   @ phys base
-               ldr     \tmp, =omap_uart_phys
+               mrc     p15, 0, \tmp, c1, c0
+               tst     \tmp, #1                @ MMU enabled?
+               ldreq   \tmp, =__virt_to_phys(omap_uart_phys)
+               ldrne   \tmp, =omap_uart_phys
                str     \rx, [\tmp, #0]
                sub     \rx, \rx, #0xff000000   @ phys base
                add     \rx, \rx, #0xfe000000   @ virt base
-               ldr     \tmp, =omap_uart_virt
+               ldreq   \tmp, =__virt_to_phys(omap_uart_virt)
+               ldrne   \tmp, =omap_uart_virt
                str     \rx, [\tmp, #0]
                b       9b
 99:
index 35b24409a0c827a85e3c4e821f7c966d2602462e..09331bbbda52b66e267756b58cf8294472a010bb 100644 (file)
@@ -36,7 +36,7 @@ omap_uart_lsr:        .word   0
                /* Use omap_uart_phys/virt if already configured */
 10:            mrc     p15, 0, \rx, c1, c0
                tst     \rx, #1                 @ MMU enabled?
-               ldreq   \rx, =omap_uart_phys    @ physical base address
+               ldreq   \rx, =__virt_to_phys(omap_uart_phys)    @ physical base address
                ldrne   \rx, =omap_uart_virt    @ virtual base address
                ldr     \rx, [\rx, #0]
                cmp     \rx, #0                 @ is port configured?
@@ -89,26 +89,36 @@ omap_uart_lsr:      .word   0
 44:            mov     \rx, #UART_OFFSET(OMAP4_UART4_BASE)
                b       98f
 95:            ldr     \rx, =ZOOM_UART_BASE
-               ldr     \tmp, =omap_uart_phys
+               mrc     p15, 0, \tmp, c1, c0
+               tst     \tmp, #1                @ MMU enabled?
+               ldreq   \tmp, =__virt_to_phys(omap_uart_phys)
+               ldrne   \tmp, =omap_uart_phys
                str     \rx, [\tmp, #0]
                ldr     \rx, =ZOOM_UART_VIRT
-               ldr     \tmp, =omap_uart_virt
+               ldreq   \tmp, =__virt_to_phys(omap_uart_virt)
+               ldrne   \tmp, =omap_uart_virt
                str     \rx, [\tmp, #0]
                mov     \rx, #(UART_LSR << ZOOM_PORT_SHIFT)
-               ldr     \tmp, =omap_uart_lsr
+               ldreq   \tmp, =__virt_to_phys(omap_uart_lsr)
+               ldrne   \tmp, =omap_uart_lsr
                str     \rx, [\tmp, #0]
                b       10b
 
                /* Store both phys and virt address for the uart */
 98:            add     \rx, \rx, #0x48000000   @ phys base
-               ldr     \tmp, =omap_uart_phys
+               mrc     p15, 0, \tmp, c1, c0
+               tst     \tmp, #1                @ MMU enabled?
+               ldreq   \tmp, =__virt_to_phys(omap_uart_phys)
+               ldrne   \tmp, =omap_uart_phys
                str     \rx, [\tmp, #0]
                sub     \rx, \rx, #0x48000000   @ phys base
                add     \rx, \rx, #0xfa000000   @ virt base
-               ldr     \tmp, =omap_uart_virt
+               ldreq   \tmp, =__virt_to_phys(omap_uart_virt)
+               ldrne   \tmp, =omap_uart_virt
                str     \rx, [\tmp, #0]
                mov     \rx, #(UART_LSR << OMAP_PORT_SHIFT)
-               ldr     \tmp, =omap_uart_lsr
+               ldreq   \tmp, =__virt_to_phys(omap_uart_lsr)
+               ldrne   \tmp, =omap_uart_lsr
                str     \rx, [\tmp, #0]
 
                b       10b
@@ -120,7 +130,10 @@ omap_uart_lsr:     .word   0
                .endm
 
                .macro  busyuart,rd,rx
-1001:          ldr     \rd, =omap_uart_lsr
+1001:          mrc     p15, 0, \rd, c1, c0
+               tst     \rd, #1         @ MMU enabled?
+               ldreq   \rd, =__virt_to_phys(omap_uart_lsr)
+               ldrne   \rd, =omap_uart_lsr
                ldr     \rd, [\rd, #0]
                ldrb    \rd, [\rx, \rd]
                and     \rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
This page took 0.052251 seconds and 5 git commands to generate.