Module Name:    src
Committed By:   thorpej
Date:           Sat Jan 22 11:49:18 UTC 2022

Modified Files:
        src/sys/arch/macppc/dev: gpio.c mediabay.c obio.c smu.c uni-n.c
        src/sys/arch/macppc/macppc: mainbus.c
        src/sys/arch/sparc/dev: bootbus.c ebus.c sbus.c
        src/sys/arch/sparc/include: promlib.h
        src/sys/arch/sparc/sparc: autoconf.c iommu.c promlib.c
        src/sys/arch/sparc64/dev: cbus.c central.c ebus.c ebus_mainbus.c fhc.c
            sbus.c upa.c vbus.c
        src/sys/arch/sparc64/sparc64: autoconf.c
        src/sys/arch/x86/x86: mpacpi.c
        src/sys/dev/acpi: acpi.c acpi_pci.c acpi_util.c acpi_util.h
        src/sys/dev/fdt: fdtbus.c
        src/sys/dev/i2c: i2c.c
        src/sys/dev/ofisa: ofisa.c
        src/sys/dev/ofw: ofbus.c ofw_pci_subr.c ofw_subr.c openfirm.h
        src/sys/dev/sbus: dma_sbus.c lebuffer.c qec.c

Log Message:
Change the devhandle_from_*() functions to also take a "super handle",
from which the newly created handle will inherit it's implementation.
The root implementation for a new handle type is used if an invalid
"super handle" is passed.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/macppc/dev/gpio.c \
    src/sys/arch/macppc/dev/smu.c
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/macppc/dev/mediabay.c
cvs rdiff -u -r1.50 -r1.51 src/sys/arch/macppc/dev/obio.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/macppc/dev/uni-n.c
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/macppc/macppc/mainbus.c
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/sparc/dev/bootbus.c
cvs rdiff -u -r1.41 -r1.42 src/sys/arch/sparc/dev/ebus.c
cvs rdiff -u -r1.83 -r1.84 src/sys/arch/sparc/dev/sbus.c
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/sparc/include/promlib.h
cvs rdiff -u -r1.269 -r1.270 src/sys/arch/sparc/sparc/autoconf.c
cvs rdiff -u -r1.100 -r1.101 src/sys/arch/sparc/sparc/iommu.c
cvs rdiff -u -r1.51 -r1.52 src/sys/arch/sparc/sparc/promlib.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/sparc64/dev/cbus.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/sparc64/dev/central.c \
    src/sys/arch/sparc64/dev/vbus.c
cvs rdiff -u -r1.68 -r1.69 src/sys/arch/sparc64/dev/ebus.c
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/sparc64/dev/ebus_mainbus.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/sparc64/dev/fhc.c
cvs rdiff -u -r1.103 -r1.104 src/sys/arch/sparc64/dev/sbus.c
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/sparc64/dev/upa.c
cvs rdiff -u -r1.237 -r1.238 src/sys/arch/sparc64/sparc64/autoconf.c
cvs rdiff -u -r1.108 -r1.109 src/sys/arch/x86/x86/mpacpi.c
cvs rdiff -u -r1.295 -r1.296 src/sys/dev/acpi/acpi.c
cvs rdiff -u -r1.33 -r1.34 src/sys/dev/acpi/acpi_pci.c
cvs rdiff -u -r1.31 -r1.32 src/sys/dev/acpi/acpi_util.c
cvs rdiff -u -r1.13 -r1.14 src/sys/dev/acpi/acpi_util.h
cvs rdiff -u -r1.44 -r1.45 src/sys/dev/fdt/fdtbus.c
cvs rdiff -u -r1.82 -r1.83 src/sys/dev/i2c/i2c.c
cvs rdiff -u -r1.34 -r1.35 src/sys/dev/ofisa/ofisa.c
cvs rdiff -u -r1.30 -r1.31 src/sys/dev/ofw/ofbus.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/ofw/ofw_pci_subr.c
cvs rdiff -u -r1.59 -r1.60 src/sys/dev/ofw/ofw_subr.c
cvs rdiff -u -r1.47 -r1.48 src/sys/dev/ofw/openfirm.h
cvs rdiff -u -r1.38 -r1.39 src/sys/dev/sbus/dma_sbus.c
cvs rdiff -u -r1.39 -r1.40 src/sys/dev/sbus/lebuffer.c
cvs rdiff -u -r1.53 -r1.54 src/sys/dev/sbus/qec.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/macppc/dev/gpio.c
diff -u src/sys/arch/macppc/dev/gpio.c:1.15 src/sys/arch/macppc/dev/gpio.c:1.16
--- src/sys/arch/macppc/dev/gpio.c:1.15	Sat Aug  7 16:18:57 2021
+++ src/sys/arch/macppc/dev/gpio.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: gpio.c,v 1.15 2021/08/07 16:18:57 thorpej Exp $	*/
+/*	$NetBSD: gpio.c,v 1.16 2022/01/22 11:49:16 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 1998	Internet Research Institute, Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gpio.c,v 1.15 2021/08/07 16:18:57 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gpio.c,v 1.16 2022/01/22 11:49:16 thorpej Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -97,6 +97,7 @@ gpio_obio_attach(device_t parent, device
 	sc->sc_port = mapiodev(ca->ca_baseaddr + ca->ca_reg[0], ca->ca_reg[1],
 	    false);
 
+	devhandle_t selfh = device_handle(self);
 	ca2.ca_baseaddr = ca->ca_baseaddr;
 	for (child = OF_child(ca->ca_node); child; child = OF_peer(child)) {
 		namelen = OF_getprop(child, "name", name, sizeof(name));
@@ -120,7 +121,7 @@ gpio_obio_attach(device_t parent, device
 		ca2.ca_intr = intr;
 
 		config_found(self, &ca2, gpio_obio_print,
-		    CFARGS(.devhandle = devhandle_from_of(child)));
+		    CFARGS(.devhandle = devhandle_from_of(selfh, child)));
 	}
 }
 
Index: src/sys/arch/macppc/dev/smu.c
diff -u src/sys/arch/macppc/dev/smu.c:1.15 src/sys/arch/macppc/dev/smu.c:1.16
--- src/sys/arch/macppc/dev/smu.c:1.15	Fri Sep  3 17:18:40 2021
+++ src/sys/arch/macppc/dev/smu.c	Sat Jan 22 11:49:16 2022
@@ -365,6 +365,7 @@ smu_setup_iicbus(struct smu_softc *sc)
 	int node;
 	char name[32];
 
+	devhandle_t selfh = device_handle(sc->sc_dev);
 	node = of_getnode_byname(sc->sc_node, "smu-i2c-control");
 	if (node == 0) node = sc->sc_node;
 	for (node = OF_child(node);
@@ -393,7 +394,7 @@ smu_setup_iicbus(struct smu_softc *sc)
 		ca.ca_node = node;
 		ca.ca_tag = i2c;
 		config_found(sc->sc_dev, &ca, smu_iicbus_print,
-		    CFARGS(.devhandle = devhandle_from_of(node)));
+		    CFARGS(.devhandle = devhandle_from_of(selfh, node)));
 
 		sc->sc_num_iicbus++;
 	}

Index: src/sys/arch/macppc/dev/mediabay.c
diff -u src/sys/arch/macppc/dev/mediabay.c:1.26 src/sys/arch/macppc/dev/mediabay.c:1.27
--- src/sys/arch/macppc/dev/mediabay.c:1.26	Sat Aug  7 16:18:57 2021
+++ src/sys/arch/macppc/dev/mediabay.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: mediabay.c,v 1.26 2021/08/07 16:18:57 thorpej Exp $	*/
+/*	$NetBSD: mediabay.c,v 1.27 2022/01/22 11:49:16 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 1999 Tsubai Masanari.  All rights reserved.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mediabay.c,v 1.26 2021/08/07 16:18:57 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mediabay.c,v 1.27 2022/01/22 11:49:16 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -225,6 +225,7 @@ mediabay_attach_content(struct mediabay_
 		printf(" done.\n");
 	}
 
+	devhandle_t selfh = device_handle(sc->sc_dev);
 	for (child = OF_child(sc->sc_node); child; child = OF_peer(child)) {
 		memset(name, 0, sizeof(name));
 		if (OF_getprop(child, "name", name, sizeof(name)) == -1)
@@ -244,7 +245,7 @@ mediabay_attach_content(struct mediabay_
 		ca.ca_intr = intr;
 
 		content = config_found(sc->sc_dev, &ca, mediabay_print,
-		    CFARGS(.devhandle = devhandle_from_of(child)));
+		    CFARGS(.devhandle = devhandle_from_of(selfh, child)));
 		if (content) {
 			sc->sc_content = content;
 			return;

Index: src/sys/arch/macppc/dev/obio.c
diff -u src/sys/arch/macppc/dev/obio.c:1.50 src/sys/arch/macppc/dev/obio.c:1.51
--- src/sys/arch/macppc/dev/obio.c:1.50	Sat Aug  7 16:18:57 2021
+++ src/sys/arch/macppc/dev/obio.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: obio.c,v 1.50 2021/08/07 16:18:57 thorpej Exp $	*/
+/*	$NetBSD: obio.c,v 1.51 2022/01/22 11:49:16 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 1998	Internet Research Institute, Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: obio.c,v 1.50 2021/08/07 16:18:57 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: obio.c,v 1.51 2022/01/22 11:49:16 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -236,6 +236,7 @@ obio_attach(device_t parent, device_t se
 			bus_space_write_1(ca.ca_tag, bsh, 0x37, 0x03);
 	}
 
+	devhandle_t selfh = device_handle(self);
 	for (child = OF_child(node); child; child = OF_peer(child)) {
 		namelen = OF_getprop(child, "name", name, sizeof(name));
 		if (namelen < 0)
@@ -272,7 +273,7 @@ obio_attach(device_t parent, device_t se
 		ca.ca_intr = intr;
 
 		config_found(self, &ca, obio_print,
-		    CFARGS(.devhandle = devhandle_from_of(child)));
+		    CFARGS(.devhandle = devhandle_from_of(selfh, child)));
 	}
 }
 

Index: src/sys/arch/macppc/dev/uni-n.c
diff -u src/sys/arch/macppc/dev/uni-n.c:1.11 src/sys/arch/macppc/dev/uni-n.c:1.12
--- src/sys/arch/macppc/dev/uni-n.c:1.11	Sat Aug  7 16:18:58 2021
+++ src/sys/arch/macppc/dev/uni-n.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: uni-n.c,v 1.11 2021/08/07 16:18:58 thorpej Exp $	*/
+/*	$NetBSD: uni-n.c,v 1.12 2022/01/22 11:49:16 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 2005 Michael Lorenz.
@@ -31,7 +31,7 @@
  */
  
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uni-n.c,v 1.11 2021/08/07 16:18:58 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uni-n.c,v 1.12 2022/01/22 11:49:16 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -129,6 +129,7 @@ uni_n_attach(device_t parent, device_t s
 		panic("Can't init uni-n mem tag");
 	}
 
