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 <p...@kernel.org>
---
 drivers/pci/pci-uclass.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
index 044babee164f..5da3515f5f25 100644
--- a/drivers/pci/pci-uclass.c
+++ b/drivers/pci/pci-uclass.c
@@ -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),
-- 
2.20.1

Reply via email to