device/device.h: Rename busses for clarity

This renames bus to upstream and link_list to downstream.

Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Change-Id: I80a81b6b8606e450ff180add9439481ec28c2420
Reviewed-on: https://review.coreboot.org/c/coreboot/+/78330
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c
index 0e4798c..6bf452e 100644
--- a/src/acpi/acpi.c
+++ b/src/acpi/acpi.c
@@ -700,8 +700,8 @@
 
 	if (device->path.type == DEVICE_PATH_PCI) {
 		spmi->pci_device_flag = ACPI_IPMI_PCI_DEVICE_FLAG;
-		spmi->pci_segment_group = device->bus->segment_group;
-		spmi->pci_bus = device->bus->secondary;
+		spmi->pci_segment_group = device->upstream->segment_group;
+		spmi->pci_bus = device->upstream->secondary;
 		spmi->pci_device = device->path.pci.devfn >> 3;
 		spmi->pci_function = device->path.pci.devfn & 0x7;
 	} else if (type != IPMI_INTERFACE_SSIF) {
diff --git a/src/acpi/device.c b/src/acpi/device.c
index 823cdbeb..368b86c 100644
--- a/src/acpi/device.c
+++ b/src/acpi/device.c
@@ -83,8 +83,8 @@
 	}
 
 	/* Walk up the tree to find if any parent can identify this device */