+	devhandle_t selfh = device_handle(self);
 	for (child = OF_child(node); child; child = OF_peer(child)) {
 		namelen = OF_getprop(child, "name", name, sizeof(name));
 		if (namelen < 0)
@@ -150,7 +151,7 @@ uni_n_attach(device_t parent, device_t s
 		ca.ca_reg = reg;
 		ca.ca_intr = intr;
 		config_found(self, &ca, uni_n_print,
-		    CFARGS(.devhandle = devhandle_from_of(child)));
+		    CFARGS(.devhandle = devhandle_from_of(selfh, child)));
 	}
 }
 

Index: src/sys/arch/macppc/macppc/mainbus.c
diff -u src/sys/arch/macppc/macppc/mainbus.c:1.24 src/sys/arch/macppc/macppc/mainbus.c:1.25
--- src/sys/arch/macppc/macppc/mainbus.c:1.24	Sat Aug  7 16:18:58 2021
+++ src/sys/arch/macppc/macppc/mainbus.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: mainbus.c,v 1.24 2021/08/07 16:18:58 thorpej Exp $	*/
+/*	$NetBSD: mainbus.c,v 1.25 2022/01/22 11:49:16 thorpej Exp $	*/
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.24 2021/08/07 16:18:58 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.25 2022/01/22 11:49:16 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -73,6 +73,8 @@ mainbus_attach(device_t parent, device_t
 
 	printf("\n");
 
+	devhandle_t selfh = device_handle(self);
+
 	cpus = OF_finddevice("/cpus");
 	if (cpus != 0) {
 		node = OF_child(cpus);
@@ -81,7 +83,8 @@ mainbus_attach(device_t parent, device_t
 			ca.ca_reg = reg;
 			ca.ca_nreg = OF_getprop(node, "reg", reg, sizeof(reg));
 			config_found(self, &ca, NULL,
-			    CFARGS(.devhandle = devhandle_from_of(node)));
+			    CFARGS(.devhandle = devhandle_from_of(selfh,
+								  node)));
 			node = OF_peer(node);
 		}			
 	} else {
@@ -100,7 +103,7 @@ mainbus_attach(device_t parent, device_t
 		oba.oba_busname = "ofw";
 		oba.oba_phandle = node;
 		config_found(self, &oba, NULL,
-		    CFARGS(.devhandle = devhandle_from_of(node)));
+		    CFARGS(.devhandle = devhandle_from_of(selfh, node)));
 	}
 
 	for (node = OF_child(OF_finddevice("/")); node; node = OF_peer(node)) {
@@ -113,7 +116,7 @@ mainbus_attach(device_t parent, device_t
 		ca.ca_nreg = OF_getprop(node, "reg", reg, sizeof(reg));
 		ca.ca_reg  = reg;
 		config_found(self, &ca, NULL,
-		    CFARGS(.devhandle = devhandle_from_of(node)));
+		    CFARGS(.devhandle = devhandle_from_of(selfh, node)));
 	}
 
 #ifdef MAMBO

Index: src/sys/arch/sparc/dev/bootbus.c
diff -u src/sys/arch/sparc/dev/bootbus.c:1.23 src/sys/arch/sparc/dev/bootbus.c:1.24
--- src/sys/arch/sparc/dev/bootbus.c:1.23	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc/dev/bootbus.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: bootbus.c,v 1.23 2021/08/07 16:19:05 thorpej Exp $	*/
+/*	$NetBSD: bootbus.c,v 1.24 2022/01/22 11:49:16 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bootbus.c,v 1.23 2021/08/07 16:19:05 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bootbus.c,v 1.24 2022/01/22 11:49:16 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/malloc.h>
@@ -115,6 +115,7 @@ bootbus_attach(device_t parent, device_t
 	}
 
 	/* Attach the CPU (and possibly bootbus) child nodes. */
+	devhandle_t selfh = device_handle(self);
 	for (node = firstchild(sc->sc_node); node != 0;
 	     node = nextsibling(node)) {
 		struct bootbus_attach_args baa;
@@ -123,7 +124,7 @@ bootbus_attach(device_t parent, device_t
 			panic("bootbus_attach: failed to set up attach args");
 
 		config_found(self, &baa, bootbus_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node),
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node),
 			   .submatch = bootbus_submatch));
 
 		bootbus_destroy_attach_args(&baa);

