[PATCH] omap: Fix DEBUG_LL uart to access phys addr when MMU isn't enable
Eric Miao
eric.y.miao at gmail.com
Tue Aug 3 00:36:15 EDT 2010
On Tue, Aug 3, 2010 at 11:44 AM, Jason Wang <jason77.wang at gmail.com> wrote:
> 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 at gmail.com>
> ---
> arch/arm/mach-omap1/include/mach/debug-macro.S | 10 +++++--
> arch/arm/mach-omap2/include/mach/debug-macro.S | 29 +++++++++++++++++------
> 2 files changed, 28 insertions(+), 11 deletions(-)
>
> diff --git a/arch/arm/mach-omap1/include/mach/debug-macro.S b/arch/arm/mach-omap1/include/mach/debug-macro.S
> index e8a8cf3..671408e 100644
> --- a/arch/arm/mach-omap1/include/mach/debug-macro.S
> +++ b/arch/arm/mach-omap1/include/mach/debug-macro.S
> @@ -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
Along with introduction of run-time phys_offset, I'm afraid this
macro won't work in assembly any longer.
And having a variable version of debugging uart base, in my POV,
may not be generic enough to handle the fundamental issue. Tho
I'm not sure if it will feasible to have a generic debug function in
'struct machine_desc' and make that structure available as early
as possible.
> 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:
> diff --git a/arch/arm/mach-omap2/include/mach/debug-macro.S b/arch/arm/mach-omap2/include/mach/debug-macro.S
> index 35b2440..09331bb 100644
> --- a/arch/arm/mach-omap2/include/mach/debug-macro.S
> +++ b/arch/arm/mach-omap2/include/mach/debug-macro.S
> @@ -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)
> --
> 1.5.6.5
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
More information about the linux-arm-kernel
mailing list