This patch adopts a debug uart selection similar to the OMAP model.  During
the boot process, the uncompress code determines the physical and virtual base
addresses of the board-specific debug uart.  These addresses are then passed
on to the in-kernel debug macros through a small chunk of memory placed just
below the page tables (@0x80003ff8).

Signed-off-by: Cyril Chemparathy <cy...@ti.com>
Tested-by: Sandeep Paulraj <s-paul...@ti.com>
---
 arch/arm/mach-davinci/include/mach/debug-macro.S |   51 +++++++++++---
 arch/arm/mach-davinci/include/mach/serial.h      |   13 ++++
 arch/arm/mach-davinci/include/mach/uncompress.h  |   80 ++++++++++++++++------
 3 files changed, 112 insertions(+), 32 deletions(-)

diff --git a/arch/arm/mach-davinci/include/mach/debug-macro.S 
b/arch/arm/mach-davinci/include/mach/debug-macro.S
index 3cd93a8..ac0fa02 100644
--- a/arch/arm/mach-davinci/include/mach/debug-macro.S
+++ b/arch/arm/mach-davinci/include/mach/debug-macro.S
@@ -17,22 +17,51 @@
  */
 
 #include <linux/serial_reg.h>
+
+#include <asm/memory.h>
+
+#include <mach/serial.h>
+
 #define UART_SHIFT     2
 
+               .pushsection .data
+davinci_uart_phys:     .word   0
+davinci_uart_virt:     .word   0
+               .popsection
+
                .macro addruart, rx, tmp
+
+               /* Use davinci_uart_phys/virt if already configured */
+10:            mrc     p15, 0, \rx, c1, c0
+               tst     \rx, #1                 @ MMU enabled?
+               ldreq   \rx, =__virt_to_phys(davinci_uart_phys)
+               ldrne   \rx, =davinci_uart_virt
+               ldr     \rx, [\rx]
+               cmp     \rx, #0                 @ is port configured?
+               bne     99f                     @ already configured
+
+               /* Copy uart phys address from decompressor uart info */
                mrc     p15, 0, \rx, c1, c0
                tst     \rx, #1                 @ MMU enabled?