Index: src/sys/arch/sparc/dev/ebus.c
diff -u src/sys/arch/sparc/dev/ebus.c:1.41 src/sys/arch/sparc/dev/ebus.c:1.42
--- src/sys/arch/sparc/dev/ebus.c:1.41	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc/dev/ebus.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ebus.c,v 1.41 2021/08/07 16:19:05 thorpej Exp $ */
+/*	$NetBSD: ebus.c,v 1.42 2022/01/22 11:49:16 thorpej Exp $ */
 
 /*
  * Copyright (c) 1999, 2000 Matthew R. Green
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ebus.c,v 1.41 2021/08/07 16:19:05 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ebus.c,v 1.42 2022/01/22 11:49:16 thorpej Exp $");
 
 #if defined(DEBUG) && !defined(EBUS_DEBUG)
 #define EBUS_DEBUG
@@ -307,6 +307,7 @@ ebus_attach(device_t parent, device_t se
 	 * now attach all our children
 	 */
 	DPRINTF(EDB_CHILD, ("ebus node %08x, searching children...\n", node));
+	devhandle_t selfh = device_handle(self);
 	for (node = firstchild(node); node; node = nextsibling(node)) {
 		char *name = prom_getpropstring(node, "name");
 
@@ -317,7 +318,7 @@ ebus_attach(device_t parent, device_t se
 		DPRINTF(EDB_CHILD,
 			("- found child `%s', attaching\n", ea.ea_name));
 		(void)config_found(self, &ea, ebus_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 		ebus_destroy_attach_args(&ea);
 	}
 }

Index: src/sys/arch/sparc/dev/sbus.c
diff -u src/sys/arch/sparc/dev/sbus.c:1.83 src/sys/arch/sparc/dev/sbus.c:1.84
--- src/sys/arch/sparc/dev/sbus.c:1.83	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc/dev/sbus.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: sbus.c,v 1.83 2021/08/07 16:19:05 thorpej Exp $ */
+/*	$NetBSD: sbus.c,v 1.84 2022/01/22 11:49:16 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -74,7 +74,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sbus.c,v 1.83 2021/08/07 16:19:05 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sbus.c,v 1.84 2022/01/22 11:49:16 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/malloc.h>
@@ -352,6 +352,7 @@ sbus_attach_common(struct sbus_softc *sc
 	const char *const *ssp;
 	bus_space_tag_t sbt;
 	struct sbus_attach_args sa;
+	devhandle_t selfh = device_handle(sc->sc_dev);
 
 	if ((sbt = bus_space_tag_alloc(sc->sc_bustag, sc)) == NULL) {
 		printf("%s: attach: out of memory\n",
@@ -413,7 +414,7 @@ sbus_attach_common(struct sbus_softc *sc
 			panic("sbus_attach: %s: incomplete", sp);
 		}
 		(void) config_found(sc->sc_dev, (void *)&sa, sbus_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 		sbus_destroy_attach_args(&sa);
 	}
 
@@ -435,7 +436,7 @@ sbus_attach_common(struct sbus_softc *sc
 			continue;
 		}
 		(void) config_found(sc->sc_dev, (void *)&sa, sbus_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 		sbus_destroy_attach_args(&sa);
 	}
 }

Index: src/sys/arch/sparc/include/promlib.h
diff -u src/sys/arch/sparc/include/promlib.h:1.26 src/sys/arch/sparc/include/promlib.h:1.27
--- src/sys/arch/sparc/include/promlib.h:1.26	Mon May 10 13:59:30 2021
+++ src/sys/arch/sparc/include/promlib.h	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: promlib.h,v 1.26 2021/05/10 13:59:30 thorpej Exp $ */
+/*	$NetBSD: promlib.h,v 1.27 2022/01/22 11:49:16 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -113,7 +113,7 @@ struct promops {
 	int	(*po_finddevice)(const char *);
 
 	/* devhandle_t interface */
-	devhandle_t (*po_node_to_devhandle)(int);
+	devhandle_t (*po_node_to_devhandle)(devhandle_t, int);
 	int	(*po_devhandle_to_node)(devhandle_t);
 };
 
