linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] console: Add console=spcr option
@ 2018-08-29 15:56 Prarit Bhargava
  2018-08-30 12:38 ` [PATCH v4] " Prarit Bhargava
  2018-08-30 14:26 ` [PATCH v3] " Thomas Gleixner
  0 siblings, 2 replies; 4+ messages in thread
From: Prarit Bhargava @ 2018-08-29 15:56 UTC (permalink / raw)
  To: linux-kernel
  Cc: Prarit Bhargava, Mark Salter, Al Stone, Rafael J. Wysocki,
	Len Brown, Pavel Machek, x86, Petr Mladek, Sergey Senozhatsky,
	Steven Rostedt, Kees Cook, Greg Kroah-Hartman, linux-pm

ACPI may contain an SPCR table that defines a default system console.
On ARM if the table is present then the SPCR console is enabled by default.
On x86 the SPCR console is used if 'earlycon' (no parameters) is
specified as a kernel parameter and is used only as the early console.
To use the SPCR data as a console a user must boot with 'earlycon',
grep logs & specify a console= kernel parameter, and then reboot again.

Add 'console=spcr' that enables a firmware or hardware console, and on
x86 enable the SPCR console if 'console=spcr' is specified.

Tested on systems with and without an ACPI SPCR.  The following kernel
parameters were also tested:

console=ttyS0,115200    		works
earlycon                		works (early console only)
console=spcr            		works (full console as expected)
no console or earlycon arguments	works (no output as expected)

v2: Fix prototype.
v3: Change parameter to "spcr" and add error message to spcr init call.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: Mark Salter <msalter@redhat.com>
Cc: Al Stone <ahs3@redhat.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Len Brown <len.brown@intel.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: x86@kernel.org
Cc: Petr Mladek <pmladek@suse.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-pm@vger.kernel.org
---
 Documentation/admin-guide/kernel-parameters.txt |  1 +
 arch/x86/kernel/acpi/boot.c                     |  9 +++++++++
 include/linux/console.h                         |  1 +
 kernel/printk/printk.c                          | 10 ++++++++++
 4 files changed, 21 insertions(+)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 9871e649ffef..f51a32cda90c 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -635,6 +635,7 @@
 
 		hvc<n>	Use the hypervisor console device <n>. This is for
 			both Xen and PowerPC hypervisors.
+		spcr	[X86] Enable ACPI SPCR console
 
 		If the device connected to the port is not a TTY but a braille
 		device, prepend "brl," before the device type, for instance
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 3b20607d581b..3fed5e9a6b82 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -1771,3 +1771,12 @@ void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size)
 	e820__range_add(addr, size, E820_TYPE_ACPI);
 	e820__update_table_print();
 }
+
+void __init arch_console_setup(void)
+{
+	int ret;
+
+	ret = acpi_parse_spcr(false, true);
+	if (ret)
+		pr_err(PREFIX "ERROR: SPCR console is not enabled (%d)\n", ret);
+}
diff --git a/include/linux/console.h b/include/linux/console.h
index ec9bdb3d7bab..562b825d911c 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -183,6 +183,7 @@ extern int is_console_locked(void);
 extern int braille_register_console(struct console *, int index,
 		char *console_options, char *braille_options);
 extern int braille_unregister_console(struct console *);
+void arch_console_setup(void);
 #ifdef CONFIG_TTY
 extern void console_sysfs_notify(void);
 #else
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 924e37fb1620..35859606e714 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2097,6 +2097,11 @@ static int __init console_msg_format_setup(char *str)
 }
 __setup("console_msg_format=", console_msg_format_setup);
 
