Received: by 2002:a05:7412:40d:b0:e2:908c:2ebd with SMTP id 13csp311549rdf; Tue, 21 Nov 2023 03:33:37 -0800 (PST) X-Google-Smtp-Source: AGHT+IFal4bjkmg6a0f3L7FOgzgDNY4wCyIyk9CTX7Jos4HwDP2oHd7q+sWrkmsKpEb/LPOPMp9s X-Received: by 2002:a05:6808:1893:b0:3a7:55f2:552d with SMTP id bi19-20020a056808189300b003a755f2552dmr13340238oib.58.1700566417582; Tue, 21 Nov 2023 03:33:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700566417; cv=none; d=google.com; s=arc-20160816; b=tzsOeOYMO5ciCdxUy664LI+5SB1lJBwkfHQIWXk4ABscaDDN1PrL5yjKi1aU+YRIPs E4S48HDqIyCrYJn3EGoN4q6JRcKGeQCoAtHGRSfnyCSTqU2PGQIU65b5OqtO1UOQD1US /fduIAHfJ7Ah23cvxIZL0YLl0kBXfSDweIH1swbRsrRaTz6cgfoDC/WWd+rGrVxpsWnW CGb7Vi1wJOlpt39xPmKKUxJqWrswleyqyxgGD6SZb90KoyTUkQK7aBo4blvz0Mpixp7x 3P93uNyz5Gs5A45NLE1GtLpPktsVk9Thk3dJ8oNjqrxyeTnw3RhMeOaw+nZm5wSaoC1n sOCw== 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 Return-Path: Received: from lipwig.vger.email (lipwig.vger.email. [2620:137:e000::3:3]) by mx.google.com with ESMTPS id 195-20020a6300cc000000b005b8f61fcb98si10097803pga.629.2023.11.21.03.33.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Nov 2023 03:33:37 -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 500048028B71; Tue, 21 Nov 2023 03:33:32 -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=20J=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 Content-Transfer-Encoding: 8bit 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:32 -0800 (PST) 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; -- 2.42.1