@@ -217,8 +217,8 @@ void	prom_boot(char *)	__attribute__((__
 #define prom_getproplen(node,name)	prom_proplen(node, name)
 
 /* devhandle_t interface */
-#define	prom_node_to_devhandle(n)  ((*promops.po_node_to_devhandle)(n))
-#define	prom_devhandle_to_node(dh) ((*promops.po_devhandle_to_node)(dh))
+#define	prom_node_to_devhandle(s, n) ((*promops.po_node_to_devhandle)((s), (n)))
+#define	prom_devhandle_to_node(dh)   ((*promops.po_devhandle_to_node)(dh))
 
 /* MP stuff - not currently used */
 #define prom_cpustart(m,a,c,pc)	((*promops.po_cpustart)(m,a,c,pc))

Index: src/sys/arch/sparc/sparc/autoconf.c
diff -u src/sys/arch/sparc/sparc/autoconf.c:1.269 src/sys/arch/sparc/sparc/autoconf.c:1.270
--- src/sys/arch/sparc/sparc/autoconf.c:1.269	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc/sparc/autoconf.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: autoconf.c,v 1.269 2021/08/07 16:19:05 thorpej Exp $ */
+/*	$NetBSD: autoconf.c,v 1.270 2022/01/22 11:49:16 thorpej Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.269 2021/08/07 16:19:05 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.270 2022/01/22 11:49:16 thorpej Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -1243,6 +1243,7 @@ mainbus_attach(device_t parent, device_t
  * The rest of this routine is for OBP machines exclusively.
  */
 #if defined(SUN4C) || defined(SUN4M) || defined(SUN4D)
+	devhandle_t selfh = device_handle(dev);
 
 	if (CPU_ISSUN4D)
 		openboot_special = openboot_special4d;
@@ -1286,7 +1287,8 @@ mainbus_attach(device_t parent, device_t
 			ma.ma_node = node;
 			ma.ma_name = "cpu";
 			config_found(dev, (void *)&ma, mbprint,
-			    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+			    CFARGS(.devhandle = prom_node_to_devhandle(selfh,
+								       node)));
 			if (node == bootnode && bootmid != 0) {
 				/* Re-enter loop to find all remaining CPUs */
 				goto rescan;
@@ -1299,7 +1301,8 @@ mainbus_attach(device_t parent, device_t
 		ma.ma_node = findroot();
 		ma.ma_name = "cpu";
 		config_found(dev, (void *)&ma, mbprint,
-		    CFARGS(.devhandle = prom_node_to_devhandle(ma.ma_node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh,
+							       ma.ma_node)));
 	}
 
 	for (ssp = openboot_special; (sp = ssp->dev) != NULL; ssp++) {
@@ -1331,7 +1334,8 @@ mainbus_attach(device_t parent, device_t
 
 		if (config_found(dev, (void *)&ma, mbprint,
 				 CFARGS(.devhandle =
-				     prom_node_to_devhandle(node))) == NULL) {
+				     prom_node_to_devhandle(selfh,
+				 			    node))) == NULL) {
 			if (ssp->flags & BS_OPTIONAL) continue;
 			panic("%s", sp);
 		}
@@ -1391,7 +1395,8 @@ mainbus_attach(device_t parent, device_t
 			ma.ma_promvaddr = 0;
 
 			config_found(dev, (void *)&ma, mbprint,
-			    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+			    CFARGS(.devhandle = prom_node_to_devhandle(selfh,
+								       node)));
 			continue;
 		}
 #endif /* SUN4M */
@@ -1409,7 +1414,7 @@ mainbus_attach(device_t parent, device_t
 			continue;
 
 		config_found(dev, (void *)&ma, mbprint,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 	}
 #endif /* SUN4C || SUN4M || SUN4D */
 }

Index: src/sys/arch/sparc/sparc/iommu.c
diff -u src/sys/arch/sparc/sparc/iommu.c:1.100 src/sys/arch/sparc/sparc/iommu.c:1.101
--- src/sys/arch/sparc/sparc/iommu.c:1.100	Mon Aug  9 21:08:06 2021
+++ src/sys/arch/sparc/sparc/iommu.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: iommu.c,v 1.100 2021/08/09 21:08:06 andvar Exp $ */
+/*	$NetBSD: iommu.c,v 1.101 2022/01/22 11:49:16 thorpej Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: iommu.c,v 1.100 2021/08/09 21:08:06 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: iommu.c,v 1.101 2022/01/22 11:49:16 thorpej Exp $");
 
 #include "opt_sparc_arch.h"
 
@@ -278,6 +278,8 @@ iommu_attach(device_t parent, device_t s
 					IOMMU_DVMA_BASE, IOMMU_DVMA_END,
 					0, 0, EX_WAITOK);
 
+	devhandle_t selfh = device_handle(self);
+
 	/*
 	 * If we are attaching implicit iommu on JS1/OF we do not have
 	 * an iommu node to traverse, instead mainbus_attach passed us
@@ -299,7 +301,7 @@ iommu_attach(device_t parent, device_t s
 		ia.iom_nreg = 1;
 
 		config_found(self, (void *)&ia, iommu_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 		return;
 	}
 
@@ -323,7 +325,7 @@ iommu_attach(device_t parent, device_t s
 			&ia.iom_nreg, &ia.iom_reg);
 
 		config_found(self, (void *)&ia, iommu_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 		if (ia.iom_reg != NULL)
 			free(ia.iom_reg, M_DEVBUF);
 	}

Index: src/sys/arch/sparc/sparc/promlib.c
diff -u src/sys/arch/sparc/sparc/promlib.c:1.51 src/sys/arch/sparc/sparc/promlib.c:1.52
--- src/sys/arch/sparc/sparc/promlib.c:1.51	Fri Jan 21 15:55:36 2022
+++ src/sys/arch/sparc/sparc/promlib.c	Sat Jan 22 11:49:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: promlib.c,v 1.51 2022/01/21 15:55:36 thorpej Exp $ */
+/*	$NetBSD: promlib.c,v 1.52 2022/01/22 11:49:16 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: promlib.c,v 1.51 2022/01/21 15:55:36 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: promlib.c,v 1.52 2022/01/22 11:49:16 thorpej Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_sparc_arch.h"
@@ -239,12 +239,18 @@ static const struct devhandle_impl obp_d
 };
 
 static devhandle_t
-devhandle_from_obp(int node)
+devhandle_from_obp(devhandle_t super_handle, int node)
 {
-	devhandle_t handle = {
-		.impl = &obp_devhandle_impl,
-		.integer = node,
-	};
+	devhandle_type_t super_type = devhandle_type(super_handle);
+	devhandle_t handle = { 0 };
+
+	if (super_type == DEVHANDLE_TYPE_OPENBOOT) {
+		handle.impl = super_handle.impl;
+	} else {
+		KASSERT(super_type == DEVHANDLE_TYPE_INVALID);
+		handle.impl = &obp_devhandle_impl;
+	}
+	handle.integer = node;
 
 	return handle;
 }
@@ -265,7 +271,7 @@ obp_device_enumerate_children(device_t d
 
 	for (node = prom_firstchild(node); node != 0;
 	     node = prom_nextsibling(node)) {
-		if (!args->callback(dev, devhandle_from_obp(node),
+		if (!args->callback(dev, devhandle_from_obp(call_handle, node),
 				    args->callback_arg)) {
 			break;
 		}

Index: src/sys/arch/sparc64/dev/cbus.c
diff -u src/sys/arch/sparc64/dev/cbus.c:1.7 src/sys/arch/sparc64/dev/cbus.c:1.8
--- src/sys/arch/sparc64/dev/cbus.c:1.7	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc64/dev/cbus.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: cbus.c,v 1.7 2021/08/07 16:19:05 thorpej Exp $	*/
+/*	$NetBSD: cbus.c,v 1.8 2022/01/22 11:49:17 thorpej Exp $	*/
 /*	$OpenBSD: cbus.c,v 1.15 2015/09/27 11:29:20 kettenis Exp $	*/
 /*
  * Copyright (c) 2008 Mark Kettenis
@@ -101,6 +101,7 @@ cbus_attach(device_t parent, device_t se
 	  return;
 	}
 
+	devhandle_t selfh = device_handle(self);
 	for (node = OF_child(va->va_node); node; node = OF_peer(node)) {
 		struct cbus_attach_args ca;
 		char buf[32];
@@ -122,7 +123,7 @@ cbus_attach(device_t parent, device_t se
 		}
 
 		config_found(self, &ca, cbus_print,
-		    CFARGS(.devhandle = devhandle_from_of(ca.ca_node)));
+		    CFARGS(.devhandle = devhandle_from_of(selfh, ca.ca_node)));
 	}
 }
 

Index: src/sys/arch/sparc64/dev/central.c
diff -u src/sys/arch/sparc64/dev/central.c:1.8 src/sys/arch/sparc64/dev/central.c:1.9
--- src/sys/arch/sparc64/dev/central.c:1.8	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc64/dev/central.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: central.c,v 1.8 2021/08/07 16:19:05 thorpej Exp $	*/
+/*	$NetBSD: central.c,v 1.9 2022/01/22 11:49:17 thorpej Exp $	*/
 /*	$OpenBSD: central.c,v 1.7 2010/11/11 17:58:23 miod Exp $	*/
 
 /*
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: central.c,v 1.8 2021/08/07 16:19:05 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: central.c,v 1.9 2022/01/22 11:49:17 thorpej Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -97,6 +97,7 @@ central_attach(device_t parent, device_t
 
 	printf("\n");
 
+	devhandle_t selfh = device_handle(self);
 	node0 = firstchild(sc->sc_node);
 	for (node = node0; node; node = nextsibling(node)) {
 		struct central_attach_args ca;
@@ -113,7 +114,8 @@ central_attach(device_t parent, device_t
 		    &ca.ca_nreg, (void **)&ca.ca_reg);
 
 		(void)config_found(self, (void *)&ca, central_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(ca.ca_node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh,
+							       ca.ca_node)));
 
 		if (ca.ca_name != NULL)
 			free(ca.ca_name, M_DEVBUF);
Index: src/sys/arch/sparc64/dev/vbus.c
diff -u src/sys/arch/sparc64/dev/vbus.c:1.8 src/sys/arch/sparc64/dev/vbus.c:1.9
--- src/sys/arch/sparc64/dev/vbus.c:1.8	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc64/dev/vbus.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vbus.c,v 1.8 2021/08/07 16:19:05 thorpej Exp $	*/
+/*	$NetBSD: vbus.c,v 1.9 2022/01/22 11:49:17 thorpej Exp $	*/
 /*	$OpenBSD: vbus.c,v 1.8 2015/09/27 11:29:20 kettenis Exp $	*/
 /*
  * Copyright (c) 2008 Mark Kettenis
@@ -81,6 +81,7 @@ vbus_attach(device_t parent, device_t se
 	sc->sc_dmatag = ma->ma_dmatag;
 	printf("\n");
 
+	devhandle_t selfh = device_handle(self);
 	for (node = OF_child(ma->ma_node); node; node = OF_peer(node)) {
 		struct vbus_attach_args va;
 		char buf[32];
@@ -97,7 +98,8 @@ vbus_attach(device_t parent, device_t se
 		prom_getprop(node, "interrupts", sizeof(*va.va_intr),
 			     &va.va_nintr, (void **)&va.va_intr);
 		config_found(self, &va, vbus_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(va.va_node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh,
+							       va.va_node)));
 	}
 
 	struct vbus_attach_args va;

Index: src/sys/arch/sparc64/dev/ebus.c
diff -u src/sys/arch/sparc64/dev/ebus.c:1.68 src/sys/arch/sparc64/dev/ebus.c:1.69
--- src/sys/arch/sparc64/dev/ebus.c:1.68	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc64/dev/ebus.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ebus.c,v 1.68 2021/08/07 16:19:05 thorpej Exp $	*/
+/*	$NetBSD: ebus.c,v 1.69 2022/01/22 11:49:17 thorpej Exp $	*/
 
 /*
  * Copyright (c) 1999, 2000, 2001 Matthew R. Green
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ebus.c,v 1.68 2021/08/07 16:19:05 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ebus.c,v 1.69 2022/01/22 11:49:17 thorpej Exp $");
 
 #include "opt_ddb.h"
 
@@ -204,6 +204,7 @@ ebus_attach(device_t parent, device_t se
 	 * now attach all our children
 	 */
 	DPRINTF(EDB_CHILD, ("ebus node %08x, searching children...\n", node));
+	devhandle_t selfh = device_handle(self);
 	for (node = firstchild(node); node; node = nextsibling(node)) {
 		char *name = prom_getpropstring(node, "name");
 
@@ -214,7 +215,8 @@ ebus_attach(device_t parent, device_t se
 			DPRINTF(EDB_CHILD, ("- found child `%s', attaching\n",
 			    eba.ea_name));
 			(void)config_found(self, &eba, ebus_print,
-			    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+			    CFARGS(.devhandle = prom_node_to_devhandle(selfh,
+								       node)));
 		}
 		ebus_destroy_attach_args(&eba);
 	}

Index: src/sys/arch/sparc64/dev/ebus_mainbus.c
diff -u src/sys/arch/sparc64/dev/ebus_mainbus.c:1.21 src/sys/arch/sparc64/dev/ebus_mainbus.c:1.22
--- src/sys/arch/sparc64/dev/ebus_mainbus.c:1.21	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc64/dev/ebus_mainbus.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ebus_mainbus.c,v 1.21 2021/08/07 16:19:05 thorpej Exp $	*/
+/*	$NetBSD: ebus_mainbus.c,v 1.22 2022/01/22 11:49:17 thorpej Exp $	*/
 /*	$OpenBSD: ebus_mainbus.c,v 1.7 2010/11/11 17:58:23 miod Exp $	*/
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ebus_mainbus.c,v 1.21 2021/08/07 16:19:05 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ebus_mainbus.c,v 1.22 2022/01/22 11:49:17 thorpej Exp $");
 
 #ifdef DEBUG
 #define	EDB_PROM	0x01
@@ -164,6 +164,7 @@ ebus_mainbus_attach(device_t parent, dev
 	 * now attach all our children
 	 */
 	DPRINTF(EDB_CHILD, ("ebus node %08x, searching children...\n", node));
+	devhandle_t selfh = device_handle(self);
 	for (node = firstchild(node); node; node = nextsibling(node)) {
 		if (ebus_setup_attach_args(sc, node, &eba) != 0) {
 			DPRINTF(EDB_CHILD,
@@ -174,7 +175,8 @@ ebus_mainbus_attach(device_t parent, dev
 			DPRINTF(EDB_CHILD, ("- found child `%s', attaching\n",
 			    eba.ea_name));
 			(void)config_found(self, &eba, ebus_print,
-			    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+			    CFARGS(.devhandle = prom_node_to_devhandle(selfh,
+								       node)));
 		}
 		ebus_destroy_attach_args(&eba);
 	}

Index: src/sys/arch/sparc64/dev/fhc.c
diff -u src/sys/arch/sparc64/dev/fhc.c:1.10 src/sys/arch/sparc64/dev/fhc.c:1.11
--- src/sys/arch/sparc64/dev/fhc.c:1.10	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc64/dev/fhc.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: fhc.c,v 1.10 2021/08/07 16:19:05 thorpej Exp $	*/
+/*	$NetBSD: fhc.c,v 1.11 2022/01/22 11:49:17 thorpej Exp $	*/
 /*	$OpenBSD: fhc.c,v 1.17 2010/11/11 17:58:23 miod Exp $	*/
 
 /*
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fhc.c,v 1.10 2021/08/07 16:19:05 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fhc.c,v 1.11 2022/01/22 11:49:17 thorpej Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -91,6 +91,7 @@ fhc_attach(struct fhc_softc *sc)
 	prom_getprop(sc->sc_node, "ranges", sizeof(struct fhc_range),
 	    &sc->sc_nrange, (void **)&sc->sc_range);
 
+	devhandle_t selfh = device_handle(sc->sc_dev);
 	node0 = firstchild(sc->sc_node);
 	for (node = node0; node; node = nextsibling(node)) {
 		struct fhc_attach_args fa;
@@ -117,7 +118,7 @@ fhc_attach(struct fhc_softc *sc)
 		    &fa.fa_npromvaddrs, (void **)&fa.fa_promvaddrs);
 
 		(void)config_found(sc->sc_dev, (void *)&fa, fhc_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 
 		if (fa.fa_name != NULL)
 			free(fa.fa_name, M_DEVBUF);

Index: src/sys/arch/sparc64/dev/sbus.c
diff -u src/sys/arch/sparc64/dev/sbus.c:1.103 src/sys/arch/sparc64/dev/sbus.c:1.104
--- src/sys/arch/sparc64/dev/sbus.c:1.103	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc64/dev/sbus.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: sbus.c,v 1.103 2021/08/07 16:19:05 thorpej Exp $ */
+/*	$NetBSD: sbus.c,v 1.104 2022/01/22 11:49:17 thorpej Exp $ */
 
 /*
  * Copyright (c) 1999-2002 Eduardo Horvath
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sbus.c,v 1.103 2021/08/07 16:19:05 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sbus.c,v 1.104 2022/01/22 11:49:17 thorpej Exp $");
 
 #include "opt_ddb.h"
 
@@ -284,6 +284,7 @@ sbus_attach(device_t parent, device_t se
 	 * `specials' is an array of device names that are treated
 	 * specially:
 	 */
+	devhandle_t selfh = device_handle(self);
 	node0 = OF_child(node);
 	for (node = node0; node; node = OF_peer(node)) {
 		char *name1 = prom_getpropstring(node, "name");
@@ -294,7 +295,7 @@ sbus_attach(device_t parent, device_t se
 			continue;
 		}
 		(void) config_found(self, &sa, sbus_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 		sbus_destroy_attach_args(&sa);
 	}
 }

Index: src/sys/arch/sparc64/dev/upa.c
diff -u src/sys/arch/sparc64/dev/upa.c:1.23 src/sys/arch/sparc64/dev/upa.c:1.24
--- src/sys/arch/sparc64/dev/upa.c:1.23	Sat Aug  7 16:19:05 2021
+++ src/sys/arch/sparc64/dev/upa.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: upa.c,v 1.23 2021/08/07 16:19:05 thorpej Exp $	*/
+/*	$NetBSD: upa.c,v 1.24 2022/01/22 11:49:17 thorpej Exp $	*/
 /*	$OpenBSD: upa.c,v 1.8 2008/01/17 22:53:18 kettenis Exp $	*/
 
 /*
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: upa.c,v 1.23 2021/08/07 16:19:05 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: upa.c,v 1.24 2022/01/22 11:49:17 thorpej Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -116,6 +116,7 @@ upa_attach(device_t parent, device_t sel
 
 	sc->sc_cbt = upa_alloc_bus_tag(sc);
 
+	devhandle_t selfh = device_handle(sc->sc_dev);
 	for (node = OF_child(sc->sc_node); node; node = OF_peer(node)) {
 		char buf[32];
 		struct mainbus_attach_args map;
@@ -133,7 +134,7 @@ upa_attach(device_t parent, device_t sel
 		map.ma_bustag = sc->sc_cbt;
 		map.ma_dmatag = ma->ma_dmatag;
 		config_found(sc->sc_dev, &map, upa_print,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 	}
 }
 

Index: src/sys/arch/sparc64/sparc64/autoconf.c
diff -u src/sys/arch/sparc64/sparc64/autoconf.c:1.237 src/sys/arch/sparc64/sparc64/autoconf.c:1.238
--- src/sys/arch/sparc64/sparc64/autoconf.c:1.237	Mon Oct  4 21:02:39 2021
+++ src/sys/arch/sparc64/sparc64/autoconf.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: autoconf.c,v 1.237 2021/10/04 21:02:39 andvar Exp $ */
+/*	$NetBSD: autoconf.c,v 1.238 2022/01/22 11:49:17 thorpej Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.237 2021/10/04 21:02:39 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.238 2022/01/22 11:49:17 thorpej Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -701,6 +701,8 @@ extern struct sparc_bus_space_tag mainbu
 		aprint_normal(": %s: hostid %lx\n", machine_model, hostid);
 	aprint_naive("\n");
 
+	devhandle_t selfh = device_handle(dev);
+
 	/*
 	 * Locate and configure the ``early'' devices.  These must be
 	 * configured before we can do the rest.  For instance, the
@@ -730,7 +732,7 @@ extern struct sparc_bus_space_tag mainbu
 		ma.ma_node = node;
 		ma.ma_name = "cpu";
 		config_found(dev, &ma, mbprint,
-		    CFARGS(.devhandle = devhandle_from_of(ma.ma_node)));
+		    CFARGS(.devhandle = devhandle_from_of(selfh, ma.ma_node)));
 	}
 
 	node = findroot();	/* re-init root node */
@@ -814,7 +816,8 @@ extern struct sparc_bus_space_tag mainbu
 		}
 #endif
 		(void) config_found(dev, (void *)&ma, mbprint,
-		    CFARGS(.devhandle = prom_node_to_devhandle(ma.ma_node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh,
+							       ma.ma_node)));
 		free(ma.ma_reg, M_DEVBUF);
 		if (ma.ma_ninterrupts)
 			free(ma.ma_interrupts, M_DEVBUF);

Index: src/sys/arch/x86/x86/mpacpi.c
diff -u src/sys/arch/x86/x86/mpacpi.c:1.108 src/sys/arch/x86/x86/mpacpi.c:1.109
--- src/sys/arch/x86/x86/mpacpi.c:1.108	Thu Oct  7 12:52:27 2021
+++ src/sys/arch/x86/x86/mpacpi.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpacpi.c,v 1.108 2021/10/07 12:52:27 msaitoh Exp $	*/
+/*	$NetBSD: mpacpi.c,v 1.109 2022/01/22 11:49:17 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mpacpi.c,v 1.108 2021/10/07 12:52:27 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpacpi.c,v 1.109 2022/01/22 11:49:17 thorpej Exp $");
 
 #include "acpica.h"
 #include "opt_acpi.h"
@@ -506,7 +506,8 @@ mpacpi_pci_foundbus(struct acpi_devnode 
 	}
 
 	mpr = kmem_zalloc(sizeof(struct mpacpi_pcibus), KM_SLEEP);
-	mpr->mpr_devhandle = devhandle_from_acpi(ad->ad_handle);
+	mpr->mpr_devhandle =
+	    devhandle_from_acpi(devhandle_invalid(), ad->ad_handle);
 	mpr->mpr_buf = buf;
 	mpr->mpr_seg = ad->ad_pciinfo->ap_segment;
 	mpr->mpr_bus = ad->ad_pciinfo->ap_downbus;

Index: src/sys/dev/acpi/acpi.c
diff -u src/sys/dev/acpi/acpi.c:1.295 src/sys/dev/acpi/acpi.c:1.296
--- src/sys/dev/acpi/acpi.c:1.295	Fri Dec 31 14:22:42 2021
+++ src/sys/dev/acpi/acpi.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi.c,v 1.295 2021/12/31 14:22:42 riastradh Exp $	*/
+/*	$NetBSD: acpi.c,v 1.296 2022/01/22 11:49:17 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2003, 2007 The NetBSD Foundation, Inc.
@@ -100,7 +100,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi.c,v 1.295 2021/12/31 14:22:42 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi.c,v 1.296 2022/01/22 11:49:17 thorpej Exp $");
 
 #include "pci.h"
 #include "opt_acpi.h"
@@ -962,7 +962,8 @@ acpi_rescan_early(struct acpi_softc *sc)
 
 		ad->ad_device = config_found(sc->sc_dev, &aa, acpi_print,
 		    CFARGS(.iattr = "acpinodebus",
-			   .devhandle = devhandle_from_acpi(ad->ad_handle)));
+			   .devhandle = devhandle_from_acpi(devhandle_invalid(),
+							    ad->ad_handle)));
 	}
 }
 
@@ -1029,7 +1030,8 @@ acpi_rescan_nodes(struct acpi_softc *sc)
 
 		ad->ad_device = config_found(sc->sc_dev, &aa, acpi_print,
 		    CFARGS(.iattr = "acpinodebus",
-			   .devhandle = devhandle_from_acpi(ad->ad_handle)));
+			   .devhandle = devhandle_from_acpi(devhandle_invalid(),
+							    ad->ad_handle)));
 	}
 }
 

Index: src/sys/dev/acpi/acpi_pci.c
diff -u src/sys/dev/acpi/acpi_pci.c:1.33 src/sys/dev/acpi/acpi_pci.c:1.34
--- src/sys/dev/acpi/acpi_pci.c:1.33	Mon Dec 20 11:17:40 2021
+++ src/sys/dev/acpi/acpi_pci.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_pci.c,v 1.33 2021/12/20 11:17:40 skrll Exp $ */
+/* $NetBSD: acpi_pci.c,v 1.34 2022/01/22 11:49:17 thorpej Exp $ */
 
 /*
  * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_pci.c,v 1.33 2021/12/20 11:17:40 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_pci.c,v 1.34 2022/01/22 11:49:17 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -572,7 +572,7 @@ acpi_pci_bus_get_child_devhandle(device_
 
 	if (ad != NULL && (hdl = ad->ad_handle) != NULL) {
 		/* Found it! */
-		args->devhandle = devhandle_from_acpi(hdl);
+		args->devhandle = devhandle_from_acpi(call_handle, hdl);
 		return 0;
 	}
 

Index: src/sys/dev/acpi/acpi_util.c
diff -u src/sys/dev/acpi/acpi_util.c:1.31 src/sys/dev/acpi/acpi_util.c:1.32
--- src/sys/dev/acpi/acpi_util.c:1.31	Sat Jan 15 14:40:22 2022
+++ src/sys/dev/acpi/acpi_util.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_util.c,v 1.31 2022/01/15 14:40:22 jmcneill Exp $ */
+/*	$NetBSD: acpi_util.c,v 1.32 2022/01/22 11:49:17 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2003, 2007, 2021 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.31 2022/01/15 14:40:22 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.32 2022/01/22 11:49:17 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -121,12 +121,18 @@ static const struct devhandle_impl acpi_
 };
 
 devhandle_t
-devhandle_from_acpi(ACPI_HANDLE const hdl)
+devhandle_from_acpi(devhandle_t super_handle, ACPI_HANDLE const hdl)
 {
-	devhandle_t handle = {
-		.impl = &acpi_devhandle_impl,
-		.pointer = hdl,
-	};
+	devhandle_type_t super_type = devhandle_type(super_handle);
+	devhandle_t handle = { 0 };
+
+	if (super_type == DEVHANDLE_TYPE_ACPI) {
+		handle.impl = super_handle.impl;
+	} else {
+		KASSERT(super_type == DEVHANDLE_TYPE_INVALID);
+		handle.impl = &acpi_devhandle_impl;
+	}
+	handle.pointer = hdl;
 
 	return handle;
 }
@@ -154,7 +160,8 @@ acpi_device_enumerate_children(device_t 
 		    !acpi_device_present(ad->ad_handle)) {
 			continue;
 		}
-		if (!args->callback(dev, devhandle_from_acpi(ad->ad_handle),
+		if (!args->callback(dev, devhandle_from_acpi(call_handle,
+							     ad->ad_handle),
 				    args->callback_arg)) {
 			break;
 		}

Index: src/sys/dev/acpi/acpi_util.h
diff -u src/sys/dev/acpi/acpi_util.h:1.13 src/sys/dev/acpi/acpi_util.h:1.14
--- src/sys/dev/acpi/acpi_util.h:1.13	Sat Jan 15 14:40:33 2022
+++ src/sys/dev/acpi/acpi_util.h	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_util.h,v 1.13 2022/01/15 14:40:33 jmcneill Exp $ */
+/*	$NetBSD: acpi_util.h,v 1.14 2022/01/22 11:49:17 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2003, 2007 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
 #ifndef _SYS_DEV_ACPI_ACPI_UTIL_H
 #define _SYS_DEV_ACPI_ACPI_UTIL_H
 
-devhandle_t	devhandle_from_acpi(ACPI_HANDLE);
+devhandle_t	devhandle_from_acpi(devhandle_t, ACPI_HANDLE);
 ACPI_HANDLE	devhandle_to_acpi(devhandle_t);
 
 #define	ACPI_DEVICE_CALL_REGISTER(_n_, _c_)				\

Index: src/sys/dev/fdt/fdtbus.c
diff -u src/sys/dev/fdt/fdtbus.c:1.44 src/sys/dev/fdt/fdtbus.c:1.45
--- src/sys/dev/fdt/fdtbus.c:1.44	Sun Nov  7 17:12:15 2021
+++ src/sys/dev/fdt/fdtbus.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: fdtbus.c,v 1.44 2021/11/07 17:12:15 jmcneill Exp $ */
+/* $NetBSD: fdtbus.c,v 1.45 2022/01/22 11:49:17 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdtbus.c,v 1.44 2021/11/07 17:12:15 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdtbus.c,v 1.45 2022/01/22 11:49:17 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -423,12 +423,15 @@ fdt_scan(struct fdt_softc *sc, int pass)
 		 */
 		fdt_pre_attach(node);
 
+		devhandle_t nodeh = device_handle(node->n_bus);
+
 		if (quiet) {
 			node->n_dev = config_attach(node->n_bus, node->n_cf,
 			    &faa, fdtbus_print,
 			    CFARGS(.locators = locs,
 				   .devhandle =
-				       devhandle_from_of(node->n_phandle)));
+				       devhandle_from_of(nodeh,
+							 node->n_phandle)));
 		} else {
 			/*
 			 * Default pass.
@@ -439,7 +442,8 @@ fdt_scan(struct fdt_softc *sc, int pass)
 				   .iattr = "fdt",
 				   .locators = locs,
 				   .devhandle =
-				       devhandle_from_of(node->n_phandle)));
+				       devhandle_from_of(nodeh,
+							 node->n_phandle)));
 		}
 
 		if (node->n_dev != NULL)

Index: src/sys/dev/i2c/i2c.c
diff -u src/sys/dev/i2c/i2c.c:1.82 src/sys/dev/i2c/i2c.c:1.83
--- src/sys/dev/i2c/i2c.c:1.82	Fri Jan 21 15:55:36 2022
+++ src/sys/dev/i2c/i2c.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: i2c.c,v 1.82 2022/01/21 15:55:36 thorpej Exp $	*/
+/*	$NetBSD: i2c.c,v 1.83 2022/01/22 11:49:17 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -53,7 +53,7 @@
 #endif /* _KERNEL_OPT */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.82 2022/01/21 15:55:36 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.83 2022/01/22 11:49:17 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -498,13 +498,15 @@ iic_attach(device_t parent, device_t sel
 			devhandle = devhandle_invalid();
 #ifdef I2C_USE_FDT
 			if (cookietype == I2C_COOKIE_OF) {
-				devhandle = devhandle_from_of((int)cookie);
+				devhandle = devhandle_from_of(devhandle,
+							      (int)cookie);
 			}
 #endif /* I2C_USE_FDT */
 #ifdef I2C_USE_ACPI
 			if (cookietype == I2C_COOKIE_ACPI) {
 				devhandle =
-				    devhandle_from_acpi((ACPI_HANDLE)cookie);
+				    devhandle_from_acpi(devhandle,
+							(ACPI_HANDLE)cookie);
 			}
 #endif /* I2C_USE_ACPI */
 

Index: src/sys/dev/ofisa/ofisa.c
diff -u src/sys/dev/ofisa/ofisa.c:1.34 src/sys/dev/ofisa/ofisa.c:1.35
--- src/sys/dev/ofisa/ofisa.c:1.34	Sat Aug  7 16:19:13 2021
+++ src/sys/dev/ofisa/ofisa.c	Sat Jan 22 11:49:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ofisa.c,v 1.34 2021/08/07 16:19:13 thorpej Exp $	*/
+/*	$NetBSD: ofisa.c,v 1.35 2022/01/22 11:49:17 thorpej Exp $	*/
 
 /*
  * Copyright 1997, 1998
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofisa.c,v 1.34 2021/08/07 16:19:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofisa.c,v 1.35 2022/01/22 11:49:17 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -127,6 +127,7 @@ ofisaattach(device_t parent, device_t se
 	isa_dmainit(iba.iba_ic, iba.iba_iot, iba.iba_dmat, self);
 #endif
 
+	devhandle_t selfh = device_handle(self);
 	for (child = OF_child(oba->oba_phandle); child;
 	    child = OF_peer(child)) {
 		if (ofisa_ignore_child(oba->oba_phandle, child))
@@ -142,7 +143,7 @@ ofisaattach(device_t parent, device_t se
 		aa.ic = iba.iba_ic;
 
 		config_found(self, &aa, ofisaprint,
-		    CFARGS(.devhandle = devhandle_from_of(child)));
+		    CFARGS(.devhandle = devhandle_from_of(selfh, child)));
 	}
 }
 

Index: src/sys/dev/ofw/ofbus.c
diff -u src/sys/dev/ofw/ofbus.c:1.30 src/sys/dev/ofw/ofbus.c:1.31
--- src/sys/dev/ofw/ofbus.c:1.30	Sat Aug  7 16:19:14 2021
+++ src/sys/dev/ofw/ofbus.c	Sat Jan 22 11:49:18 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ofbus.c,v 1.30 2021/08/07 16:19:14 thorpej Exp $	*/
+/*	$NetBSD: ofbus.c,v 1.31 2022/01/22 11:49:18 thorpej Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofbus.c,v 1.30 2021/08/07 16:19:14 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofbus.c,v 1.31 2022/01/22 11:49:18 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -159,6 +159,8 @@ ofbus_attach(device_t parent, device_t d
 			units = 2;
 	}
 
+	devhandle_t selfh = device_handle(dev);
+
 	/* attach displays first */
 	for (child = OF_child(oba->oba_phandle); child != 0;
 	     child = OF_peer(child)) {
@@ -181,7 +183,8 @@ ofbus_attach(device_t parent, device_t d
 				    sizeof(oba2.oba_ofname));
 			}
 			config_found(dev, &oba2, ofbus_print,
-			    CFARGS(.devhandle = devhandle_from_of(child)));
+			    CFARGS(.devhandle = devhandle_from_of(selfh,
+								  child)));
 		}
 	}
 
@@ -211,7 +214,8 @@ ofbus_attach(device_t parent, device_t d
 				    sizeof(oba2.oba_ofname));
 			}
 			config_found(dev, &oba2, ofbus_print,
-			    CFARGS(.devhandle = devhandle_from_of(child)));
+			    CFARGS(.devhandle = devhandle_from_of(selfh,
+								  child)));
 		}
 	}
 }

