x86: apl: PCI enumeration issue

Bernhard Messerklinger bernhard.messerklinger at br-automation.com
Mon Mar 30 09:35:57 CEST 2020

Hi Simon, Bin,

I am facing problems with the PCI enumeration at SPL loader stage.
On our HW we have PCIe x2 port connected to a FPGA. Since SPL does pci
enumeration before FSP-S has been called the enumeration of the second port of
the pci x2 connection causes the system to hang.

In my configuration PCI 0.13.0 is a X2 port. So, if the pci_bind_bus_devices
function wants to read the PCI_VENDOR_ID from the PCI device 0.13.1 the system

int pci_bind_bus_devices(struct udevice *bus)
	ulong vendor, device;
	ulong header_type;
	pci_dev_t bdf, end;
	bool found_multi;
	int ret;

	found_multi = false;
	end = PCI_BDF(bus->seq, PCI_MAX_PCI_DEVICES - 1,
	for (bdf = PCI_BDF(bus->seq, 0, 0); bdf <= end;
	     bdf += PCI_BDF(0, 0, 1)) {
		struct pci_child_platdata *pplat;
		struct udevice *dev;
		ulong class;

		if (!PCI_FUNC(bdf))
			found_multi = false;
		if (PCI_FUNC(bdf) && !found_multi)

#if defined(CONFIG_SPL_BUILD)
		if (PCI_DEV(bdf) == 0x13 && PCI_FUNC(bdf) == 1)

		/* Check only the first access, we don't expect problems */
		ret = pci_bus_read_config(bus, bdf, PCI_VENDOR_ID, &vendor,

At the moment, I fixed this issue by adding an #ifdef which skips the config read
on this device.

I think a way to solve this issue could be to add a new devic-tree property
like it's done here with "pci,no-autoconfig":

But i don't know if it's good to put more apollolake specific stuff into the

Maybe we should add an apollolake specific pci_uclass_post_probe override.
This could maybe be done by adding a spcecific pci driver like pci_x86 for
apollolake platform and override the post_probe argument of the pci_uclass.
Then we could also move the other apollolake specific things into this driver.

What do you think about this?
Do you have better/other ideas?


More information about the U-Boot mailing list