Received: by 10.213.65.68 with SMTP id h4csp1261901imn; Wed, 14 Mar 2018 14:47:31 -0700 (PDT) X-Google-Smtp-Source: AG47ELtjHgLfaN+ixgr2bgrAwEv3wHb8Atohd76QDCiV4hjmrCj/8Lw+LGaKqNpbUNzOQ7/9C/2A X-Received: by 10.98.246.16 with SMTP id x16mr5616140pfh.81.1521064051667; Wed, 14 Mar 2018 14:47:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521064051; cv=none; d=google.com; s=arc-20160816; b=ZVnf8AnRzYUTRdvZoYZxrXMVC2dB2sdmZd9ypRwCnemR55pSNZAkZxQzDH2r0/Anwp eBOP5iur9PO+tciJ+ZU2oI/nl8S2K+eDcnYr+V1mI3QFYxs6gLINtc782Q3KH1A97SIb a0zBP/paaT/llOQEHa9Xu3AWNwDOgVCYNJdSJt0FD5KH9DHibxiuQWhkkbwoMJswpe8v lkyCJ+xCAbCMWr4hBhq3uYhyM6YBZ5ItBY5rNNhEyX0I0UBPXDhUL8Sq0swiw8cQ2KG9 pK72iTZd1s65mVDHIzIw79zdujFFwtV3bY+Wdl4fNLx/ypGV3NtajQuMuosZAA3yVzRc R2AQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=9HUzemuG44B3fdPs+EP9Z0hHz9NaA7D5WpQ91D7PU2U=; b=xUVC4qbGQdzEYqFBYOGvYKr7nGaECPbhv29PDVE9anGnzw68WXdGSuKLEHyn7ix9DX sv9JpFveALGE5QL0JdI52vBTI2WNlNWdnx7E7dcEMRwg6t885sGetthV0OK3gcLC6aSt YSHQBLxUKe0cKSYAi1RCrZ4gMH/OZSD/2rscKzt1gafybd8mrPdc0wnTliwN44pRnHbO 7iH9fXxQsxegEpJeQAJcecUfACT1j7lM3k3XIhdHzKHwzPOAtcvh7jX4s9J1eV/xq5r0 fRV8jTwNuTrUrw7TLI2TK51J9XMZBvOvhTN5AvFyV3PhYmLJOrpm3p8dQKEIH573rGnE h12w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=Fy+JxLEV; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f1-v6si2628346plb.73.2018.03.14.14.47.17; Wed, 14 Mar 2018 14:47:31 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=Fy+JxLEV; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752148AbeCNVpJ (ORCPT + 99 others); Wed, 14 Mar 2018 17:45:09 -0400 Received: from mail-oi0-f66.google.com ([209.85.218.66]:39363 "EHLO mail-oi0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751988AbeCNVpA (ORCPT ); Wed, 14 Mar 2018 17:45:00 -0400 Received: by mail-oi0-f66.google.com with SMTP id p9so168114oic.6 for ; Wed, 14 Mar 2018 14:45:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9HUzemuG44B3fdPs+EP9Z0hHz9NaA7D5WpQ91D7PU2U=; b=Fy+JxLEVj9agURgzgVgB5g8bResFRar6i2sz+rberDkQmg8mFUPz3snIeJS+cmgPgP UqYSfkgBf6pH1B4VaBCWZkE0AtmESleNK5HjWcAYJ/cZY4w6jWZKMGlH7mE7gIO/BdFA Ul7U3wNH8seSyGzJYkwHefYRglVg5YXClMA98= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9HUzemuG44B3fdPs+EP9Z0hHz9NaA7D5WpQ91D7PU2U=; b=UdZH/xXa8gli8vezEgVpdTLTtQxtKbjLMXFxUG+MESwmDrcVAm49cNj94pqDJKzrOD 7qCf0kDtp+tteeMnMaQbAAdnPMP5+y1mXyAqEybX6jAHgx3UegNsxn7nF2URVi8kYhuz lIb1WO2o0qrQbfViw930h0AvkhzfKFcXg07xEn5K4l15UnVTviCmzTM2jgGpLFuST/YM pV8QI03UPNV0qW5ImVElHFto6ObPfja103rl58277qf5hhCxHOPUi3fywogfzsL+k2dH 1LGTHKfAKoY8uFn56/4KI48qh6Zwkax2M5CraHClZHwGGF02H74/7TypqeZgp0enzypC gbvg== X-Gm-Message-State: AElRT7Hhfra0cG6+QGUhp7eVJzoVW6g9n5gk5PBigbxv4NKhKXn+Hs1K UQABfa3izM82NnCTajkaRdSNtg== X-Received: by 10.202.102.84 with SMTP id a81mr2440565oic.35.1521063899991; Wed, 14 Mar 2018 14:44:59 -0700 (PDT) Received: from djkurtz2.bld.corp.google.com ([2620:15c:183:0:1cfd:61a5:7215:5f9c]) by smtp.gmail.com with ESMTPSA id p200sm1974922oic.0.2018.03.14.14.44.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 14 Mar 2018 14:44:59 -0700 (PDT) From: Daniel Kurtz To: Greg Kroah-Hartman Cc: adurbin@chromium.org, linux-kernel@vger.kernel.org, Daniel Kurtz , "Rafael J. Wysocki" , Len Brown , Jiri Slaby , Andy Shevchenko , Matthias Brugger , Kees Cook , David Howells , Vignesh R , Sean Young , Jeffy Chen , Douglas Anderson , Matt Redfearn , Marc Gonzalez , linux-acpi@vger.kernel.org (open list:ACPI), linux-serial@vger.kernel.org (open list:SERIAL DRIVERS) Subject: [PATCH v2 3/3] serial: core: Allow skipping old serial port initialization Date: Wed, 14 Mar 2018 15:44:38 -0600 Message-Id: <20180314214439.27806-4-djkurtz@chromium.org> X-Mailer: git-send-email 2.16.2.804.g6dcf76e118-goog In-Reply-To: <20180314214439.27806-1-djkurtz@chromium.org> References: <20180314214439.27806-1-djkurtz@chromium.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The old_serial_port global array in 8250_core is supposed to hold an entry for each serial port on the system that cannot be discovered via a standard enumeration mechanism (aka ACPI/PCI/DTS). The array is populated at compile-time from the value specified in the SERIAL_PORT_DFNS macro. This macro is defined in arch/serial.h. For x86, this macro is currently unconditionally initialized to supply four ioport UARTs (0x3F8, 0x2F8, 0x3E8, 0x2E8). However, not all x86 CPUs have these four ioport UARTs. For example, the UARTs on AMD Carrizo and later are separate memory mapped Designware IP blocks. Fairly early in boot the console_initcall univ8250_console_init iterates over this array and installs these old UARTs into the global array serial8250_ports. Further, it attempts to register them for use as the console. In other words, if, for example, the kernel commandline has console=ttyS0, the console will be switched over to one of these non-existent UARTs. Only later, when the real UART drivers are probed and their devices are instantiated will the console switch back over to the proper UART. This is noticeable when using earlycon, since part of the serial console log will appear to disappear (when the bogus old takes over) and then re-appear (when the real UART finally gets registered for the console). The problem is even more noticable when *not* using earlycon, since in this case the entire console output is missing, having been incorrectly played back to the non-existing serial port. Create a global variable to allow skipping old serial port initialization and wire it up to the AMDCZ ACPI SPCR quirk and the special amdcz earlycon setup handler. Signed-off-by: Daniel Kurtz --- Changes since v1: * Rename variable to serial8250_skip_old_ports * Also set variable in acpi/spcr. to support no-earlycon case. drivers/acpi/spcr.c | 2 ++ drivers/tty/serial/8250/8250_core.c | 6 ++++++ drivers/tty/serial/8250/8250_early.c | 1 + include/linux/serial_8250.h | 6 ++++++ 4 files changed, 15 insertions(+) diff --git a/drivers/acpi/spcr.c b/drivers/acpi/spcr.c index 52d840d0e05b..f59591283410 100644 --- a/drivers/acpi/spcr.c +++ b/drivers/acpi/spcr.c @@ -14,6 +14,7 @@ #include #include #include +#include #include /* @@ -208,6 +209,7 @@ int __init acpi_parse_spcr(bool enable_earlycon, bool enable_console) } if (amdcz_present(table)) { + serial8250_skip_old_ports = true; if (enable_earlycon) uart = "amdcz"; } diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index 9342fc2ee7df..a04da392a251 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -66,6 +66,9 @@ static unsigned int skip_txen_test; /* force skip of txen test at init time */ #define SERIAL_PORT_DFNS #endif +bool serial8250_skip_old_ports; +EXPORT_SYMBOL(serial8250_skip_old_ports); + static const struct old_serial_port old_serial_port[] = { SERIAL_PORT_DFNS /* defined in asm/serial.h */ }; @@ -537,6 +540,9 @@ static void __init serial8250_isa_init_ports(void) if (share_irqs) irqflag = IRQF_SHARED; + if (serial8250_skip_old_ports) + return; + for (i = 0, up = serial8250_ports; i < ARRAY_SIZE(old_serial_port) && i < nr_uarts; i++, up++) { diff --git a/drivers/tty/serial/8250/8250_early.c b/drivers/tty/serial/8250/8250_early.c index c6bf971a6038..288d2be82990 100644 --- a/drivers/tty/serial/8250/8250_early.c +++ b/drivers/tty/serial/8250/8250_early.c @@ -202,6 +202,7 @@ static int __init early_amdcz_setup(struct earlycon_device *dev, { struct uart_port *port = &dev->port; + serial8250_skip_old_ports = true; port->uartclk = 48000000; return early_serial8250_setup(dev, opt); diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index a27ef5f56431..02570edaddd8 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h @@ -136,6 +136,12 @@ struct uart_8250_port { struct uart_8250_em485 *em485; }; +#ifdef CONFIG_SERIAL_8250 +extern bool serial8250_skip_old_ports; +#else +static const bool serial8250_skip_old_ports; +#endif + static inline struct uart_8250_port *up_to_u8250p(struct uart_port *up) { return container_of(up, struct uart_8250_port, port); -- 2.16.2.804.g6dcf76e118-goog