First version
[3rdparty/ote_partner/tlk.git] / platform / tegra / monitor / debug.c
1 /*
2  * Copyright (c) 2008 Travis Geiselbrecht
3  * Copyright (c) 2014, 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 <debug.h>
25 #include <platform/memmap.h>
26
27 static unsigned int disable_debug;
28
29 #define TEGRA_UART_NONE 0x0
30
31 static uintptr_t uart_base[] = {
32         TEGRA_UART_NONE,
33         TEGRA_UARTA_BASE,
34         TEGRA_UARTB_BASE,
35         TEGRA_UARTC_BASE,
36         TEGRA_UARTD_BASE,
37         TEGRA_UARTE_BASE
38 };
39
40 static unsigned int debug_port;
41
42 #define UART_RHR        0
43 #define UART_THR        0
44 #define UART_LSR        5
45
46 static inline void write_uart_reg(int port, uint reg, unsigned char data)
47 {
48         *(volatile unsigned char *)(uart_base[port] + (reg << 2)) = data;
49 }
50
51 static inline unsigned char read_uart_reg(int port, uint reg)
52 {
53         return *(volatile unsigned char *)(uart_base[port] + (reg << 2));
54 }
55
56 static int uart_putc(int port, char c )
57 {
58         while (!(read_uart_reg(port, UART_LSR) & (1<<6)))
59                 ;
60         write_uart_reg(port, UART_THR, c);
61         return 0;
62 }
63
64 int uart_getc(int port, bool wait)
65 {
66         if (wait) {
67                 while (!(read_uart_reg(port, UART_LSR) & (1<<0)))
68                         ;
69         } else {
70                 if (!(read_uart_reg(port, UART_LSR) & (1<<0)))
71                         return -1;
72         }
73         return read_uart_reg(port, UART_RHR);
74 }
75
76 void platform_dputc(char c)
77 {
78         if (disable_debug || (debug_port == TEGRA_UART_NONE))
79                 return;
80
81         if (c == '\n') {
82                 uart_putc(debug_port, '\r');
83         } else if (c == '\0') {
84                 return;
85         }
86         uart_putc(debug_port, c);
87 }
88
89 int platform_dgetc(char *c, bool wait)
90 {
91         int _c;
92
93         if (disable_debug || (debug_port == TEGRA_UART_NONE))
94                 return -1;
95
96         if ((_c = uart_getc(debug_port, false)) < 0)
97                 return -1;
98
99         *c = _c;
100         return 0;
101 }
102
103 void platform_init_debug_port(unsigned int dbg_port)
104 {
105         debug_port = dbg_port;
106 }
107
108 void platform_halt(void)
109 {
110         dprintf(ALWAYS, "HALT: spinning forever...\n");
111         for(;;);
112 }
113
114 void platform_disable_debug_intf(void)
115 {
116         disable_debug = 1;
117 }
118
119 void platform_enable_debug_intf(void)
120 {
121         disable_debug = 0;
122 }