pci: Avoid a crash in device_is_on_pci_bus()
authorSimon Glass <sjg@chromium.org>
Tue, 7 Jul 2020 19:12:10 +0000 (13:12 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Fri, 17 Jul 2020 06:32:24 +0000 (14:32 +0800)
This function cannot currently be called on the root node. Add a check
for this as well as a test.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
include/dm/device.h
test/dm/pci.c

index f5738a0..953706c 100644 (file)
@@ -764,7 +764,7 @@ int dev_enable_by_path(const char *path);
  */
 static inline bool device_is_on_pci_bus(const struct udevice *dev)
 {
-       return device_get_uclass_id(dev->parent) == UCLASS_PCI;
+       return dev->parent && device_get_uclass_id(dev->parent) == UCLASS_PCI;
 }
 
 /**
index fb93e4c..39e82b3 100644 (file)
@@ -339,3 +339,17 @@ static int dm_test_pci_addr_live(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_pci_addr_live, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT |
                DM_TESTF_LIVE_TREE);
+
+/* Test device_is_on_pci_bus() */
+static int dm_test_pci_on_bus(struct unit_test_state *uts)
+{
+       struct udevice *dev;
+
+       ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(0, 0x1f, 0), &dev));
+       ut_asserteq(true, device_is_on_pci_bus(dev));
+       ut_asserteq(false, device_is_on_pci_bus(dev_get_parent(dev)));
+       ut_asserteq(true, device_is_on_pci_bus(dev));
+
+       return 0;
+}
+DM_TEST(dm_test_pci_on_bus, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);