+void __init __weak arch_console_setup(void)
+{
+	return;
+}
+
 /*
  * Set up a console.  Called via do_early_param() in init/main.c
  * for each "console=" parameter in the boot command line.
@@ -2107,6 +2112,11 @@ static int __init console_setup(char *str)
 	char *s, *options, *brl_options = NULL;
 	int idx;
 
+	if (!strcmp(str, "spcr")) {
+		arch_console_setup();
+		return 1;
+	}
+
 	if (_braille_console_setup(&str, &brl_options))
 		return 1;
 
-- 
2.14.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v4] console: Add console=spcr option
  2018-08-29 15:56 [PATCH v3] console: Add console=spcr option Prarit Bhargava
@ 2018-08-30 12:38 ` Prarit Bhargava
  2018-08-30 14:04   ` Petr Mladek
  2018-08-30 14:26 ` [PATCH v3] " Thomas Gleixner
  1 sibling, 1 reply; 4+ messages in thread
From: Prarit Bhargava @ 2018-08-30 12:38 UTC (permalink / raw)
  To: linux-kernel; +Cc: Prarit Bhargava, Petr Mladek, Sergey Senozhatsky

ACPI may contain an SPCR table that defines a default system console.
On ARM if the table is present then the SPCR console is enabled by default.
On x86 the SPCR console is used if 'earlycon' (no parameters) is
specified as a kernel parameter and is used only as the early console.
To use the SPCR data as a console a user must boot with 'earlycon',
grep logs & specify a console= kernel parameter, and then reboot again.

Add 'console=spcr' that enables a firmware or hardware console, and on
x86 enable the SPCR console if 'console=spcr' is specified.

Tested on systems with and without an ACPI SPCR.  The following kernel
parameters were also tested:

console=ttyS0,115200    		works
earlycon                		works (early console only)
console=spcr            		works (full console as expected)
no console or earlycon arguments	works (no output as expected)

v2: Fix prototype.
v3: Change parameter to "spcr" and add error message to spcr init call.
v4: move spcr to x86 (really make it arch specific)

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
---
 Documentation/admin-guide/kernel-parameters.txt |  1 +
 arch/x86/kernel/acpi/boot.c                     | 14 ++++++++++++++
 include/linux/console.h                         |  1 +
 kernel/printk/printk.c                          |  8 ++++++++
 4 files changed, 24 insertions(+)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 9871e649ffef..f51a32cda90c 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -635,6 +635,7 @@
 
 		hvc<n>	Use the hypervisor console device <n>. This is for
 			both Xen and PowerPC hypervisors.
+		spcr	[X86] Enable ACPI SPCR console
 
 		If the device connected to the port is not a TTY but a braille
 		device, prepend "brl," before the device type, for instance
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 3b20607d581b..a43a34734f02 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -1771,3 +1771,17 @@ void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size)
 	e820__range_add(addr, size, E820_TYPE_ACPI);
 	e820__update_table_print();
 }
+
+int __init arch_console_setup(char *str)
+{
+	int ret;
+
+	if (strcmp("spcr", str))
+		return 1;
+
+	ret = acpi_parse_spcr(false, true);
+	if (ret)
+		pr_err(PREFIX "ERROR: SPCR console is not enabled (%d)\n", ret);
+
+	return 0;
+}
diff --git a/include/linux/console.h b/include/linux/console.h
index ec9bdb3d7bab..9bb6a79823a2 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -183,6 +183,7 @@ struct console {
 extern int braille_register_console(struct console *, int index,
 		char *console_options, char *braille_options);
 extern int braille_unregister_console(struct console *);
+int arch_console_setup(char *str);
 #ifdef CONFIG_TTY
 extern void console_sysfs_notify(void);
 #else
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 924e37fb1620..ceee021a37ec 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2097,6 +2097,11 @@ static int __init console_msg_format_setup(char *str)
 }
 __setup("console_msg_format=", console_msg_format_setup);
 
+int __init __weak arch_console_setup(char *str)
+{
+	return 1;
+}
+
 /*
  * Set up a console.  Called via do_early_param() in init/main.c
  * for each "console=" parameter in the boot command line.
@@ -2107,6 +2112,9 @@ static int __init console_setup(char *str)
 	char *s, *options, *brl_options = NULL;
 	int idx;
 
+	if (!arch_console_setup(str))
+		return 1;
+
 	if (_braille_console_setup(&str, &brl_options))
 		return 1;
 
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v4] console: Add console=spcr option
  2018-08-30 12:38 ` [PATCH v4] " Prarit Bhargava
@ 2018-08-30 14:04   ` Petr Mladek
  0 siblings, 0 replies; 4+ messages in thread
From: Petr Mladek @ 2018-08-30 14:04 UTC (permalink / raw)
  To: Prarit Bhargava; +Cc: linux-kernel, Sergey Senozhatsky

On Thu 2018-08-30 08:38:49, Prarit Bhargava wrote:
> ACPI may contain an SPCR table that defines a default system console.
> On ARM if the table is present then the SPCR console is enabled by default.
> On x86 the SPCR console is used if 'earlycon' (no parameters) is
> specified as a kernel parameter and is used only as the early console.
> To use the SPCR data as a console a user must boot with 'earlycon',
> grep logs & specify a console= kernel parameter, and then reboot again.
> 
> Add 'console=spcr' that enables a firmware or hardware console, and on
> x86 enable the SPCR console if 'console=spcr' is specified.

> diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
> index 3b20607d581b..a43a34734f02 100644
> --- a/arch/x86/kernel/acpi/boot.c
> +++ b/arch/x86/kernel/acpi/boot.c
> @@ -1771,3 +1771,17 @@ void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size)
>  	e820__range_add(addr, size, E820_TYPE_ACPI);
>  	e820__update_table_print();
>  }
> +
> +int __init arch_console_setup(char *str)
> +{
> +	int ret;
> +
> +	if (strcmp("spcr", str))
> +		return 1;
> +
> +	ret = acpi_parse_spcr(false, true);
> +	if (ret)
> +		pr_err(PREFIX "ERROR: SPCR console is not enabled (%d)\n", ret);
> +
> +	return 0;
> +}
> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
> index 924e37fb1620..ceee021a37ec 100644
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -2107,6 +2112,9 @@ static int __init console_setup(char *str)
>  	char *s, *options, *brl_options = NULL;
>  	int idx;
>  
> +	if (!arch_console_setup(str))
> +		return 1;
> +
>  	if (_braille_console_setup(&str, &brl_options))
>  		return 1;

Sigh, I am still a bit confused by the error handling. Especially
I am not sure why console_setup() always returns 1.

It looks like it means an error when called from do_early_param().
But it means that the option was proceed when called from
obsolete_checksetup(). Do I get this correctly, please?

If this is true, we should change the logic in arch_console_setup().
It should return 1 when "spcr" is handled and it should return 0
otherwise. Also it should be commented.

It looks like a historic mess. This is why I do not ask you to do
any bigger clean up. But the new patch should not make it even
more confusing by an inverted 0/1 logic.

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v3] console: Add console=spcr option
  2018-08-29 15:56 [PATCH v3] console: Add console=spcr option Prarit Bhargava
  2018-08-30 12:38 ` [PATCH v4] " Prarit Bhargava
@ 2018-08-30 14:26 ` Thomas Gleixner
  1 sibling, 0 replies; 4+ messages in thread
From: Thomas Gleixner @ 2018-08-30 14:26 UTC (permalink / raw)
  To: Prarit Bhargava
  Cc: linux-kernel, Mark Salter, Al Stone, Rafael J. Wysocki,
	Len Brown, Pavel Machek, x86, Petr Mladek, Sergey Senozhatsky,
	Steven Rostedt, Kees Cook, Greg Kroah-Hartman, linux-pm

On Wed, 29 Aug 2018, Prarit Bhargava wrote:
> +
> +void __init arch_console_setup(void)
> +{
> +	int ret;
> +
> +	ret = acpi_parse_spcr(false, true);
> +	if (ret)
> +		pr_err(PREFIX "ERROR: SPCR console is not enabled (%d)\n", ret);
> +}

Why does this require yet another arch/weak function?

>  /*
>   * Set up a console.  Called via do_early_param() in init/main.c
>   * for each "console=" parameter in the boot command line.
> @@ -2107,6 +2112,11 @@ static int __init console_setup(char *str)
>  	char *s, *options, *brl_options = NULL;
>  	int idx;
>  
> +	if (!strcmp(str, "spcr")) {
> +		arch_console_setup();
> +		return 1;

And this gets added to everything and the world whether it's
needed/supported or not.

Why can't we simply register the SPCR console as we do with any other
console when it is detected?

If we can't for some real good reason then there is no need to invoke
acpi_parse_spcr() twice. We simply can store the fact that it got selected
and use that information in acpi_boot_init().

Thanks,

	tglx






^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-08-30 14:26 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-29 15:56 [PATCH v3] console: Add console=spcr option Prarit Bhargava
2018-08-30 12:38 ` [PATCH v4] " Prarit Bhargava
2018-08-30 14:04   ` Petr Mladek
2018-08-30 14:26 ` [PATCH v3] " Thomas Gleixner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).