All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Glass <sjg@chromium.org>
To: U-Boot Mailing List <u-boot@lists.denx.de>
Cc: Simon Glass <sjg@chromium.org>, Bin Meng <bmeng.cn@gmail.com>
Subject: [PATCH v3 03/16] x86: Allow coreboot serial driver to guess the UART
Date: Sun, 27 Jun 2021 17:50:58 -0600	[thread overview]
Message-ID: <20210627175102.v3.3.I967ea8c85e009f870c7aa944372d32c990f1b14a@changeid> (raw)
In-Reply-To: <20210627235111.485507-1-sjg@chromium.org>

At present this driver relies on coreboot to provide information about
the console UART. However if coreboot is not compiled with the UART
enabled, the information is left out. This configuration is quite
common, e.g. with shipping x86-based Chrome OS Chromebooks.

Add a way to determine the UART settings in this case, using a
hard-coded list of PCI IDs.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

 drivers/serial/serial_coreboot.c | 68 ++++++++++++++++++++++++++++----
 include/pci_ids.h                |  1 +
 2 files changed, 61 insertions(+), 8 deletions(-)

diff --git a/drivers/serial/serial_coreboot.c b/drivers/serial/serial_coreboot.c
index de09c8681f5..4b4619432d8 100644
--- a/drivers/serial/serial_coreboot.c
+++ b/drivers/serial/serial_coreboot.c
@@ -11,19 +11,71 @@
 #include <serial.h>
 #include <asm/cb_sysinfo.h>
 
+static const struct pci_device_id ids[] = {
+	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_APL_UART2) },
+	{},
+};
+
+/*
+ * Coreboot only sets up the UART if it uses it and doesn't bother to put the
+ * details in sysinfo if it doesn't. Try to guess in that case, using devices
+ * we know about
+ *
+ * @plat: Platform data to fill in
+ * @return 0 if found, -ve if no UART was found
+ */
+static int guess_uart(struct ns16550_plat *plat)
+{
+	struct udevice *bus, *dev;
+	ulong addr;
+	int index;
+	int ret;
+
+	ret = uclass_first_device_err(UCLASS_PCI, &bus);
+	if (ret)
+		return ret;
+	index = 0;
+	ret = pci_bus_find_devices(bus, ids, &index, &dev);
+	if (ret)
+		return ret;
+	addr = dm_pci_read_bar32(dev, 0);
+	plat->base = addr;
+	plat->reg_shift = 2;
+	plat->reg_width = 4;
+	plat->clock = 1843200;
+	plat->fcr = UART_FCR_DEFVAL;
+	plat->flags = 0;
+
+	return 0;
+}
+
 static int coreboot_of_to_plat(struct udevice *dev)
 {
 	struct ns16550_plat *plat = dev_get_plat(dev);
 	struct cb_serial *cb_info = lib_sysinfo.serial;
 
-	plat->base = cb_info->baseaddr;
-	plat->reg_shift = cb_info->regwidth == 4 ? 2 : 0;
-	plat->reg_width = cb_info->regwidth;
-	plat->clock = cb_info->input_hertz;
-	plat->fcr = UART_FCR_DEFVAL;
-	plat->flags = 0;
-	if (cb_info->type == CB_SERIAL_TYPE_IO_MAPPED)
-		plat->flags |= NS16550_FLAG_IO;
+	if (cb_info) {
+		plat->base = cb_info->baseaddr;
+		plat->reg_shift = cb_info->regwidth == 4 ? 2 : 0;
+		plat->reg_width = cb_info->regwidth;
+		plat->clock = cb_info->input_hertz;
+		plat->fcr = UART_FCR_DEFVAL;
+		plat->flags = 0;
+		if (cb_info->type == CB_SERIAL_TYPE_IO_MAPPED)
+			plat->flags |= NS16550_FLAG_IO;
+	} else if (CONFIG_IS_ENABLED(PCI)) {
+		int ret;
+
+		ret = guess_uart(plat);
+		if (ret) {
+			/*
+			 * Returning an error will cause U-Boot to complain that
+			 * there is no UART, which may panic. So stay silent and
+			 * pray that the video console will work.
+			 */
+			log_debug("Cannot detect UART\n");
+		}
+	}
 
 	return 0;
 }
