pci: Skip configuring invalid P2P bridge devices
authorPali Rohár <pali@kernel.org>
Thu, 7 Oct 2021 12:50:58 +0000 (14:50 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 14 Oct 2021 23:45:07 +0000 (19:45 -0400)
Function dm_pci_hose_probe_bus() expects that bus is valid PCI device with
Bridge header type (0x01). So add check before touching PCI config space to
prevent misconfiguring some non-standard device.

Signed-off-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Stefan Roese <sr@denx.de>
drivers/pci/pci-uclass.c

index 044babe..5da3515 100644 (file)
@@ -627,6 +627,7 @@ int pci_generic_mmap_read_config(
 
 int dm_pci_hose_probe_bus(struct udevice *bus)
 {
+       u8 header_type;
        int sub_bus;
        int ret;
        int ea_pos;
@@ -634,6 +635,14 @@ int dm_pci_hose_probe_bus(struct udevice *bus)
 
        debug("%s\n", __func__);
 
+       dm_pci_read_config8(bus, PCI_HEADER_TYPE, &header_type);
+       header_type &= 0x7f;
+       if (header_type != PCI_HEADER_TYPE_BRIDGE) {
+               debug("%s: Skipping PCI device %d with Non-Bridge Header Type 0x%x\n",
+                     __func__, PCI_DEV(dm_pci_get_bdf(bus)), header_type);
+               return log_msg_ret("probe", -EINVAL);
+       }
+
        ea_pos = dm_pci_find_capability(bus, PCI_CAP_ID_EA);
        if (ea_pos) {
                dm_pci_read_config8(bus, ea_pos + sizeof(u32) + sizeof(u8),