Index: src/sys/dev/ofw/ofw_pci_subr.c
diff -u src/sys/dev/ofw/ofw_pci_subr.c:1.2 src/sys/dev/ofw/ofw_pci_subr.c:1.3
--- src/sys/dev/ofw/ofw_pci_subr.c:1.2	Wed Sep 15 17:33:08 2021
+++ src/sys/dev/ofw/ofw_pci_subr.c	Sat Jan 22 11:49:18 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ofw_pci_subr.c,v 1.2 2021/09/15 17:33:08 thorpej Exp $	*/
+/*	$NetBSD: ofw_pci_subr.c,v 1.3 2022/01/22 11:49:18 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofw_pci_subr.c,v 1.2 2021/09/15 17:33:08 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofw_pci_subr.c,v 1.3 2022/01/22 11:49:18 thorpej Exp $");
 
 #include <sys/types.h>
 #include <sys/device.h>
@@ -77,7 +77,7 @@ ofw_pci_bus_get_child_devhandle(device_t
 		}
 
 		/* Found it! */
-		args->devhandle = devhandle_from_of(phandle);
+		args->devhandle = devhandle_from_of(call_handle, phandle);
 		return 0;
 	}
 

Index: src/sys/dev/ofw/ofw_subr.c
diff -u src/sys/dev/ofw/ofw_subr.c:1.59 src/sys/dev/ofw/ofw_subr.c:1.60
--- src/sys/dev/ofw/ofw_subr.c:1.59	Wed Sep 15 17:33:08 2021
+++ src/sys/dev/ofw/ofw_subr.c	Sat Jan 22 11:49:18 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ofw_subr.c,v 1.59 2021/09/15 17:33:08 thorpej Exp $	*/
+/*	$NetBSD: ofw_subr.c,v 1.60 2022/01/22 11:49:18 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofw_subr.c,v 1.59 2021/09/15 17:33:08 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofw_subr.c,v 1.60 2022/01/22 11:49:18 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -99,12 +99,18 @@ static const struct devhandle_impl of_de
 };
 
 devhandle_t
-devhandle_from_of(int phandle)
+devhandle_from_of(devhandle_t super_handle, int phandle)
 {
-	devhandle_t handle = {
-		.impl = &of_devhandle_impl,
-		.integer = phandle,
-	};
+	devhandle_type_t super_type = devhandle_type(super_handle);
+	devhandle_t handle = { 0 };
+
+	if (super_type == DEVHANDLE_TYPE_OF) {
+		handle.impl = super_handle.impl;
+	} else {
+		KASSERT(super_type == DEVHANDLE_TYPE_INVALID);
+		handle.impl = &of_devhandle_impl;
+	}
+	handle.integer = phandle;
 
 	return handle;
 }
@@ -125,7 +131,7 @@ of_device_enumerate_children(device_t de
 	int child;
 
 	for (child = OF_child(phandle); child != 0; child = OF_peer(child)) {
-		if (!args->callback(dev, devhandle_from_of(child),
+		if (!args->callback(dev, devhandle_from_of(call_handle, child),
 				    args->callback_arg)) {
 			break;
 		}

Index: src/sys/dev/ofw/openfirm.h
diff -u src/sys/dev/ofw/openfirm.h:1.47 src/sys/dev/ofw/openfirm.h:1.48
--- src/sys/dev/ofw/openfirm.h:1.47	Sat Apr 24 23:36:57 2021
+++ src/sys/dev/ofw/openfirm.h	Sat Jan 22 11:49:18 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: openfirm.h,v 1.47 2021/04/24 23:36:57 thorpej Exp $	*/
+/*	$NetBSD: openfirm.h,v 1.48 2022/01/22 11:49:18 thorpej Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -107,7 +107,7 @@ int	openfirmware(void *);
 #ifdef _KERNEL
 struct device_compatible_entry;
 
-devhandle_t	devhandle_from_of(int);
+devhandle_t	devhandle_from_of(devhandle_t, int);
 int		devhandle_to_of(devhandle_t);
 
 #define	OF_DEVICE_CALL_REGISTER(_n_, _c_)				\

Index: src/sys/dev/sbus/dma_sbus.c
diff -u src/sys/dev/sbus/dma_sbus.c:1.38 src/sys/dev/sbus/dma_sbus.c:1.39
--- src/sys/dev/sbus/dma_sbus.c:1.38	Sat Aug  7 16:19:15 2021
+++ src/sys/dev/sbus/dma_sbus.c	Sat Jan 22 11:49:18 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: dma_sbus.c,v 1.38 2021/08/07 16:19:15 thorpej Exp $ */
+/*	$NetBSD: dma_sbus.c,v 1.39 2022/01/22 11:49:18 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dma_sbus.c,v 1.38 2021/08/07 16:19:15 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dma_sbus.c,v 1.39 2022/01/22 11:49:18 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -207,11 +207,12 @@ dmaattach_sbus(device_t parent, device_t
 	lsi64854_attach(sc);
 
 	/* Attach children */