diff --git a/include/pci_ids.h b/include/pci_ids.h
index 7ecedc7f04c..d91c1d08f1a 100644
--- a/include/pci_ids.h
+++ b/include/pci_ids.h
@@ -2987,6 +2987,7 @@
 #define PCI_DEVICE_ID_INTEL_UNC_R3QPI1	0x3c45
 #define PCI_DEVICE_ID_INTEL_JAKETOWN_UBOX	0x3ce0
 #define PCI_DEVICE_ID_INTEL_IOAT_SNB	0x402f
+#define PCI_DEVICE_ID_INTEL_APL_UART2	0x5ac0
 #define PCI_DEVICE_ID_INTEL_5100_16	0x65f0
 #define PCI_DEVICE_ID_INTEL_5100_19	0x65f3
 #define PCI_DEVICE_ID_INTEL_5100_21	0x65f5
-- 
2.32.0.93.g670b81a890-goog


  parent reply	other threads:[~2021-06-27 23:52 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-27 23:50 [PATCH v3 00/16] misc: Some more misc patches Simon Glass
2021-06-27 23:50 ` [PATCH v3 01/16] pci: Use const for pci_find_device_id() etc Simon Glass
2021-06-27 23:50 ` [PATCH v3 02/16] x86: pci: Allow binding of some devices before relocation Simon Glass
2021-06-27 23:50 ` Simon Glass [this message]
2021-07-15 11:44   ` [PATCH v3 03/16] x86: Allow coreboot serial driver to guess the UART Bin Meng
2021-07-15 15:18     ` Simon Glass
2021-06-27 23:50 ` [PATCH v3 04/16] spi: ich: Don't require the PCH Simon Glass
2021-06-28  6:19   ` Jagan Teki
2021-06-27 23:51 ` [PATCH v3 05/16] tpm: cr50: Drop unnecessary coral headers Simon Glass
2021-06-27 23:51 ` [PATCH v3 06/16] x86: Don't set up MTRRs if previously done Simon Glass
2021-06-27 23:51 ` [PATCH v3 07/16] x86: Update the MP constants to avoid conflicts Simon Glass
2021-06-27 23:51 ` [PATCH v3 08/16] x86: Do cache set-up by default when booting from coreboot Simon Glass
2021-06-27 23:51 ` [PATCH v3 09/16] x86: coreboot: Show the BIOS date Simon Glass
2021-06-27 23:51 ` [PATCH v3 10/16] x86: coral: Allow booting from coreboot Simon Glass
2021-06-27 23:51 ` [PATCH v3 11/16] x86: Add function comments to cb_sysinfo.h Simon Glass
2021-06-27 23:51 ` [PATCH v3 12/16] x86: coreboot: Use vendor in the Kconfig Simon Glass
2021-06-27 23:51 ` [PATCH v3 13/16] x86: coreboot: Document the memory map Simon Glass
2021-06-27 23:51 ` [PATCH v3 14/16] x86: cros: Check ROM exists before building vboot Simon Glass
2021-06-27 23:51 ` [PATCH v3 15/16] dtoc: Check that a parent is not missing Simon Glass
2021-06-27 23:51 ` [PATCH v3 16/16] doc: Update documentation for cros-2021.04 release Simon Glass
2021-07-14 15:47 ` [PATCH v3 00/16] misc: Some more misc patches Simon Glass
2021-07-15 11:51   ` Bin Meng
2021-08-01 22:01     ` Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210627175102.v3.3.I967ea8c85e009f870c7aa944372d32c990f1b14a@changeid \
    --to=sjg@chromium.org \
    --cc=bmeng.cn@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.