Antwort: Re: x86: apl: PCI enumeration issue
Bernhard Messerklinger
bernhard.messerklinger at br-automation.com
Mon Mar 30 10:25:40 CEST 2020
Hi Bin,
>Hi Bernhard,
>
>On Mon, Mar 30, 2020 at 3:35 PM Bernhard Messerklinger
><bernhard.messerklinger at br-automation.com> wrote:
>>
>> 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.
>
>Do you know why the 2nd port hang happens, but not the 1st port? Is
>that because in order to get 2nd port working something is done in
>FSP-S?
I know that the problem happens because of the PCIe FIT tool configuration.
If I change the configuration to PCIe x1 on all root ports of the SoC the
issue doesn't occur.
I think FSP-S hides the second port because it's no real PCIe root port,
it's just the second lane of the first port. I also did some research in the
intel FSP-S code. In the FSP-S code some not documented fuse registers are
accessed and then the second port is deactivated depending of the FIT
configuration.
>>
>> 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
>> hangs.
>>
>> 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,
>> PCI_MAX_PCI_FUNCTIONS - 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)
>> continue;
>>
>> #if defined(CONFIG_SPL_BUILD)
>> if (PCI_DEV(bdf) == 0x13 && PCI_FUNC(bdf) == 1)
>> continue;
>> #endif
>>
>> /* Check only the first access, we don't expect
>problems */
>> ret = pci_bus_read_config(bus, bdf, PCI_VENDOR_ID,
>&vendor,
>> PCI_SIZE_16);
>>
>> 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":
>> https://lists.denx.de/pipermail/u-boot/2020-March/402276.html
>>
>> But i don't know if it's good to put more apollolake specific stuff
>into the
>> pci-uclass.
>>
>> 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?
>>
>
>Regards,
>Bin
>
Regards,
Bernhard
More information about the U-Boot
mailing list