diff options
author | Rob Herring <robh@kernel.org> | 2014-04-18 18:19:58 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-04-24 19:32:27 -0400 |
commit | d50d7269ebcb438afa346cdffce0f4e2a1b9e831 (patch) | |
tree | 7095e7a34467771f9b0e3c2f113cbeb6e7ff5145 | |
parent | 0d3c673e7881e691991b2a4745bd4f149603baa2 (diff) |
tty/serial: add arm/arm64 semihosting earlycon
Add earlycon support for the arm/arm64 semihosting debug serial
interface. This allows enabling a debug console when early_params are
processed. This is based on the arm64 earlyprintk smh support and is
intended to replace it.
Signed-off-by: Rob Herring <robh@kernel.org>
Cc: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | Documentation/kernel-parameters.txt | 2 | ||||
-rw-r--r-- | drivers/tty/serial/Kconfig | 10 | ||||
-rw-r--r-- | drivers/tty/serial/Makefile | 1 | ||||
-rw-r--r-- | drivers/tty/serial/earlycon-arm-semihost.c | 61 |
4 files changed, 74 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 2609ead7ff55..4946d8e58d53 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -899,6 +899,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
899 | must already be setup and configured. Options are not | 899 | must already be setup and configured. Options are not |
900 | yet supported. | 900 | yet supported. |
901 | 901 | ||
902 | smh Use ARM semihosting calls for early console. | ||
903 | |||
902 | earlyprintk= [X86,SH,BLACKFIN,ARM] | 904 | earlyprintk= [X86,SH,BLACKFIN,ARM] |
903 | earlyprintk=vga | 905 | earlyprintk=vga |
904 | earlyprintk=efi | 906 | earlyprintk=efi |
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index 4290d05875b1..988fa2b6243b 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig | |||
@@ -73,6 +73,16 @@ config SERIAL_AMBA_PL011_CONSOLE | |||
73 | your boot loader (lilo or loadlin) about how to pass options to the | 73 | your boot loader (lilo or loadlin) about how to pass options to the |
74 | kernel at boot time.) | 74 | kernel at boot time.) |
75 | 75 | ||
76 | config SERIAL_EARLYCON_ARM_SEMIHOST | ||
77 | bool "Early console using ARM semihosting" | ||
78 | depends on ARM64 || ARM | ||
79 | select SERIAL_EARLYCON | ||
80 | help | ||
81 | Support for early debug console using ARM semihosting. This enables | ||
82 | the console before standard serial driver is probed. This is enabled | ||
83 | with "earlycon=smh" on the kernel command line. The console is | ||
84 | enabled when early_param is processed. | ||
85 | |||
76 | config SERIAL_SB1250_DUART | 86 | config SERIAL_SB1250_DUART |
77 | tristate "BCM1xxx on-chip DUART serial support" | 87 | tristate "BCM1xxx on-chip DUART serial support" |
78 | depends on SIBYTE_SB1xxx_SOC=y | 88 | depends on SIBYTE_SB1xxx_SOC=y |
diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile index 28048178f308..3a5be4633333 100644 --- a/drivers/tty/serial/Makefile +++ b/drivers/tty/serial/Makefile | |||
@@ -6,6 +6,7 @@ obj-$(CONFIG_SERIAL_CORE) += serial_core.o | |||
6 | obj-$(CONFIG_SERIAL_21285) += 21285.o | 6 | obj-$(CONFIG_SERIAL_21285) += 21285.o |
7 | 7 | ||
8 | obj-$(CONFIG_SERIAL_EARLYCON) += earlycon.o | 8 | obj-$(CONFIG_SERIAL_EARLYCON) += earlycon.o |
9 | obj-$(CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST) += earlycon-arm-semihost.o | ||
9 | 10 | ||
10 | # These Sparc drivers have to appear before others such as 8250 | 11 | # These Sparc drivers have to appear before others such as 8250 |
11 | # which share ttySx minor node space. Otherwise console device | 12 | # which share ttySx minor node space. Otherwise console device |
diff --git a/drivers/tty/serial/earlycon-arm-semihost.c b/drivers/tty/serial/earlycon-arm-semihost.c new file mode 100644 index 000000000000..383db10fbb49 --- /dev/null +++ b/drivers/tty/serial/earlycon-arm-semihost.c | |||
@@ -0,0 +1,61 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012 ARM Ltd. | ||
3 | * Author: Marc Zyngier <marc.zyngier@arm.com> | ||
4 | * | ||
5 | * Adapted for ARM and earlycon: | ||
6 | * Copyright (C) 2014 Linaro Ltd. | ||
7 | * Author: Rob Herring <robh@kernel.org> | ||
8 | * | ||
9 | * This program is free software: you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
20 | */ | ||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/console.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/serial_core.h> | ||
25 | |||
26 | #ifdef CONFIG_THUMB2_KERNEL | ||
27 | #define SEMIHOST_SWI "0xab" | ||
28 | #else | ||
29 | #define SEMIHOST_SWI "0x123456" | ||
30 | #endif | ||
31 | |||
32 | /* | ||
33 | * Semihosting-based debug console | ||
34 | */ | ||
35 | static void smh_putc(struct uart_port *port, int c) | ||
36 | { | ||
37 | #ifdef CONFIG_ARM64 | ||
38 | asm volatile("mov x1, %0\n" | ||
39 | "mov x0, #3\n" | ||
40 | "hlt 0xf000\n" | ||
41 | : : "r" (&c) : "x0", "x1", "memory"); | ||
42 | #else | ||
43 | asm volatile("mov r1, %0\n" | ||
44 | "mov r0, #3\n" | ||
45 | "svc " SEMIHOST_SWI "\n" | ||
46 | : : "r" (&c) : "r0", "r1", "memory"); | ||
47 | #endif | ||
48 | } | ||
49 | |||
50 | static void smh_write(struct console *con, const char *s, unsigned n) | ||
51 | { | ||
52 | struct earlycon_device *dev = con->data; | ||
53 | uart_console_write(&dev->port, s, n, smh_putc); | ||
54 | } | ||
55 | |||
56 | int __init early_smh_setup(struct earlycon_device *device, const char *opt) | ||
57 | { | ||
58 | device->con->write = smh_write; | ||
59 | return 0; | ||
60 | } | ||
61 | EARLYCON_DECLARE(smh, early_smh_setup); | ||