Module Name:    src
Committed By:   thorpej
Date:           Mon May 10 13:59:30 UTC 2021

Modified Files:
        src/sys/arch/sparc/include: promlib.h
        src/sys/arch/sparc/sparc: promlib.c
        src/sys/sys: device.h

Log Message:
sparc{,64} promlib -> devhandle_t glue


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/sparc/include/promlib.h
cvs rdiff -u -r1.47 -r1.48 src/sys/arch/sparc/sparc/promlib.c
cvs rdiff -u -r1.169 -r1.170 src/sys/sys/device.h

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/sparc/include/promlib.h
diff -u src/sys/arch/sparc/include/promlib.h:1.25 src/sys/arch/sparc/include/promlib.h:1.26
--- src/sys/arch/sparc/include/promlib.h:1.25	Mon Sep 11 19:25:07 2017
+++ src/sys/arch/sparc/include/promlib.h	Mon May 10 13:59:30 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: promlib.h,v 1.25 2017/09/11 19:25:07 palle Exp $ */
+/*	$NetBSD: promlib.h,v 1.26 2021/05/10 13:59:30 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -41,6 +41,8 @@
 #include "opt_multiprocessor.h"
 #endif
 
+#include <sys/device.h>			/* for devhandle_t */
+
 #include <machine/idprom.h>
 #include <machine/bsd_openprom.h>
 #include <machine/openfirm.h>
@@ -110,6 +112,9 @@ struct promops {
 
 	int	(*po_finddevice)(const char *);
 
+	/* devhandle_t interface */
+	devhandle_t (*po_node_to_devhandle)(int);
+	int	(*po_devhandle_to_node)(devhandle_t);
 };
 
 extern struct promops	promops;