+	devhandle_t selfh = device_handle(self);
 	for (node = firstchild(sa->sa_node); node; node = nextsibling(node)) {
 		struct sbus_attach_args sax;
 		sbus_setup_attach_args(sbsc, sbt, sc->sc_dmatag, node, &sax);
 		(void)config_found(self, (void *)&sax, dmaprint_sbus,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 		sbus_destroy_attach_args(&sax);
 	}
 }

Index: src/sys/dev/sbus/lebuffer.c
diff -u src/sys/dev/sbus/lebuffer.c:1.39 src/sys/dev/sbus/lebuffer.c:1.40
--- src/sys/dev/sbus/lebuffer.c:1.39	Sat Aug  7 16:19:15 2021
+++ src/sys/dev/sbus/lebuffer.c	Sat Jan 22 11:49:18 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: lebuffer.c,v 1.39 2021/08/07 16:19:15 thorpej Exp $ */
+/*	$NetBSD: lebuffer.c,v 1.40 2022/01/22 11:49:18 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lebuffer.c,v 1.39 2021/08/07 16:19:15 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lebuffer.c,v 1.40 2022/01/22 11:49:18 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -120,12 +120,13 @@ lebufattach(device_t parent, device_t se
 	printf(": %dK memory\n", sc->sc_bufsiz / 1024);
 
 	/* search through children */
