diff options
author | Cyril Chemparathy <cyril@ti.com> | 2010-05-18 12:51:17 -0400 |
---|---|---|
committer | Kevin Hilman <khilman@deeprootsystems.com> | 2010-06-21 15:48:30 -0400 |
commit | dc2eb76c40590a3c080294d1fbd000c8f70d88a9 (patch) | |
tree | 8c7bccdd0eb4dfba763cd19216d8c0a13dfb5d51 | |
parent | 7e27d6e778cd87b6f2415515d7127eba53fe5d02 (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.S | 50 | ||||
-rw-r--r-- | arch/arm/mach-davinci/include/mach/serial.h | 13 | ||||
-rw-r--r-- | arch/arm/mach-davinci/include/mach/uncompress.h | 80 |
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 | ||
28 | davinci_uart_phys: .word 0 | ||
29 | davinci_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 */ | ||
35 | 10: 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 | ||
63 | 99: | ||
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__ | ||
29 | struct davinci_uart_config { | 41 | struct 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 | ||
34 | extern int davinci_serial_init(struct davinci_uart_config *); | 46 | extern 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 | ||
18 | extern unsigned int __machine_arch_type; | 26 | #include <mach/serial.h> |
19 | 27 | ||
20 | static u32 *uart; | 28 | static u32 *uart; |
21 | 29 | static u32 *uart_info = (u32 *)(DAVINCI_UART_INFO); | |
22 | static 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 | |||
33 | static void putc(char c) | 32 | static 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 | ||
43 | static inline void flush(void) | 39 | static 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() | 45 | static 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 | |||
66 | static 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() |