From patchwork Tue Nov 21 11:31:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tony Lindgren X-Patchwork-Id: 167668 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2b07:b0:403:3b70:6f57 with SMTP id io7csp553716vqb; Tue, 21 Nov 2023 03:33:11 -0800 (PST) X-Google-Smtp-Source: AGHT+IHGHhIKfdxEbpa7R43WaSv8VvIkq5YgBMVnNwvXHgbpnE4qo9rPSN6V86VM/xg0l2M9WCEj X-Received: by 2002:a05:6a21:e85:b0:188:443:be25 with SMTP id ma5-20020a056a210e8500b001880443be25mr8716287pzb.46.1700566390899; Tue, 21 Nov 2023 03:33:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700566390; cv=none; d=google.com; s=arc-20160816; b=yXMX4AMAO9rHWH0uqoRfmL+Ir84q8WEe7aubPWS9T4FX6HO2pKTYxt6fCFai1AeT3U BIdXvuIKVAcC9zKaaNAT8aKTpC2hK7H90tMiMpJhHqbFEKPj7LLszjiwjOC0N56tWHpo VXGF+FzkAy5btsknx/dMK3Uq5vBY5/rN913wFD/R6EGcGkA2xW9UQdmGQ+vNWvmprEZQ 1RkstLUB/XIWBOYlBwTAEGWRAL13z5tVXnZ1Rpm4xmSOYv0FTG/ZewES+UY83XkSbnWz dTGJatp98n+8m04XygTWbucHMa7XCm20fS/Dglg61OZ/DlGysgSVV2bvAZM6zJSMlHHK FGxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=ksZ2lKHs/MlGf75YzXbwoAiVbe5x53qFkcYMd8AzedQ=; fh=OQrZIrddo55Tm+afxTOsnGwFgD38y2NNd7tU+1OGSCE=; b=tIH9ITC45dF117aGnCaXzqQA7sNGU33LCqkRAn2/h5Ikhp7MdRPPbwAEScPXZNKENp rLfpl46MbmjQzcN8/8HsHkyNwPi8jusEBbjUDTG37w3oUF9rxkBKBXlrEi1Gjv0/i2Mf 9huX5o1Z7q0YD3qxEQ7MXjwr4sb12anulx4mulqtTCcWPBTNaMjQZcPGxgFyDCJk0yRq /7/ci3+NnJXhhybxuDBcyWbVfrQ4d6Q8+0Elc+sx3JqMFBoiymNvzl5m3uG8UVbOwBI8 nSos/y1PHrQfM+FKiK1MEFwspTcQykLi9/nnr8igKKIr9ecoySc70Jdycoteq4Hq5RTp yKtg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from lipwig.vger.email (lipwig.vger.email. [23.128.96.33]) by mx.google.com with ESMTPS id pi15-20020a17090b1e4f00b00277e0d7163asi10844997pjb.32.2023.11.21.03.33.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Nov 2023 03:33:10 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) client-ip=23.128.96.33; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id 903708028B7E; Tue, 21 Nov 2023 03:33:01 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233997AbjKULc5 (ORCPT + 99 others); Tue, 21 Nov 2023 06:32:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59040 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234198AbjKULcz (ORCPT ); Tue, 21 Nov 2023 06:32:55 -0500 Received: from muru.com (muru.com [72.249.23.125]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 2A79CD1; Tue, 21 Nov 2023 03:32:50 -0800 (PST) Received: from hillo.muru.com (localhost [127.0.0.1]) by muru.com (Postfix) with ESMTP id D5C8380E2; Tue, 21 Nov 2023 11:32:47 +0000 (UTC) From: Tony Lindgren To: Greg Kroah-Hartman , Jiri Slaby , Petr Mladek , Steven Rostedt , John Ogness , Sergey Senozhatsky Cc: "David S . Miller" , Andy Shevchenko , Dhruva Gole , =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Johan Hovold , Sebastian Andrzej Siewior , Vignesh Raghavendra , linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org Subject: [PATCH v3 1/3] printk: Save console options for add_preferred_console_match() Date: Tue, 21 Nov 2023 13:31:55 +0200 Message-ID: <20231121113203.61341-2-tony@atomide.com> X-Mailer: git-send-email 2.42.1 In-Reply-To: <20231121113203.61341-1-tony@atomide.com> References: <20231121113203.61341-1-tony@atomide.com> MIME-Version: 1.0 X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Tue, 21 Nov 2023 03:33:01 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1783173104048816455 X-GMAIL-MSGID: 1783173104048816455 Driver subsystems may need to translate the preferred console name to the character device name used. We already do some of this in console_setup() with a few hardcoded names, but that does not scale well. The console options are parsed early in console_setup(), and the consoles are added with __add_preferred_console(). At this point we don't know much about the character device names and device drivers getting probed. To allow drivers subsystems to set up a preferred console, let's save the kernel command line console options. To add a preferred console, let's add a new function add_preferred_console_match(). This allows the serial core layer to support console=DEVNAME:0.0 style hardware based addressing in addition to the current console=ttyS0 style naming. And we can start moving console_setup() character device parsing to the driver subsystem specific code. We use a separate array from the console_cmdline array as the character device name and index may be unknown at the console_setup() time. And we do not want to call __add_preferred_console() until the character device name and index are known. Adding the console name in addition to the character device name, and a flag for an added console, could be added to the struct console_cmdline. And the console_cmdline array handling modified accordingly. But that complicates things compared saving the console options, and then adding the consoles when the subsystems handling the consoles are ready. Signed-off-by: Tony Lindgren --- include/linux/printk.h | 3 + kernel/printk/Makefile | 2 +- kernel/printk/conopt.c | 115 ++++++++++++++++++++++++++++++++ kernel/printk/console_cmdline.h | 4 ++ kernel/printk/printk.c | 11 ++- 5 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 kernel/printk/conopt.c diff --git a/include/linux/printk.h b/include/linux/printk.h --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -60,6 +60,9 @@ 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 --- a/kernel/printk/Makefile +++ b/kernel/printk/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-only -obj-y = printk.o +obj-y = printk.o conopt.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 new file mode 100644 --- /dev/null +++ b/kernel/printk/conopt.c @@ -0,0 +1,115 @@ +// 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 "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 + +struct console_option { + char name[CONSOLE_NAME_MAX]; + char opt[CONSOLE_OPT_MAX]; +}; + +/* 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 + * + * Saves a kernel command line console option for driver subsystems to use for + * adding a preferred console during init. Called from console_setup() only. + */ +int __init console_opt_save(char *str) +{ + struct console_option *con; + const char *opt = NULL; + size_t namelen, optlen; + int i; + + namelen = strcspn(str, ","); + if (!namelen) + return -EINVAL; + + optlen = strlen(str) - namelen; + if (optlen > 1) + opt = str + namelen + 1; + + if (namelen >= CONSOLE_NAME_MAX || 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; + } + + strscpy(con->name, str, namelen + 1); + if (opt) + strscpy(con->opt, opt, optlen + 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(). + */ +int add_preferred_console_match(const char *match, const char *name, + const short idx) +{ + struct console_option *con; + + if (!match || !strlen(match) || !name || !strlen(name) || + idx < 0) + return -EINVAL; + + con = console_opt_find(match); + if (!con) + return -ENOENT; + + add_preferred_console(name, idx, con->opt); + + return 0; +} diff --git a/kernel/printk/console_cmdline.h b/kernel/printk/console_cmdline.h --- a/kernel/printk/console_cmdline.h +++ b/kernel/printk/console_cmdline.h @@ -2,6 +2,10 @@ #ifndef _CONSOLE_CMDLINE_H #define _CONSOLE_CMDLINE_H +#define MAX_CMDLINECONSOLES 8 + +int console_opt_save(char *str); + struct console_cmdline { char name[16]; /* Name of the driver */ diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -360,9 +360,6 @@ 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; @@ -2445,6 +2442,14 @@ static int __init console_setup(char *str) char *s, *options, *brl_options = NULL; int idx; + /* + * Save the console for possible driver subsystem use. Bail out early + * for DEVICE:0.0 style console names as the character device name is + * be unknown at this point. + */ + if (!console_opt_save(str) && strchr(str, ':')) + return 1; + /* * console="" or console=null have been suggested as a way to * disable console output. Use ttynull that has been created From patchwork Tue Nov 21 11:31:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tony Lindgren X-Patchwork-Id: 167669 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2b07:b0:403:3b70:6f57 with SMTP id io7csp553870vqb; Tue, 21 Nov 2023 03:33:31 -0800 (PST) X-Google-Smtp-Source: AGHT+IF787B8eYbo5OS4TAt12fZztXiUeHet7JJL0XJ9ydvC+EGd+W5luNtHABG6XRm0QNLAFdV/ X-Received: by 2002:a17:902:a413:b0:1cc:5db8:7e92 with SMTP id p19-20020a170902a41300b001cc5db87e92mr8599268plq.58.1700566410932; Tue, 21 Nov 2023 03:33:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700566410; cv=none; d=google.com; s=arc-20160816; b=f6T/+tz80rIckdhKJc2RLBj3lm0sbunqvrBRo4uO/RuMncA9Ii2tLhvyrgv9YYWo/l 9zT4BRX6vDpF/OXZHSBclYC/TSSPXXnqHtxa0NKEE/txRNbgsD8gk2dQOoTpJxkHxTQk UdAOVa08kfbmR7M6DS6VskucwtXci8QYzQCczSqur81SaHQPRcH4UmMeEqyO45v1N+D1 sRZlVKOj3yUOV+kZtQqq3xjjFuhxHVEjAtm0a9P6iO8YMHnMTWm95xdZtywm0U2NIQCZ Z+EMdm1T665x/pOIR20N0EK5C6dgTUI1dFoUc3qdyB1a3xlz4do2G77iam+Y8RYWKoXq 4YQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=WxkLR1iag3KrhSXF3XwXyZ2CTDVWmbzMM8c8ebqtCjI=; fh=bWj5KacFiXVp0Il3xL1MvNC9F4GPhzCV51seXUkiNOA=; b=YzTHVm1cXra+0w0Ant7isPSNl5OFl/C2U1AUXI7PLfmllegOsouvy84sJ2doH3suUA jazisDeuLpRcg0thFaNNivSwwOp+Lh7LGCnUGK57Zb/EwSBgfmOOrQsYWGW9XkhmbFqg 0R8q1+JwDPH/B0BO5dRC59zMoY4jj+dQa5b8EQSDVUjk67OiIr2en5EDUDqGnvs+xUH4 iXD6R60GfXuA+KWoxQlPdJ3Bd8bhDkKAB+bV3cqBeneIblvF/pWtDJJbI/J0W3NDI5BB i8RxUlj6hKqHH0ZY19PcuyZhNDXEoTTdWEuhru9sXKDSka0Shm9sj0vnjLE99ZnwvAqj gYJw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from lipwig.vger.email (lipwig.vger.email. [2620:137:e000::3:3]) by mx.google.com with ESMTPS id t12-20020a170902bc4c00b001c9b5a96d15si9908274plz.13.2023.11.21.03.33.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Nov 2023 03:33:30 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) client-ip=2620:137:e000::3:3; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id 54E4A8028B7D; Tue, 21 Nov 2023 03:33:25 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234466AbjKULdM (ORCPT + 99 others); Tue, 21 Nov 2023 06:33:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59572 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234335AbjKULdC (ORCPT ); Tue, 21 Nov 2023 06:33:02 -0500 Received: from muru.com (muru.com [72.249.23.125]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id C2DA9CA; Tue, 21 Nov 2023 03:32:57 -0800 (PST) Received: from hillo.muru.com (localhost [127.0.0.1]) by muru.com (Postfix) with ESMTP id B942D80CC; Tue, 21 Nov 2023 11:32:54 +0000 (UTC) From: Tony Lindgren To: Greg Kroah-Hartman , Jiri Slaby Cc: "David S . Miller" , Petr Mladek , Sergey Senozhatsky , Steven Rostedt , Andy Shevchenko , Dhruva Gole , =?utf-8?q?Ilpo_J=C3=A4rvinen?= , John Ogness , Johan Hovold , Sebastian Andrzej Siewior , Vignesh Raghavendra , linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org Subject: [PATCH v3 2/3] serial: core: Add support for DEVNAME:0.0 style naming for kernel console Date: Tue, 21 Nov 2023 13:31:56 +0200 Message-ID: <20231121113203.61341-3-tony@atomide.com> X-Mailer: git-send-email 2.42.1 In-Reply-To: <20231121113203.61341-1-tony@atomide.com> References: <20231121113203.61341-1-tony@atomide.com> MIME-Version: 1.0 X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Tue, 21 Nov 2023 03:33:25 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1783173125123522742 X-GMAIL-MSGID: 1783173125123522742 We can now add hardware based addressing for serial ports. Starting with commit 84a9582fd203 ("serial: core: Start managing serial controllers to enable runtime PM"), and all the related fixes to this commit, the serial core now knows to which serial port controller the ports are connected. The serial ports can be addressed with DEVNAME:0.0 style naming. The names are something like 00:04:0.0 for a serial port on qemu, and something like 2800000.serial:0.0 on platform device using systems like ARM64 for example. The DEVNAME is the unique serial port hardware controller device name, AKA the name for port->dev. The 0.0 are the serial core controller id and port id. Typically 0.0 are used for each controller and port instance unless the serial port hardware controller has multiple controllers or ports. Using DEVNAME:0.0 style naming actually solves two long term issues for addressing the serial ports: 1. According to Andy Shevchenko, using DEVNAME:0.0 style naming fixes an issue where depending on the BIOS settings, the kernel serial port ttyS instance number may change if HSUART is enabled 2. Device tree using architectures no longer necessarily need to specify aliases to find a specific serial port, and we can just allocate the ttyS instance numbers dynamically in whatever probe order To do this, let's match the hardware addressing style console name to the character device name used, and add a preferred console using the character device device name. Signed-off-by: Tony Lindgren --- drivers/tty/serial/serial_base.h | 14 ++++++++++ drivers/tty/serial/serial_base_bus.c | 38 ++++++++++++++++++++++++++++ drivers/tty/serial/serial_core.c | 4 +++ 3 files changed, 56 insertions(+) diff --git a/drivers/tty/serial/serial_base.h b/drivers/tty/serial/serial_base.h --- a/drivers/tty/serial/serial_base.h +++ b/drivers/tty/serial/serial_base.h @@ -45,3 +45,17 @@ void serial_ctrl_unregister_port(struct uart_driver *drv, struct uart_port *port int serial_core_register_port(struct uart_driver *drv, struct uart_port *port); void serial_core_unregister_port(struct uart_driver *drv, struct uart_port *port); + +#ifdef CONFIG_SERIAL_CORE_CONSOLE + +int serial_base_add_preferred_console(struct uart_driver *drv, + struct uart_port *port); +#else +static inline +int serial_base_add_preferred_console(struct uart_driver *drv, + struct uart_port *port) +{ + return 0; +} + +#endif diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c --- a/drivers/tty/serial/serial_base_bus.c +++ b/drivers/tty/serial/serial_base_bus.c @@ -204,6 +204,44 @@ void serial_base_port_device_remove(struct serial_port_device *port_dev) put_device(&port_dev->dev); } +#ifdef CONFIG_SERIAL_CORE_CONSOLE + +/* + * serial_base_add_preferred_console - Adds a preferred console + * @drv: Serial port device driver + * @port: Serial port instance + * + * Tries to add a preferred console for a serial port if specified in the + * kernel command line. Supports both the traditional character device such + * as console=ttyS0, and a hardware addressing based console=DEVNAME:0.0 + * style name. + * + * Translates the kernel command line option using a hardware based addressing + * console=DEVNAME:0.0 to the serial port character device such as ttyS0. + * + * Note that duplicates are ignored by add_preferred_console(). + */ +int serial_base_add_preferred_console(struct uart_driver *drv, + struct uart_port *port) +{ + const char *port_match __free(kfree); + int ret; + + port_match = kasprintf(GFP_KERNEL, "%s:%i.%i", dev_name(port->dev), + port->ctrl_id, port->port_id); + if (!port_match) + return -ENOMEM; + + /* Translate a hardware addressing style console=DEVNAME:0.0 */ + ret = add_preferred_console_match(port_match, drv->dev_name, port->line); + if (ret && ret != -ENOENT) + return ret; + + return 0; +} + +#endif + static int serial_base_init(void) { int ret; diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -3359,6 +3359,10 @@ int serial_core_register_port(struct uart_driver *drv, struct uart_port *port) if (ret) goto err_unregister_ctrl_dev; + ret = serial_base_add_preferred_console(drv, port); + if (ret) + goto err_unregister_port_dev; + ret = serial_core_add_one_port(drv, port); if (ret) goto err_unregister_port_dev; From patchwork Tue Nov 21 11:31:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tony Lindgren X-Patchwork-Id: 167670 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2b07:b0:403:3b70:6f57 with SMTP id io7csp554013vqb; Tue, 21 Nov 2023 03:33:48 -0800 (PST) X-Google-Smtp-Source: AGHT+IGLcdFpu7UF0L1S7G09EbGFK3LJPg/E+0Lr3YMhCO5xRuQr9q7wk/Vv+FvvSo26nUHmkqNw X-Received: by 2002:a17:903:447:b0:1cf:6ac3:81ba with SMTP id iw7-20020a170903044700b001cf6ac381bamr2804686plb.57.1700566428070; Tue, 21 Nov 2023 03:33:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700566428; cv=none; d=google.com; s=arc-20160816; b=OgGuQoxKfu/83B2WVDN1/HDkAY+aKQsr/H1Y02GOTvVWz4gzdlzjJR0dmhoFiq+pEV 8xbfy9trW3SHiVdSqW5geonCXoRCa6Lv0Yu//Sf+7ITycX/1huUBFj8Cn5W8HWUYVorA v0F0dtN9jlHZ3j0eBmKSqg+X/YG0mcWGEIw+ChKuBN3ZUml+1IdHsVnE4lRwtgrsL3Dd eZwjg02giDbOF4BacbJL6tdZCMA6jbOBk0dbvOrQKVspv5jpXwthcvLyHbR3nwNtJIzw OICs4f3vuoF2Fl+xr0lb4u6owpW2TbGANjkXLmsESPY7uZbsYL//nbquzuCI5kD9Ty29 iuhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=NUtGCDZ9pCDpbwI4n0H/OfsVjKU3r6MZskZ5uvMY0H8=; fh=OQrZIrddo55Tm+afxTOsnGwFgD38y2NNd7tU+1OGSCE=; b=P3gTezbssVSIXRy40J+Leh6bCpEOvcFaSPDdb7xJ64YHhelOxYE1KPtC4jd7t6g/TK f3k1Zh8TafOiFB7cG6+6+Cu6W+cuf2MkiAk5C/wfCe6TNMNlWxTS7r6a4PVY1Ns7f27U 4mqi+qNauLXOHOmQsTxVJMxQZ7XL6fGs3v55qHwkRQqBA5/5NgQdS//87OBZ8SU+dVNA Tdv2QKN3Bajean727kZcDiuUudCxJv1ocmYcxWwby5phgCEXJ3OVb3rXpWDVHX/j20uU CQyP4GJl2klcXWjs3MAanDNYCnPNYzMX4053jRMzpsGnApw/M9YXzsmpI8lr0YKpwojn I3+A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from lipwig.vger.email (lipwig.vger.email. [23.128.96.33]) by mx.google.com with ESMTPS id g1-20020a1709026b4100b001c7615a8e09si9796525plt.593.2023.11.21.03.33.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Nov 2023 03:33:48 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) client-ip=23.128.96.33; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id 409368028B75; Tue, 21 Nov 2023 03:33:45 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234564AbjKULdV (ORCPT + 99 others); Tue, 21 Nov 2023 06:33:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59630 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233753AbjKULdM (ORCPT ); Tue, 21 Nov 2023 06:33:12 -0500 Received: from muru.com (muru.com [72.249.23.125]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 5187511A; Tue, 21 Nov 2023 03:33:04 -0800 (PST) Received: from hillo.muru.com (localhost [127.0.0.1]) by muru.com (Postfix) with ESMTP id 6933880CC; Tue, 21 Nov 2023 11:33:01 +0000 (UTC) From: Tony Lindgren To: Greg Kroah-Hartman , Jiri Slaby , Petr Mladek , Steven Rostedt , John Ogness , Sergey Senozhatsky Cc: "David S . Miller" , Andy Shevchenko , Dhruva Gole , =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Johan Hovold , Sebastian Andrzej Siewior , Vignesh Raghavendra , linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org Subject: [PATCH v3 3/3] serial: core: Move console character device handling from printk Date: Tue, 21 Nov 2023 13:31:57 +0200 Message-ID: <20231121113203.61341-4-tony@atomide.com> X-Mailer: git-send-email 2.42.1 In-Reply-To: <20231121113203.61341-1-tony@atomide.com> References: <20231121113203.61341-1-tony@atomide.com> MIME-Version: 1.0 X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Tue, 21 Nov 2023 03:33:45 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1783173142440618687 X-GMAIL-MSGID: 1783173142440618687 There's no need for console_setup() to try to figure out the console character device name for serial ports early on before uart_add_one_port() has been called. And for early debug console we have earlycon. Let's handle the serial port specific commandline options in the serial core subsystem and drop the handling from printk. The serial core subsystem can just call add_preferred_console() when the serial port is getting initialized. Note that eventually we may want to set up driver specific console quirk handling for the serial port device drivers to use. But we need to figure out which driver(s) need to call the quirk. So for now, we just move the sparc quirk and handle it directly. Signed-off-by: Tony Lindgren --- drivers/tty/serial/serial_base_bus.c | 66 ++++++++++++++++++++++++++++ kernel/printk/printk.c | 30 +------------ 2 files changed, 67 insertions(+), 29 deletions(-) diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c --- a/drivers/tty/serial/serial_base_bus.c +++ b/drivers/tty/serial/serial_base_bus.c @@ -206,6 +206,43 @@ void serial_base_port_device_remove(struct serial_port_device *port_dev) #ifdef CONFIG_SERIAL_CORE_CONSOLE +#ifdef __sparc__ + +/* Handle Sparc ttya and ttyb options as done in console_setup() */ +static int serial_base_add_sparc_console(struct uart_driver *drv, + struct uart_port *port) +{ + const char *name = NULL; + int ret; + + switch (port->line) { + case 0: + name = "ttya"; + break; + case 1: + name = "ttyb"; + break; + default: + return 0; + } + + ret = add_preferred_console_match(name, drv->dev_name, port->line); + if (ret && ret != -ENOENT) + return ret; + + return 0; +} + +#else + +static inline int serial_base_add_sparc_console(struct uart_driver *drv, + struct uart_port *port) +{ + return 0; +} + +#endif + /* * serial_base_add_preferred_console - Adds a preferred console * @drv: Serial port device driver @@ -225,6 +262,8 @@ int serial_base_add_preferred_console(struct uart_driver *drv, struct uart_port *port) { const char *port_match __free(kfree); + const char *char_match __free(kfree); + const char *nmbr_match __free(kfree); int ret; port_match = kasprintf(GFP_KERNEL, "%s:%i.%i", dev_name(port->dev), @@ -232,6 +271,33 @@ int serial_base_add_preferred_console(struct uart_driver *drv, if (!port_match) return -ENOMEM; + char_match = kasprintf(GFP_KERNEL, "%s%i", drv->dev_name, port->line); + if (!char_match) + return -ENOMEM; + + /* Handle ttyS specific options */ + if (!strncmp(drv->dev_name, "ttyS", 4)) { + /* No name, just a number */ + nmbr_match = kasprintf(GFP_KERNEL, "%i", port->line); + if (!nmbr_match) + return -ENODEV; + + ret = add_preferred_console_match(nmbr_match, drv->dev_name, + port->line); + if (ret && ret != -ENOENT) + return ret; + + /* Sparc ttya and ttyb */ + ret = serial_base_add_sparc_console(drv, port); + if (ret) + return ret; + } + + /* Handle the traditional character device name style console=ttyS0 */ + ret = add_preferred_console_match(char_match, drv->dev_name, port->line); + if (ret && ret != -ENOENT) + return ret; + /* Translate a hardware addressing style console=DEVNAME:0.0 */ ret = add_preferred_console_match(port_match, drv->dev_name, port->line); if (ret && ret != -ENOENT) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -2438,9 +2438,7 @@ __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; - int idx; + char *brl_options = NULL; /* * Save the console for possible driver subsystem use. Bail out early @@ -2463,32 +2461,6 @@ static int __init console_setup(char *str) if (_braille_console_setup(&str, &brl_options)) return 1; - /* - * Decode str into name, index, options. - */ - if (str[0] >= '0' && str[0] <= '9') { - strcpy(buf, "ttyS"); - strncpy(buf + 4, str, sizeof(buf) - 5); - } else { - strncpy(buf, str, sizeof(buf) - 1); - } - buf[sizeof(buf) - 1] = 0; - options = strchr(str, ','); - if (options) - *(options++) = 0; -#ifdef __sparc__ - if (!strcmp(str, "ttya")) - strcpy(buf, "ttyS0"); - if (!strcmp(str, "ttyb")) - strcpy(buf, "ttyS1"); -#endif - for (s = buf; *s; s++) - if (isdigit(*s) || *s == ',') - break; - idx = simple_strtoul(s, NULL, 10); - *s = 0; - - __add_preferred_console(buf, idx, options, brl_options, true); return 1; } __setup("console=", console_setup);