@@ -211,6 +216,9 @@ void	prom_boot(char *)	__attribute__((__
 #define nextsibling(node)	prom_nextsibling(node)
 #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))
 
 /* MP stuff - not currently used */
 #define prom_cpustart(m,a,c,pc)	((*promops.po_cpustart)(m,a,c,pc))
@@ -220,4 +228,9 @@ void	prom_boot(char *)	__attribute__((__
 
 extern void	*romp;		/* PROM-supplied argument (see locore) */
 
+#ifdef _KERNEL
+#define	OBP_DEVICE_CALL_REGISTER(_n_, _c_)				\
+	DEVICE_CALL_REGISTER(obp_device_calls, _n_, _c_)
+#endif /* _KERNEL */
+
 #endif /* _SPARC_PROMLIB_H_ */

Index: src/sys/arch/sparc/sparc/promlib.c
diff -u src/sys/arch/sparc/sparc/promlib.c:1.47 src/sys/arch/sparc/sparc/promlib.c:1.48
--- src/sys/arch/sparc/sparc/promlib.c:1.47	Sun Jan 24 07:36:54 2021
+++ src/sys/arch/sparc/sparc/promlib.c	Mon May 10 13:59:30 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: promlib.c,v 1.47 2021/01/24 07:36:54 mrg Exp $ */
+/*	$NetBSD: promlib.c,v 1.48 2021/05/10 13:59:30 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.47 2021/01/24 07:36:54 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: promlib.c,v 1.48 2021/05/10 13:59:30 thorpej Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_sparc_arch.h"
@@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: promlib.c,v 
 
 #include <sys/param.h>
 #include <sys/kernel.h>
+#include <sys/device.h>
 
 #ifdef _STANDALONE
 #include <lib/libsa/stand.h>
@@ -93,6 +94,23 @@ static int	opf_instance_to_package(int);
 static char	*opf_nextprop(int, const char *);
 static void	opf_interpret_simple(const char *);
 
+#ifndef _STANDALONE
+static devhandle_t
+null_prom_to_devhandle(int node __unused)
+{
+	devhandle_t devhandle;
+
+	devhandle_invalidate(&devhandle);
+
+	return devhandle;
+}
+
+static int
+null_devhandle_to_prom(devhandle_t devhandle __unused)
+{
+	return 0;
+}
+#endif /* ! _STANDALONE */
 
 /*
  * PROM entry points.
@@ -142,7 +160,20 @@ struct promops promops = {
 	(void *)notimplemented,		/* getprop */
 	(void *)notimplemented,		/* setprop */
 	(void *)notimplemented,		/* nextprop */
-	(void *)notimplemented		/* finddevice */
+	(void *)notimplemented,		/* finddevice */
+
+	/*
+	 * These should never be called in the STANDALONE environment,
+	 * but when we're in the kernel environment, it's not really
+	 * invalid to do so.
+	 */
+#ifdef STANDALONE
+	(void *)notimplemented,		/* node_to_devhandle */
+	(void *)notimplemented,		/* devhandle_to_node */
+#else
+	(void *)null_prom_to_devhandle,	/* node_to_devhandle */
+	(void *)null_devhandle_to_prom,	/* devhandle_to_node */
+#endif /* STANDALONE */
 };
 
 static void
@@ -181,6 +212,73 @@ notimplemented(void)
 	}
 }
 
+#ifndef _STANDALONE
+/*
+ * OBP device handle support.  We subsume v0-v3 into a single implementation
+ * and use promops to handle differences.
+ *
+ * On 32-bit SPARC, the OpenFirmware variant also gets redirected here.
+ * See prom_init_opf().
+ */
+
+static device_call_t
+obp_devhandle_lookup_device_call(devhandle_t handle, const char *name,
+    devhandle_t *call_handlep)
+{
+	__link_set_decl(obp_device_calls, struct device_call_descriptor);
+	struct device_call_descriptor * const *desc;
+
+	__link_set_foreach(desc, obp_device_calls) {
+		if (strcmp((*desc)->name, name) == 0) {
+			return (*desc)->call;
+		}
+	}
+	return NULL;
+}
+
+static const struct devhandle_impl obp_devhandle_impl = {
+	.type = DEVHANDLE_TYPE_OPENBOOT,
+	.lookup_device_call = obp_devhandle_lookup_device_call,
+};
+
+static devhandle_t
+devhandle_from_obp(int node)
+{
+	devhandle_t handle = {
+		.impl = &obp_devhandle_impl,
+		.integer = node,
+	};
+
+	return handle;
+}
+
+static int
+devhandle_to_obp(devhandle_t const handle)
+{
+	KASSERT(devhandle_type(handle) == DEVHANDLE_TYPE_OPENBOOT);
+
+	return handle.integer;
+}
+
+static int
+obp_device_enumerate_children(device_t dev, devhandle_t call_handle, void *v)
+{
+	struct device_enumerate_children_args *args = v;
+	int node = devhandle_to_obp(call_handle);
+
+	for (node = prom_firstchild(node); node != 0;
+	     node = prom_nextsibling(node)) {
+		if (!args->callback(dev, devhandle_from_obp(node),
+				    args->callback_arg)) {
+			break;
+		}
+	}
+
+	return 0;
+}
+OBP_DEVICE_CALL_REGISTER("device-enumerate-children",
+			 obp_device_enumerate_children)
+#endif /* ! _STANDALONE */
 
 /*
  * prom_getprop() reads the named property data from a given node.
@@ -1185,6 +1283,11 @@ prom_init_obp(void)
 	promops.po_setprop = no->no_setprop;
 	promops.po_nextprop = no->no_nextprop;
 
+#ifndef _STANDALONE
+	promops.po_node_to_devhandle = devhandle_from_obp;
+	promops.po_devhandle_to_node = devhandle_to_obp;
+#endif /* _STANDALONE */
+
 	/*
 	 * Next, deal with prom vector differences between versions.
 	 */
@@ -1288,6 +1391,23 @@ prom_init_opf(void)
 	promops.po_instance_to_package = opf_instance_to_package;
 	promops.po_finddevice = opf_finddevice;
 
+#ifndef _STANDALONE
+#ifdef __sparc64__
+	promops.po_node_to_devhandle = devhandle_from_of;
+	promops.po_devhandle_to_node = devhandle_to_of;
+#else
+	/*
+	 * For 32-bit SPARC, pretend this is OpenBoot for now.
+	 * The differences will be hidden behind the promops
+	 * anyway.  We do this because this platform doesn't
+	 * pull in all of the OpenFirmware support code that
+	 * 64-bit SPARC does.
+	 */
+	promops.po_node_to_devhandle = devhandle_from_obp;
+	promops.po_devhandle_to_node = devhandle_to_obp;
+#endif /* __sparc64__ */
+#endif /* _STANDALONE */
+
 	/* Retrieve and cache stdio handles */
 	node = findchosen();
 	OF_getprop(node, "stdin", &promops.po_stdin, sizeof(int));

Index: src/sys/sys/device.h
diff -u src/sys/sys/device.h:1.169 src/sys/sys/device.h:1.170
--- src/sys/sys/device.h:1.169	Tue Apr 27 14:48:28 2021
+++ src/sys/sys/device.h	Mon May 10 13:59:30 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: device.h,v 1.169 2021/04/27 14:48:28 thorpej Exp $ */
+/* $NetBSD: device.h,v 1.170 2021/05/10 13:59:30 thorpej Exp $ */
 
 /*
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -219,6 +219,9 @@ typedef enum {
 	/* OpenFirmware, FDT */
 	DEVHANDLE_TYPE_OF		=	0x4f504657,	/* 'OPFW' */
 
+	/* Sun OpenBoot */
+	DEVHANDLE_TYPE_OPENBOOT		=	0x4f504254,	/* 'OPBT' */
+
 	/* Private (opaque data) */
 	DEVHANDLE_TYPE_PRIVATE		=	0x50525654,	/* 'PRVT' */
 

Reply via email to