tlk: 6/19 update
[3rdparty/ote_partner/tlk.git] / platform / tegra / common / debug.c
1 /*
2  * Copyright (c) 2008 Travis Geiselbrecht
3  * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files
7  * (the "Software"), to deal in the Software without restriction,
8  * including without limitation the rights to use, copy, modify, merge,
9  * publish, distribute, sublicense, and/or sell copies of the Software,
10  * and to permit persons to whom the Software is furnished to do so,
11  * subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 #include <stdarg.h>
25 #include <reg.h>
26 #include <debug.h>
27 #include <printf.h>
28 #include <kernel/thread.h>
29 #include <platform/debug.h>
30 #include <arch/ops.h>
31 #include <platform/memmap.h>
32 #include <target/debugconfig.h>
33
34 static unsigned int disable_debug;
35
36 #define TEGRA_UART_NONE 0x0
37
38 static unsigned int uart_base[] = {
39         TEGRA_UART_NONE,
40         TEGRA_UARTA_BASE,
41         TEGRA_UARTB_BASE,
42         TEGRA_UARTC_BASE,
43         TEGRA_UARTD_BASE,
44         TEGRA_UARTE_BASE
45 };
46
47 static unsigned int debug_port;
48
49 #define UART_RHR        0
50 #define UART_THR        0
51 #define UART_LSR        5
52
53 static inline void write_uart_reg(int port, uint reg, unsigned char data)
54 {
55         *(volatile unsigned char *)(uart_base[port] + (reg << 2)) = data;
56 }
57
58 static inline unsigned char read_uart_reg(int port, uint reg)
59 {
60         return *(volatile unsigned char *)(uart_base[port] + (reg << 2));
61 }
62
63 static int uart_putc(int port, char c )
64 {
65         while (!(read_uart_reg(port, UART_LSR) & (1<<6)))
66                 ;
67         write_uart_reg(port, UART_THR, c);
68         return 0;
69 }
70
71 int uart_getc(int port, bool wait)
72 {
73         if (wait) {
74                 while (!(read_uart_reg(port, UART_LSR) & (1<<0)))
75                         ;
76         } else {
77                 if (!(read_uart_reg(port, UART_LSR) & (1<<0)))
78                         return -1;
79         }
80         return read_uart_reg(port, UART_RHR);
81 }
82
83 void platform_dputc(char c)
84 {
85         if (disable_debug || (debug_port == TEGRA_UART_NONE))
86                 return;
87
88         if (c == '\n') {
89                 uart_putc(debug_port, '\r');
90         } else if (c == '\0') {
91                 return;
92         }
93         uart_putc(debug_port, c);
94 }
95
96 int platform_dgetc(char *c, bool wait)
97 {
98         int _c;
99
100         if (disable_debug || (debug_port == TEGRA_UART_NONE))
101                 return -1;
102
103         if ((_c = uart_getc(debug_port, false)) < 0)
104                 return -1;
105
106         *c = _c;
107         return 0;
108 }
109
110 void platform_init_debug_port(unsigned int dbg_port)
111 {
112         debug_port = dbg_port;
113 }
114
115 void platform_halt(void)
116 {
117         dprintf(ALWAYS, "HALT: spinning forever...\n");
118         for(;;);
119 }
120
121 void platform_disable_debug_intf(void)
122 {
123         disable_debug = 1;
124 }
125
126 void platform_enable_debug_intf(void)
127 {
128         disable_debug = 0;
129 }