+	devhandle_t selfh = device_handle(self);
 	for (node = firstchild(node); node; node = nextsibling(node)) {
 		struct sbus_attach_args sax;
 		sbus_setup_attach_args(sbsc,
 				       bt, dt, node, &sax);
 		(void)config_found(self, (void *)&sax, lebufprint,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 		sbus_destroy_attach_args(&sax);
 	}
 }

Index: src/sys/dev/sbus/qec.c
diff -u src/sys/dev/sbus/qec.c:1.53 src/sys/dev/sbus/qec.c:1.54
--- src/sys/dev/sbus/qec.c:1.53	Sat Aug  7 16:19:15 2021
+++ src/sys/dev/sbus/qec.c	Sat Jan 22 11:49:18 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: qec.c,v 1.53 2021/08/07 16:19:15 thorpej Exp $ */
+/*	$NetBSD: qec.c,v 1.54 2022/01/22 11:49:18 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: qec.c,v 1.53 2021/08/07 16:19:15 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: qec.c,v 1.54 2022/01/22 11:49:18 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -203,12 +203,13 @@ qecattach(device_t parent, device_t self
 	qec_init(sc);
 
 	/* search through children */
+	devhandle_t selfh = device_handle(self);
 	for (node = firstchild(node); node; node = nextsibling(node)) {
 		struct sbus_attach_args sax;
 		sbus_setup_attach_args(sbsc,
 				       sbt, sc->sc_dmatag, node, &sax);
 		(void)config_found(self, (void *)&sax, qecprint,
-		    CFARGS(.devhandle = prom_node_to_devhandle(node)));
+		    CFARGS(.devhandle = prom_node_to_devhandle(selfh, node)));
 		sbus_destroy_attach_args(&sax);
 	}
 }

Reply via email to