device/pci: Handle unassigned bus resources gracefully

The I/O windows of PCI bridges can be disabled individually by
setting their limit lower than their base. Always do this if a
resource wasn't assigned a value.

Change-Id: I73f6817c4b12cb1689627044735d1fed6d825afe
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/41552
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Furquan Shaikh <furquan@google.com>
diff --git a/src/device/pci_device.c b/src/device/pci_device.c
index 9011f0d..e6c6ff3 100644
--- a/src/device/pci_device.c
+++ b/src/device/pci_device.c
@@ -510,10 +510,16 @@
 {
 	/* Make certain the resource has actually been assigned a value. */
 	if (!(resource->flags & IORESOURCE_ASSIGNED)) {
-		printk(BIOS_ERR, "ERROR: %s %02lx %s size: 0x%010llx not "
-		       "assigned\n", dev_path(dev), resource->index,
-		       resource_type(resource), resource->size);
-		return;
+		if (resource->flags & IORESOURCE_BRIDGE) {
+			/* If a bridge resource has no value assigned,
+			   we can treat it like an empty resource. */
+			resource->size = 0;
+		} else {
+			printk(BIOS_ERR, "ERROR: %s %02lx %s size: 0x%010llx not "
+			       "assigned\n", dev_path(dev), resource->index,
+			       resource_type(resource), resource->size);
+			return;
+		}
 	}
 
 	/* If this resource is fixed don't worry about it. */