From patchwork Tue Jun 18 04:54:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tony Lindgren X-Patchwork-Id: 805927 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97B471C2AD; Tue, 18 Jun 2024 04:55:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718686526; cv=none; b=VPEo9nFSmP/CC7BweHYGTBa0a2WsqbeBXtaULtRX7L/tJdwH9sDMTH6IbxLZEooXQIoasYqEbUYsiks+oaZyOFZ+DPVjVBeV2tbKIk1yhVjZn+RG9uYfX9EtJzs91RgI46FaFhF2amIM1zSsIKz5RaOpSVQkL7PLYfZbZqlY440= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718686526; c=relaxed/simple; bh=ykmFHjLmQcgg09LU3W6SLx0qpasqzoUvmrp1nqXPat0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=etTlItVCrMJPs1G6olwGnE56/EcpOFhA5bYBKLUQfRKT6qso0AeuLFVQHmW7tRHQgozQ+qXMXsNXB/X+0XiWUtsnNfTtNsEK5SZLdUHFWW4R6NEgCg8DVIYBHmFCBVPWZFXcugZr+pcUmpJe+edP+yDwEREAbgLurRg7BQ2rd/0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=YdhhHxKL; arc=none smtp.client-ip=198.175.65.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="YdhhHxKL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1718686525; x=1750222525; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ykmFHjLmQcgg09LU3W6SLx0qpasqzoUvmrp1nqXPat0=; b=YdhhHxKLuyAF7RYYOHquYKNF+Mt5NCNvg9n8ujXUXy4IndrePqJykIn4 hPAkw3zLmuq4fcylUfS6Od7fnXmW/5xSpgMPhTyoeFAWH8ny/tGfI6bRV AcxGtYHrBnmIMwBL/+ju62B3RICppmTNaftEcYogWUQwJKSGUb3uLtsCu l8cV6TXdu54yOzfw7H7KWSbzl0z/CTLJMB/TWDkVOooLrAQSvWGRKdx4S PWsVw09h/kLJLlH51uV4xwBxHotThdZ52nJbCYAdad8wuRmDJxoPKa6vY vNPbvELCI0NCyNSdjxqao7tP67/tnk9ZP6J17zg3YupgHmMEG6y3e2S+g A==; X-CSE-ConnectionGUID: 9qPAqmuNQWSNtOenlWda8w== X-CSE-MsgGUID: /PNr0kB7SgmHR3egC/VASg== X-IronPort-AV: E=McAfee;i="6700,10204,11106"; a="38062781" X-IronPort-AV: E=Sophos;i="6.08,246,1712646000"; d="scan'208";a="38062781" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Jun 2024 21:55:24 -0700 X-CSE-ConnectionGUID: sWPUTTZBTRCev3Sed8h1iw== X-CSE-MsgGUID: RkTuYlIjR2WuU4oljXmmbg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,246,1712646000"; d="scan'208";a="41507398" Received: from unknown (HELO tlindgre-MOBL1.intel.com) ([10.245.247.4]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Jun 2024 21:55:19 -0700 From: Tony Lindgren To: Greg Kroah-Hartman , Jiri Slaby , Petr Mladek , Steven Rostedt , John Ogness , Sergey Senozhatsky , Tony Lindgren , Andy Shevchenko Cc: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , linux-serial@vger.kernel.org, Tony Lindgren , linux-kernel@vger.kernel.org Subject: [PATCH v3 1/3] printk: Revert add_preferred_console_match() related commits Date: Tue, 18 Jun 2024 07:54:48 +0300 Message-ID: <20240618045458.14731-2-tony.lindgren@linux.intel.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240618045458.14731-1-tony.lindgren@linux.intel.com> References: <20240618045458.14731-1-tony.lindgren@linux.intel.com> Precedence: bulk X-Mailing-List: linux-serial@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Recent changes to allow using DEVNAME:0.0 style console names caused a regression to the kernel command line handling for the console options. The last preferred console added gets used for init. This is documented in the comments for add_preferred_console(). Now the kernel command line options for console=ttyS0,115200 console=tty0 are wrongly handled and cause the /dev/console to be associated with ttyS0 instead of tty0. This happens because we are calling __add_preferred_console() later on from serial8250_isa_init_ports() after console_setup() and the console gets treated as the last added preferred console. As the DEVNAME:0.0 style console device is not known at console_setup() time, I added a call to __add_preferred_console() later on when the console is ready. To fix the issue, let's revert the printk related commits: f03e8c1060f8 ("printk: Save console options for add_preferred_console_match()") b73c9cbe4f1f ("printk: Flag register_console() if console is set on command line") 8a831c584e6e ("printk: Don't try to parse DEVNAME:0.0 console options") We need to also drop the call for add_preferred_console_match() from serial_base_add_one_prefcon() added by commit 787a1cabac01 ("serial: core: Add support for DEVNAME:0.0 style naming for kernel console"). Petr has suggested a better way to handle the deferred consoles that does not rely on calling __add_preferred_console() again. Reported-by: Petr Mladek Link: https://lore.kernel.org/linux-serial/ZlC6_Um4P4b-_WQE@pathway.suse.cz/ Fixes: f03e8c1060f8 ("printk: Save console options for add_preferred_console_match()") Reviewed-by: Petr Mladek Signed-off-by: Tony Lindgren --- drivers/tty/serial/serial_base_bus.c | 8 +- include/linux/printk.h | 3 - kernel/printk/Makefile | 2 +- kernel/printk/conopt.c | 146 --------------------------- kernel/printk/console_cmdline.h | 6 -- kernel/printk/printk.c | 23 +---- 6 files changed, 6 insertions(+), 182 deletions(-) delete mode 100644 kernel/printk/conopt.c diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c index 73c6ee540c83..5ebacb982f9e 100644 --- a/drivers/tty/serial/serial_base_bus.c +++ b/drivers/tty/serial/serial_base_bus.c @@ -210,13 +210,7 @@ void serial_base_port_device_remove(struct serial_port_device *port_dev) static int serial_base_add_one_prefcon(const char *match, const char *dev_name, int port_id) { - int ret; - - ret = add_preferred_console_match(match, dev_name, port_id); - if (ret == -ENOENT) - return 0; - - return ret; + return 0; } #ifdef __sparc__ diff --git a/include/linux/printk.h b/include/linux/printk.h index 40afab23881a..65c5184470f1 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -60,9 +60,6 @@ static inline const char *printk_skip_headers(const char *buffer) #define CONSOLE_LOGLEVEL_DEFAULT CONFIG_CONSOLE_LOGLEVEL_DEFAULT #define CONSOLE_LOGLEVEL_QUIET CONFIG_CONSOLE_LOGLEVEL_QUIET -int add_preferred_console_match(const char *match, const char *name, - const short idx); - extern int console_printk[]; #define console_loglevel (console_printk[0]) diff --git a/kernel/printk/Makefile b/kernel/printk/Makefile index 040fe7d1eda2..39a2b61c7232 100644 --- a/kernel/printk/Makefile +++ b/kernel/printk/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-only -obj-y = printk.o conopt.o +obj-y = printk.o obj-$(CONFIG_PRINTK) += printk_safe.o nbcon.o obj-$(CONFIG_A11Y_BRAILLE_CONSOLE) += braille.o obj-$(CONFIG_PRINTK_INDEX) += index.o diff --git a/kernel/printk/conopt.c b/kernel/printk/conopt.c deleted file mode 100644 index 9d507bac3657..000000000000 --- a/kernel/printk/conopt.c +++ /dev/null @@ -1,146 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Kernel command line console options for hardware based addressing - * - * Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/ - * Author: Tony Lindgren - */ - -#include -#include -#include -#include - -#include - -#include "console_cmdline.h" - -/* - * Allow longer DEVNAME:0.0 style console naming such as abcd0000.serial:0.0 - * in addition to the legacy ttyS0 style naming. - */ -#define CONSOLE_NAME_MAX 32 - -#define CONSOLE_OPT_MAX 16 -#define CONSOLE_BRL_OPT_MAX 16 - -struct console_option { - char name[CONSOLE_NAME_MAX]; - char opt[CONSOLE_OPT_MAX]; - char brl_opt[CONSOLE_BRL_OPT_MAX]; - u8 has_brl_opt:1; -}; - -/* Updated only at console_setup() time, no locking needed */ -static struct console_option conopt[MAX_CMDLINECONSOLES]; - -/** - * console_opt_save - Saves kernel command line console option for driver use - * @str: Kernel command line console name and option - * @brl_opt: Braille console options - * - * Saves a kernel command line console option for driver subsystems to use for - * adding a preferred console during init. Called from console_setup() only. - * - * Return: 0 on success, negative error code on failure. - */ -int __init console_opt_save(const char *str, const char *brl_opt) -{ - struct console_option *con; - size_t namelen, optlen; - const char *opt; - int i; - - namelen = strcspn(str, ","); - if (namelen == 0 || namelen >= CONSOLE_NAME_MAX) - return -EINVAL; - - opt = str + namelen; - if (*opt == ',') - opt++; - - optlen = strlen(opt); - if (optlen >= CONSOLE_OPT_MAX) - return -EINVAL; - - for (i = 0; i < MAX_CMDLINECONSOLES; i++) { - con = &conopt[i]; - - if (con->name[0]) { - if (!strncmp(str, con->name, namelen)) - return 0; - continue; - } - - /* - * The name isn't terminated, only opt is. Empty opt is fine, - * but brl_opt can be either empty or NULL. For more info, see - * _braille_console_setup(). - */ - strscpy(con->name, str, namelen + 1); - strscpy(con->opt, opt, CONSOLE_OPT_MAX); - if (brl_opt) { - strscpy(con->brl_opt, brl_opt, CONSOLE_BRL_OPT_MAX); - con->has_brl_opt = 1; - } - - return 0; - } - - return -ENOMEM; -} - -static struct console_option *console_opt_find(const char *name) -{ - struct console_option *con; - int i; - - for (i = 0; i < MAX_CMDLINECONSOLES; i++) { - con = &conopt[i]; - if (!strcmp(name, con->name)) - return con; - } - - return NULL; -} - -/** - * add_preferred_console_match - Adds a preferred console if a match is found - * @match: Expected console on kernel command line, such as console=DEVNAME:0.0 - * @name: Name of the console character device to add such as ttyS - * @idx: Index for the console - * - * Allows driver subsystems to add a console after translating the command - * line name to the character device name used for the console. Options are - * added automatically based on the kernel command line. Duplicate preferred - * consoles are ignored by __add_preferred_console(). - * - * Return: 0 on success, negative error code on failure. - */ -int add_preferred_console_match(const char *match, const char *name, - const short idx) -{ - struct console_option *con; - char *brl_opt = NULL; - - if (!match || !strlen(match) || !name || !strlen(name) || - idx < 0) - return -EINVAL; - - con = console_opt_find(match); - if (!con) - return -ENOENT; - - /* - * See __add_preferred_console(). It checks for NULL brl_options to set - * the preferred_console flag. Empty brl_opt instead of NULL leads into - * the preferred_console flag not set, and CON_CONSDEV not being set, - * and the boot console won't get disabled at the end of console_setup(). - */ - if (con->has_brl_opt) - brl_opt = con->brl_opt; - - console_opt_add_preferred_console(name, idx, con->opt, brl_opt); - - return 0; -} diff --git a/kernel/printk/console_cmdline.h b/kernel/printk/console_cmdline.h index a125e0235589..3ca74ad391d6 100644 --- a/kernel/printk/console_cmdline.h +++ b/kernel/printk/console_cmdline.h @@ -2,12 +2,6 @@ #ifndef _CONSOLE_CMDLINE_H #define _CONSOLE_CMDLINE_H -#define MAX_CMDLINECONSOLES 8 - -int console_opt_save(const char *str, const char *brl_opt); -int console_opt_add_preferred_console(const char *name, const short idx, - char *options, char *brl_options); - struct console_cmdline { char name[16]; /* Name of the driver */ diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 420fd310129d..dddb15f48d59 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -383,6 +383,9 @@ static int console_locked; /* * Array of consoles built from command line options (console=) */ + +#define MAX_CMDLINECONSOLES 8 + static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES]; static int preferred_console = -1; @@ -2500,17 +2503,6 @@ static int __init console_setup(char *str) if (_braille_console_setup(&str, &brl_options)) return 1; - /* Save the console for driver subsystem use */ - if (console_opt_save(str, brl_options)) - return 1; - - /* Flag register_console() to not call try_enable_default_console() */ - console_set_on_cmdline = 1; - - /* Don't attempt to parse a DEVNAME:0.0 style console */ - if (strchr(str, ':')) - return 1; - /* * Decode str into name, index, options. */ @@ -2541,13 +2533,6 @@ static int __init console_setup(char *str) } __setup("console=", console_setup); -/* Only called from add_preferred_console_match() */ -int console_opt_add_preferred_console(const char *name, const short idx, - char *options, char *brl_options) -{ - return __add_preferred_console(name, idx, options, brl_options, true); -} - /** * add_preferred_console - add a device to the list of preferred consoles. * @name: device name @@ -3522,7 +3507,7 @@ void register_console(struct console *newcon) * Note that a console with tty binding will have CON_CONSDEV * flag set and will be first in the list. */ - if (preferred_console < 0 && !console_set_on_cmdline) { + if (preferred_console < 0) { if (hlist_empty(&console_list) || !console_first()->device || console_first()->flags & CON_BOOT) { try_enable_default_console(newcon); From patchwork Tue Jun 18 04:54:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tony Lindgren X-Patchwork-Id: 805588 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 75865249EB; Tue, 18 Jun 2024 04:55:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718686537; cv=none; b=M+0PM5VbwK6401AcCukmjD8VZqPUMO3u3ICokoHkcyD/tQ19taNgNKQ6jIn3ncpoiRAoZGvbEfWdPw2TRpFbhLdOpMs/QJBUDAn5kSGJms2ah6zAAOSbxLu0BpEFXM/v+X4sM4kKH6fmXHchjQtBQCitT792JtRRNPddCnyMNlk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718686537; c=relaxed/simple; bh=Ophd+CrMEE6LKy6/M+RI/2YYXJYUHhdwy7epncN9EgM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qOb0uN1eJHqywA4anp4wrX+rPZwcqcjTq3KpIHncGKXk/pZ8HmYsDypiKjAnEBkibePPKYRjYzg7wd+8/qI1EpJXfx1iaSAec6eHLLZakHVE9eexP2XNkPF9svh7nyYa7nEDyHWHVDdjluzzYNLm0QTHRnBfk/pa1PXhpQ+CiaI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=NwxDxTu2; arc=none smtp.client-ip=198.175.65.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="NwxDxTu2" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1718686535; x=1750222535; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Ophd+CrMEE6LKy6/M+RI/2YYXJYUHhdwy7epncN9EgM=; b=NwxDxTu2B3rXjtN1m8dQ6xD/nV/WJdg4Oocomkl6PV35MdbbhuVleJlF /M4HhU/ENayS9nRz9WFdsCtfRmevhE0p4V5abs36y2WnpxmQlcbELP9C2 1Bk+frtIXBG157tGadS0fwY3EK2UHTGArzKiwz2O0Tj4Q33s9WJrt/Sky 2GxAGBLPzx2YZW72putwDO8clI7IBQmYivOM9eOgpl7c5koHB1wSDm8nh zWtlSOUSHrpGRlJWiuQOtxBFw0UgGAPBpecD+oObASURCFp0syi8RwUfs n+Bz18W8LZwUxmo5++6VT35WS5c33ANS7DY4XFrTkpzzWiXCqiFaUXS/e g==; X-CSE-ConnectionGUID: FaduCr2WTfy1PV0ghQo61g== X-CSE-MsgGUID: b8oqN6Q+TNu9QnsnrU0rQg== X-IronPort-AV: E=McAfee;i="6700,10204,11106"; a="38062803" X-IronPort-AV: E=Sophos;i="6.08,246,1712646000"; d="scan'208";a="38062803" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Jun 2024 21:55:35 -0700 X-CSE-ConnectionGUID: /t2xhix7TQGghCtCs6OyPA== X-CSE-MsgGUID: VYouvJAcS4i0bHXMqqyFbA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,246,1712646000"; d="scan'208";a="41507404" Received: from unknown (HELO tlindgre-MOBL1.intel.com) ([10.245.247.4]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Jun 2024 21:55:29 -0700 From: Tony Lindgren To: Greg Kroah-Hartman , Jiri Slaby , Petr Mladek , Steven Rostedt , John Ogness , Sergey Senozhatsky , Tony Lindgren , Andy Shevchenko Cc: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , linux-serial@vger.kernel.org, Tony Lindgren , linux-kernel@vger.kernel.org Subject: [PATCH v3 2/3] printk: Add match_devname_and_update_preferred_console() Date: Tue, 18 Jun 2024 07:54:49 +0300 Message-ID: <20240618045458.14731-3-tony.lindgren@linux.intel.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240618045458.14731-1-tony.lindgren@linux.intel.com> References: <20240618045458.14731-1-tony.lindgren@linux.intel.com> Precedence: bulk X-Mailing-List: linux-serial@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Let's add match_devname_and_update_preferred_console() for driver subsystems to call during init when the console is ready, and it's character device name is known. For now, we use it only for the serial layer to allow console=DEVNAME:0.0 style hardware based addressing for consoles. The earlier attempt on doing this caused a regression with the kernel command line console order as it added calling __add_preferred_console() again later on during init. A better approach was suggested by Petr where we add the deferred console to the console_cmdline[] and update it later on when the console is ready. Suggested-by: Petr Mladek Co-developed-by: Petr Mladek Signed-off-by: Tony Lindgren Reviewed-by: Petr Mladek Tested-by: Petr Mladek --- drivers/tty/serial/serial_base_bus.c | 8 ++- include/linux/printk.h | 4 ++ kernel/printk/console_cmdline.h | 1 + kernel/printk/printk.c | 103 +++++++++++++++++++++++---- 4 files changed, 100 insertions(+), 16 deletions(-) diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c index 5ebacb982f9e..2cf86f1ff298 100644 --- a/drivers/tty/serial/serial_base_bus.c +++ b/drivers/tty/serial/serial_base_bus.c @@ -210,7 +210,13 @@ void serial_base_port_device_remove(struct serial_port_device *port_dev) static int serial_base_add_one_prefcon(const char *match, const char *dev_name, int port_id) { - return 0; + int ret; + + ret = match_devname_and_update_preferred_console(match, dev_name, port_id); + if (ret == -ENOENT) + return 0; + + return ret; } #ifdef __sparc__ diff --git a/include/linux/printk.h b/include/linux/printk.h index 65c5184470f1..7239976698e4 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -60,6 +60,10 @@ static inline const char *printk_skip_headers(const char *buffer) #define CONSOLE_LOGLEVEL_DEFAULT CONFIG_CONSOLE_LOGLEVEL_DEFAULT #define CONSOLE_LOGLEVEL_QUIET CONFIG_CONSOLE_LOGLEVEL_QUIET +int match_devname_and_update_preferred_console(const char *match, + const char *name, + const short idx); + extern int console_printk[]; #define console_loglevel (console_printk[0]) diff --git a/kernel/printk/console_cmdline.h b/kernel/printk/console_cmdline.h index 3ca74ad391d6..0ab573b6d4dc 100644 --- a/kernel/printk/console_cmdline.h +++ b/kernel/printk/console_cmdline.h @@ -6,6 +6,7 @@ struct console_cmdline { char name[16]; /* Name of the driver */ int index; /* Minor dev. to use */ + char devname[32]; /* DEVNAME:0.0 style device name */ bool user_specified; /* Specified by command line vs. platform */ char *options; /* Options for the driver */ #ifdef CONFIG_A11Y_BRAILLE_CONSOLE diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index dddb15f48d59..7d91593f0ecf 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -2429,18 +2429,23 @@ static void set_user_specified(struct console_cmdline *c, bool user_specified) console_set_on_cmdline = 1; } -static int __add_preferred_console(const char *name, const short idx, char *options, +static int __add_preferred_console(const char *name, const short idx, + const char *devname, char *options, char *brl_options, bool user_specified) { struct console_cmdline *c; int i; + if (!name && !devname) + return -EINVAL; + /* * We use a signed short index for struct console for device drivers to * indicate a not yet assigned index or port. However, a negative index - * value is not valid for preferred console. + * value is not valid when the console name and index are defined on + * the command line. */ - if (idx < 0) + if (name && idx < 0) return -EINVAL; /* @@ -2448,9 +2453,10 @@ static int __add_preferred_console(const char *name, const short idx, char *opti * if we have a slot free. */ for (i = 0, c = console_cmdline; - i < MAX_CMDLINECONSOLES && c->name[0]; + i < MAX_CMDLINECONSOLES && (c->name[0] || c->devname[0]); i++, c++) { - if (strcmp(c->name, name) == 0 && c->index == idx) { + if ((name && strcmp(c->name, name) == 0 && c->index == idx) || + (devname && strcmp(c->devname, devname) == 0)) { if (!brl_options) preferred_console = i; set_user_specified(c, user_specified); @@ -2461,7 +2467,10 @@ static int __add_preferred_console(const char *name, const short idx, char *opti return -E2BIG; if (!brl_options) preferred_console = i; - strscpy(c->name, name, sizeof(c->name)); + if (name) + strscpy(c->name, name); + if (devname) + strscpy(c->devname, devname); c->options = options; set_user_specified(c, user_specified); braille_set_options(c, brl_options); @@ -2486,8 +2495,13 @@ __setup("console_msg_format=", console_msg_format_setup); */ static int __init console_setup(char *str) { - char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for "ttyS" */ - char *s, *options, *brl_options = NULL; + static_assert(sizeof(console_cmdline[0].devname) >= sizeof(console_cmdline[0].name) + 4); + char buf[sizeof(console_cmdline[0].devname)]; + char *brl_options = NULL; + char *ttyname = NULL; + char *devname = NULL; + char *options; + char *s; int idx; /* @@ -2496,17 +2510,23 @@ static int __init console_setup(char *str) * for exactly this purpose. */ if (str[0] == 0 || strcmp(str, "null") == 0) { - __add_preferred_console("ttynull", 0, NULL, NULL, true); + __add_preferred_console("ttynull", 0, NULL, NULL, NULL, true); return 1; } if (_braille_console_setup(&str, &brl_options)) return 1; + /* For a DEVNAME:0.0 style console the character device is unknown early */ + if (strchr(str, ':')) + devname = buf; + else + ttyname = buf; + /* * Decode str into name, index, options. */ - if (isdigit(str[0])) + if (ttyname && isdigit(str[0])) scnprintf(buf, sizeof(buf), "ttyS%s", str); else strscpy(buf, str); @@ -2523,12 +2543,18 @@ static int __init console_setup(char *str) #endif for (s = buf; *s; s++) - if (isdigit(*s) || *s == ',') + if ((ttyname && isdigit(*s)) || *s == ',') break; - idx = simple_strtoul(s, NULL, 10); + + /* @idx will get defined when devname matches. */ + if (devname) + idx = -1; + else + idx = simple_strtoul(s, NULL, 10); + *s = 0; - __add_preferred_console(buf, idx, options, brl_options, true); + __add_preferred_console(ttyname, idx, devname, options, brl_options, true); return 1; } __setup("console=", console_setup); @@ -2548,7 +2574,51 @@ __setup("console=", console_setup); */ int add_preferred_console(const char *name, const short idx, char *options) { - return __add_preferred_console(name, idx, options, NULL, false); + return __add_preferred_console(name, idx, NULL, options, NULL, false); +} + +/** + * match_devname_and_update_preferred_console - Update a preferred console + * when matching devname is found. + * @devname: DEVNAME:0.0 style device name + * @name: Name of the corresponding console driver, e.g. "ttyS" + * @idx: Console index, e.g. port number. + * + * The function checks whether a device with the given @devname is + * preferred via the console=DEVNAME:0.0 command line option. + * It fills the missing console driver name and console index + * so that a later register_console() call could find (match) + * and enable this device. + * + * It might be used when a driver subsystem initializes particular + * devices with already known DEVNAME:0.0 style names. And it + * could predict which console driver name and index this device + * would later get associated with. + * + * Return: 0 on success, negative error code on failure. + */ +int match_devname_and_update_preferred_console(const char *devname, + const char *name, + const short idx) +{ + struct console_cmdline *c = console_cmdline; + int i; + + if (!devname || !strlen(devname) || !name || !strlen(name) || idx < 0) + return -EINVAL; + + for (i = 0; i < MAX_CMDLINECONSOLES && (c->name[0] || c->devname[0]); + i++, c++) { + if (!strcmp(devname, c->devname)) { + pr_info("associate the preferred console \"%s\" with \"%s%d\"\n", + devname, name, idx); + strscpy(c->name, name); + c->index = idx; + return 0; + } + } + + return -ENOENT; } bool console_suspend_enabled = true; @@ -3318,8 +3388,11 @@ static int try_enable_preferred_console(struct console *newcon, int i, err; for (i = 0, c = console_cmdline; - i < MAX_CMDLINECONSOLES && c->name[0]; + i < MAX_CMDLINECONSOLES && (c->name[0] || c->devname[0]); i++, c++) { + /* Console not yet initialized? */ + if (!c->name[0]) + continue; if (c->user_specified != user_specified) continue; if (!newcon->match || From patchwork Tue Jun 18 04:54:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tony Lindgren X-Patchwork-Id: 805926 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 376B433987; Tue, 18 Jun 2024 04:55:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718686544; cv=none; b=qsr9m7GWu9m9XUrh0/lqvfRcOtWyCXc7vBe3SqONzlRUs7CRLzL97qdhH1SyZILESy266Osh+CO95afUxTik9DIHHZI9hrQccxAdWspzF5p+KBGKsAdHE2EJB9mS+ONfoPqHFCjpKIYOUaD4SYuk4I8pEMYKeNx/CSLRQ4Yx/V0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718686544; c=relaxed/simple; bh=o6ukNG1uFMlN+wMsdfJhh/d4ANa/v4iREsteg6C/Kn4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iViIZInV45xiNWwCFmHIPfJlmTNt+gBFa/IoL6Rn0B3+m/nmYbMZF2UmBsJUxXbW6JcEl/jBTk2xv5k7sJTsU7PtZAEmIJntyeDbq9r8qr6bwwBjMoiMXUR9FQjpInwsRaDrAWieiLSj1YJitjVr5V9fcsw2MSovvQ4T0/Ouboo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=AAz28KRA; arc=none smtp.client-ip=198.175.65.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="AAz28KRA" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1718686543; x=1750222543; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=o6ukNG1uFMlN+wMsdfJhh/d4ANa/v4iREsteg6C/Kn4=; b=AAz28KRAYLXEF7e16h8eoR8IJbGJXyjDp2Jwm2kHq+MCOxhHtHrRyi+u QcfySXj8SjWPmdGFS7Qqfjoy0ca3ZO+5buyjcUb8HikxF0LoWhSlFlxUJ pv4hrIO3V5W/Mpz4Af0+PVBim6CWElrhby5qE335AJ1ubio/lSD3Calzi qPPEA1hdfTNkHvA6KMOD5Nz+mBaMVx9XTt/MQvcZDB3Mv3bEIFEC2F1tJ LsG7vTDvhUXdjh2lHQPQR4RPn/uCIzYaEhlel27/NzY3BGbuDjRZiPGrw +rukUoIG3HzHSkyElHRuWWOXv6XV3RJrAlGJR8B0TDbIMVYwoZTwuaNH+ g==; X-CSE-ConnectionGUID: uVKlq61VTxOxHBgoYdSnQA== X-CSE-MsgGUID: +2eCEEfbT2CqpMDuy9Pt/w== X-IronPort-AV: E=McAfee;i="6700,10204,11106"; a="38062814" X-IronPort-AV: E=Sophos;i="6.08,246,1712646000"; d="scan'208";a="38062814" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Jun 2024 21:55:43 -0700 X-CSE-ConnectionGUID: cGjUpZAVTlOGqT9EhAt4MA== X-CSE-MsgGUID: x5pOJKYJTHq3YjdhNcNAzw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,246,1712646000"; d="scan'208";a="41507407" Received: from unknown (HELO tlindgre-MOBL1.intel.com) ([10.245.247.4]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Jun 2024 21:55:38 -0700 From: Tony Lindgren To: Greg Kroah-Hartman , Jiri Slaby , Petr Mladek , Steven Rostedt , John Ogness , Sergey Senozhatsky , Andy Shevchenko , Tony Lindgren Cc: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , linux-serial@vger.kernel.org, Tony Lindgren , linux-kernel@vger.kernel.org Subject: [PATCH v3 3/3] serial: core: Rename preferred console handling for match and update Date: Tue, 18 Jun 2024 07:54:50 +0300 Message-ID: <20240618045458.14731-4-tony.lindgren@linux.intel.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240618045458.14731-1-tony.lindgren@linux.intel.com> References: <20240618045458.14731-1-tony.lindgren@linux.intel.com> Precedence: bulk X-Mailing-List: linux-serial@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 We are now matching and updating the preferred console, not adding it. Let's update the naming accordingly to avoid confusion. Suggested-by: Petr Mladek Signed-off-by: Tony Lindgren --- drivers/tty/serial/8250/8250_core.c | 4 ++-- drivers/tty/serial/serial_base.h | 4 ++-- drivers/tty/serial/serial_base_bus.c | 21 +++++++++++---------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index ff15022369e4..3556fe42ec65 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -42,7 +42,7 @@ #include -#include "../serial_base.h" /* For serial_base_add_isa_preferred_console() */ +#include "../serial_base.h" /* For serial_base_match_and_update_isa_preferred_console() */ #include "8250.h" @@ -564,7 +564,7 @@ static void __init serial8250_isa_init_ports(void) if (serial8250_isa_config != NULL) serial8250_isa_config(i, &up->port, &up->capabilities); - serial_base_add_isa_preferred_console(serial8250_reg.dev_name, i); + serial_base_match_and_update_isa_preferred_console(serial8250_reg.dev_name, i); } } diff --git a/drivers/tty/serial/serial_base.h b/drivers/tty/serial/serial_base.h index 743a72ac34f3..a5632eeda250 100644 --- a/drivers/tty/serial/serial_base.h +++ b/drivers/tty/serial/serial_base.h @@ -68,12 +68,12 @@ int serial_base_add_preferred_console(struct uart_driver *drv, #ifdef CONFIG_SERIAL_8250_CONSOLE -int serial_base_add_isa_preferred_console(const char *name, int idx); +int serial_base_match_and_update_isa_preferred_console(const char *name, int idx); #else static inline -int serial_base_add_isa_preferred_console(const char *name, int idx) +int serial_base_match_and_update_isa_preferred_console(const char *name, int idx) { return 0; } diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c index 2cf86f1ff298..391d41ef5942 100644 --- a/drivers/tty/serial/serial_base_bus.c +++ b/drivers/tty/serial/serial_base_bus.c @@ -207,8 +207,9 @@ void serial_base_port_device_remove(struct serial_port_device *port_dev) #ifdef CONFIG_SERIAL_CORE_CONSOLE -static int serial_base_add_one_prefcon(const char *match, const char *dev_name, - int port_id) +static int serial_base_match_and_update_one_prefcon(const char *match, + const char *dev_name, + int port_id) { int ret; @@ -237,7 +238,7 @@ static int serial_base_add_sparc_console(const char *dev_name, int idx) return 0; } - return serial_base_add_one_prefcon(name, dev_name, idx); + return serial_base_match_and_update_one_prefcon(name, dev_name, idx); } #else @@ -249,7 +250,7 @@ static inline int serial_base_add_sparc_console(const char *dev_name, int idx) #endif -static int serial_base_add_prefcon(const char *name, int idx) +static int serial_base_match_and_update_prefcon(const char *name, int idx) { const char *char_match __free(kfree) = NULL; const char *nmbr_match __free(kfree) = NULL; @@ -262,7 +263,7 @@ static int serial_base_add_prefcon(const char *name, int idx) if (!nmbr_match) return -ENODEV; - ret = serial_base_add_one_prefcon(nmbr_match, name, idx); + ret = serial_base_match_and_update_one_prefcon(nmbr_match, name, idx); if (ret) return ret; @@ -277,7 +278,7 @@ static int serial_base_add_prefcon(const char *name, int idx) if (!char_match) return -ENOMEM; - return serial_base_add_one_prefcon(char_match, name, idx); + return serial_base_match_and_update_one_prefcon(char_match, name, idx); } /** @@ -304,7 +305,7 @@ int serial_base_add_preferred_console(struct uart_driver *drv, const char *port_match __free(kfree) = NULL; int ret; - ret = serial_base_add_prefcon(drv->dev_name, port->line); + ret = serial_base_match_and_update_prefcon(drv->dev_name, port->line); if (ret) return ret; @@ -314,7 +315,7 @@ int serial_base_add_preferred_console(struct uart_driver *drv, return -ENOMEM; /* Translate a hardware addressing style console=DEVNAME:0.0 */ - return serial_base_add_one_prefcon(port_match, drv->dev_name, port->line); + return serial_base_match_and_update_one_prefcon(port_match, drv->dev_name, port->line); } #endif @@ -326,9 +327,9 @@ int serial_base_add_preferred_console(struct uart_driver *drv, * This should be only called from serial8250_isa_init_preferred_console(), * other callers are likely wrong and should rely on earlycon instead. */ -int serial_base_add_isa_preferred_console(const char *name, int idx) +int serial_base_match_and_update_isa_preferred_console(const char *name, int idx) { - return serial_base_add_prefcon(name, idx); + return serial_base_match_and_update_prefcon(name, idx); } #endif