pci: Support autoconfig in SPL
authorSimon Glass <sjg@chromium.org>
Sun, 16 Jul 2023 03:38:55 +0000 (21:38 -0600)
committerBin Meng <bmeng@tinylab.org>
Mon, 17 Jul 2023 09:12:26 +0000 (17:12 +0800)
Allow PCI autoconfig to be handled in SPL, so that we can set it up
correctly for boards which need to do this before U-Boot proper. This
includes qemu-x64_64 which needs to set up the video device while in
32-bit mode.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
drivers/pci/Kconfig
drivers/pci/pci-uclass.c

index 84a2ae9..aca439d 100644 (file)
@@ -44,8 +44,13 @@ config SPL_PCI_PNP
        bool "Enable Plug & Play support for PCI"
        help
          Enable PCI memory and I/O space resource allocation and assignment.
+
          This is required to auto configure the enumerated devices.
 
+         This is normally not done in SPL, but can be enabled if devices must
+         be set up in the SPL phase. Often it is enough to manually configure
+         one device, so this option can be disabled.
+
 config PCI_REGION_MULTI_ENTRY
        bool "Enable Multiple entries of region type MEMORY in ranges for PCI"
        help
index 8d27e40..632c1a6 100644 (file)
@@ -13,6 +13,7 @@
 #include <log.h>
 #include <malloc.h>
 #include <pci.h>
+#include <spl.h>
 #include <asm/global_data.h>
 #include <asm/io.h>
 #include <dm/device-internal.h>
@@ -722,6 +723,9 @@ static bool pci_need_device_pre_reloc(struct udevice *bus, uint vendor,
        u32 vendev;
        int index;
 
+       if (spl_phase() == PHASE_SPL && CONFIG_IS_ENABLED(PCI_PNP))
+               return true;
+
        for (index = 0;
             !dev_read_u32_index(bus, "u-boot,pci-pre-reloc", index,
                                 &vendev);
@@ -793,7 +797,9 @@ static int pci_find_and_bind_driver(struct udevice *parent,
                         * space is pretty limited (ie: using Cache As RAM).
                         */
                        if (!(gd->flags & GD_FLG_RELOC) &&
-                           !(drv->flags & DM_FLAG_PRE_RELOC))
+                           !(drv->flags & DM_FLAG_PRE_RELOC) &&
+                           (!CONFIG_IS_ENABLED(PCI_PNP) ||
+                            spl_phase() != PHASE_SPL))
                                return log_msg_ret("pre", -EPERM);
 
                        /*
@@ -918,6 +924,8 @@ int pci_bind_bus_devices(struct udevice *bus)
                        }
                        ret = pci_find_and_bind_driver(bus, &find_id, bdf,
                                                       &dev);
+               } else {
+                       debug("device: %s\n", dev->name);
                }
                if (ret == -EPERM)
                        continue;