aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyril Chemparathy <cyril@ti.com>2010-05-18 12:51:17 -0400
committerKevin Hilman <khilman@deeprootsystems.com>2010-06-21 15:48:30 -0400
commitdc2eb76c40590a3c080294d1fbd000c8f70d88a9 (patch)
tree8c7bccdd0eb4dfba763cd19216d8c0a13dfb5d51
parent7e27d6e778cd87b6f2415515d7127eba53fe5d02 (diff)
Davinci: generalized debug macros
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 <cyril@ti.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
-rw-r--r--arch/arm/mach-davinci/include/mach/debug-macro.S50
-rw-r--r--arch/arm/mach-davinci/include/mach/serial.h13
-rw-r--r--arch/arm/mach-davinci/include/mach/uncompress.h80
3 files changed, 111 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 3cd93a801d9b..f761dfdb8689 100644
--- a/arch/arm/mach-davinci/include/mach/debug-macro.S
+++ b/arch/arm/mach-davinci/include/mach/debug-macro.S
@@ -17,22 +17,50 @@
17 */ 17 */
18 18
19#include <linux/serial_reg.h> 19#include <linux/serial_reg.h>
20
21#include <asm/memory.h>
22
23#include <mach/serial.h>
24
20#define UART_SHIFT 2 25#define UART_SHIFT 2
21 26
27 .pushsection .data
28davinci_uart_phys: .word 0
29davinci_uart_virt: .word 0
30 .popsection
31
22 .macro addruart, rx, tmp 32 .macro addruart, rx, tmp
33
34 /* Use davinci_uart_phys/virt if already configured */
3510: mrc p15, 0, \rx, c1, c0
36 tst \rx, #1 @ MMU enabled?
37 ldreq \rx, =__virt_to_phys(davinci_uart_phys)
38 ldrne \rx, =davinci_uart_virt
39 ldr \rx, [\rx]
40 cmp \rx, #0 @ is port configured?
41 bne 99f @ already configured
42
23 mrc p15, 0, \rx, c1, c0 43 mrc p15, 0, \rx, c1, c0
24 tst \rx, #1 @ MMU enabled? 44 tst \rx, #1 @ MMU enabled?
25 moveq \rx, #0x01000000 @ physical base address 45
26 movne \rx, #0xfe000000 @ virtual base 46 /* Copy uart phys address from decompressor uart info */
27#if defined(CONFIG_ARCH_DAVINCI_DA8XX) && defined(CONFIG_ARCH_DAVINCI_DMx) 47 ldreq \tmp, =__virt_to_phys(davinci_uart_phys)
28#error Cannot enable DaVinci and DA8XX platforms concurrently 48 ldrne \tmp, =davinci_uart_phys
29#elif defined(CONFIG_MACH_DAVINCI_DA830_EVM) || \ 49 ldreq \rx, =DAVINCI_UART_INFO
30 defined(CONFIG_MACH_DAVINCI_DA850_EVM) 50 ldrne \rx, =__phys_to_virt(DAVINCI_UART_INFO)
31 orr \rx, \rx, #0x00d00000 @ physical base address 51 ldr \rx, [\rx, #0]
32 orr \rx, \rx, #0x0000d000 @ of UART 2 52 str \rx, [\tmp]
33#else 53
34 orr \rx, \rx, #0x00c20000 @ UART 0 54 /* Copy uart virt address from decompressor uart info */
35#endif 55 ldreq \tmp, =__virt_to_phys(davinci_uart_virt)
56 ldrne \tmp, =davinci_uart_virt
57 ldreq \rx, =DAVINCI_UART_INFO
58 ldrne \rx, =__phys_to_virt(DAVINCI_UART_INFO)
59 ldr \rx, [\rx, #4]
60 str \rx, [\tmp]
61
62 b 10b
6399:
36 .endm 64 .endm
37 65
38 .macro senduart,rd,rx 66 .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 f6c4f34909a2..b21ec224b11d 100644
--- a/arch/arm/mach-davinci/include/mach/serial.h
+++ b/arch/arm/mach-davinci/include/mach/serial.h
@@ -11,8 +11,19 @@
11#ifndef __ASM_ARCH_SERIAL_H 11#ifndef __ASM_ARCH_SERIAL_H
12#define __ASM_ARCH_SERIAL_H 12#define __ASM_ARCH_SERIAL_H
13 13
14#include <asm/memory.h>
15
14#include <mach/hardware.h> 16#include <mach/hardware.h>
15 17
18/*
19 * Stolen area that contains debug uart physical and virtual addresses. These
20 * addresses are filled in by the uncompress.h code, and are used by the debug
21 * macros in debug-macro.S.
22 *
23 * This area sits just below the page tables (see arch/arm/kernel/head.S).
24 */
25#define DAVINCI_UART_INFO (PHYS_OFFSET + 0x3ff8)
26
16#define DAVINCI_UART0_BASE (IO_PHYS + 0x20000) 27#define DAVINCI_UART0_BASE (IO_PHYS + 0x20000)
17#define DAVINCI_UART1_BASE (IO_PHYS + 0x20400) 28#define DAVINCI_UART1_BASE (IO_PHYS + 0x20400)
18#define DAVINCI_UART2_BASE (IO_PHYS + 0x20800) 29#define DAVINCI_UART2_BASE (IO_PHYS + 0x20800)
@@ -26,11 +37,13 @@
26#define UART_DM646X_SCR 0x10 37#define UART_DM646X_SCR 0x10
27#define UART_DM646X_SCR_TX_WATERMARK 0x08 38#define UART_DM646X_SCR_TX_WATERMARK 0x08
28 39
40#ifndef __ASSEMBLY__
29struct davinci_uart_config { 41struct davinci_uart_config {
30 /* Bit field of UARTs present; bit 0 --> UART1 */ 42 /* Bit field of UARTs present; bit 0 --> UART1 */
31 unsigned int enabled_uarts; 43 unsigned int enabled_uarts;
32}; 44};
33 45
34extern int davinci_serial_init(struct davinci_uart_config *); 46extern int davinci_serial_init(struct davinci_uart_config *);
47#endif
35 48
36#endif /* __ASM_ARCH_SERIAL_H */ 49#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 33796b4db17f..20c23a3bc907 100644
--- a/arch/arm/mach-davinci/include/mach/uncompress.h
+++ b/arch/arm/mach-davinci/include/mach/uncompress.h
@@ -1,8 +1,17 @@
1/* 1/*
2 * Serial port stubs for kernel decompress status messages 2 * Serial port stubs for kernel decompress status messages
3 * 3 *
4 * Author: Anant Gole 4 * Initially based on:
5 * (C) Copyright (C) 2006, Texas Instruments, Inc 5 * arch/arm/plat-omap/include/mach/uncompress.h
6 *
7 * Original copyrights follow.
8 *
9 * Copyright (C) 2000 RidgeRun, Inc.
10 * Author: Greg Lonnon <glonnon@ridgerun.com>
11 *
12 * Rewritten by:
13 * Author: <source@mvista.com>
14 * 2004 (c) MontaVista Software, Inc.
6 * 15 *
7 * This file is licensed under the terms of the GNU General Public License 16 * This file is licensed under the terms of the GNU General Public License
8 * version 2. This program is licensed "as is" without any warranty of any 17 * version 2. This program is licensed "as is" without any warranty of any
@@ -11,30 +20,17 @@
11 20
12#include <linux/types.h> 21#include <linux/types.h>
13#include <linux/serial_reg.h> 22#include <linux/serial_reg.h>
14#include <mach/serial.h>
15 23
16#include <asm/mach-types.h> 24#include <asm/mach-types.h>
17 25
18extern unsigned int __machine_arch_type; 26#include <mach/serial.h>
19 27
20static u32 *uart; 28static u32 *uart;
21 29static u32 *uart_info = (u32 *)(DAVINCI_UART_INFO);
22static u32 *get_uart_base(void)
23{
24 if (__machine_arch_type == MACH_TYPE_DAVINCI_DA830_EVM ||
25 __machine_arch_type == MACH_TYPE_DAVINCI_DA850_EVM)
26 return (u32 *)DA8XX_UART2_BASE;
27 else
28 return (u32 *)DAVINCI_UART0_BASE;
29}
30 30
31/* PORT_16C550A, in polled non-fifo mode */ 31/* PORT_16C550A, in polled non-fifo mode */
32
33static void putc(char c) 32static void putc(char c)
34{ 33{
35 if (!uart)
36 uart = get_uart_base();
37
38 while (!(uart[UART_LSR] & UART_LSR_THRE)) 34 while (!(uart[UART_LSR] & UART_LSR_THRE))
39 barrier(); 35 barrier();
40 uart[UART_TX] = c; 36 uart[UART_TX] = c;
@@ -42,12 +38,54 @@ static void putc(char c)
42 38
43static inline void flush(void) 39static inline void flush(void)
44{ 40{
45 if (!uart)
46 uart = get_uart_base();
47
48 while (!(uart[UART_LSR] & UART_LSR_THRE)) 41 while (!(uart[UART_LSR] & UART_LSR_THRE))
49 barrier(); 42 barrier();
50} 43}
51 44
52#define arch_decomp_setup() 45static inline void set_uart_info(u32 phys, void * __iomem virt)
46{
47 uart = (u32 *)phys;
48 uart_info[0] = phys;
49 uart_info[1] = (u32)virt;
50}
51
52#define _DEBUG_LL_ENTRY(machine, phys, virt) \
53 if (machine_is_##machine()) { \
54 set_uart_info(phys, virt); \
55 break; \
56 }
57
58#define DEBUG_LL_DAVINCI(machine, port) \
59 _DEBUG_LL_ENTRY(machine, DAVINCI_UART##port##_BASE, \
60 IO_ADDRESS(DAVINCI_UART##port##_BASE))
61
62#define DEBUG_LL_DA8XX(machine, port) \
63 _DEBUG_LL_ENTRY(machine, DA8XX_UART##port##_BASE, \
64 IO_ADDRESS(DA8XX_UART##port##_BASE))
65
66static inline void __arch_decomp_setup(unsigned long arch_id)
67{
68 /*
69 * Initialize the port based on the machine ID from the bootloader.
70 * Note that we're using macros here instead of switch statement
71 * as machine_is functions are optimized out for the boards that
72 * are not selected.
73 */
74 do {
75 /* Davinci boards */
76 DEBUG_LL_DAVINCI(davinci_evm, 0);
77 DEBUG_LL_DAVINCI(sffsdr, 0);
78 DEBUG_LL_DAVINCI(neuros_osd2, 0);
79 DEBUG_LL_DAVINCI(davinci_dm355_evm, 0);
80 DEBUG_LL_DAVINCI(dm355_leopard, 0);
81 DEBUG_LL_DAVINCI(davinci_dm6467_evm, 0);
82 DEBUG_LL_DAVINCI(davinci_dm365_evm, 0);
83
84 /* DA8xx boards */
85 DEBUG_LL_DA8XX(davinci_da830_evm, 2);
86 DEBUG_LL_DA8XX(davinci_da850_evm, 2);
87 } while (0);
88}
89
90#define arch_decomp_setup() __arch_decomp_setup(arch_id)
53#define arch_decomp_wdog() 91#define arch_decomp_wdog()