-	while (pdev->bus) {
-		pdev = pdev->bus->dev;
+	while (pdev->upstream) {
+		pdev = pdev->upstream->dev;
 		if (!pdev)
 			break;
 		if (is_root_device(pdev))
@@ -147,8 +147,8 @@
 		return cur;
 
 	/* Walk up the tree to the root device */
-	if (!is_root_device(dev) && dev->bus && dev->bus->dev)
-		next = acpi_device_path_fill(dev->bus->dev, buf, buf_len, cur);
+	if (!is_root_device(dev) && dev->upstream && dev->upstream->dev)
+		next = acpi_device_path_fill(dev->upstream->dev, buf, buf_len, cur);
 	if (next < 0)
 		return next;
 
@@ -182,10 +182,10 @@
 {
 	static char buf[DEVICE_PATH_MAX] = {};
 
-	if (!dev || !dev->bus || !dev->bus->dev)
+	if (!dev || !dev->upstream || !dev->upstream->dev)
 		return NULL;
 
-	if (acpi_device_path_fill(dev->bus->dev, buf, sizeof(buf), 0) <= 0)
+	if (acpi_device_path_fill(dev->upstream->dev, buf, sizeof(buf), 0) <= 0)
 		return NULL;
 
 	return buf;
diff --git a/src/arch/x86/mpspec.c b/src/arch/x86/mpspec.c
index 3ddee2f..b8bdb09 100644
--- a/src/arch/x86/mpspec.c
+++ b/src/arch/x86/mpspec.c
@@ -284,11 +284,11 @@
 
 	unsigned char dstirq_x[4];
 
-	if (!dev->link_list)
+	if (!dev->downstream)
 		return;
 
-	child = dev->link_list->children;
-	srcbus = dev->link_list->secondary;
+	child = dev->downstream->children;
+	srcbus = dev->downstream->secondary;
 
 	while (child) {
 		if (child->path.type != DEVICE_PATH_PCI)
@@ -476,7 +476,7 @@
 	memset(buses, 0, sizeof(buses));
 
 	for (dev = all_devices; dev; dev = dev->next) {
-		struct bus *bus = dev->link_list;
+		struct bus *bus = dev->downstream;
 		if (!bus)
 			continue;
 		if (bus->secondary > 255) {
diff --git a/src/cpu/intel/haswell/haswell_init.c b/src/cpu/intel/haswell/haswell_init.c
index 83d847cb..86dcbea 100644
--- a/src/cpu/intel/haswell/haswell_init.c
+++ b/src/cpu/intel/haswell/haswell_init.c
@@ -449,7 +449,7 @@
 static void configure_thermal_target(struct device *dev)
 {
 	/* Make sure your devicetree has the cpu_cluster below chip cpu/intel/haswell! */
-	struct cpu_intel_haswell_config *conf = dev->bus->dev->chip_info;
+	struct cpu_intel_haswell_config *conf = dev->upstream->dev->chip_info;
 	msr_t msr;
 
 	/* Set TCC activation offset if supported */
diff --git a/src/cpu/intel/model_2065x/model_2065x_init.c b/src/cpu/intel/model_2065x/model_2065x_init.c
index 3497ae0..cb74854 100644
--- a/src/cpu/intel/model_2065x/model_2065x_init.c
+++ b/src/cpu/intel/model_2065x/model_2065x_init.c
@@ -22,7 +22,7 @@
 
 static void configure_thermal_target(struct device *dev)
 {
-	struct cpu_intel_model_2065x_config *conf = dev->bus->dev->chip_info;
+	struct cpu_intel_model_2065x_config *conf = dev->upstream->dev->chip_info;
 	msr_t msr;
 
 	/* Set TCC activation offset if supported */
diff --git a/src/cpu/intel/model_206ax/model_206ax_init.c b/src/cpu/intel/model_206ax/model_206ax_init.c
index 372989c..d9340ff 100644
--- a/src/cpu/intel/model_206ax/model_206ax_init.c
+++ b/src/cpu/intel/model_206ax/model_206ax_init.c
@@ -223,7 +223,7 @@
 
 static void configure_thermal_target(struct device *dev)
 {
-	struct cpu_intel_model_206ax_config *conf = dev->bus->dev->chip_info;
+	struct cpu_intel_model_206ax_config *conf = dev->upstream->dev->chip_info;
 	msr_t msr;
 
 	if (boot_cpu()) {
diff --git a/src/device/cardbus_device.c b/src/device/cardbus_device.c
index 23f24dd..2eb070e 100644
--- a/src/device/cardbus_device.c
+++ b/src/device/cardbus_device.c
@@ -119,7 +119,7 @@
 	u16 ctrl;
 
 	ctrl = pci_read_config16(dev, PCI_CB_BRIDGE_CONTROL);
-	ctrl |= (dev->link_list->bridge_ctrl & (
+	ctrl |= (dev->downstream->bridge_ctrl & (
 			PCI_BRIDGE_CTL_VGA |
 			PCI_BRIDGE_CTL_MASTER_ABORT |
 			PCI_BRIDGE_CTL_BUS_RESET));
diff --git a/src/device/device.c b/src/device/device.c
index 743a3af..72a408e 100644
--- a/src/device/device.c
+++ b/src/device/device.c
@@ -101,7 +101,7 @@
 	dev->enabled = 1;
 
 	/* Add the new device to the list of children of the bus. */
-	dev->bus = parent;
+	dev->upstream = parent;
 	if (child)
 		child->sibling = dev;
 	else
@@ -139,13 +139,13 @@
  */
 static struct bus *__alloc_bus(struct device *parent)
 {
-	if (parent->link_list)
-		return parent->link_list;
+	if (parent->downstream)
+		return parent->downstream;
 
 	struct bus *bus = calloc(1, sizeof(struct bus));
 	if (!bus)
 		die("Couldn't allocate downstream bus!\n");
-	parent->link_list = bus;
+	parent->downstream = bus;
 	bus->dev = parent;
 
 	return bus;
@@ -205,8 +205,8 @@
 		curdev->ops->read_resources(curdev);
 
 		/* Read in the resources behind the current device's links. */
-		if (curdev->link_list)
-			read_resources(curdev->link_list);
+		if (curdev->downstream)
+			read_resources(curdev->downstream);
 	}
 	post_log_clear();
 	printk(BIOS_SPEW, "%s %s segment group %d bus %d done\n",
@@ -236,7 +236,7 @@
 			continue;
 
 		printk(BIOS_DEBUG, "found VGA at %s\n", dev_path(dev));
-		if (dev->bus->no_vga16) {
+		if (dev->upstream->no_vga16) {
 			printk(BIOS_WARNING,
 				"A bridge on the path doesn't support 16-bit VGA decoding!");
 		}
@@ -270,7 +270,7 @@
 		/* All legacy VGA cards have MEM & I/O space registers. */
 		vga->command |= (PCI_COMMAND_MEMORY | PCI_COMMAND_IO);
 		vga_pri = vga;
-		bus = vga->bus;
+		bus = vga->upstream;
 	}
 
 	/* Now walk up the bridges setting the VGA enable. */
@@ -278,7 +278,7 @@
 		printk(BIOS_DEBUG, "Setting PCI_BRIDGE_CTL_VGA for bridge %s\n",
 		       dev_path(bus->dev));
 		bus->bridge_ctrl |= PCI_BRIDGE_CTL_VGA | PCI_BRIDGE_CTL_VGA16;
-		bus = (bus == bus->dev->bus) ? 0 : bus->dev->bus;
+		bus = (bus == bus->dev->upstream) ? 0 : bus->dev->upstream;
 	}
 }
 
@@ -343,8 +343,8 @@
 	}
 
 	for (dev = link->children; dev; dev = dev->sibling) {
-		if (dev->link_list)
-			enable_resources(dev->link_list);
+		if (dev->downstream)
+			enable_resources(dev->downstream);
 	}
 	post_log_clear();
 }
@@ -391,7 +391,7 @@
 
 	do_scan_bus = 1;
 	while (do_scan_bus) {
-		struct bus *link = busdev->link_list;
+		struct bus *link = busdev->downstream;
 		busdev->ops->scan_bus(busdev);
 		do_scan_bus = 0;
 		if (!link || !link->reset_needed)
@@ -399,7 +399,7 @@
 		if (reset_bus(link))
 			do_scan_bus = 1;
 		else
-			busdev->bus->reset_needed = 1;
+			busdev->upstream->reset_needed = 1;
 	}
 
 	scan_time = stopwatch_duration_msecs(&sw);
@@ -496,14 +496,14 @@
 	/* Read the resources for the entire tree. */
 
 	printk(BIOS_INFO, "Reading resources...\n");
-	read_resources(root->link_list);
+	read_resources(root->downstream);
 	printk(BIOS_INFO, "Done reading resources.\n");
 
 	print_resource_tree(root, BIOS_SPEW, "After reading.");
 
 	allocate_resources(root);
 
-	assign_resources(root->link_list);
+	assign_resources(root->downstream);
 	printk(BIOS_INFO, "Done setting resources.\n");
 	print_resource_tree(root, BIOS_SPEW, "After assigning values.");
 
@@ -521,8 +521,8 @@
 	printk(BIOS_INFO, "Enabling resources...\n");
 
 	/* Now enable everything. */
-	if (dev_root.link_list)
-		enable_resources(dev_root.link_list);
+	if (dev_root.downstream)
+		enable_resources(dev_root.downstream);
 
 	printk(BIOS_INFO, "done.\n");
 }
@@ -546,7 +546,7 @@
 		long init_time;
 
 		if (dev->path.type == DEVICE_PATH_I2C) {
-			printk(BIOS_DEBUG, "smbus: %s->", dev_path(dev->bus->dev));
+			printk(BIOS_DEBUG, "smbus: %s->", dev_path(dev->upstream->dev));
 		}
 
 		printk(BIOS_DEBUG, "%s init\n", dev_path(dev));
@@ -572,8 +572,8 @@
 	}
 
 	for (dev = link->children; dev; dev = dev->sibling)
-		if (dev->link_list)
-			init_link(dev->link_list);
+		if (dev->downstream)
+			init_link(dev->downstream);
 }
 
 /**
@@ -590,8 +590,8 @@
 	init_dev(&dev_root);
 
 	/* Now initialize everything. */
-	if (dev_root.link_list)
-		init_link(dev_root.link_list);
+	if (dev_root.downstream)
+		init_link(dev_root.downstream);
 	post_log_clear();
 
 	printk(BIOS_INFO, "Devices initialized\n");
@@ -626,8 +626,8 @@
 		final_dev(dev);
 
 	for (dev = link->children; dev; dev = dev->sibling)
-		if (dev->link_list)
-			final_link(dev->link_list);
+		if (dev->downstream)
+			final_link(dev->downstream);
 }
 /**
  * Finalize all devices in the global device tree.
@@ -643,7 +643,7 @@
 	final_dev(&dev_root);
 
 	/* Now finalize everything. */
-	final_link(dev_root.link_list);
+	final_link(dev_root.downstream);
 
 	printk(BIOS_INFO, "Devices finalized\n");
 }
diff --git a/src/device/device_const.c b/src/device/device_const.c
index c91c009..0521c7e 100644
--- a/src/device/device_const.c
+++ b/src/device/device_const.c
@@ -34,8 +34,8 @@
 	result = 0;
 	for (dev = all_devices; dev; dev = dev->next) {
 		if ((dev->path.type == DEVICE_PATH_PCI) &&
-		    (dev->bus->secondary == bus) &&
-		    (dev->bus->segment_group == 0) &&
+		    (dev->upstream->secondary == bus) &&
+		    (dev->upstream->segment_group == 0) &&
 		    (dev->path.pci.devfn == devfn)) {
 			result = dev;
 			break;
@@ -210,7 +210,7 @@
 	if (nested_path_length == 1 || !child)
 		return child;
 
-	return find_dev_nested_path(child->link_list, nested_path + 1, nested_path_length - 1);
+	return find_dev_nested_path(child->downstream, nested_path + 1, nested_path_length - 1);
 }
 
 DEVTREE_CONST struct device *pcidev_path_behind(
@@ -234,8 +234,8 @@
 			dev = dev->next;
 			continue;
 		}
-		if (dev->bus->secondary == bus && dev->bus->segment_group == 0)
-			return pcidev_path_behind(dev->bus, devfn);
+		if (dev->upstream->secondary == bus && dev->upstream->segment_group == 0)
+			return pcidev_path_behind(dev->upstream, devfn);
 		dev = dev->next;
 	}
 	return NULL;
@@ -253,7 +253,7 @@
 	if (!pci_domain)
 		return NULL;
 
-	pci_root = pci_domain->link_list;
+	pci_root = pci_domain->downstream;
 	return pci_root;
 }
 
@@ -277,7 +277,7 @@
 		return NULL;
 	}
 
-	return pcidev_path_behind(bridge->link_list, devfn);
+	return pcidev_path_behind(bridge->downstream, devfn);
 }
 
 DEVTREE_CONST struct device *pcidev_path_on_root_debug(pci_devfn_t devfn, const char *func)
@@ -317,7 +317,7 @@
 	result = 0;
 	for (dev = all_devices; dev; dev = dev->next) {
 		if ((dev->path.type == DEVICE_PATH_I2C) &&
-		    (dev->bus->secondary == bus) &&
+		    (dev->upstream->secondary == bus) &&
 		    (dev->path.i2c.device == addr)) {
 			result = dev;
 			break;
diff --git a/src/device/device_util.c b/src/device/device_util.c
index ea4ef27..b5d0d98 100644
--- a/src/device/device_util.c
+++ b/src/device/device_util.c
@@ -97,7 +97,7 @@
 	case DEVICE_PATH_ROOT:
 		break;
 	case DEVICE_PATH_PCI:
-		ret |= dev->bus->segment_group << 16 | dev->bus->secondary << 8 | dev->path.pci.devfn;
+		ret |= dev->upstream->segment_group << 16 | dev->upstream->secondary << 8 | dev->path.pci.devfn;
 		break;
 	case DEVICE_PATH_PNP:
 		ret |= dev->path.pnp.port << 8 | dev->path.pnp.device;
@@ -169,8 +169,8 @@
 		case DEVICE_PATH_PCI:
 			snprintf(buffer, sizeof(buffer),
 				 "PCI: %02x:%02x:%02x.%01x",
-				 dev->bus->segment_group,
-				 dev->bus->secondary,
+				 dev->upstream->segment_group,
+				 dev->upstream->secondary,
 				 PCI_SLOT(dev->path.pci.devfn),
 				 PCI_FUNC(dev->path.pci.devfn));
 			break;
@@ -180,7 +180,7 @@
 			break;
 		case DEVICE_PATH_I2C:
 			snprintf(buffer, sizeof(buffer), "I2C: %02x:%02x",
-				 dev->bus->secondary,
+				 dev->upstream->secondary,
 				 dev->path.i2c.device);
 			break;
 		case DEVICE_PATH_APIC:
@@ -253,8 +253,8 @@
 struct device *dev_get_pci_domain(struct device *dev)
 {
 	/* Walk up the tree up to the PCI domain */
-	while (dev && dev->bus && !is_root_device(dev)) {
-		dev = dev->bus->dev;
+	while (dev && dev->upstream && !is_root_device(dev)) {
+		dev = dev->upstream->dev;
 		if (dev->path.type == DEVICE_PATH_DOMAIN)
 			return dev;
 	}
@@ -529,10 +529,10 @@
 	end = resource_end(resource);
 	buf[0] = '\0';
 
-	if (dev->link_list && (resource->flags & IORESOURCE_PCI_BRIDGE)) {
+	if (dev->downstream && (resource->flags & IORESOURCE_PCI_BRIDGE)) {
 		snprintf(buf, sizeof(buf),
-			 "seg %02x bus %02x ", dev->link_list->segment_group,
-			 dev->link_list->secondary);
+			 "seg %02x bus %02x ", dev->downstream->segment_group,
+			 dev->downstream->secondary);
 	}
 	printk(BIOS_DEBUG, "%s %02lx <- [0x%016llx - 0x%016llx] size 0x%08llx "
 	       "gran 0x%02x %s%s%s\n", dev_path(dev), resource->index,
@@ -560,8 +560,8 @@
 
 			/* If it is a subtractive resource recurse. */
 			if (res->flags & IORESOURCE_SUBTRACTIVE) {
-				if (curdev->link_list)
-					search_bus_resources(curdev->link_list, type_mask, type,
+				if (curdev->downstream)
+					search_bus_resources(curdev->downstream, type_mask, type,
 							     search, gp);
 				continue;
 			}
@@ -617,8 +617,8 @@
 	struct device *child;
 
 	for (child = bus->children; child; child = child->sibling) {
-		if (child->link_list)
-			disable_children(child->link_list);
+		if (child->downstream)
+			disable_children(child->downstream);
 		dev_set_enabled(child, 0);
 	}
 }
@@ -634,10 +634,10 @@
 	if (!dev || !dev->enabled)
 		return 0;
 
-	if (!dev->link_list || !dev->link_list->children)
+	if (!dev->downstream || !dev->downstream->children)
 		return 0;
 
-	for (child = dev->link_list->children; child; child = child->sibling) {
+	for (child = dev->downstream->children; child; child = child->sibling) {
 		if (child->path.type == DEVICE_PATH_NONE)
 			continue;
 		if (child->enabled)
@@ -659,9 +659,9 @@
 	indent[i] = '\0';
 
 	printk(BIOS_DEBUG, "%s%s", indent, dev_path(root));
-	if (root->link_list && root->link_list->children)
+	if (root->downstream && root->downstream->children)
 		printk(BIOS_DEBUG, " child on link 0 %s",
-			  dev_path(root->link_list->children));
+			  dev_path(root->downstream->children));
 	printk(BIOS_DEBUG, "\n");
 
 	for (res = root->resource_list; res; res = res->next) {
@@ -672,10 +672,10 @@
 			  res->index);
 	}
 
-	if (!root->link_list)
+	if (!root->downstream)
 		return;
 
-	for (child = root->link_list->children; child; child = child->sibling)
+	for (child = root->downstream->children; child; child = child->sibling)
 		resource_tree(child, debug_level, depth + 1);
 }
 
@@ -709,10 +709,10 @@
 	printk(debug_level, "%s%s: enabled %d\n",
 		  depth_str, dev_path(dev), dev->enabled);
 
-	if (!dev->link_list)
+	if (!dev->downstream)
 		return;
 
-	for (sibling = dev->link_list->children; sibling; sibling = sibling->sibling)
+	for (sibling = dev->downstream->children; sibling; sibling = sibling->sibling)
 		show_devs_tree(sibling, debug_level, depth + 1);
 }
 
@@ -890,7 +890,7 @@
 
 bool dev_path_hotplug(const struct device *dev)
 {
-	for (dev = dev->bus->dev; dev != dev->bus->dev; dev = dev->bus->dev) {
+	for (dev = dev->upstream->dev; dev != dev->upstream->dev; dev = dev->upstream->dev) {
 		if (dev->hotplug_port)
 			return true;
 	}
@@ -909,7 +909,7 @@
 bool is_cpu(const struct device *cpu)
 {
 	return cpu->path.type == DEVICE_PATH_APIC &&
-	       cpu->bus->dev->path.type == DEVICE_PATH_CPU_CLUSTER;
+	       cpu->upstream->dev->path.type == DEVICE_PATH_CPU_CLUSTER;
 }
 
 bool is_enabled_cpu(const struct device *cpu)
@@ -929,5 +929,6 @@
 
 bool is_pci_dev_on_bus(const struct device *pci, unsigned int bus)
 {
-	return is_pci(pci) && pci->bus->segment_group == 0 && pci->bus->secondary == bus;
+	return is_pci(pci) && pci->upstream->segment_group == 0
+		&& pci->upstream->secondary == bus;
 }
diff --git a/src/device/i2c_bus.c b/src/device/i2c_bus.c
index 1d4aa2d..41ef14a 100644
--- a/src/device/i2c_bus.c
+++ b/src/device/i2c_bus.c
@@ -18,10 +18,10 @@
 
 struct bus *i2c_link(const struct device *const dev)
 {
-	if (!dev || !dev->bus)
+	if (!dev || !dev->upstream)
 		return NULL;
 
-	struct bus *link = dev->bus;
+	struct bus *link = dev->upstream;
 	while (link) {
 		struct device *const parent = link->dev;
 
@@ -29,8 +29,8 @@
 		    (parent->ops->ops_i2c_bus || parent->ops->ops_smbus_bus))
 			break;
 
-		if (parent && parent->bus && link != parent->bus)
-			link = parent->bus;
+		if (parent && parent->upstream && link != parent->upstream)
+			link = parent->upstream;
 		else
 			link = NULL;
 	}
diff --git a/src/device/mdio.c b/src/device/mdio.c
index 39ac40b..89da60b 100644
--- a/src/device/mdio.c
+++ b/src/device/mdio.c
@@ -19,7 +19,7 @@
 uint16_t mdio_read(struct device *dev, uint8_t offset)
 {
 	const struct mdio_bus_operations *mdio_ops;
-	struct device *parent = dev->bus->dev;
+	struct device *parent = dev->upstream->dev;
 
 	assert(dev->path.type == DEVICE_PATH_MDIO);
 	mdio_ops = dev_get_mdio_ops(parent);
@@ -30,7 +30,7 @@
 void mdio_write(struct device *dev, uint8_t offset, uint16_t val)
 {
 	const struct mdio_bus_operations *mdio_ops;
-	struct device *parent = dev->bus->dev;
+	struct device *parent = dev->upstream->dev;
 
 	assert(dev->path.type == DEVICE_PATH_MDIO);
 	mdio_ops = dev_get_mdio_ops(parent);
diff --git a/src/device/oprom/realmode/x86.c b/src/device/oprom/realmode/x86.c
index 367614d..c3adf40 100644
--- a/src/device/oprom/realmode/x86.c
+++ b/src/device/oprom/realmode/x86.c
@@ -415,7 +415,7 @@
 
 void run_bios(struct device *dev, unsigned long addr)
 {
-	u32 num_dev = (dev->bus->secondary << 8) | dev->path.pci.devfn;
+	u32 num_dev = (dev->upstream->secondary << 8) | dev->path.pci.devfn;
 
 	/* Setting up required hardware.
 	 * Removing this will cause random illegal instruction exceptions
diff --git a/src/device/oprom/realmode/x86_interrupts.c b/src/device/oprom/realmode/x86_interrupts.c
index 945052b..71fc1d5 100644
--- a/src/device/oprom/realmode/x86_interrupts.c
+++ b/src/device/oprom/realmode/x86_interrupts.c
@@ -138,7 +138,7 @@
 			X86_EAX |= PCIBIOS_SUCCESSFUL;
 			// busnum is an unsigned char;
 			// devfn is an int, so we mask it off.
-			busdevfn = (dev->bus->secondary << 8)
+			busdevfn = (dev->upstream->secondary << 8)
 			    | (dev->path.pci.devfn & 0xff);
 			printk(BIOS_DEBUG, "0x%x: return 0x%x\n", func, busdevfn);
 			X86_EBX = busdevfn;
diff --git a/src/device/oprom/yabel/device.c b/src/device/oprom/yabel/device.c
index 2c98578..d1dc801 100644
--- a/src/device/oprom/yabel/device.c
+++ b/src/device/oprom/yabel/device.c
@@ -65,7 +65,7 @@
 {
 	int taa_index = 0;
 	struct resource *r;
-	u8 bus = bios_device.dev->bus->secondary;
+	u8 bus = bios_device.dev->upstream->secondary;
 	u16 devfn = bios_device.dev->path.pci.devfn;
 
 	bios_device.bus =  bus;
diff --git a/src/device/oprom/yabel/interrupt.c b/src/device/oprom/yabel/interrupt.c
index 968e471..e78a3cb 100644
--- a/src/device/oprom/yabel/interrupt.c
+++ b/src/device/oprom/yabel/interrupt.c
@@ -375,7 +375,7 @@
 		} else if (CONFIG(YABEL_PCI_ACCESS_OTHER_DEVICES)) {
 			dev = dev_find_device(M.x86.R_DX, M.x86.R_CX, 0);
 			if (dev != NULL) {
-				M.x86.R_BH = dev->bus->secondary;
+				M.x86.R_BH = dev->upstream->secondary;
 				M.x86.R_BL = dev->path.pci.devfn;
 				DEBUG_PRINTF_INTR
 				    ("%s(): function %x: PCI Find Device --> 0x%04x\n",
diff --git a/src/device/pci_device.c b/src/device/pci_device.c
index 24b9523..8ead8a5 100644
--- a/src/device/pci_device.c
+++ b/src/device/pci_device.c
@@ -585,7 +585,7 @@
 
 void pci_domain_set_resources(struct device *dev)
 {
-	assign_resources(dev->link_list);
+	assign_resources(dev->downstream);
 }
 
 static void pci_store_resource(const struct device *const dev,
@@ -718,8 +718,8 @@
 	for (res = dev->resource_list; res; res = res->next)
 		pci_set_resource(dev, res);
 
-	if (dev->link_list && dev->link_list->children)
-		assign_resources(dev->link_list);
+	if (dev->downstream && dev->downstream->children)
+		assign_resources(dev->downstream);
 
 	/* Set a default latency timer. */
 	pci_write_config8(dev, PCI_LATENCY_TIMER, 0x40);
@@ -782,10 +782,10 @@
 	 * Enable I/O in command register if there is VGA card
 	 * connected with (even it does not claim I/O resource).
 	 */
-	if (dev->link_list->bridge_ctrl & PCI_BRIDGE_CTL_VGA)
+	if (dev->downstream->bridge_ctrl & PCI_BRIDGE_CTL_VGA)
 		dev->command |= PCI_COMMAND_IO;
 	ctrl = pci_read_config16(dev, PCI_BRIDGE_CONTROL);
-	ctrl |= dev->link_list->bridge_ctrl;
+	ctrl |= dev->downstream->bridge_ctrl;
 	ctrl |= (PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR); /* Error check. */
 	printk(BIOS_DEBUG, "%s bridge ctrl <- %04x\n", dev_path(dev), ctrl);
 	pci_write_config16(dev, PCI_BRIDGE_CONTROL, ctrl);
@@ -843,7 +843,7 @@
 {
 	static int should_run = -1;
 
-	if (dev->bus->segment_group) {
+	if (dev->upstream->segment_group) {
 		printk(BIOS_ERR, "Only option ROMs of devices in first PCI segment group can "
 				 "be run.\n");
 		return 0;
@@ -990,7 +990,7 @@
 	pci_write_config16(bus->dev, PCI_BRIDGE_CONTROL, bridge_ctrl);
 
 	/* If the upstream bridge doesn't support VGA16, we don't have to check */
-	bus->no_vga16 |= bus->dev->bus->no_vga16;
+	bus->no_vga16 |= bus->dev->upstream->no_vga16;
 	if (bus->no_vga16)
 		return;
 
@@ -1215,7 +1215,7 @@
 	if (!dev) {
 		struct device dummy;
 
-		dummy.bus = bus;
+		dummy.upstream = bus;
 		dummy.path.type = DEVICE_PATH_PCI;
 		dummy.path.pci.devfn = devfn;
 
@@ -1317,9 +1317,9 @@
  */
 unsigned int pci_match_simple_dev(struct device *dev, pci_devfn_t sdev)
 {
-	return dev->bus->secondary == PCI_DEV2BUS(sdev) &&
-			dev->bus->segment_group == PCI_DEV2SEG(sdev) &&
-			dev->path.pci.devfn == PCI_DEV2DEVFN(sdev);
+	return dev->upstream->secondary == PCI_DEV2BUS(sdev) &&
+		dev->upstream->segment_group == PCI_DEV2SEG(sdev) &&
+		dev->path.pci.devfn == PCI_DEV2DEVFN(sdev);
 }
 
 /**
@@ -1333,14 +1333,14 @@
  */
 uint16_t pci_find_cap_recursive(const struct device *dev, uint16_t cap)
 {
-	assert(dev->bus);
+	assert(dev->upstream);
 	uint16_t pos = pci_find_capability(dev, cap);
-	const struct device *bridge = dev->bus->dev;
+	const struct device *bridge = dev->upstream->dev;
 	while (bridge && (bridge->path.type == DEVICE_PATH_PCI)) {
-		assert(bridge->bus);
+		assert(bridge->upstream);
 		if (!pci_find_capability(bridge, cap))
 			return 0;
-		bridge = bridge->bus->dev;
+		bridge = bridge->upstream->dev;
 	}
 	return pos;
 }
@@ -1546,7 +1546,7 @@
 static void pci_bridge_route(struct bus *link, scan_state state)
 {
 	struct device *dev = link->dev;
-	struct bus *parent = dev->bus;
+	struct bus *parent = dev->upstream;
 	uint8_t primary, secondary, subordinate;
 
 	if (state == PCI_ROUTE_SCAN) {
@@ -1625,17 +1625,17 @@
 
 	printk(BIOS_SPEW, "%s for %s\n", __func__, dev_path(dev));
 
-	if (dev->link_list == NULL) {
+	if (dev->downstream == NULL) {
 		struct bus *link;
 		link = malloc(sizeof(*link));
 		if (link == NULL)
 			die("Couldn't allocate a link!\n");
 		memset(link, 0, sizeof(*link));
 		link->dev = dev;
-		dev->link_list = link;
+		dev->downstream = link;
 	}
 
-	bus = dev->link_list;
+	bus = dev->downstream;
 
 	pci_bridge_vga_compat(bus);
 
@@ -1670,7 +1670,7 @@
  */
 void pci_host_bridge_scan_bus(struct device *dev)
 {
-	struct bus *link = dev->link_list;
+	struct bus *link = dev->downstream;
 	pci_scan_bus(link, PCI_DEVFN(0, 0), 0xff);
 }
 
@@ -1733,8 +1733,8 @@
 
 	/* While our current device has parent devices */
 	child = dev;
-	for (parent = child->bus->dev; parent; parent = parent->bus->dev) {
-		parent_bus = parent->bus->secondary;
+	for (parent = child->upstream->dev; parent; parent = parent->upstream->dev) {
+		parent_bus = parent->upstream->secondary;
 		parent_devfn = parent->path.pci.devfn;
 		child_devfn = child->path.pci.devfn;
 
@@ -1798,7 +1798,7 @@
 	if (!(dev->enabled && (dev->path.type == DEVICE_PATH_PCI)))
 		return -1;
 
-	bus = dev->bus->secondary;
+	bus = dev->upstream->secondary;
 	devfn = dev->path.pci.devfn;
 
 	/* Get and validate the interrupt pin used. Only 1-4 are allowed */
diff --git a/src/device/pci_rom.c b/src/device/pci_rom.c
index cc1e5d1..1e212ab 100644
--- a/src/device/pci_rom.c
+++ b/src/device/pci_rom.c
@@ -230,7 +230,7 @@
 		printk(BIOS_ERR, "%s failed\n", __func__);
 		return current;
 	}
-	if (device->bus->segment_group) {
+	if (device->upstream->segment_group) {
 		printk(BIOS_ERR, "VFCT only supports GPU in first PCI segment group.\n");
 		return current;
 	}
@@ -243,7 +243,7 @@
 
 	header->DeviceID = device->device;
 	header->VendorID = device->vendor;
-	header->PCIBus = device->bus->secondary;
+	header->PCIBus = device->upstream->secondary;
 	header->PCIFunction = PCI_FUNC(device->path.pci.devfn);
 	header->PCIDevice = PCI_SLOT(device->path.pci.devfn);
 	header->ImageLength = rom->size * 512;
diff --git a/src/device/pciexp_device.c b/src/device/pciexp_device.c
index ab8430f..969dbb00 100644
--- a/src/device/pciexp_device.c
+++ b/src/device/pciexp_device.c
@@ -302,7 +302,7 @@
 	struct device *parent = NULL;
 	unsigned int parent_cap = 0;
 	if (!dev->ops->ops_pci || !dev->ops->ops_pci->get_ltr_max_latencies) {
-		parent = dev->bus->dev;
+		parent = dev->upstream->dev;
 		if (parent->path.type != DEVICE_PATH_PCI)
 			return;
 		parent_cap = pci_find_capability(parent, PCI_CAP_ID_PCIE);
@@ -319,9 +319,9 @@
 	do {
 		if (dev->ops->ops_pci && dev->ops->ops_pci->get_ltr_max_latencies)
 			break;
-		if (dev->bus->dev == dev || dev->bus->dev->path.type != DEVICE_PATH_PCI)
+		if (dev->upstream->dev == dev || dev->upstream->dev->path.type != DEVICE_PATH_PCI)
 			return false;
-		dev = dev->bus->dev;
+		dev = dev->upstream->dev;
 	} while (true);
 
 	dev->ops->ops_pci->get_ltr_max_latencies(max_snoop, max_nosnoop);
@@ -627,7 +627,7 @@
 
 static void pciexp_tune_dev(struct device *dev)
 {
-	struct device *root = dev->bus->dev;
+	struct device *root = dev->upstream->dev;
 	unsigned int root_cap, cap;
 
 	cap = pci_find_capability(dev, PCI_CAP_ID_PCIE);
@@ -752,7 +752,7 @@
 	/* Add dummy slot to preserve resources, must happen after bus scan */
 	struct device *dummy;
 	struct device_path dummy_path = { .type = DEVICE_PATH_NONE };
-	dummy = alloc_dev(dev->link_list, &dummy_path);
+	dummy = alloc_dev(dev->downstream, &dummy_path);
 	dummy->ops = &pciexp_hotplug_dummy_ops;
 }
 
diff --git a/src/device/pcix_device.c b/src/device/pcix_device.c
index e40ed3b..7ddc15d 100644
--- a/src/device/pcix_device.c
+++ b/src/device/pcix_device.c
@@ -107,11 +107,11 @@
 	sstatus = pci_read_config16(dev, pos + PCI_X_SEC_STATUS);
 
 	if (PCI_X_SSTATUS_MFREQ(sstatus) != PCI_X_SSTATUS_CONVENTIONAL_PCI)
-		pcix_tune_bus(dev->link_list);
+		pcix_tune_bus(dev->downstream);
 
 	/* Print the PCI-X bus speed. */
-	printk(BIOS_DEBUG, "PCI: %02x:%02x: %s\n", dev->link_list->segment_group,
-	       dev->link_list->secondary, pcix_speed(sstatus));
+	printk(BIOS_DEBUG, "PCI: %02x:%02x: %s\n", dev->downstream->segment_group,
+	       dev->downstream->secondary, pcix_speed(sstatus));
 }
 
 /** Default device operations for PCI-X bridges */
diff --git a/src/device/pnp_device.c b/src/device/pnp_device.c
index dad791c..f799530 100644
--- a/src/device/pnp_device.c
+++ b/src/device/pnp_device.c
@@ -384,7 +384,7 @@
 			continue;
 
 		path.pnp.device = info[i].function;
-		dev = alloc_find_dev(base_dev->bus, &path);
+		dev = alloc_find_dev(base_dev->upstream, &path);
 
 		/* Don't initialize a device multiple times. */
 		if (dev->ops)
diff --git a/src/device/resource_allocator_v4.c b/src/device/resource_allocator_v4.c
index 73ec9c1..c9630bb 100644
--- a/src/device/resource_allocator_v4.c
+++ b/src/device/resource_allocator_v4.c
@@ -78,7 +78,7 @@
 
 static bool dev_has_children(const struct device *dev)
 {
-	const struct bus *bus = dev->link_list;
+	const struct bus *bus = dev->downstream;
 	return bus && bus->children;
 }
 
@@ -122,7 +122,7 @@
 	resource_t base;
 	const unsigned long type_mask = IORESOURCE_TYPE_MASK | IORESOURCE_PREFETCH;
 	const unsigned long type_match = bridge_res->flags & type_mask;
-	struct bus *bus = bridge->link_list;
+	struct bus *bus = bridge->downstream;
 
 	child_res = NULL;
 
@@ -208,7 +208,7 @@
 {
 	const struct device *child;
 	struct resource *res;
-	struct bus *bus = bridge->link_list;
+	struct bus *bus = bridge->downstream;
 	const unsigned long type_mask = IORESOURCE_TYPE_MASK | IORESOURCE_PREFETCH;
 
 	for (res = bridge->resource_list; res; res = res->next) {
@@ -256,10 +256,10 @@
 	const struct device *child;
 	const int print_depth = 1;
 
-	if (domain->link_list == NULL)
+	if (domain->downstream == NULL)
 		return;
 
-	for (child = domain->link_list->children; child; child = child->sibling) {
+	for (child = domain->downstream->children; child; child = child->sibling) {
 
 		/* Skip if this is not a bridge or has no children under it. */
 		if (!dev_has_children(child))
@@ -299,7 +299,7 @@
 		memranges_create_hole(ranges, res->base, res->size);
 	}
 
-	bus = dev->link_list;
+	bus = dev->downstream;
 	if (bus == NULL)
 		return;
 
@@ -399,7 +399,7 @@
 
 	setup_resource_ranges(domain, type, &ranges);
 
-	while ((dev = largest_resource(domain->link_list, &res, type_mask, type))) {
+	while ((dev = largest_resource(domain->downstream, &res, type_mask, type))) {
 
 		if (!res->size)
 			continue;
@@ -441,7 +441,7 @@
 {
 	const unsigned long type_mask =
 		IORESOURCE_TYPE_MASK | IORESOURCE_PREFETCH | IORESOURCE_FIXED;
-	struct bus *const bus = bridge->link_list;
+	struct bus *const bus = bridge->downstream;
 	struct resource *res;
 	struct device *child;
 
@@ -496,7 +496,7 @@
 	allocate_toplevel_resources(domain, IORESOURCE_MEM);
 
 	struct device *child;
-	for (child = domain->link_list->children; child; child = child->sibling) {
+	for (child = domain->downstream->children; child; child = child->sibling) {
 		if (!dev_has_children(child))
 			continue;
 
@@ -553,10 +553,10 @@
 {
 	const struct device *child;
 
-	if ((root == NULL) || (root->link_list == NULL))
+	if ((root == NULL) || (root->downstream == NULL))
 		return;
 
-	for (child = root->link_list->children; child; child = child->sibling) {
+	for (child = root->downstream->children; child; child = child->sibling) {
 
 		if (child->path.type != DEVICE_PATH_DOMAIN)
 			continue;
diff --git a/src/device/root_device.c b/src/device/root_device.c
index 54e82ea..0164b19 100644
--- a/src/device/root_device.c
+++ b/src/device/root_device.c
@@ -39,10 +39,10 @@
 {
 	struct device *child;
 
-	if (!bus->link_list)
+	if (!bus->downstream)
 		return;
 
-	for (child = bus->link_list->children; child; child = child->sibling)
+	for (child = bus->downstream->children; child; child = child->sibling)
 		enable_static_device(child);
 }
 
@@ -53,12 +53,12 @@
 
 	printk(BIOS_SPEW, "%s for %s\n", __func__, dev_path(bus));
 
-	if (bus->link_list) {
-		bus->link_list->secondary = ++bus_max;
+	if (bus->downstream) {
+		bus->downstream->secondary = ++bus_max;
 
-		for (child = bus->link_list->children; child; child = child->sibling) {
+		for (child = bus->downstream->children; child; child = child->sibling) {
 			enable_static_device(child);
-			printk(BIOS_DEBUG, "bus: %s->", dev_path(child->bus->dev));
+			printk(BIOS_DEBUG, "bus: %s->", dev_path(child->upstream->dev));
 		}
 	}
 
@@ -86,8 +86,8 @@
 
 	enable_static_devices(bus);
 
-	if (bus->link_list)
-		scan_bridges(bus->link_list);
+	if (bus->downstream)
+		scan_bridges(bus->downstream);
 
 	printk(BIOS_SPEW, "%s for %s done\n", __func__, dev_path(bus));
 }
diff --git a/src/drivers/i2c/ptn3460/ptn3460.c b/src/drivers/i2c/ptn3460/ptn3460.c
index 93acb18..76b3bc8 100644
--- a/src/drivers/i2c/ptn3460/ptn3460.c
+++ b/src/drivers/i2c/ptn3460/ptn3460.c
@@ -172,8 +172,8 @@
 		return;
 	}
 	/* Initialize the I2C controller before it is used. */
-	if (ptn_dev->bus && ptn_dev->bus->dev->ops && ptn_dev->bus->dev->ops->init)
-		ptn_dev->bus->dev->ops->init(ptn_dev->bus->dev);
+	if (ptn_dev->upstream && ptn_dev->upstream->dev->ops && ptn_dev->upstream->dev->ops->init)
+		ptn_dev->upstream->dev->ops->init(ptn_dev->upstream->dev);
 	ptn3460_init(ptn_dev);
 }
 
diff --git a/src/drivers/intel/dptf/dptf.c b/src/drivers/intel/dptf/dptf.c
index bceb0de..f313540 100644
--- a/src/drivers/intel/dptf/dptf.c
+++ b/src/drivers/intel/dptf/dptf.c
@@ -503,7 +503,7 @@
 	enum dptf_participant p;
 
 	/* The CPU device gets an _ADR that matches the ACPI PCI address for 00:04.00 */
-	parent = dev && dev->bus ? dev->bus->dev : NULL;
+	parent = dev && dev->upstream ? dev->upstream->dev : NULL;
 	if (!parent || parent->path.type != DEVICE_PATH_PCI) {
 		printk(BIOS_ERR, "%s: DPTF objects must live under 00:04.0 PCI device\n",
 		       __func__);
diff --git a/src/drivers/intel/ish/ish.c b/src/drivers/intel/ish/ish.c
index 6dba46a..0ad0bb8 100644
--- a/src/drivers/intel/ish/ish.c
+++ b/src/drivers/intel/ish/ish.c
@@ -12,7 +12,7 @@
 static void ish_fill_ssdt_generator(const struct device *dev)
 {
 	struct drivers_intel_ish_config *config = dev->chip_info;
-	struct device *root = dev->bus->dev;
+	struct device *root = dev->upstream->dev;
 	struct acpi_dp *dsd;
 
 	if (!config)
diff --git a/src/drivers/intel/mipi_camera/camera.c b/src/drivers/intel/mipi_camera/camera.c
index 77c86ea..4044a26 100644
--- a/src/drivers/intel/mipi_camera/camera.c
+++ b/src/drivers/intel/mipi_camera/camera.c
@@ -199,7 +199,7 @@
 static uint32_t address_for_dev_type(const struct device *dev, uint8_t dev_type)
 {
 	struct drivers_intel_mipi_camera_config *config = dev->chip_info;
-	uint16_t i2c_bus = dev->bus ? dev->bus->secondary : 0xFFFF;
+	uint16_t i2c_bus = dev->upstream ? dev->upstream->secondary : 0xFFFF;
 	uint16_t i2c_addr;
 
 	switch (dev_type) {
@@ -416,7 +416,7 @@
 				.type = DEVICE_PATH_I2C,
 				.i2c.device = config->vcm_address,
 			};
-			struct device *vcm_dev = find_dev_path(dev->bus, &path);
+			struct device *vcm_dev = find_dev_path(dev->upstream, &path);
 			struct drivers_intel_mipi_camera_config *vcm_config;
 			vcm_config = vcm_dev ? vcm_dev->chip_info : NULL;
 
@@ -927,7 +927,7 @@
 	const struct device *pdev;
 
 	if (config->has_power_resource) {
-		pdev = dev->bus->dev;
+		pdev = dev->upstream->dev;
 		if (!pdev || !pdev->enabled)
 			return;
 
@@ -951,7 +951,7 @@
 		write_i2c_camera_device(dev, scope);
 		break;
 	case DEVICE_PATH_GENERIC:
-		pdev = dev->bus->dev;
+		pdev = dev->upstream->dev;
 		scope = acpi_device_scope(pdev);
 		if (!scope)
 			return;
diff --git a/src/drivers/intel/soundwire/soundwire.c b/src/drivers/intel/soundwire/soundwire.c
index f9421fc..0137dad 100644
--- a/src/drivers/intel/soundwire/soundwire.c
+++ b/src/drivers/intel/soundwire/soundwire.c
@@ -21,7 +21,7 @@
 {
 	struct device *child;
 
-	for (child = dev->link_list->children; child; child = child->sibling) {
+	for (child = dev->downstream->children; child; child = child->sibling) {
 		if (child->enabled && child->path.type == DEVICE_PATH_GENERIC &&
 		    child->path.generic.id == link)
 			return true;
diff --git a/src/drivers/net/phy/m88e1512/m88e1512.c b/src/drivers/net/phy/m88e1512/m88e1512.c
index 07110c6..7e67500 100644
--- a/src/drivers/net/phy/m88e1512/m88e1512.c
+++ b/src/drivers/net/phy/m88e1512/m88e1512.c
@@ -21,10 +21,10 @@
 	if (config->downshift_cnt) {
 		if (config->downshift_cnt > DOWNSHIFT_CNT_MAX) {
 			printk(BIOS_INFO, "%s: Downshift counter for %s is too large.\n",
-					dev_path(dev->bus->dev), dev->chip_ops->name);
+					dev_path(dev->upstream->dev), dev->chip_ops->name);
 		} else {
 			printk(BIOS_DEBUG, "%s: Enable downshift after %d attempts for %s.\n",
-					dev_path(dev->bus->dev), config->downshift_cnt,
+					dev_path(dev->upstream->dev), config->downshift_cnt,
 					dev->chip_ops->name);
 
 			reg = mdio_read(dev, COPPER_SPEC_CTRL_REG_1);
@@ -42,7 +42,7 @@
 	/* Configure LEDs if requested. */
 	if (config->configure_leds) {
 		printk(BIOS_DEBUG, "%s: Set a customized LED mode for %s.\n",
-				dev_path(dev->bus->dev), dev->chip_ops->name);
+				dev_path(dev->upstream->dev), dev->chip_ops->name);
 
 		/* Select page 3 to access LED function control register. */
 		switch_page(dev, 3);
@@ -57,7 +57,7 @@
 	/* INTn can be routed to LED[2] pin. */
 	if (config->enable_int) {
 		printk(BIOS_DEBUG, "%s: INTn is routed to LED[2] pin %s.\n",
-				dev_path(dev->bus->dev), dev->chip_ops->name);
+				dev_path(dev->upstream->dev), dev->chip_ops->name);
 
 		/* Select page 3 to access LED function control register. */
 		switch_page(dev, 3);
@@ -70,7 +70,7 @@
 	/* Set RGMII output impedance manually. */
 	if (config->force_mos) {
 		printk(BIOS_DEBUG, "%s: Set RGMII driver strength manually for %s.\n",
-				dev_path(dev->bus->dev), dev->chip_ops->name);
+				dev_path(dev->upstream->dev), dev->chip_ops->name);
 
 		/* Select page 2 to access RGMII output impedance calibration override
 		   register. */
diff --git a/src/drivers/net/r8168.c b/src/drivers/net/r8168.c
index 70a0f63..6d93ed2 100644
--- a/src/drivers/net/r8168.c
+++ b/src/drivers/net/r8168.c
@@ -364,7 +364,7 @@
 static void r8168_net_fill_ssdt(const struct device *dev)
 {
 	struct drivers_net_config *config = dev->chip_info;
-	const char *path = acpi_device_path(dev->bus->dev);
+	const char *path = acpi_device_path(dev->upstream->dev);
 	u32 address;
 
 	if (!path || !config)
diff --git a/src/drivers/nxp/uwb/uwb.c b/src/drivers/nxp/uwb/uwb.c
index 0f5ba47..b828657 100644
--- a/src/drivers/nxp/uwb/uwb.c
+++ b/src/drivers/nxp/uwb/uwb.c
@@ -15,10 +15,10 @@
 	struct device *spi_dev;
 	struct device_operations *ops;
 
-	if (!dev->bus || !dev->bus->dev)
+	if (!dev->upstream || !dev->upstream->dev)
 		return -1;
 
-	spi_dev = dev->bus->dev;
+	spi_dev = dev->upstream->dev;
 	ops = spi_dev->ops;
 
 	if (ops && ops->ops_spi_bus && ops->ops_spi_bus->dev_to_bus)
diff --git a/src/drivers/pcie/generic/generic.c b/src/drivers/pcie/generic/generic.c
index 1b7976e..e401261 100644
--- a/src/drivers/pcie/generic/generic.c
+++ b/src/drivers/pcie/generic/generic.c
@@ -27,13 +27,13 @@
 	pci_rom_ssdt(dev);
 
 	config = dev->chip_info;
-	if (!config || !dev->bus || !dev->bus->dev)
+	if (!config || !dev->upstream || !dev->upstream->dev)
 		return;
 
 	const char *scope;
 	const char *name;
 
-	scope = acpi_device_path(dev->bus->dev);
+	scope = acpi_device_path(dev->upstream->dev);
 	name = acpi_device_name(dev);
 
 	acpigen_write_scope(scope);
diff --git a/src/drivers/spi/acpi/acpi.c b/src/drivers/spi/acpi/acpi.c
index b58bc2d..537c377 100644
--- a/src/drivers/spi/acpi/acpi.c
+++ b/src/drivers/spi/acpi/acpi.c
@@ -15,10 +15,10 @@
 	struct device *spi_dev;
 	struct device_operations *ops;
 
-	if (!dev->bus || !dev->bus->dev)
+	if (!dev->upstream || !dev->upstream->dev)
 		return -1;
 
-	spi_dev = dev->bus->dev;
+	spi_dev = dev->upstream->dev;
 	ops = spi_dev->ops;
 
 	if (ops && ops->ops_spi_bus &&
diff --git a/src/drivers/usb/hub/acpi.c b/src/drivers/usb/hub/acpi.c
index e26d584..3944952 100644
--- a/src/drivers/usb/hub/acpi.c
+++ b/src/drivers/usb/hub/acpi.c
@@ -41,7 +41,7 @@
 	struct device *port = NULL;
 	unsigned int child_count = 0;
 
-	while ((port = dev_bus_each_child(dev->link_list, port)) != NULL) {
+	while ((port = dev_bus_each_child(dev->downstream, port)) != NULL) {
 		if (child_count++ >= config->port_count) {
 			printk(BIOS_WARNING, "%s cannot be added. Port Count limit reached.\n",
 			       dev_name(port));
diff --git a/src/drivers/usb/pci_xhci/pci_xhci.c b/src/drivers/usb/pci_xhci/pci_xhci.c
index 398595d..47f69c0 100644
--- a/src/drivers/usb/pci_xhci/pci_xhci.c
+++ b/src/drivers/usb/pci_xhci/pci_xhci.c
@@ -76,7 +76,7 @@
 		if (is_root_device(dev))
 			return NULL;
 
-		dev = dev->bus->dev;
+		dev = dev->upstream->dev;
 	}
 
 	return dev;
diff --git a/src/drivers/wifi/generic/acpi.c b/src/drivers/wifi/generic/acpi.c
index f37a084..6abad83 100644
--- a/src/drivers/wifi/generic/acpi.c
+++ b/src/drivers/wifi/generic/acpi.c
@@ -610,7 +610,7 @@
 	if (!dev)
 		return;
 
-	path = acpi_device_path(dev->bus->dev);
+	path = acpi_device_path(dev->upstream->dev);
 	if (!path)
 		return;
 
diff --git a/src/drivers/wifi/generic/smbios.c b/src/drivers/wifi/generic/smbios.c
index 82c96a5..e6ccd5d 100644
--- a/src/drivers/wifi/generic/smbios.c
+++ b/src/drivers/wifi/generic/smbios.c
@@ -38,5 +38,5 @@
 
 int smbios_write_wifi_cnvi(struct device *dev, int *handle, unsigned long *current)
 {
-	return smbios_write_wifi_pcie(dev->bus->dev, handle, current);
+	return smbios_write_wifi_pcie(dev->upstream->dev, handle, current);
 }
diff --git a/src/drivers/wwan/fm/acpi_fm350gl.c b/src/drivers/wwan/fm/acpi_fm350gl.c
index 77ff085..564ac03 100644
--- a/src/drivers/wwan/fm/acpi_fm350gl.c
+++ b/src/drivers/wwan/fm/acpi_fm350gl.c
@@ -317,7 +317,7 @@
 static void wwan_fm350gl_acpi_fill_ssdt(const struct device *dev)
 {
 	const struct drivers_wwan_fm_config *config = config_of(dev);
-	const struct device *parent = dev->bus->dev;
+	const struct device *parent = dev->upstream->dev;
 	const char *scope = acpi_device_path(parent);
 	const struct soc_intel_common_block_pcie_rtd3_config *rtd3_config;
 
diff --git a/src/ec/google/chromeec/ec_acpi.c b/src/ec/google/chromeec/ec_acpi.c
index 3367cfa..cf29636 100644
--- a/src/ec/google/chromeec/ec_acpi.c
+++ b/src/ec/google/chromeec/ec_acpi.c
@@ -273,7 +273,7 @@
 	path.type = DEVICE_PATH_GENERIC;
 	path.generic.id = 0;
 	path.generic.subid = 0;
-	ec = alloc_find_dev(dev->bus, &path);
+	ec = alloc_find_dev(dev->upstream, &path);
 	ec->ops = &ec_ops;
 
 	if (CONFIG(DRIVERS_INTEL_DPTF))
diff --git a/src/include/device/device.h b/src/include/device/device.h
index 7e52f41..27ef82a 100644
--- a/src/include/device/device.h
+++ b/src/include/device/device.h
@@ -95,8 +95,8 @@
  */
 
 struct device {
-	DEVTREE_CONST struct bus *bus;	/* bus this device is on, for bridge
-					 * devices, it is the up stream bus */
+	DEVTREE_CONST struct bus *upstream;
+	DEVTREE_CONST struct bus *downstream;
 
 	DEVTREE_CONST struct device *sibling;	/* next device on this bus */
 
@@ -124,11 +124,6 @@
 	/* Base registers for this device. I/O, MEM and Expansion ROM */
 	DEVTREE_CONST struct resource *resource_list;
 
-	/* links are (downstream) buses attached to the device, usually a leaf
-	 * device with no children has 0 buses attached and a bridge has 1 bus
-	 */
-	DEVTREE_CONST struct bus *link_list;
-
 #if !DEVTREE_EARLY
 	struct device_operations *ops;
 	struct chip_operations *chip_ops;
@@ -458,11 +453,11 @@
 
 static inline bool is_root_device(const struct device *dev)
 {
-	if (!dev || !dev->bus)
+	if (!dev || !dev->upstream)
 		return false;
 
 	return (dev->path.type == DEVICE_PATH_ROOT) ||
-	       (dev->bus->dev == dev);
+	       (dev->upstream->dev == dev);
 }
 
 void enable_static_device(struct device *dev);
diff --git a/src/include/device/pci_ops.h b/src/include/device/pci_ops.h
index de5f913..90c59fb 100644
--- a/src/include/device/pci_ops.h
+++ b/src/include/device/pci_ops.h
@@ -12,8 +12,8 @@
 
 static __always_inline pci_devfn_t pcidev_bdf(const struct device *dev)
 {
-	return (dev->path.pci.devfn << 12) | (dev->bus->secondary << 20) |
-			(dev->bus->segment_group << 28);
+	return (dev->path.pci.devfn << 12) | (dev->upstream->secondary << 20) |
+		(dev->upstream->segment_group << 28);
 }
 
 static __always_inline pci_devfn_t pcidev_assert(const struct device *dev)
diff --git a/src/lib/smbios.c b/src/lib/smbios.c
index c6cfb05..449e4fd 100644
--- a/src/lib/smbios.c
+++ b/src/lib/smbios.c
@@ -1114,8 +1114,8 @@
 	return smbios_write_type41(current, handle,
 					name, // name
 					instance_id, // inst
-					dev->bus->segment_group, // segment group
-					dev->bus->secondary, //bus
+					dev->upstream->segment_group, // segment group
+					dev->upstream->secondary, //bus
 					PCI_SLOT(dev->path.pci.devfn), // device
 					PCI_FUNC(dev->path.pci.devfn), // func
 					device_type);
@@ -1167,8 +1167,8 @@
 				  0,
 				  1,
 				  0,
-				  dev->bus->segment_group,
-				  dev->bus->secondary,
+				  dev->upstream->segment_group,
+				  dev->upstream->secondary,
 				  dev->path.pci.devfn);
 }
 
diff --git a/src/mainboard/aopen/dxplplusu/acpi_tables.c b/src/mainboard/aopen/dxplplusu/acpi_tables.c
index e22b454..114068f 100644
--- a/src/mainboard/aopen/dxplplusu/acpi_tables.c
+++ b/src/mainboard/aopen/dxplplusu/acpi_tables.c
@@ -11,7 +11,7 @@
 	bdev = pcidev_on_root(2, 0);
 	/* P64H2 Bus B IOAPIC */
 	if (bdev)
-		dev = pcidev_path_behind(bdev->link_list, PCI_DEVFN(28, 0));
+		dev = pcidev_path_behind(bdev->downstream, PCI_DEVFN(28, 0));
 	if (dev) {
 		res = find_resource(dev, PCI_BASE_ADDRESS_0);
 		current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, res->base);
@@ -19,7 +19,7 @@
 
 	/* P64H2 Bus A IOAPIC */
 	if (bdev)
-		dev = pcidev_path_behind(bdev->link_list, PCI_DEVFN(30, 0));
+		dev = pcidev_path_behind(bdev->downstream, PCI_DEVFN(30, 0));
 	if (dev) {
 		res = find_resource(dev, PCI_BASE_ADDRESS_0);
 		current += acpi_create_madt_ioapic_from_hw((acpi_madt_ioapic_t *)current, res->base);
diff --git a/src/mainboard/emulation/qemu-i440fx/northbridge.c b/src/mainboard/emulation/qemu-i440fx/northbridge.c
index 6c26366..609e389 100644
--- a/src/mainboard/emulation/qemu-i440fx/northbridge.c
+++ b/src/mainboard/emulation/qemu-i440fx/northbridge.c
@@ -39,7 +39,7 @@
 
 static void cpu_pci_domain_set_resources(struct device *dev)
 {
-	assign_resources(dev->link_list);
+	assign_resources(dev->downstream);
 }
 
 static void cpu_pci_domain_read_resources(struct device *dev)
diff --git a/src/mainboard/google/brox/mainboard.c b/src/mainboard/google/brox/mainboard.c
index f892099..5820805 100644
--- a/src/mainboard/google/brox/mainboard.c
+++ b/src/mainboard/google/brox/mainboard.c
@@ -106,7 +106,7 @@
 static void mainboard_generate_wwan_shutdown(const struct device *dev)
 {
 	const struct drivers_wwan_fm_config *config = config_of(dev);
-	const struct device *parent = dev->bus->dev;
+	const struct device *parent = dev->upstream->dev;
 
 	if (!config)
 		return;
@@ -126,7 +126,7 @@
 static void mainboard_generate_dgpu_shutdown(const struct device *dev)
 {
 	/* Call `_OFF` from the Power Resource associated with the dGPU's PEG port. */
-	const struct device *parent = dev->bus->dev;
+	const struct device *parent = dev->upstream->dev;
 
 	if (parent)
 		acpigen_emit_namestring(acpi_device_path_join(parent, "PGPR._OFF"));
diff --git a/src/mainboard/google/brya/mainboard.c b/src/mainboard/google/brya/mainboard.c
index aa332cd..9cf56b2 100644
--- a/src/mainboard/google/brya/mainboard.c
+++ b/src/mainboard/google/brya/mainboard.c
@@ -106,7 +106,7 @@
 static void mainboard_generate_wwan_shutdown(const struct device *dev)
 {
 	const struct drivers_wwan_fm_config *config = config_of(dev);
-	const struct device *parent = dev->bus->dev;
+	const struct device *parent = dev->upstream->dev;
 
 	if (!config)
 		return;
@@ -126,7 +126,7 @@
 static void mainboard_generate_dgpu_shutdown(const struct device *dev)
 {
 	/* Call `_OFF` from the Power Resource associated with the dGPU's PEG port. */
-	const struct device *parent = dev->bus->dev;
+	const struct device *parent = dev->upstream->dev;
 
 	if (parent)
 		acpigen_emit_namestring(acpi_device_path_join(parent, "PGPR._OFF"));
diff --git a/src/mainboard/google/kahlee/variants/careena/mainboard.c b/src/mainboard/google/kahlee/variants/careena/mainboard.c
index 937a411..c54b530 100644
--- a/src/mainboard/google/kahlee/variants/careena/mainboard.c
+++ b/src/mainboard/google/kahlee/variants/careena/mainboard.c
@@ -26,7 +26,7 @@
 	if (mmio_dev == NULL)
 		return;
 
-	while ((child = dev_bus_each_child(mmio_dev->link_list, child)) != NULL) {
+	while ((child = dev_bus_each_child(mmio_dev->downstream, child)) != NULL) {
 		if (child->path.type != DEVICE_PATH_I2C)
 			continue;
 		if (child->path.i2c.device != 0x1a)
diff --git a/src/mainboard/google/kahlee/variants/treeya/audio.c b/src/mainboard/google/kahlee/variants/treeya/audio.c
index ac7f7a2..e7a20ea 100644
--- a/src/mainboard/google/kahlee/variants/treeya/audio.c
+++ b/src/mainboard/google/kahlee/variants/treeya/audio.c
@@ -25,7 +25,7 @@
 		}
 	} while (mmio_dev->path.mmio.addr != APU_I2C0_BASE);
 
-	while ((child = dev_bus_each_child(mmio_dev->link_list, child)) != NULL) {
+	while ((child = dev_bus_each_child(mmio_dev->downstream, child)) != NULL) {
 		if (child->path.type != DEVICE_PATH_I2C)
 			continue;
 		if (child->path.i2c.device != RT58_I2C_ADDRESS)
diff --git a/src/mainboard/google/octopus/mainboard.c b/src/mainboard/google/octopus/mainboard.c
index 92b1074..3392a3c 100644
--- a/src/mainboard/google/octopus/mainboard.c
+++ b/src/mainboard/google/octopus/mainboard.c
@@ -179,7 +179,7 @@
 {
 	struct device *audio_dev = NULL;
 	struct bus *audio_i2c_bus =
-		pcidev_path_on_root(PCH_DEVFN_I2C5)->link_list;
+		pcidev_path_on_root(PCH_DEVFN_I2C5)->downstream;
 	enum ssfc_audio_codec codec = ssfc_get_audio_codec();
 
 	while ((audio_dev = dev_bus_each_child(audio_i2c_bus, audio_dev))) {
diff --git a/src/mainboard/google/rex/mainboard.c b/src/mainboard/google/rex/mainboard.c
index 3ca85ff..bf489ff 100644
--- a/src/mainboard/google/rex/mainboard.c
+++ b/src/mainboard/google/rex/mainboard.c
@@ -82,7 +82,7 @@
 static void mainboard_generate_wwan_shutdown(const struct device *dev)
 {
 	const struct drivers_wwan_fm_config *config = config_of(dev);
-	const struct device *parent = dev->bus->dev;
+	const struct device *parent = dev->upstream->dev;
 
 	if (!config)
 		return;
diff --git a/src/mainboard/google/zork/variants/baseboard/ramstage_common.c b/src/mainboard/google/zork/variants/baseboard/ramstage_common.c
index 3c203f5..a544548 100644
--- a/src/mainboard/google/zork/variants/baseboard/ramstage_common.c
+++ b/src/mainboard/google/zork/variants/baseboard/ramstage_common.c
@@ -115,7 +115,7 @@
 	if (variant_uses_v3_6_schematics())
 		return;
 
-	while ((child = dev_bus_each_child(mmio_dev->link_list, child)) != NULL) {
+	while ((child = dev_bus_each_child(mmio_dev->downstream, child)) != NULL) {
 		struct drivers_i2c_generic_config *cfg;
 
 		if (child->chip_ops == &drivers_i2c_generic_ops) {
diff --git a/src/mainboard/ibase/mb899/mptable.c b/src/mainboard/ibase/mb899/mptable.c
index 4ec578a..a9ad7c7 100644
--- a/src/mainboard/ibase/mb899/mptable.c
+++ b/src/mainboard/ibase/mb899/mptable.c
@@ -19,7 +19,7 @@
 
 	firewire = dev_find_device(0x104c, 0x8023, 0);
 	if (firewire) {
-		firewire_bus = firewire->bus->secondary;
+		firewire_bus = firewire->upstream->secondary;
 		printk(BIOS_SPEW, "Firewire device is on bus %x\n",
 				firewire_bus);
 	}
@@ -30,7 +30,7 @@
 	if (!riser)
 		riser = dev_find_device(0x3388, 0x0022, 0);
 	if (riser) {
-		riser_bus = riser->link_list->secondary;
+		riser_bus = riser->downstream->secondary;
 		printk(BIOS_SPEW, "Riser bus is %x\n", riser_bus);
 	}
 
diff --git a/src/mainboard/kontron/986lcd-m/mptable.c b/src/mainboard/kontron/986lcd-m/mptable.c
index 605b8d7..b0bfbe7 100644
--- a/src/mainboard/kontron/986lcd-m/mptable.c
+++ b/src/mainboard/kontron/986lcd-m/mptable.c
@@ -18,7 +18,7 @@
 
 	firewire = dev_find_device(0x104c, 0x8023, 0);
 	if (firewire) {
-		firewire_bus = firewire->bus->secondary;
+		firewire_bus = firewire->upstream->secondary;
 	}
 
 	/* If a riser card is used, this riser is detected on bus 4, so its secondary bus is the */
@@ -27,7 +27,7 @@
 	if (!riser)
 		riser = dev_find_device(0x3388, 0x0022, 0);
 	if (riser) {
-		riser_bus = riser->link_list->secondary;
+		riser_bus = riser->downstream->secondary;
 	}
 
 	mptable_write_buses(mc, NULL, &isa_bus);
diff --git a/src/mainboard/pcengines/apu2/mainboard.c b/src/mainboard/pcengines/apu2/mainboard.c
index a09fa66..ac5c928 100644
--- a/src/mainboard/pcengines/apu2/mainboard.c
+++ b/src/mainboard/pcengines/apu2/mainboard.c
@@ -277,7 +277,7 @@
 
 	dev = pcidev_on_root(2, 2);
 	if (dev)
-		dev = pcidev_path_behind(dev->link_list, PCI_DEVFN(0, 0));
+		dev = pcidev_path_behind(dev->downstream, PCI_DEVFN(0, 0));
 	if (!dev)
 		return serial;
 
diff --git a/src/mainboard/roda/rk9/ti_pci7xx1.c b/src/mainboard/roda/rk9/ti_pci7xx1.c
index 3ff339c..970e83d 100644
--- a/src/mainboard/roda/rk9/ti_pci7xx1.c
+++ b/src/mainboard/roda/rk9/ti_pci7xx1.c
@@ -19,7 +19,7 @@
 		u16 gcr = pci_read_config16(dev, 0x86);
 		for (fn = 5; fn > 0; --fn) {
 			const struct device *const d =
-				pcidev_path_behind(dev->bus, PCI_DEVFN(slot, fn));
+				pcidev_path_behind(dev->upstream, PCI_DEVFN(slot, fn));
 			if (!d || d->enabled) continue;
 			printk(BIOS_DEBUG,
 				"%s: Hiding function #%d.\n", __func__, fn);
diff --git a/src/mainboard/siemens/fa_ehl/mainboard.c b/src/mainboard/siemens/fa_ehl/mainboard.c
index 7aa0d86..ac16346 100644
--- a/src/mainboard/siemens/fa_ehl/mainboard.c
+++ b/src/mainboard/siemens/fa_ehl/mainboard.c
@@ -42,7 +42,7 @@
  */
 enum cb_err mainboard_get_mac_address(struct device *dev, uint8_t mac[MAC_ADDR_LEN])
 {
-	struct bus *parent = dev->bus;
+	struct bus *parent = dev->upstream;
 	uint8_t buf[16], mapping[16], i = 0, chain_len = 0;
 
 	memset(buf, 0, sizeof(buf));
@@ -51,10 +51,10 @@
 	/* The first entry in the tree is the device itself. */
 	buf[0] = dev->path.pci.devfn;
 	chain_len = 1;
-	for (i = 1; i < MAX_PATH_DEPTH && parent->dev->bus->subordinate; i++) {
+	for (i = 1; i < MAX_PATH_DEPTH && parent->dev->upstream->subordinate; i++) {
 		buf[i] = parent->dev->path.pci.devfn;
 		chain_len++;
-		parent = parent->dev->bus;
+		parent = parent->dev->upstream;
 	}
 	if (i == MAX_PATH_DEPTH) {
 		/* The path is deeper than MAX_PATH_DEPTH devices, error. */
diff --git a/src/mainboard/siemens/mc_apl1/mainboard.c b/src/mainboard/siemens/mc_apl1/mainboard.c
index 0593797..51427be 100644
--- a/src/mainboard/siemens/mc_apl1/mainboard.c
+++ b/src/mainboard/siemens/mc_apl1/mainboard.c
@@ -55,7 +55,7 @@
  */
 enum cb_err mainboard_get_mac_address(struct device *dev, uint8_t mac[MAC_ADDR_LEN])
 {
-	struct bus *parent = dev->bus;
+	struct bus *parent = dev->upstream;
 	uint8_t buf[16], mapping[16], i = 0, chain_len = 0;
 
 	memset(buf, 0, sizeof(buf));
@@ -64,10 +64,10 @@
 	/* The first entry in the tree is the device itself. */
 	buf[0] = dev->path.pci.devfn;
 	chain_len = 1;
-	for (i = 1; i < MAX_PATH_DEPTH && parent->dev->bus->subordinate; i++) {
+	for (i = 1; i < MAX_PATH_DEPTH && parent->dev->upstream->subordinate; i++) {
 		buf[i] = parent->dev->path.pci.devfn;
 		chain_len++;
-		parent = parent->dev->bus;
+		parent = parent->dev->upstream;
 	}
 	if (i == MAX_PATH_DEPTH) {
 		/* The path is deeper than MAX_PATH_DEPTH devices, error. */
diff --git a/src/mainboard/siemens/mc_apl1/variants/mc_apl3/mainboard.c b/src/mainboard/siemens/mc_apl1/variants/mc_apl3/mainboard.c
index b61f32d..c6beff6 100644
--- a/src/mainboard/siemens/mc_apl1/variants/mc_apl3/mainboard.c
+++ b/src/mainboard/siemens/mc_apl1/variants/mc_apl3/mainboard.c
@@ -41,7 +41,7 @@
 
 		/* Disable clock outputs 0 and 2-4 (CLKOUT) for upstream XIO2001 PCIe to PCI
 		   Bridge. */
-		struct device *parent = dev->bus->dev;
+		struct device *parent = dev->upstream->dev;
 		if (parent && parent->device == PCI_DID_TI_XIO2001)
 			pci_write_config8(parent, 0xd8, 0x1d);
 	}
@@ -50,7 +50,7 @@
 	   mainboard. */
 	dev = dev_find_device(PCI_VID_SIEMENS, 0x403f, 0);
 	if (dev) {
-		struct device *parent = dev->bus->dev;
+		struct device *parent = dev->upstream->dev;
 		if (parent && parent->device == PCI_DID_TI_XIO2001)
 			pci_write_config8(parent, 0xd8, 0x3c);
 	}
diff --git a/src/mainboard/siemens/mc_apl1/variants/mc_apl5/mainboard.c b/src/mainboard/siemens/mc_apl1/variants/mc_apl5/mainboard.c
index 8eedce6..eda4b1b 100644
--- a/src/mainboard/siemens/mc_apl1/variants/mc_apl5/mainboard.c
+++ b/src/mainboard/siemens/mc_apl1/variants/mc_apl5/mainboard.c
@@ -51,7 +51,7 @@
 
 		/* Disable clock outputs 0-3 (CLKOUT) for upstream XIO2001 PCIe to PCI
 		   Bridge. */
-		struct device *parent = dev->bus->dev;
+		struct device *parent = dev->upstream->dev;
 		if (parent && parent->device == PCI_DID_TI_XIO2001)
 			pci_write_config8(parent, 0xd8, 0x0f);
 	}
@@ -60,7 +60,7 @@
 	   mainboard. */
 	dev = dev_find_device(PCI_VID_SIEMENS, 0x403f, 0);
 	if (dev) {
-		struct device *parent = dev->bus->dev;
+		struct device *parent = dev->upstream->dev;
 		if (parent && parent->device == PCI_DID_TI_XIO2001)
 			pci_write_config8(parent, 0xd8, 0x3e);
 	}
diff --git a/src/mainboard/siemens/mc_apl1/variants/mc_apl6/mainboard.c b/src/mainboard/siemens/mc_apl1/variants/mc_apl6/mainboard.c
index 1856a35..a5fe3d7 100644
--- a/src/mainboard/siemens/mc_apl1/variants/mc_apl6/mainboard.c
+++ b/src/mainboard/siemens/mc_apl1/variants/mc_apl6/mainboard.c
@@ -41,7 +41,7 @@
 
 		/* Disable clock outputs 0-3 (CLKOUT) for upstream XIO2001 PCIe to PCI
 		   Bridge. */
-		struct device *parent = dev->bus->dev;
+		struct device *parent = dev->upstream->dev;
 		if (parent && parent->device == PCI_DID_TI_XIO2001)
 			pci_write_config8(parent, 0xd8, 0x0F);
 	}
@@ -50,7 +50,7 @@
 	   mainboard. */
 	dev = dev_find_device(PCI_VID_SIEMENS, 0x403f, 0);
 	if (dev) {
-		struct device *parent = dev->bus->dev;
+		struct device *parent = dev->upstream->dev;
 		if (parent && parent->device == PCI_DID_TI_XIO2001)
 			pci_write_config8(parent, 0xd8, 0x3c);
 	}
diff --git a/src/mainboard/siemens/mc_ehl/mainboard.c b/src/mainboard/siemens/mc_ehl/mainboard.c
index 7aa0d86..ac16346 100644
--- a/src/mainboard/siemens/mc_ehl/mainboard.c
+++ b/src/mainboard/siemens/mc_ehl/mainboard.c
@@ -42,7 +42,7 @@
  */
 enum cb_err mainboard_get_mac_address(struct device *dev, uint8_t mac[MAC_ADDR_LEN])
 {
-	struct bus *parent = dev->bus;
+	struct bus *parent = dev->upstream;
 	uint8_t buf[16], mapping[16], i = 0, chain_len = 0;
 
 	memset(buf, 0, sizeof(buf));
@@ -51,10 +51,10 @@
 	/* The first entry in the tree is the device itself. */
 	buf[0] = dev->path.pci.devfn;
 	chain_len = 1;
-	for (i = 1; i < MAX_PATH_DEPTH && parent->dev->bus->subordinate; i++) {
+	for (i = 1; i < MAX_PATH_DEPTH && parent->dev->upstream->subordinate; i++) {
 		buf[i] = parent->dev->path.pci.devfn;
 		chain_len++;
-		parent = parent->dev->bus;
+		parent = parent->dev->upstream;
 	}
 	if (i == MAX_PATH_DEPTH) {
 		/* The path is deeper than MAX_PATH_DEPTH devices, error. */
diff --git a/src/northbridge/amd/pi/00730F01/northbridge.c b/src/northbridge/amd/pi/00730F01/northbridge.c
index 7e9cfd8..b318be0 100644
--- a/src/northbridge/amd/pi/00730F01/northbridge.c
+++ b/src/northbridge/amd/pi/00730F01/northbridge.c
@@ -186,7 +186,7 @@
 		ivrs_ivhd_generic_t *ivhd_entry = (ivrs_ivhd_generic_t *)*current;
 
 		ivhd_entry->type = type;
-		ivhd_entry->dev_id = dev->path.pci.devfn | (dev->bus->secondary << 8);
+		ivhd_entry->dev_id = dev->path.pci.devfn | (dev->upstream->secondary << 8);
 		ivhd_entry->dte_setting = data;
 		*current += sizeof(ivrs_ivhd_generic_t);
 	} else if (type == IVHD_DEV_8_BYTE_ALIAS_SELECT) {
@@ -195,12 +195,12 @@
 		ivrs_ivhd_alias_t *ivhd_entry = (ivrs_ivhd_alias_t *)*current;
 
 		ivhd_entry->type = type;
-		ivhd_entry->dev_id = dev->path.pci.devfn | (dev->bus->secondary << 8);
+		ivhd_entry->dev_id = dev->path.pci.devfn | (dev->upstream->secondary << 8);
 		ivhd_entry->dte_setting = data;
 		ivhd_entry->reserved1 = 0;
 		ivhd_entry->reserved2 = 0;
 		ivhd_entry->source_dev_id = parent->path.pci.devfn |
-					    (parent->bus->secondary << 8);
+					    (parent->upstream->secondary << 8);
 		*current += sizeof(ivrs_ivhd_alias_t);
 	}
 
@@ -243,7 +243,7 @@
 
 	if (dev->path.type == DEVICE_PATH_PCI) {
 
-		if ((dev->bus->secondary == 0x0) &&
+		if ((dev->upstream->secondary == 0x0) &&
 		    (dev->path.pci.devfn == 0x0))
 			*root_level = depth;
 
@@ -253,8 +253,8 @@
 		}
 	}
 
-	if (dev->link_list) {
-		for (sibling = dev->link_list->children; sibling; sibling = sibling->sibling)
+	if (dev->downstream) {
+		for (sibling = dev->downstream->children; sibling; sibling = sibling->sibling)
 			add_ivhd_device_entries(dev, sibling, depth + 1, depth, root_level,
 						current, ivhd_length);
 	}
@@ -290,12 +290,12 @@
 	ivhd_11->flags = ivrs_agesa->ivhd.flags & 0x3f;
 	ivhd_11->length = sizeof(struct acpi_ivrs_ivhd_11);
 	/* BDF <bus>:00.2 */
-	ivhd_11->device_id = 0x02 | (nb_dev->bus->secondary << 8);
+	ivhd_11->device_id = 0x02 | (nb_dev->upstream->secondary << 8);
 	/* PCI Capability block 0x40 (type 0xf, "Secure device") */
 	ivhd_11->capability_offset = 0x40;
 	ivhd_11->iommu_base_low = ivrs_agesa->ivhd.iommu_base_low;
 	ivhd_11->iommu_base_high = ivrs_agesa->ivhd.iommu_base_high;
-	ivhd_11->pci_segment_group = nb_dev->bus->segment_group;
+	ivhd_11->pci_segment_group = nb_dev->upstream->segment_group;
 	ivhd_11->iommu_info = ivrs_agesa->ivhd.iommu_info;
 	ivhd_11->iommu_attributes.perf_counters =
 		(IOMMU_MMIO32(ivhd_11->iommu_base_low + 0x4000) >> 7) & 0xf;
@@ -358,12 +358,12 @@
 		ivrs->ivhd.flags = ivrs_agesa->ivhd.flags;
 		ivrs->ivhd.length = sizeof(struct acpi_ivrs_ivhd);
 		/* BDF <bus>:00.2 */
-		ivrs->ivhd.device_id = 0x02 | (nb_dev->bus->secondary << 8);
+		ivrs->ivhd.device_id = 0x02 | (nb_dev->upstream->secondary << 8);
 		/* PCI Capability block 0x40 (type 0xf, "Secure device") */
 		ivrs->ivhd.capability_offset = 0x40;
 		ivrs->ivhd.iommu_base_low = ivrs_agesa->ivhd.iommu_base_low;
 		ivrs->ivhd.iommu_base_high = ivrs_agesa->ivhd.iommu_base_high;
-		ivrs->ivhd.pci_segment_group = nb_dev->bus->segment_group;
+		ivrs->ivhd.pci_segment_group = nb_dev->upstream->segment_group;
 		ivrs->ivhd.iommu_info = ivrs_agesa->ivhd.iommu_info;
 		ivrs->ivhd.iommu_feature_info = ivrs_agesa->ivhd.iommu_feature_info;
 		/* Enable EFR if supported */
diff --git a/src/northbridge/intel/e7505/northbridge.c b/src/northbridge/intel/e7505/northbridge.c
index fa29ef5..23d60dc 100644
--- a/src/northbridge/intel/e7505/northbridge.c
+++ b/src/northbridge/intel/e7505/northbridge.c
@@ -52,7 +52,7 @@
 
 static void mch_domain_set_resources(struct device *dev)
 {
-	assign_resources(dev->link_list);
+	assign_resources(dev->downstream);
 }
 
 struct device_operations e7505_pci_domain_ops = {
diff --git a/src/northbridge/intel/gm45/northbridge.c b/src/northbridge/intel/gm45/northbridge.c
index 50d0d89..dc18791 100644
--- a/src/northbridge/intel/gm45/northbridge.c
+++ b/src/northbridge/intel/gm45/northbridge.c
@@ -122,7 +122,7 @@
 			report_resource_stored(dev, resource, "");
 	}
 
-	assign_resources(dev->link_list);
+	assign_resources(dev->downstream);
 }
 
 static void mch_domain_init(struct device *dev)
diff --git a/src/northbridge/intel/haswell/pcie.c b/src/northbridge/intel/haswell/pcie.c
index 7fe57e9..4eeaa3f 100644
--- a/src/northbridge/intel/haswell/pcie.c
+++ b/src/northbridge/intel/haswell/pcie.c
@@ -20,8 +20,8 @@
 	if (dev->path.type != DEVICE_PATH_PCI)
 		return NULL;
 
-	assert(dev->bus);
-	if (dev->bus->secondary == 0)
+	assert(dev->upstream);
+	if (dev->upstream->secondary == 0)
 		switch (dev->path.pci.devfn) {
 		case PCI_DEVFN(1, 0):
 			return "PEGP";
@@ -31,12 +31,12 @@
 			return "PEG2";
 		};
 
-	struct device *const port = dev->bus->dev;
+	struct device *const port = dev->upstream->dev;
 	assert(port);
-	assert(port->bus);
+	assert(port->upstream);
 
 	if (dev->path.pci.devfn == PCI_DEVFN(0, 0) &&
-	    port->bus->secondary == 0 &&
+	    port->upstream->secondary == 0 &&
 	    (port->path.pci.devfn == PCI_DEVFN(1, 0) ||
 	    port->path.pci.devfn == PCI_DEVFN(1, 1) ||
 	    port->path.pci.devfn == PCI_DEVFN(1, 2)))
diff --git a/src/northbridge/intel/i440bx/northbridge.c b/src/northbridge/intel/i440bx/northbridge.c
index d588197..0a72cb7 100644
--- a/src/northbridge/intel/i440bx/northbridge.c
+++ b/src/northbridge/intel/i440bx/northbridge.c
@@ -34,8 +34,8 @@
 
 	pci_domain_read_resources(dev);
 
-	pci_tolm = find_pci_tolm(dev->link_list);
-	mc_dev = dev->link_list->children;
+	pci_tolm = find_pci_tolm(dev->downstream);
+	mc_dev = dev->downstream->children;
 	if (mc_dev) {
 		unsigned long tomk, tolmk;
 		int idx;
diff --git a/src/northbridge/intel/i945/northbridge.c b/src/northbridge/intel/i945/northbridge.c
index 34ebcb2..79e9ee5 100644
--- a/src/northbridge/intel/i945/northbridge.c
+++ b/src/northbridge/intel/i945/northbridge.c
@@ -26,7 +26,7 @@
 	/* Can we find out how much memory we can use at most
 	 * this way?
 	 */
-	pci_tolm = find_pci_tolm(dev->link_list);
+	pci_tolm = find_pci_tolm(dev->downstream);
 	printk(BIOS_DEBUG, "pci_tolm: 0x%x\n", pci_tolm);
 
 	tolud = pci_read_config8(d0f0, TOLUD) << 24;
@@ -65,7 +65,7 @@
 	for (res = dev->resource_list; res; res = res->next)
 		report_resource_stored(dev, res, "");
 
-	assign_resources(dev->link_list);
+	assign_resources(dev->downstream);
 }
 
 static const char *northbridge_acpi_name(const struct device *dev)
diff --git a/src/northbridge/intel/pineview/northbridge.c b/src/northbridge/intel/pineview/northbridge.c
index d7a6c84..c24493a 100644
--- a/src/northbridge/intel/pineview/northbridge.c
+++ b/src/northbridge/intel/pineview/northbridge.c
@@ -108,7 +108,7 @@
 	for (res = dev->resource_list; res; res = res->next)
 		report_resource_stored(dev, res, "");
 
-	assign_resources(dev->link_list);
+	assign_resources(dev->downstream);
 }
 
 static void mch_domain_init(struct device *dev)
diff --git a/src/northbridge/intel/sandybridge/pcie.c b/src/northbridge/intel/sandybridge/pcie.c
index 96fb12f..244b0f5 100644
--- a/src/northbridge/intel/sandybridge/pcie.c
+++ b/src/northbridge/intel/sandybridge/pcie.c
@@ -13,8 +13,8 @@
 	if (dev->path.type != DEVICE_PATH_PCI)
 		return NULL;
 
-	assert(dev->bus);
-	if (dev->bus->secondary == 0)
+	assert(dev->upstream);
+	if (dev->upstream->secondary == 0)
 		switch (dev->path.pci.devfn) {
 		case PCI_DEVFN(1, 0):
 			return "PEGP";
@@ -26,12 +26,12 @@
 			return "PEG6";
 		};
 
-	struct device *const port = dev->bus->dev;
+	struct device *const port = dev->upstream->dev;
 	assert(port);
-	assert(port->bus);
+	assert(port->upstream);
 
 	if (dev->path.pci.devfn == PCI_DEVFN(0, 0) &&
-	    port->bus->secondary == 0 &&
+	    port->upstream->secondary == 0 &&
 	    (port->path.pci.devfn == PCI_DEVFN(1, 0) ||
 	     port->path.pci.devfn == PCI_DEVFN(1, 1) ||
 	     port->path.pci.devfn == PCI_DEVFN(1, 2) ||
diff --git a/src/northbridge/intel/x4x/northbridge.c b/src/northbridge/intel/x4x/northbridge.c
index b037cf8..4987cae 100644
--- a/src/northbridge/intel/x4x/northbridge.c
+++ b/src/northbridge/intel/x4x/northbridge.c
@@ -72,7 +72,7 @@
 	for (res = dev->resource_list; res; res = res->next)
 		report_resource_stored(dev, res, "");
 
-	assign_resources(dev->link_list);
+	assign_resources(dev->downstream);
 }
 
 static void mch_domain_init(struct device *dev)
diff --git a/src/soc/amd/cezanne/xhci.c b/src/soc/amd/cezanne/xhci.c
index b0205c6..fc1c119 100644
--- a/src/soc/amd/cezanne/xhci.c
+++ b/src/soc/amd/cezanne/xhci.c
@@ -26,10 +26,10 @@
 
 enum cb_err pci_xhci_get_wake_gpe(const struct device *dev, int *gpe)
 {
-	if (dev->bus->dev->path.type != DEVICE_PATH_PCI)
+	if (dev->upstream->dev->path.type != DEVICE_PATH_PCI)
 		return CB_ERR_ARG;
 
-	if (dev->bus->dev->path.pci.devfn != PCIE_ABC_A_DEVFN)
+	if (dev->upstream->dev->path.pci.devfn != PCIE_ABC_A_DEVFN)
 		return CB_ERR_ARG;
 
 	if (dev->path.type != DEVICE_PATH_PCI)
diff --git a/src/soc/amd/common/block/acpi/ivrs.c b/src/soc/amd/common/block/acpi/ivrs.c
index 57b5974..bd52d7c 100644
--- a/src/soc/amd/common/block/acpi/ivrs.c
+++ b/src/soc/amd/common/block/acpi/ivrs.c
@@ -96,7 +96,7 @@
 		memset(ivhd_entry, 0, sizeof(*ivhd_entry));
 
 		ivhd_entry->type = type;
-		ivhd_entry->dev_id = dev->path.pci.devfn | (dev->bus->secondary << 8);
+		ivhd_entry->dev_id = dev->path.pci.devfn | (dev->upstream->secondary << 8);
 		ivhd_entry->dte_setting = data;
 		*current += sizeof(ivrs_ivhd_generic_t);
 	} else if (type == IVHD_DEV_8_BYTE_ALIAS_SELECT) {
@@ -104,12 +104,12 @@
 		memset(ivhd_entry, 0, sizeof(*ivhd_entry));
 
 		ivhd_entry->type = type;
-		ivhd_entry->dev_id = dev->path.pci.devfn | (dev->bus->secondary << 8);
+		ivhd_entry->dev_id = dev->path.pci.devfn | (dev->upstream->secondary << 8);
 		ivhd_entry->dte_setting = data;
 		ivhd_entry->reserved1 = 0;
 		ivhd_entry->reserved2 = 0;
 		ivhd_entry->source_dev_id = parent->path.pci.devfn |
-					    (parent->bus->secondary << 8);
+					    (parent->upstream->secondary << 8);
 		*current += sizeof(ivrs_ivhd_alias_t);
 	}
 
@@ -145,7 +145,7 @@
 		return;
 
 	if (dev->path.type == DEVICE_PATH_PCI) {
-		if ((dev->bus->secondary == nb_bus) &&
+		if ((dev->upstream->secondary == nb_bus) &&
 		    (dev->path.pci.devfn == 0x0))
 			*root_level = depth;
 
@@ -154,9 +154,9 @@
 				ivrs_add_device_or_bridge(parent, dev, current);
 	}
 
-	if (!dev->link_list)
+	if (!dev->downstream)
 		return;
-	for (sibling = dev->link_list->children; sibling; sibling = sibling->sibling)
+	for (sibling = dev->downstream->children; sibling; sibling = sibling->sibling)
 		add_ivhd_device_entries(dev, sibling, depth + 1, depth, root_level, current,
 					nb_bus);
 }
@@ -173,21 +173,21 @@
 	 * Add all possible PCI devices in the domain that can generate transactions
 	 * processed by IOMMU. Start with device <bus>:01.0
 	*/
-	current = ivhd_dev_range(current, PCI_DEVFN(0, 3) | (dev->link_list->secondary << 8),
-				 0xff | (dev->link_list->subordinate << 8), 0);
+	current = ivhd_dev_range(current, PCI_DEVFN(0, 3) | (dev->downstream->secondary << 8),
+				 0xff | (dev->downstream->subordinate << 8), 0);
 
 	add_ivhd_device_entries(NULL, dev, 0, -1, &root_level,
-		&current, dev->link_list->secondary);
+		&current, dev->downstream->secondary);
 
 	res = probe_resource(dev, IOMMU_IOAPIC_IDX);
 	if (res) {
 		/* Describe IOAPIC associated with the IOMMU */
 		current = acpi_fill_ivrs_ioapic(current, (u8 *)(uintptr_t)res->base,
-				      PCI_DEVFN(0, 1) | (dev->link_list->secondary << 8), 0);
+				      PCI_DEVFN(0, 1) | (dev->downstream->secondary << 8), 0);
 	}
 
 	/* If the domain has secondary bus as zero then associate HPET & FCH IOAPIC */
-	if (dev->link_list->secondary == 0) {
+	if (dev->downstream->secondary == 0) {
 		/* Describe HPET */
 		current = ivhd_describe_hpet(current, 0x00, SMBUS_DEVFN);
 		/* Describe FCH IOAPICs */
@@ -212,11 +212,11 @@
 	ivhd_40->flags = ivhd->flags & 0x3f;
 	ivhd_40->length = sizeof(struct acpi_ivrs_ivhd_40);
 	/* BDF <bus>:00.2 */
-	ivhd_40->device_id = 0x02 | (nb_dev->bus->secondary << 8);
+	ivhd_40->device_id = 0x02 | (nb_dev->upstream->secondary << 8);
 	ivhd_40->capability_offset = pci_find_capability(iommu_dev, IOMMU_CAP_ID);
 	ivhd_40->iommu_base_low = ivhd->iommu_base_low;
 	ivhd_40->iommu_base_high = ivhd->iommu_base_high;
-	ivhd_40->pci_segment_group = nb_dev->bus->segment_group;
+	ivhd_40->pci_segment_group = nb_dev->upstream->segment_group;
 	ivhd_40->iommu_info = ivhd->iommu_info;
 	/* For type 40h bits 31:28 and 12:0 are reserved */
 	ivhd_40->iommu_attributes = ivhd->iommu_feature_info & 0xfffe000;
@@ -230,9 +230,9 @@
 
 	/* Now repeat all the device entries from type 10h */
 	current_backup = current;
-	current = acpi_ivhd_misc(current, nb_dev->bus->dev);
+	current = acpi_ivhd_misc(current, nb_dev->upstream->dev);
 
-	if (nb_dev->bus->secondary == 0) {
+	if (nb_dev->upstream->secondary == 0) {
 		/* Describe EMMC */
 		if (CONFIG(SOC_AMD_COMMON_BLOCK_EMMC)) {
 			/* PCI_DEVFN(0x13, 1) doesn't exist in the hardware, but it's what the
@@ -269,11 +269,11 @@
 	ivhd_11->flags = ivhd->flags & 0x3f;
 	ivhd_11->length = sizeof(struct acpi_ivrs_ivhd_11);
 	/* BDF <bus>:00.2 */
-	ivhd_11->device_id = 0x02 | (nb_dev->bus->secondary << 8);
+	ivhd_11->device_id = 0x02 | (nb_dev->upstream->secondary << 8);
 	ivhd_11->capability_offset = pci_find_capability(iommu_dev, IOMMU_CAP_ID);
 	ivhd_11->iommu_base_low = ivhd->iommu_base_low;
 	ivhd_11->iommu_base_high = ivhd->iommu_base_high;
-	ivhd_11->pci_segment_group = nb_dev->bus->segment_group;
+	ivhd_11->pci_segment_group = nb_dev->upstream->segment_group;
 	ivhd_11->iommu_info = ivhd->iommu_info;
 	ivhd11_attr_ptr = (ivhd11_iommu_attr_t *)&ivhd->iommu_feature_info;
 	ivhd_11->iommu_attributes.perf_counters = ivhd11_attr_ptr->perf_counters;
@@ -289,7 +289,7 @@
 
 	/* Now repeat all the device entries from type 10h */
 	current_backup = current;
-	current = acpi_ivhd_misc(current, nb_dev->bus->dev);
+	current = acpi_ivhd_misc(current, nb_dev->upstream->dev);
 	ivhd_11->length += (current - current_backup);
 
 	return acpi_fill_ivrs40(current, ivhd, nb_dev, iommu_dev);
@@ -317,8 +317,8 @@
 
 	while ((dev = dev_find_path(dev, DEVICE_PATH_DOMAIN)) != NULL) {
 
-		nb_dev = pcidev_path_behind(dev->link_list, PCI_DEVFN(0, 0));
-		iommu_dev = pcidev_path_behind(dev->link_list, PCI_DEVFN(0, 2));
+		nb_dev = pcidev_path_behind(dev->downstream, PCI_DEVFN(0, 0));
+		iommu_dev = pcidev_path_behind(dev->downstream, PCI_DEVFN(0, 2));
 		if (!nb_dev) {
 			printk(BIOS_WARNING, "%s: Northbridge device not present!\n", __func__);
 			printk(BIOS_WARNING, "%s: IVRS table not generated...\n", __func__);
@@ -334,7 +334,7 @@
 		ivhd->length = sizeof(struct acpi_ivrs_ivhd);
 
 		/* BDF <bus>:00.2 */
-		ivhd->device_id = 0x02 | (nb_dev->bus->secondary << 8);
+		ivhd->device_id = 0x02 | (nb_dev->upstream->secondary << 8);
 		ivhd->capability_offset = pci_find_capability(iommu_dev, IOMMU_CAP_ID);
 		ivhd->iommu_base_low = pci_read_config32(iommu_dev, IOMMU_CAP_BASE_LO) & 0xffffc000;
 		ivhd->iommu_base_high = pci_read_config32(iommu_dev, IOMMU_CAP_BASE_HI);
@@ -363,7 +363,7 @@
 		ivhd->flags |= ((mmio_x18_value & MMIO_CTRL_HT_TUN_EN) ?
 							IVHD_FLAG_HT_TUN_EN : 0);
 
-		ivhd->pci_segment_group = nb_dev->bus->segment_group;
+		ivhd->pci_segment_group = nb_dev->upstream->segment_group;
 
 		ivhd->iommu_info = pci_read_config16(iommu_dev,
 			ivhd->capability_offset + 0x10) & 0x1F;
diff --git a/src/soc/amd/common/block/data_fabric/domain.c b/src/soc/amd/common/block/data_fabric/domain.c
index b827dd3..f17346f 100644
--- a/src/soc/amd/common/block/data_fabric/domain.c
+++ b/src/soc/amd/common/block/data_fabric/domain.c
@@ -34,12 +34,12 @@
 	limit = MIN(limit, PCI_BUSES_PER_SEGMENT_GROUP - 1);
 
 	/* Set bus first number of PCI root */
-	domain->link_list->secondary = bus;
+	domain->downstream->secondary = bus;
 	/* subordinate needs to be the same as secondary before pci_host_bridge_scan_bus call. */
-	domain->link_list->subordinate = bus;
+	domain->downstream->subordinate = bus;
 	/* Tell allocator about maximum PCI bus number in domain */
-	domain->link_list->max_subordinate = limit;
-	domain->link_list->segment_group = segment_group;
+	domain->downstream->max_subordinate = limit;
+	domain->downstream->segment_group = segment_group;
 
 	pci_host_bridge_scan_bus(domain);
 }
@@ -249,12 +249,12 @@
 
 	/* PCI bus number range in domain */
 	printk(BIOS_DEBUG, "%s _CRS: adding busses [%x-%x] in segment group %x\n",
-	       acpi_device_name(domain), domain->link_list->secondary,
-	       domain->link_list->max_subordinate, domain->link_list->segment_group);
-	acpigen_resource_producer_bus_number(domain->link_list->secondary,
-					     domain->link_list->max_subordinate);
+	       acpi_device_name(domain), domain->downstream->secondary,
+	       domain->downstream->max_subordinate, domain->downstream->segment_group);
+	acpigen_resource_producer_bus_number(domain->downstream->secondary,
+					     domain->downstream->max_subordinate);
 
-	if (domain->link_list->secondary == 0 && domain->link_list->segment_group == 0) {
+	if (domain->downstream->secondary == 0 && domain->downstream->segment_group == 0) {
 		/* ACPI 6.4.2.5 I/O Port Descriptor */
 		acpigen_write_io16(PCI_IO_CONFIG_INDEX, PCI_IO_CONFIG_LAST_PORT, 1,
 				   PCI_IO_CONFIG_PORT_COUNT, 1);
@@ -282,7 +282,7 @@
 		}
 	}
 
-	if (domain->link_list->bridge_ctrl & PCI_BRIDGE_CTL_VGA) {
+	if (domain->downstream->bridge_ctrl & PCI_BRIDGE_CTL_VGA) {
 		printk(BIOS_DEBUG, "%s _CRS: adding VGA resource\n", acpi_device_name(domain));
 		acpigen_resource_producer_mmio(VGA_MMIO_BASE, VGA_MMIO_LIMIT,
 			MEM_RSRC_FLAG_MEM_READ_WRITE | MEM_RSRC_FLAG_MEM_ATTR_CACHE);
@@ -290,9 +290,8 @@
 
 	acpigen_write_resourcetemplate_footer();
 
-	acpigen_write_SEG(domain->link_list->segment_group);
-	acpigen_write_BBN(domain->link_list->secondary);
-
+	acpigen_write_SEG(domain->downstream->segment_group);
+	acpigen_write_BBN(domain->downstream->secondary);
 	/* Scope */
 	acpigen_pop_len();
 }
diff --git a/src/soc/amd/common/block/lpc/lpc.c b/src/soc/amd/common/block/lpc/lpc.c
index c076361..a90fc3e 100644
--- a/src/soc/amd/common/block/lpc/lpc.c
+++ b/src/soc/amd/common/block/lpc/lpc.c
@@ -280,10 +280,10 @@
 {
 	struct device *child;
 
-	if (!dev->link_list)
+	if (!dev->downstream)
 		return;
 
-	for (child = dev->link_list->children; child; child = child->sibling) {
+	for (child = dev->downstream->children; child; child = child->sibling) {
 		if (!child->enabled)
 			continue;
 		if (child->path.type != DEVICE_PATH_PNP)
diff --git a/src/soc/amd/genoa_poc/domain.c b/src/soc/amd/genoa_poc/domain.c
index dc37450..57e020a 100644
--- a/src/soc/amd/genoa_poc/domain.c
+++ b/src/soc/amd/genoa_poc/domain.c
@@ -18,7 +18,7 @@
 	amd_pci_domain_read_resources(domain);
 
 	// We only want to add the DRAM memory map once
-	if (domain->link_list->secondary == 0 && domain->link_list->segment_group == 0) {
+	if (domain->downstream->secondary == 0 && domain->downstream->segment_group == 0) {
 		/* 0x1000 is a large enough first index to be sure to not overlap with the
 		   resources added by amd_pci_domain_read_resources */
 		add_opensil_memmap(domain, 0x1000);
@@ -27,7 +27,7 @@
 
 static void genoa_domain_set_resources(struct device *domain)
 {
-	if (domain->link_list->bridge_ctrl & PCI_BRIDGE_CTL_VGA) {
+	if (domain->downstream->bridge_ctrl & PCI_BRIDGE_CTL_VGA) {
 		printk(BIOS_DEBUG, "Setting VGA decoding for domain 0x%x\n",
 		       domain->path.domain.domain);
 		const union df_vga_en vga_en = {
diff --git a/src/soc/amd/glinda/xhci.c b/src/soc/amd/glinda/xhci.c
index dad5593..74e8816 100644
--- a/src/soc/amd/glinda/xhci.c
+++ b/src/soc/amd/glinda/xhci.c
@@ -34,13 +34,13 @@
 
 enum cb_err pci_xhci_get_wake_gpe(const struct device *dev, int *gpe)
 {
-	if (dev->bus->dev->path.type != DEVICE_PATH_PCI)
+	if (dev->upstream->dev->path.type != DEVICE_PATH_PCI)
 		return CB_ERR_ARG;
 
 	if (dev->path.type != DEVICE_PATH_PCI)
 		return CB_ERR_ARG;
 
-	if (dev->bus->dev->path.pci.devfn == PCIE_ABC_A_DEVFN) {
+	if (dev->upstream->dev->path.pci.devfn == PCIE_ABC_A_DEVFN) {
 		if (dev->path.pci.devfn == XHCI0_DEVFN) {
 			*gpe = xhci_sci_sources[0].gpe;
 			return CB_SUCCESS;
@@ -48,7 +48,7 @@
 			*gpe = xhci_sci_sources[1].gpe;
 			return CB_SUCCESS;
 		}
-	} else if (dev->bus->dev->path.pci.devfn == PCIE_ABC_C_DEVFN) {
+	} else if (dev->upstream->dev->path.pci.devfn == PCIE_ABC_C_DEVFN) {
 		if (dev->path.pci.devfn == XHCI2_DEVFN
 		    && dev->device == PCI_DID_AMD_FAM17H_MODELA0H_XHCI2) {
 			*gpe = xhci_sci_sources[2].gpe;
diff --git a/src/soc/amd/mendocino/xhci.c b/src/soc/amd/mendocino/xhci.c
index e564991..8f46374 100644
--- a/src/soc/amd/mendocino/xhci.c
+++ b/src/soc/amd/mendocino/xhci.c
@@ -35,13 +35,13 @@
 
 enum cb_err pci_xhci_get_wake_gpe(const struct device *dev, int *gpe)
 {
-	if (dev->bus->dev->path.type != DEVICE_PATH_PCI)
+	if (dev->upstream->dev->path.type != DEVICE_PATH_PCI)
 		return CB_ERR_ARG;
 
 	if (dev->path.type != DEVICE_PATH_PCI)
 		return CB_ERR_ARG;
 
-	if (dev->bus->dev->path.pci.devfn == PCIE_ABC_A_DEVFN) {
+	if (dev->upstream->dev->path.pci.devfn == PCIE_ABC_A_DEVFN) {
 		if (dev->path.pci.devfn == XHCI0_DEVFN) {
 			*gpe = xhci_sci_sources[0].gpe;
 			return CB_SUCCESS;
@@ -49,7 +49,7 @@
 			*gpe = xhci_sci_sources[1].gpe;
 			return CB_SUCCESS;
 		}
-	} else if (dev->bus->dev->path.pci.devfn == PCIE_ABC_C_DEVFN) {
+	} else if (dev->upstream->dev->path.pci.devfn == PCIE_ABC_C_DEVFN) {
 		if (dev->path.pci.devfn == XHCI2_DEVFN
 		    && dev->device == PCI_DID_AMD_FAM17H_MODELA0H_XHCI2) {
 			*gpe = xhci_sci_sources[2].gpe;
diff --git a/src/soc/amd/phoenix/xhci.c b/src/soc/amd/phoenix/xhci.c
index 99033f9..79d4d07 100644
--- a/src/soc/amd/phoenix/xhci.c
+++ b/src/soc/amd/phoenix/xhci.c
@@ -39,13 +39,13 @@
 
 enum cb_err pci_xhci_get_wake_gpe(const struct device *dev, int *gpe)
 {
-	if (dev->bus->dev->path.type != DEVICE_PATH_PCI)
+	if (dev->upstream->dev->path.type != DEVICE_PATH_PCI)
 		return CB_ERR_ARG;
 
 	if (dev->path.type != DEVICE_PATH_PCI)
 		return CB_ERR_ARG;
 
-	if (dev->bus->dev->path.pci.devfn == PCIE_ABC_A_DEVFN) {
+	if (dev->upstream->dev->path.pci.devfn == PCIE_ABC_A_DEVFN) {
 		if (dev->path.pci.devfn == XHCI0_DEVFN) {
 			*gpe = xhci_sci_sources[0].gpe;
 			return CB_SUCCESS;
@@ -55,7 +55,7 @@
 		}
 	}
 
-	if (dev->bus->dev->path.pci.devfn == PCIE_ABC_C_DEVFN) {
+	if (dev->upstream->dev->path.pci.devfn == PCIE_ABC_C_DEVFN) {
 		if (dev->path.pci.devfn == USB4_XHCI0_DEVFN) {
 			*gpe = xhci_sci_sources[2].gpe;
 			return CB_SUCCESS;
diff --git a/src/soc/amd/picasso/xhci.c b/src/soc/amd/picasso/xhci.c
index 84b3a2b..a238916 100644
--- a/src/soc/amd/picasso/xhci.c
+++ b/src/soc/amd/picasso/xhci.c
@@ -26,10 +26,10 @@
 
 enum cb_err pci_xhci_get_wake_gpe(const struct device *dev, int *gpe)
 {
-	if (dev->bus->dev->path.type != DEVICE_PATH_PCI)
+	if (dev->upstream->dev->path.type != DEVICE_PATH_PCI)
 		return CB_ERR_ARG;
 
-	if (dev->bus->dev->path.pci.devfn != PCIE_GPP_A_DEVFN)
+	if (dev->upstream->dev->path.pci.devfn != PCIE_GPP_A_DEVFN)
 		return CB_ERR_ARG;
 
 	if (dev->path.type != DEVICE_PATH_PCI)
diff --git a/src/soc/amd/stoneyridge/northbridge.c b/src/soc/amd/stoneyridge/northbridge.c
index b95c4cd..a92c3b5 100644
--- a/src/soc/amd/stoneyridge/northbridge.c
+++ b/src/soc/amd/stoneyridge/northbridge.c
@@ -52,9 +52,9 @@
 
 static void create_vga_resource(struct device *dev)
 {
-	if (!dev->link_list)
+	if (!dev->downstream)
 		return;
-	if (!(dev->link_list->bridge_ctrl & PCI_BRIDGE_CTL_VGA))
+	if (!(dev->downstream->bridge_ctrl & PCI_BRIDGE_CTL_VGA))
 		return;
 
 	printk(BIOS_DEBUG, "VGA: %s has VGA device\n",	dev_path(dev));
@@ -67,8 +67,8 @@
 	/* do we need this? */
 	create_vga_resource(dev);
 
-	if (dev->link_list && dev->link_list->children)
-		assign_resources(dev->link_list);
+	if (dev->downstream && dev->downstream->children)
+		assign_resources(dev->downstream);
 }
 
 static void northbridge_init(struct device *dev)
diff --git a/src/soc/cavium/cn81xx/ecam0.c b/src/soc/cavium/cn81xx/ecam0.c
index d02e884..ff3e709 100644
--- a/src/soc/cavium/cn81xx/ecam0.c
+++ b/src/soc/cavium/cn81xx/ecam0.c
@@ -226,12 +226,12 @@
 	 * Search for missing devices on BUS 1.
 	 * Only required for ARI capability programming.
 	 */
-	ecam0_fix_missing_devices(bridge->link_list);
+	ecam0_fix_missing_devices(bridge->downstream);
 
 	/* Program secure ARI capability on bus 1 */
 	child_last = NULL;
 	for (i = 0; i <= PCI_DEVFN(0x1f, 7); i++) {
-		child = pcidev_path_behind(bridge->link_list, i);
+		child = pcidev_path_behind(bridge->downstream, i);
 		if (!child || !child->enabled)
 			continue;
 
@@ -250,7 +250,7 @@
 	/* Program insecure ARI capability on bus 1 */
 	child_last = NULL;
 	for (i = 0; i <= PCI_DEVFN(0x1f, 7); i++) {
-		child = pcidev_path_behind(bridge->link_list, i);
+		child = pcidev_path_behind(bridge->downstream, i);
 		if (!child)
 			continue;
 		config = child->chip_info;
@@ -281,7 +281,7 @@
 
 	/* Enable / disable devices and functions on bus 1 */
 	for (i = 0; i <= PCI_DEVFN(0x1f, 7); i++) {
-		child = pcidev_path_behind(bridge->link_list, i);
+		child = pcidev_path_behind(bridge->downstream, i);
 		config = child ? child->chip_info : NULL;
 		if (child && child->enabled &&
 		    ((config && !config->secure) || !config))
@@ -293,7 +293,7 @@
 	/* Apply IRQ on PCI devices */
 	/* UUA */
 	for (i = 0; i < 4; i++) {
-		child = pcidev_path_behind(bridge->link_list,
+		child = pcidev_path_behind(bridge->downstream,
 				      PCI_DEVFN(8, i));
 		if (!child)
 			continue;
diff --git a/src/soc/intel/apollolake/chip.c b/src/soc/intel/apollolake/chip.c
index 469b9be..15780d0 100644
--- a/src/soc/intel/apollolake/chip.c
+++ b/src/soc/intel/apollolake/chip.c
@@ -478,7 +478,7 @@
 		return;
 	}
 	/* Only disable bus 0 devices. */
-	for (dev = dev->bus->children; dev; dev = dev->sibling) {
+	for (dev = dev->upstream->children; dev; dev = dev->sibling) {
 		if (!dev->enabled)
 			disable_dev(dev, silconfig);
 	}
diff --git a/src/soc/intel/braswell/southcluster.c b/src/soc/intel/braswell/southcluster.c
index a0df97c..2e37280 100644
--- a/src/soc/intel/braswell/southcluster.c
+++ b/src/soc/intel/braswell/southcluster.c
@@ -117,7 +117,7 @@
 			continue;
 
 		current_bdf = irq_dev->path.pci.devfn |
-			irq_dev->bus->secondary << 8;
+			irq_dev->upstream->secondary << 8;
 
 		/*
 		 * Step 1: Get the INT_PIN and device structure to look for
@@ -132,7 +132,7 @@
 		original_int_pin = pci_read_config8(irq_dev, PCI_INTERRUPT_PIN);
 
 		parent_bdf = targ_dev->path.pci.devfn
-			| targ_dev->bus->secondary << 8;
+			| targ_dev->upstream->secondary << 8;
 		device_num = PCI_SLOT(parent_bdf);
 
 		if (ir->pcidev[device_num] == 0) {
diff --git a/src/soc/intel/common/block/acpi/pep.c b/src/soc/intel/common/block/acpi/pep.c
index 39f9542..a6ae454 100644
--- a/src/soc/intel/common/block/acpi/pep.c
+++ b/src/soc/intel/common/block/acpi/pep.c
@@ -144,7 +144,7 @@
 
 	case DEVICE_PATH_PCI:
 		/* skip external buses*/
-		if ((dev->bus->secondary != 0) || (!states_arr))
+		if ((dev->upstream->secondary != 0) || (!states_arr))
 			return ACPI_DEVICE_SLEEP_NONE;
 		for (size_t i = 0; i < size; i++)
 			if (states_arr[i].pci_dev == dev->path.pci.devfn)
diff --git a/src/soc/intel/common/block/lpc/lpc.c b/src/soc/intel/common/block/lpc/lpc.c
index 994ef9b..dbd982b 100644
--- a/src/soc/intel/common/block/lpc/lpc.c
+++ b/src/soc/intel/common/block/lpc/lpc.c
@@ -102,10 +102,10 @@
 {
 	struct device *child;
 
-	if (!dev->link_list)
+	if (!dev->downstream)
 		return;
 
-	for (child = dev->link_list->children; child; child = child->sibling)
+	for (child = dev->downstream->children; child; child = child->sibling)
 		pch_lpc_loop_resources(child);
 }
 
diff --git a/src/soc/intel/common/block/pcie/rtd3/rtd3.c b/src/soc/intel/common/block/pcie/rtd3/rtd3.c
index 39c82b1..3a7c8b4 100644
--- a/src/soc/intel/common/block/pcie/rtd3/rtd3.c
+++ b/src/soc/intel/common/block/pcie/rtd3/rtd3.c
@@ -140,7 +140,7 @@
 			 enum pcie_rp_type rp_type,
 			 const struct device *dev)
 {
-	const struct device *parent = dev->bus->dev;
+	const struct device *parent = dev->upstream->dev;
 
 	acpigen_write_method_serialized("_ON", 0);
 
@@ -224,7 +224,7 @@
 			  const struct device *dev)
 
 {
-	const struct device *parent = dev->bus->dev;
+	const struct device *parent = dev->upstream->dev;
 
 	acpigen_write_method_serialized("_OFF", 0);
 
@@ -385,7 +385,7 @@
 
 	const struct soc_intel_common_block_pcie_rtd3_config *config = config_of(dev);
 	static const char *const power_res_states[] = {"_PR0"};
-	const struct device *parent = dev->bus->dev;
+	const struct device *parent = dev->upstream->dev;
 	const char *scope = acpi_device_path(parent);
 	const struct opregion opregion = OPREGION("PXCS", PCI_CONFIG, 0, 0xff);
 	const struct fieldlist fieldlist[] = {
diff --git a/src/soc/intel/common/block/usb4/pcie.c b/src/soc/intel/common/block/usb4/pcie.c
index f2414cc..c066647 100644
--- a/src/soc/intel/common/block/usb4/pcie.c
+++ b/src/soc/intel/common/block/usb4/pcie.c
@@ -19,7 +19,7 @@
 	int port_id;
 
 	/* Get parent PCI device */
-	parent = dev->bus->dev;
+	parent = dev->upstream->dev;
 	if (!parent) {
 		printk(BIOS_ERR, "%s: Unable to find parent device\n", __func__);
 		return;
diff --git a/src/soc/intel/common/block/xhci/xhci.c b/src/soc/intel/common/block/xhci/xhci.c
index ff6fbf0..03ed578 100644
--- a/src/soc/intel/common/block/xhci/xhci.c
+++ b/src/soc/intel/common/block/xhci/xhci.c
@@ -92,8 +92,8 @@
 		return;
 	}
 
-	while ((hub = dev_bus_each_child(xhci->link_list, hub)) != NULL) {
-		while ((port = dev_bus_each_child(hub->link_list, port)) != NULL) {
+	while ((hub = dev_bus_each_child(xhci->downstream, hub)) != NULL) {
+		while ((port = dev_bus_each_child(hub->downstream, port)) != NULL) {
 			enable = true;
 			config = config_of(port);
 			if (config->type == UPC_TYPE_INTERNAL) {
diff --git a/src/soc/intel/denverton_ns/lpc.c b/src/soc/intel/denverton_ns/lpc.c
index 7ebca1e..ae923d7 100644
--- a/src/soc/intel/denverton_ns/lpc.c
+++ b/src/soc/intel/denverton_ns/lpc.c
@@ -275,7 +275,7 @@
 
 	/* Swizzle this device if needed */
 	config = targ_dev->chip_info;
-	parent_bdf = targ_dev->path.pci.devfn | targ_dev->bus->secondary << 8;
+	parent_bdf = targ_dev->path.pci.devfn | targ_dev->upstream->secondary << 8;
 	if (is_dnv_swizzled_rp(parent_bdf) && irq_dev != targ_dev) {
 		swiz_int_pin = dnv_get_swizzled_pin(config, parent_bdf, new_int_pin);
 		printk(BIOS_DEBUG, "%s: dnv swizzle %s from %c to %c\n", __func__,
@@ -387,7 +387,7 @@
 
 		int_line = dnv_get_int_line(irq_dev);
 		printk(BIOS_DEBUG, "%s: %02x:%02x.%d pin %d int line %d\n", __func__,
-		       irq_dev->bus->secondary, devfn >> 3, devfn & 0x7, int_pin, int_line);
+		       irq_dev->upstream->secondary, devfn >> 3, devfn & 0x7, int_pin, int_line);
 
 		pci_write_config8(irq_dev, PCI_INTERRUPT_LINE, int_line);
 	}
diff --git a/src/soc/intel/meteorlake/fsp_params.c b/src/soc/intel/meteorlake/fsp_params.c
index c3c47854..971fa33 100644
--- a/src/soc/intel/meteorlake/fsp_params.c
+++ b/src/soc/intel/meteorlake/fsp_params.c
@@ -760,7 +760,7 @@
 
 	for (dev = all_devices; dev; dev = dev->next) {
 		if (!(is_dev_enabled(dev) && dev->path.type == DEVICE_PATH_PCI &&
-		    dev->bus->secondary == 0))
+		    dev->upstream->secondary == 0))
 			continue;
 
 		if (dev->path.pci.devfn == PCI_DEVFN_ROOT) {
diff --git a/src/soc/intel/skylake/chip.c b/src/soc/intel/skylake/chip.c
index f471edb..ea091ce 100644
--- a/src/soc/intel/skylake/chip.c
+++ b/src/soc/intel/skylake/chip.c
@@ -94,7 +94,7 @@
 		return NULL;
 
 	/* Match functions 0 and 1 for possible GPUs on a secondary bus */
-	if (dev->bus && dev->bus->secondary > 0) {
+	if (dev->upstream && dev->upstream->secondary > 0) {
 		switch (PCI_FUNC(dev->path.pci.devfn)) {
 		case 0: return "DEV0";
 		case 1: return "DEV1";
diff --git a/src/soc/intel/xeon_sp/chip_common.c b/src/soc/intel/xeon_sp/chip_common.c
index 845e968..144dba1 100644
--- a/src/soc/intel/xeon_sp/chip_common.c
+++ b/src/soc/intel/xeon_sp/chip_common.c
@@ -78,7 +78,7 @@
 	bus->max_subordinate = sr->BusLimit;
 
 	printk(BIOS_SPEW, "Scanning IIO stack %d: busses %x-%x\n", dev->path.domain.domain,
-	       dev->link_list->secondary, dev->link_list->max_subordinate);
+	       dev->downstream->secondary, dev->downstream->max_subordinate);
 	pci_host_bridge_scan_bus(dev);
 }
 
@@ -116,14 +116,14 @@
 
 			if (!is_pcie_iio_stack_res(ri)) {
 				if (CONFIG(HAVE_IOAT_DOMAINS))
-					soc_create_ioat_domains(dn, dev->bus, ri);
+					soc_create_ioat_domains(dn, dev->upstream, ri);
 				continue;
 			}
 
 			struct device_path path;
 			path.type = DEVICE_PATH_DOMAIN;
 			path.domain.domain = dn.domain_path;
-			struct device *iio_domain = alloc_dev(dev->bus, &path);
+			struct device *iio_domain = alloc_dev(dev->upstream, &path);
 			if (iio_domain == NULL)
 				die("%s: out of memory.\n", __func__);
 			iio_domain->ops = &iio_pcie_domain_ops;
diff --git a/src/soc/intel/xeon_sp/cpx/soc_acpi.c b/src/soc/intel/xeon_sp/cpx/soc_acpi.c
index 2c19ed1..8b24ba2 100644
--- a/src/soc/intel/xeon_sp/cpx/soc_acpi.c
+++ b/src/soc/intel/xeon_sp/cpx/soc_acpi.c
@@ -46,7 +46,7 @@
 	struct iiostack_resource stack_info = {0};
 
 	/* Only add RTxx entries once. */
-	if (device->bus->secondary != 0 || device->bus->segment_group != 0)
+	if (device->upstream->secondary != 0 || device->upstream->segment_group != 0)
 		return;
 
 	get_iiostack_info(&stack_info);
diff --git a/src/soc/intel/xeon_sp/skx/soc_acpi.c b/src/soc/intel/xeon_sp/skx/soc_acpi.c
index dfbd878..2e2b14a 100644
--- a/src/soc/intel/xeon_sp/skx/soc_acpi.c
+++ b/src/soc/intel/xeon_sp/skx/soc_acpi.c
@@ -59,7 +59,7 @@
 	const IIO_UDS *hob = get_iio_uds();
 
 	/* Only add RTxx entries once. */
-	if (device->bus->secondary != 0)
+	if (device->upstream->secondary != 0)
 		return;
 
 	for (int socket = 0, iio = 0; iio < hob->PlatformData.numofIIO; ++socket) {
diff --git a/src/soc/intel/xeon_sp/spr/soc_acpi.c b/src/soc/intel/xeon_sp/spr/soc_acpi.c
index cb7fe1d..a48302c 100644
--- a/src/soc/intel/xeon_sp/spr/soc_acpi.c
+++ b/src/soc/intel/xeon_sp/spr/soc_acpi.c
@@ -341,7 +341,7 @@
 	bool stack_enabled;
 
 	/* Only add RTxx entries once. */
-	if (device->bus->secondary != 0)
+	if (device->upstream->secondary != 0)
 		return;
 
 	/*
@@ -502,7 +502,7 @@
 
 	for (cpu = all_devices; cpu; cpu = cpu->next) {
 		if ((cpu->path.type != DEVICE_PATH_APIC)
-		    || (cpu->bus->dev->path.type != DEVICE_PATH_CPU_CLUSTER)) {
+		    || (cpu->upstream->dev->path.type != DEVICE_PATH_CPU_CLUSTER)) {
 			continue;
 		}
 		if (!cpu->enabled)
diff --git a/src/soc/intel/xeon_sp/uncore.c b/src/soc/intel/xeon_sp/uncore.c
index 1b232ea..ddc6e82 100644
--- a/src/soc/intel/xeon_sp/uncore.c
+++ b/src/soc/intel/xeon_sp/uncore.c
@@ -192,7 +192,7 @@
 	struct range_entry fsp_mem;
 
 	/* Only add dram resources once. */
-	if (dev->bus->secondary != 0 || dev->bus->segment_group != 0)
+	if (dev->upstream->secondary != 0 || dev->upstream->segment_group != 0)
 		return;
 
 	/* Read in the MAP registers and report their values. */
diff --git a/src/soc/intel/xeon_sp/uncore_acpi.c b/src/soc/intel/xeon_sp/uncore_acpi.c
index e2b47329..75b281b 100644
--- a/src/soc/intel/xeon_sp/uncore_acpi.c
+++ b/src/soc/intel/xeon_sp/uncore_acpi.c
@@ -225,7 +225,7 @@
 							 uint32_t pcie_seg,
 							 bool is_atsr, bool *first)
 {
-	const uint32_t bus = bridge_dev->bus->secondary;
+	const uint32_t bus = bridge_dev->upstream->secondary;
 	const uint32_t dev = PCI_SLOT(bridge_dev->path.pci.devfn);
 	const uint32_t func = PCI_FUNC(bridge_dev->path.pci.devfn);
 
diff --git a/src/southbridge/amd/pi/hudson/lpc.c b/src/southbridge/amd/pi/hudson/lpc.c
index 266d75c..66ec824 100644
--- a/src/southbridge/amd/pi/hudson/lpc.c
+++ b/src/southbridge/amd/pi/hudson/lpc.c
@@ -171,8 +171,8 @@
 	reg_var[0] = pci_read_config16(dev, 0x64);
 
 	struct device *child;
-	if (dev->link_list) {
-		for (child = dev->link_list->children; child; child = child->sibling) {
+	if (dev->downstream) {
+		for (child = dev->downstream->children; child; child = child->sibling) {
 			if (child->enabled && (child->path.type == DEVICE_PATH_PNP)) {
 				struct resource *res;
 				for (res = child->resource_list; res; res = res->next) {
diff --git a/src/southbridge/intel/bd82x6x/pcie.c b/src/southbridge/intel/bd82x6x/pcie.c
index 13f16f8..a1dd16e 100644
--- a/src/southbridge/intel/bd82x6x/pcie.c
+++ b/src/southbridge/intel/bd82x6x/pcie.c
@@ -145,8 +145,8 @@
 	 * must be a static device from devicetree.cb.
 	 * If one is found assume it's an integrated device and not a PCIe slot.
 	 */
-	if (dev->link_list)
-		child = pcidev_path_behind(dev->link_list, PCI_DEVFN(0, 0));
+	if (dev->downstream)
+		child = pcidev_path_behind(dev->downstream, PCI_DEVFN(0, 0));
 
 	/* Set slot power limit as configured above */
 	reg32 = pci_read_config32(dev, cap + PCI_EXP_SLTCAP);
diff --git a/src/superio/common/generic.c b/src/superio/common/generic.c
index 1758acc..92d8357 100644
--- a/src/superio/common/generic.c
+++ b/src/superio/common/generic.c
@@ -13,8 +13,8 @@
 	if (!dev)
 		return;
 
-	if (dev->link_list)
-		assign_resources(dev->link_list);
+	if (dev->downstream)
+		assign_resources(dev->downstream);
 
 	for (res = dev->resource_list; res; res = res->next) {
 		if (!(res->flags & IORESOURCE_ASSIGNED))
@@ -159,8 +159,8 @@
 		acpigen_write_acquire(mutex, 0xffff);
 
 		/* Pick one of the children as the generic SIO doesn't have config mode */
-		if (dev->link_list && dev->link_list->children)
-			pnp_ssdt_enter_conf_mode(dev->link_list->children, "^INDX", "^DATA");
+		if (dev->downstream && dev->downstream->children)
+			pnp_ssdt_enter_conf_mode(dev->downstream->children, "^INDX", "^DATA");
 
 		/* Backup LDN */
 		acpigen_write_store();
@@ -178,8 +178,8 @@
 		acpigen_emit_namestring("^LDN");
 
 		/* Pick one of the children as the generic SIO doesn't have config mode */
-		if (dev->link_list && dev->link_list->children)
-			pnp_ssdt_exit_conf_mode(dev->link_list->children, "^INDX", "^DATA");
+		if (dev->downstream && dev->downstream->children)
+			pnp_ssdt_exit_conf_mode(dev->downstream->children, "^INDX", "^DATA");
 
 		acpigen_write_release(mutex);
 	}
diff --git a/src/superio/common/ssdt.c b/src/superio/common/ssdt.c
index 47fbf0c..fd55792 100644
--- a/src/superio/common/ssdt.c
+++ b/src/superio/common/ssdt.c
@@ -161,7 +161,7 @@
 
 void superio_common_fill_ssdt_generator(const struct device *dev)
 {
-	if (!dev || !dev->bus || !dev->bus->dev) {
+	if (!dev || !dev->upstream || !dev->upstream->dev) {
 		printk(BIOS_CRIT, "BUG: Invalid argument in %s!\n", __func__);
 		return;
 	}
@@ -174,11 +174,11 @@
 
 	/* Validate devicetree settings */
 	bool bug = false;
-	if (dev->bus->dev->path.type != DEVICE_PATH_PNP) {
+	if (dev->upstream->dev->path.type != DEVICE_PATH_PNP) {
 		bug = true;
 		printk(BIOS_CRIT, "BUG: Parent of device %s is not a PNP device\n",
 			dev_path(dev));
-	} else if (dev->bus->dev->path.pnp.port != dev->path.pnp.port) {
+	} else if (dev->upstream->dev->path.pnp.port != dev->path.pnp.port) {
 		bug = true;
 		printk(BIOS_CRIT, "BUG: Parent of device %s has wrong I/O port\n",
 			dev_path(dev));
diff --git a/src/superio/nuvoton/npcd378/superio.c b/src/superio/nuvoton/npcd378/superio.c
index a4759fb..ddf63cd 100644
--- a/src/superio/nuvoton/npcd378/superio.c
+++ b/src/superio/nuvoton/npcd378/superio.c
@@ -356,7 +356,7 @@
 	/* Method (SIOH, 0, NotSerialized) */
 	acpigen_write_method("_L08", 0);
 	acpigen_emit_byte(AND_OP);
-	acpigen_emit_namestring(acpi_device_path_join(dev->bus->dev, "PMFG"));
+	acpigen_emit_namestring(acpi_device_path_join(dev->upstream->dev, "PMFG"));
 	acpigen_write_integer(0xE8);
 	acpigen_emit_byte(LOCAL0_OP);
 
@@ -366,13 +366,13 @@
 	acpigen_emit_byte(ZERO_OP);
 
 	acpigen_emit_byte(NOTIFY_OP);
-	acpigen_emit_namestring(acpi_device_path_join(dev->bus->dev, "L060"));
+	acpigen_emit_namestring(acpi_device_path_join(dev->upstream->dev, "L060"));
 	acpigen_write_integer(2);
 
 	acpigen_pop_len();		/* Pop If */
 
 	acpigen_emit_byte(AND_OP);
-	acpigen_emit_namestring(acpi_device_path_join(dev->bus->dev, "PMFG"));
+	acpigen_emit_namestring(acpi_device_path_join(dev->upstream->dev, "PMFG"));
 	acpigen_write_integer(0x10);
 	acpigen_emit_byte(LOCAL0_OP);
 
@@ -382,7 +382,7 @@
 	acpigen_emit_byte(ZERO_OP);
 
 	acpigen_emit_byte(NOTIFY_OP);
-	acpigen_emit_namestring(acpi_device_path_join(dev->bus->dev, "L050"));
+	acpigen_emit_namestring(acpi_device_path_join(dev->upstream->dev, "L050"));
 	acpigen_write_integer(2);
 	acpigen_pop_len();		/* Pop If */
 
diff --git a/src/vendorcode/amd/opensil/genoa_poc/mpio/chip.c b/src/vendorcode/amd/opensil/genoa_poc/mpio/chip.c
index 9e9e886..50e96c9 100644
--- a/src/vendorcode/amd/opensil/genoa_poc/mpio/chip.c
+++ b/src/vendorcode/amd/opensil/genoa_poc/mpio/chip.c
@@ -129,7 +129,7 @@
 			      struct vendorcode_amd_opensil_genoa_poc_mpio_config *const config)
 {
 	static uint32_t slot_num;
-	const uint32_t domain = dev->bus->dev->path.domain.domain;
+	const uint32_t domain = dev->upstream->dev->path.domain.domain;
 	const uint32_t devfn = dev->path.pci.devfn;
 	printk(BIOS_DEBUG, "Setting MPIO port for domain 0x%x, PCI %d:%d\n",
 	       domain, PCI_SLOT(devfn), PCI_FUNC(devfn));
@@ -189,6 +189,6 @@
 	/* Find all devices with this chip that are directly below the chip */
 	for (struct device *dev = &dev_root; dev; dev = dev->next)
 		if (dev->chip_ops == &vendorcode_amd_opensil_genoa_poc_mpio_ops &&
-		    dev->chip_info != dev->bus->dev->chip_info)
-			per_device_config(mpio_data, dev->bus->dev, dev->chip_info);
+		    dev->chip_info != dev->upstream->dev->chip_info)
+			per_device_config(mpio_data, dev->upstream->dev, dev->chip_info);
 }
diff --git a/util/sconfig/main.c b/util/sconfig/main.c
index 533c9fb..04f78a4 100644
--- a/util/sconfig/main.c
+++ b/util/sconfig/main.c
@@ -1229,7 +1229,7 @@
 	else
 		fprintf(fil, "\t.ops = NULL,\n");
 	fprintf(fil, "#endif\n");
-	fprintf(fil, "\t.bus = &%s_bus,\n", ptr->parent->dev->name);
+	fprintf(fil, "\t.upstream = &%s_bus,\n", ptr->parent->dev->name);
 	fprintf(fil, "\t.path = {");
 	fprintf(fil, ptr->path, ptr->path_a, ptr->path_b);
 	fprintf(fil, "},\n");
@@ -1250,10 +1250,10 @@
 			ptr->name);
 	}
 	if (has_children)
-		fprintf(fil, "\t.link_list = &%s_bus,\n",
+		fprintf(fil, "\t.downstream = &%s_bus,\n",
 			ptr->name);
 	else
-		fprintf(fil, "\t.link_list = NULL,\n");
+		fprintf(fil, "\t.downstream = NULL,\n");
 	if (ptr->sibling)
 		fprintf(fil, "\t.sibling = &%s,\n", ptr->sibling->name);
 	else