dm/pci: Change the first CFG read to Vendor ID in enumeration
As the PCIe specification recommend reading the Vendor ID register to determine if a Function is present, read the Vendor ID of a non-existent Function must not result in system error, so we'd better make the first CFG read to Vendor ID instead of Header Type register in the PCIe enumeration. Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
a3e1653dde
commit
2a87f7fdd5
@ -774,16 +774,19 @@ int pci_bind_bus_devices(struct udevice *bus)
|
||||
found_multi = false;
|
||||
if (PCI_FUNC(bdf) && !found_multi)
|
||||
continue;
|
||||
|
||||
/* Check only the first access, we don't expect problems */
|
||||
ret = pci_bus_read_config(bus, bdf, PCI_HEADER_TYPE,
|
||||
&header_type, PCI_SIZE_8);
|
||||
ret = pci_bus_read_config(bus, bdf, PCI_VENDOR_ID, &vendor,
|
||||
PCI_SIZE_16);
|
||||
if (ret)
|
||||
goto error;
|
||||
pci_bus_read_config(bus, bdf, PCI_VENDOR_ID, &vendor,
|
||||
PCI_SIZE_16);
|
||||
|
||||
if (vendor == 0xffff || vendor == 0x0000)
|
||||
continue;
|
||||
|
||||
pci_bus_read_config(bus, bdf, PCI_HEADER_TYPE,
|
||||
&header_type, PCI_SIZE_8);
|
||||
|
||||
if (!PCI_FUNC(bdf))
|
||||
found_multi = header_type & 0x80;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user