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 02/16] x86: pci: Allow binding of some devices before relocation
Date: Sun, 27 Jun 2021 17:50:57 -0600	[thread overview]
Message-ID: <20210627235111.485507-3-sjg@chromium.org> (raw)
In-Reply-To: <20210627235111.485507-1-sjg@chromium.org>

At present only bridge devices are bound before relocation, to save space
in pre-relocation memory. In some cases we do actually want to bind a
device, e.g. because it provides the console UART. Add a devicetree
binding to support this.

Use the PCI_VENDEV() macro to encode the cell value. This is present in
U-Boot but not used, so move it to the binding header-file.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
---

(no changes since v1)

 doc/device-tree-bindings/pci/x86-pci.txt |  7 ++++-
 drivers/pci/pci-uclass.c                 | 33 +++++++++++++++++++++++-
 include/dt-bindings/pci/pci.h            | 12 +++++++++
 include/pci.h                            |  1 -
 4 files changed, 50 insertions(+), 3 deletions(-)
 create mode 100644 include/dt-bindings/pci/pci.h

diff --git a/doc/device-tree-bindings/pci/x86-pci.txt b/doc/device-tree-bindings/pci/x86-pci.txt
index 95e370b3e72..cf4e5ed595a 100644
--- a/doc/device-tree-bindings/pci/x86-pci.txt
+++ b/doc/device-tree-bindings/pci/x86-pci.txt
@@ -20,6 +20,10 @@ For PCI devices the following optional property is available:
 	output to be lost. This should not generally be used in production code,
 	although it is often harmless.
 
+- u-boot,pci-pre-reloc : List of vendor/device IDs to bind before relocation, even
+	if they are not bridges. This is useful if the device is needed (e.g. a
+	UART). The format is 0xvvvvdddd where d is the device ID and v is the
+	vendor ID.
 
 Example:
 
@@ -32,7 +36,8 @@ pci {
 		0x42000000 0x0 0xb0000000 0xb0000000 0 0x10000000
 		0x01000000 0x0 0x1000 0x1000 0 0xefff>;
 	u-boot,skip-auto-config-until-reloc;
-
+	u-boot,pci-pre-reloc = <
+		PCI_VENDEV(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_APL_UART2)>;
 
 	serial: serial@18,2 {
 		reg = <0x0200c210 0 0 0 0>;
diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
index d64fbe0627b..4b52620d6af 100644
--- a/drivers/pci/pci-uclass.c
+++ b/drivers/pci/pci-uclass.c
@@ -19,6 +19,7 @@
 #if defined(CONFIG_X86) && defined(CONFIG_HAVE_FSP)
 #include <asm/fsp/fsp_support.h>
 #endif
+#include <dt-bindings/pci/pci.h>
 #include <linux/delay.h>
 #include "pci_internal.h"
 
@@ -676,6 +677,34 @@ static bool pci_match_one_id(const struct pci_device_id *id,
 	return false;
 }
 
+/**
+ * pci_need_device_pre_reloc() - Check if a device should be bound
+ *
+ * This checks a list of vendor/device-ID values indicating devices that should
+ * be bound before relocation.
+ *
+ * @bus: Bus to check
+ * @vendor: Vendor ID to check
+ * @device: Device ID to check
+ * @return true if the vendor/device is in the list, false if not
+ */
+static bool pci_need_device_pre_reloc(struct udevice *bus, uint vendor,
+				      uint device)
+{
+	u32 vendev;
+	int index;
+
+	for (index = 0;
+	     !dev_read_u32_index(bus, "u-boot,pci-pre-reloc", index,
+				 &vendev);
+	     index++) {
+		if (vendev == PCI_VENDEV(vendor, device))
+			return true;
+	}
+
+	return false;
+}
+
 /**
  * pci_find_and_bind_driver() - Find and bind the right PCI driver
  *
@@ -764,7 +793,9 @@ static int pci_find_and_bind_driver(struct udevice *parent,
 	 * precious memory space as on some platforms as that space is pretty
 	 * limited (ie: using Cache As RAM).
 	 */
-	if (!(gd->flags & GD_FLG_RELOC) && !bridge)
+	if (!(gd->flags & GD_FLG_RELOC) && !bridge &&
+	    !pci_need_device_pre_reloc(parent, find_id->vendor,
+				       find_id->device))
 		return log_msg_ret("notbr", -EPERM);
 
 	/* Bind a generic driver so that the device can be used */
diff --git a/include/dt-bindings/pci/pci.h b/include/dt-bindings/pci/pci.h
new file mode 100644
index 00000000000..e7290277b90
--- /dev/null
+++ b/include/dt-bindings/pci/pci.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * This header provides common constants for PCI bindings.
+ */
+
+#ifndef _DT_BINDINGS_PCI_PCI_H
+#define _DT_BINDINGS_PCI_PCI_H
+
+/* Encode a vendor and device ID into a single cell */
+#define PCI_VENDEV(v, d)	(((v) << 16) | (d))
+
+#endif /* _DT_BINDINGS_PCI_PCI_H */
diff --git a/include/pci.h b/include/pci.h
index 2ee6138324f..9eb28aba049 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -578,7 +578,6 @@ typedef int pci_dev_t;
 #define PCI_MASK_BUS(bdf)	((bdf) & 0xffff)
 #define PCI_ADD_BUS(bus, devfn)	(((bus) << 16) | (devfn))
 #define PCI_BDF(b, d, f)	((b) << 16 | PCI_DEVFN(d, f))
-#define PCI_VENDEV(v, d)	(((v) << 16) | (d))
 #define PCI_ANY_ID		(~0)
 
 /* Convert from Linux format to U-Boot format */
-- 
2.32.0.93.g670b81a890-goog


  parent reply	other threads:[~2021-06-27 23:51 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 ` Simon Glass [this message]
2021-06-27 23:50 ` [PATCH v3 03/16] x86: Allow coreboot serial driver to guess the UART Simon Glass
2021-07-15 11:44   ` 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=20210627235111.485507-3-sjg@chromium.org \
    --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.