-               moveq   \rx, #0x01000000        @ physical base address
-               movne   \rx, #0xfe000000        @ virtual base
-#if defined(CONFIG_ARCH_DAVINCI_DA8XX) && defined(CONFIG_ARCH_DAVINCI_DMx)
-#error Cannot enable DaVinci and DA8XX platforms concurrently
-#elif defined(CONFIG_MACH_DAVINCI_DA830_EVM) || \
-       defined(CONFIG_MACH_DAVINCI_DA850_EVM)
-               orr     \rx, \rx, #0x00d00000   @ physical base address
-               orr     \rx, \rx, #0x0000d000   @ of UART 2
-#else
-               orr     \rx, \rx, #0x00c20000   @ UART 0
-#endif
+               ldreq   \tmp, =__virt_to_phys(davinci_uart_phys)
+               ldrne   \tmp, =davinci_uart_phys
+               ldreq   \rx, =DAVINCI_UART_INFO
+               ldrne   \rx, =__phys_to_virt(DAVINCI_UART_INFO)
+               ldr     \rx, [\rx, #0]
+               str     \rx, [\tmp]
+
+               /* Copy uart virt address from decompressor uart info */
+               mrc     p15, 0, \rx, c1, c0
+               tst     \rx, #1                 @ MMU enabled?
+               ldreq   \tmp, =__virt_to_phys(davinci_uart_virt)
+               ldrne   \tmp, =davinci_uart_virt
+               ldreq   \rx, =DAVINCI_UART_INFO
+               ldrne   \rx, =__phys_to_virt(DAVINCI_UART_INFO)
+               ldr     \rx, [\rx, #4]
+               str     \rx, [\tmp]
+
+               b       10b
+99:
                .endm
 
                .macro  senduart,rd,rx
diff --git a/arch/arm/mach-davinci/include/mach/serial.h 
b/arch/arm/mach-davinci/include/mach/serial.h
index a584697..8829dde 100644
--- a/arch/arm/mach-davinci/include/mach/serial.h
+++ b/arch/arm/mach-davinci/include/mach/serial.h
@@ -11,8 +11,19 @@
 #ifndef __ASM_ARCH_SERIAL_H
 #define __ASM_ARCH_SERIAL_H
 
+#include <asm/memory.h>
+
 #include <mach/hardware.h>
 
+/*
+ * Stolen area that contains debug uart physical and virtual addresses.  These
+ * addresses are filled in by the uncompress.h code, and are used by the debug
+ * macros in debug-macro.S.
+ *
+ * This area sits just below the page tables (see arch/arm/kernel/head.S).
+ */
+#define DAVINCI_UART_INFO      (PHYS_OFFSET + 0x3ff8)
+
 #define DAVINCI_MAX_NR_UARTS   3
 #define DAVINCI_UART0_BASE     (IO_PHYS + 0x20000)
 #define DAVINCI_UART1_BASE     (IO_PHYS + 0x20400)
@@ -27,11 +38,13 @@
 #define UART_DM646X_SCR                        0x10
 #define UART_DM646X_SCR_TX_WATERMARK   0x08
 
+#ifndef __ASSEMBLY__
 struct davinci_uart_config {
        /* Bit field of UARTs present; bit 0 --> UART1 */
        unsigned int enabled_uarts;
 };
 
 extern int davinci_serial_init(struct davinci_uart_config *);
+#endif
 
 #endif /* __ASM_ARCH_SERIAL_H */
diff --git a/arch/arm/mach-davinci/include/mach/uncompress.h 
b/arch/arm/mach-davinci/include/mach/uncompress.h
index 33796b4..20c23a3 100644
--- a/arch/arm/mach-davinci/include/mach/uncompress.h
+++ b/arch/arm/mach-davinci/include/mach/uncompress.h
@@ -1,8 +1,17 @@
 /*
  * Serial port stubs for kernel decompress status messages
  *
- *  Author:     Anant Gole
- * (C) Copyright (C) 2006, Texas Instruments, Inc
+ * Initially based on:
+ * arch/arm/plat-omap/include/mach/uncompress.h
+ *
+ * Original copyrights follow.
+ *
+ * Copyright (C) 2000 RidgeRun, Inc.
+ * Author: Greg Lonnon <glon...@ridgerun.com>
+ *
+ * Rewritten by:
+ * Author: <sou...@mvista.com>
+ * 2004 (c) MontaVista Software, Inc.
  *
  * This file is licensed under the terms of the GNU General Public License
  * version 2. This program is licensed "as is" without any warranty of any
@@ -11,30 +20,17 @@
 
 #include <linux/types.h>
 #include <linux/serial_reg.h>
-#include <mach/serial.h>
 
 #include <asm/mach-types.h>
 
-extern unsigned int __machine_arch_type;
+#include <mach/serial.h>
 
 static u32 *uart;
-
-static u32 *get_uart_base(void)
-{
-       if (__machine_arch_type == MACH_TYPE_DAVINCI_DA830_EVM ||
-               __machine_arch_type == MACH_TYPE_DAVINCI_DA850_EVM)
-               return (u32 *)DA8XX_UART2_BASE;
-       else
-               return (u32 *)DAVINCI_UART0_BASE;
-}
+static u32 *uart_info = (u32 *)(DAVINCI_UART_INFO);
 
 /* PORT_16C550A, in polled non-fifo mode */
-
 static void putc(char c)
 {
-       if (!uart)
-               uart = get_uart_base();
-
        while (!(uart[UART_LSR] & UART_LSR_THRE))
                barrier();
        uart[UART_TX] = c;
@@ -42,12 +38,54 @@ static void putc(char c)
 
 static inline void flush(void)
 {
-       if (!uart)
-               uart = get_uart_base();
-
        while (!(uart[UART_LSR] & UART_LSR_THRE))
                barrier();
 }
 
-#define arch_decomp_setup()
+static inline void set_uart_info(u32 phys, void * __iomem virt)
+{
+       uart = (u32 *)phys;
+       uart_info[0] = phys;
+       uart_info[1] = (u32)virt;
+}
+
+#define _DEBUG_LL_ENTRY(machine, phys, virt)                   \
+       if (machine_is_##machine()) {                           \
+               set_uart_info(phys, virt);                      \
+               break;                                          \
+       }
+
+#define DEBUG_LL_DAVINCI(machine, port)                                \
+       _DEBUG_LL_ENTRY(machine, DAVINCI_UART##port##_BASE,     \
+                       IO_ADDRESS(DAVINCI_UART##port##_BASE))
+
+#define DEBUG_LL_DA8XX(machine, port)                          \
+       _DEBUG_LL_ENTRY(machine, DA8XX_UART##port##_BASE,       \
+                       IO_ADDRESS(DA8XX_UART##port##_BASE))
+
+static inline void __arch_decomp_setup(unsigned long arch_id)
+{
+       /*
+        * Initialize the port based on the machine ID from the bootloader.
+        * Note that we're using macros here instead of switch statement
+        * as machine_is functions are optimized out for the boards that
+        * are not selected.
+        */
+       do {
+               /* Davinci boards */
+               DEBUG_LL_DAVINCI(davinci_evm,           0);
+               DEBUG_LL_DAVINCI(sffsdr,                0);
+               DEBUG_LL_DAVINCI(neuros_osd2,           0);
+               DEBUG_LL_DAVINCI(davinci_dm355_evm,     0);
+               DEBUG_LL_DAVINCI(dm355_leopard,         0);
+               DEBUG_LL_DAVINCI(davinci_dm6467_evm,    0);
+               DEBUG_LL_DAVINCI(davinci_dm365_evm,     0);
+
+               /* DA8xx boards */
+               DEBUG_LL_DA8XX(davinci_da830_evm,       2);
+               DEBUG_LL_DA8XX(davinci_da850_evm,       2);
+       } while (0);
+}
+
+#define arch_decomp_setup()    __arch_decomp_setup(arch_id)
 #define arch_decomp_wdog()
-- 
1.6.3.3

_______________________________________________
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to