PERFORCE change 105499 for review

Kip Macy kmacy at FreeBSD.org
Sat Sep 2 02:58:34 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=105499

Change 105499 by kmacy at kmacy_storage:sun4v_work_stable on 2006/09/02 02:58:20

	add machine description support to the virtual nexus

Affected files ...

.. //depot/projects/kmacy_sun4v_stable/src/sys/conf/files.sun4v#3 edit
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/include/cddl/mdesc.h#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/include/cddl/mdesc_impl.h#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/include/mdesc_bus.h#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/include/mdesc_bus_subr.h#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/include/pcpu.h#4 edit
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/include/trap.h#2 edit
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_bus_if.m#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_bus_subr.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_diff.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_findname.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_findnodeprop.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_fini.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_getbinsize.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_getgen.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_getpropdata.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_getpropstr.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_getpropval.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_init.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_init_intern.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_nodecount.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_rootnode.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_scandag.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/mdesc/mdesc_subr.c#1 add
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/exception.S#5 edit
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/hvcons.c#3 edit
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/machdep.c#5 edit
.. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/vnex.c#3 edit

Differences ...

==== //depot/projects/kmacy_sun4v_stable/src/sys/conf/files.sun4v#3 (text+ko) ====

@@ -98,3 +98,18 @@
 sun4v/sun4v/uio_machdep.c	standard
 sun4v/sun4v/vm_machdep.c	standard
 sun4v/sun4v/vnex.c		standard
+
+
+sun4v/mdesc/mdesc_bus_if.m	standard
+sun4v/mdesc/mdesc_scandag.c	standard
+sun4v/mdesc/mdesc_init.c	standard
+sun4v/mdesc/mdesc_init_intern.c	standard
+sun4v/mdesc/mdesc_subr.c	standard
+sun4v/mdesc/mdesc_bus_subr.c	standard
+sun4v/mdesc/mdesc_getpropstr.c	standard
+sun4v/mdesc/mdesc_getpropval.c	standard
+sun4v/mdesc/mdesc_rootnode.c	standard
+sun4v/mdesc/mdesc_findname.c	standard
+sun4v/mdesc/mdesc_nodecount.c	standard
+sun4v/mdesc/mdesc_findnodeprop.c	standard
+

==== //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/include/pcpu.h#4 (text+ko) ====

@@ -77,8 +77,10 @@
 	u_int   pc_kwbuf_full;                                          \
 	struct rwindow pc_tsbwbuf[2];                                   \
         uint64_t pc_caller;                                             \
+        uint32_t pc_tl;                                                 \
+        uint32_t pc_trapid;                                             \
         uint16_t pc_cpulist[MAXCPU];                                    \
-        uint64_t pad[7];
+        uint64_t pad[6];
 
 	/* XXX SUN4V_FIXME - as we access the *_ra and *_size fields in quick
 	 * succession we _really_ want them to be L1 cache line size aligned

==== //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/include/trap.h#2 (text+ko) ====

@@ -119,6 +119,12 @@
 #define	PTL1_BAD_GL		15
 
 
+#define TL_CPU_MONDO    0x1
+#define TL_DEV_MONDO    0x2
+#define TL_TSB_MISS     0x3
+#define TL_TL0_TRAP     0x4
+#define TL_SET_ACKMASK  0x5
+
 /*
  * These defines are used by the TL1 tlb miss handlers to calculate
  * the pc to jump to in the case the entry was not found in the TSB.

==== //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/exception.S#5 (text+ko) ====

@@ -1379,6 +1379,23 @@
 	wrpr	%g0, %g5, %cleanwin
 	ldx	[%g6 + PCB_KSTACK], %g6
 	sub	%g6, TF_SIZEOF, %g6
+#ifdef DEBUG_KSTACK
+	mov	%o0, %g5
+	mov	%o3, %l0
+	mov	%o4, %l1
+	mov	%o5, %l2
+	mov	%o6, %l3
+	mov	%o7, %l4
+	mov	0x10, %o0
+	mov	%g6, %o1
+	ta	TTRACE_ADDENTRY
+	mov	%g5, %o0
+	mov	%l0, %o3
+	mov	%l1, %o4
+	mov	%l2, %o5
+	mov	%l3, %o6
+	mov	%l4, %o7
+#endif
 	save	%g6, 0, %sp
 
 	rdpr	%canrestore, %l0
@@ -1433,19 +1450,16 @@
 	bge,pt	%xcc, 0f
 	  nop
 	call	panic
-!	MAGIC_EXIT		
 0:	
 #endif
 	
 	wrpr	%g0, %g4, %pil
 1:		
 	wrpr	%g0, %g6, %tnpc
-	
 	wrpr	%g0, 0, %gl
 	stx	%g7, [%l7 + TF_G7]		! save g7 before it can be overwritten by PCPU when returning from an interrupt 
 	wrpr	%g0, 1, %gl
-
-		rdpr	%cwp, %l0
+	rdpr	%cwp, %l0
 	set	TSTATE_KERNEL, %l1
 	wrpr	%l1, %l0, %tstate
 	done	
@@ -1475,6 +1489,7 @@
 	mov	1, lock_bit	; \
 	add	addr, 8, addr	; \
 	sllx	lock_bit, 56, lock_bit ; \
+	stxa	%o7, [PCPU(CALLER)]%asi	; /* XXX DEBUG */\
 label1:				; \
 	ldxa	[addr]%asi, oldval;	\
 	or	oldval, lock_bit, newval; \
@@ -1515,7 +1530,7 @@
 label2:	
 
 ENTRY(hash_bucket_lock)
-	wr	%g0, ASI_N, %asi
+	wr	%g0, ASI_N, %asi 
 	rdpr	%pstate, %o1
 	and	%o1, PSTATE_INTR_DISABLE, %o2
 	wrpr	%o2, %pstate
@@ -1588,7 +1603,6 @@
 	add	PCPU_REG, %g1, %g1
 	SAVE_LOCALS_ASI(%g1)
 	mov	0, %g1			! cansave is 0
-
 	! %g1 == %cansave
 	! %g2 == hash scratch value
 	! %g3 == TWDW ASI
@@ -1907,4 +1921,4 @@
 	sllx	%g7, TRAP_CTX_SHIFT, %g7
 	or	%g7, %g5, %g5
 	done
-END(tl1_trap)	
+END(tl1_trap)

==== //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/hvcons.c#3 (text+ko) ====

@@ -37,9 +37,10 @@
 #include <sys/rman.h>
 #include <sys/tty.h>
 
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
-#include <dev/ofw/openfirm.h>
+#include <machine/mdesc_bus.h>
+#include <machine/cddl/mdesc.h>
+
+#include "mdesc_bus_if.h"
 
 #include "opt_simulator.h"
 
@@ -158,7 +159,8 @@
 static void
 hvcnprobe(struct consdev *cp)
 {
-	phandle_t node;
+
+#if 0
 	char name[64];
 
 	node = OF_peer(0);
@@ -179,12 +181,9 @@
 		if (!strcmp(name, "console"))
 			break;
 	}
-	
 done:
-	if (node != 0)
-		cp->cn_pri = CN_NORMAL;
-	else 
-		cp->cn_pri = CN_DEAD;
+#endif	
+	cp->cn_pri = CN_NORMAL;
 
 }
 
@@ -329,7 +328,7 @@
 hvcn_probe(device_t dev)
 {
 
-	if (strcmp(ofw_bus_get_name(dev), "console"))
+	if (strcmp(mdesc_bus_get_name(dev), "console"))
 		return (ENXIO);
 	
 	device_set_desc(dev, "sun4v virtual console");	
@@ -344,7 +343,6 @@
       
 	struct cdev *cdev;
 	char output[32];
-	phandle_t options;
 	int error, rid;
 
 	/* belongs in attach - but attach is getting called multiple times
@@ -354,13 +352,13 @@
 	if (hvcn_consdev.cn_pri == CN_DEAD || 
 	    hvcn_consdev.cn_name[0] == '\0') 
 		return (ENXIO);
-
+#if 0
 	if ((options = OF_finddevice("/options")) == -1 ||
 	    OF_getprop(options, "output-device", output,
 		       sizeof(output)) == -1)
 		return (ENXIO);
 
-
+#endif
 	cdev = make_dev(&hvcn_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "%s", output);
 	make_dev_alias(cdev, "hvcn");
 	

==== //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/machdep.c#5 (text+ko) ====

@@ -110,6 +110,9 @@
 #include <machine/ver.h>
 #include <machine/hypervisor_api.h>
 
+/* XXX move this to a header */
+extern void mdesc_init(void);
+
 typedef int ofw_vec_t(void *);
 
 #ifdef DDB
@@ -443,6 +446,8 @@
 	msgbufinit(msgbufp, MSGBUF_SIZE);
 
 	mutex_init();
+	
+	mdesc_init();
 
 	OF_getprop(root, "name", sparc64_model, sizeof(sparc64_model) - 1);
 

==== //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/vnex.c#3 (text+ko) ====

@@ -44,16 +44,19 @@
 #include <machine/bus_common.h>
 #include <machine/intr_machdep.h>
 #include <machine/nexusvar.h>
-#include <machine/ofw_nexus.h>
 #include <machine/resource.h>
 #include <machine/ver.h>
 
+#include <machine/mdesc_bus.h>
+#include <machine/cddl/mdesc.h>
+#include <machine/cddl/mdesc_impl.h>
+
 #include <sys/rman.h>
 
+
 #define	SUN4V_REG_SPEC2CFG_HDL(x)	((x >> 32) & ~(0xfull << 28))
 
 static device_probe_t vnex_probe;
-static device_probe_t channex_probe;
 static device_attach_t vnex_attach;
 static bus_print_child_t vnex_print_child;
 static bus_add_child_t vnex_add_child;
@@ -61,14 +64,14 @@
 static bus_setup_intr_t vnex_setup_intr;
 static bus_teardown_intr_t vnex_teardown_intr;
 static bus_get_resource_list_t vnex_get_resource_list;
-static ofw_bus_get_devinfo_t vnex_get_devinfo;
+static mdesc_bus_get_devinfo_t vnex_get_devinfo;
 
-static struct vnex_devinfo * vnex_setup_dinfo(device_t, phandle_t);
+static struct vnex_devinfo * vnex_setup_dinfo(device_t, mde_cookie_t node);
 static void vnex_destroy_dinfo(struct vnex_devinfo *);
 static int vnex_print_res(struct vnex_devinfo *);
 
 struct vnex_devinfo {
-	struct ofw_bus_devinfo	vndi_obdinfo;
+	struct mdesc_bus_devinfo	vndi_mbdinfo;
 	struct resource_list	vndi_rl;
 
 	/* Some common properties. */
@@ -81,62 +84,6 @@
 	struct rman	sc_mem_rman;
 };
 
-static device_method_t channex_methods[] = {
-	/* Device interface */
-	DEVMETHOD(device_probe,		channex_probe),
-	DEVMETHOD(device_attach,	vnex_attach),
-	DEVMETHOD(device_detach,	bus_generic_detach),
-	DEVMETHOD(device_shutdown,	bus_generic_shutdown),
-	DEVMETHOD(device_suspend,	bus_generic_suspend),
-	DEVMETHOD(device_resume,	bus_generic_resume),
-
-	/* Bus interface */
-	DEVMETHOD(bus_print_child,	vnex_print_child),
-	DEVMETHOD(bus_probe_nomatch,	vnex_probe_nomatch),
-	DEVMETHOD(bus_read_ivar,	bus_generic_read_ivar),
-	DEVMETHOD(bus_write_ivar,	bus_generic_write_ivar),
-	DEVMETHOD(bus_add_child,	vnex_add_child),
-	DEVMETHOD(bus_alloc_resource,	bus_generic_alloc_resource),
-	DEVMETHOD(bus_activate_resource,	bus_generic_activate_resource),
-	DEVMETHOD(bus_deactivate_resource,	bus_generic_deactivate_resource),
-	DEVMETHOD(bus_release_resource,	bus_generic_release_resource),
-	DEVMETHOD(bus_setup_intr,	vnex_setup_intr),
-	DEVMETHOD(bus_teardown_intr,	vnex_teardown_intr),
-	DEVMETHOD(bus_get_resource,	bus_generic_rl_get_resource),
-	DEVMETHOD(bus_get_resource_list, vnex_get_resource_list),
-
-	/* ofw_bus interface */
-	DEVMETHOD(ofw_bus_get_devinfo,	vnex_get_devinfo),
-	DEVMETHOD(ofw_bus_get_compat,	ofw_bus_gen_get_compat),
-	DEVMETHOD(ofw_bus_get_model,	ofw_bus_gen_get_model),
-	DEVMETHOD(ofw_bus_get_name,	ofw_bus_gen_get_name),
-	DEVMETHOD(ofw_bus_get_node,	ofw_bus_gen_get_node),
-	DEVMETHOD(ofw_bus_get_type,	ofw_bus_gen_get_type),
-
-	{ 0, 0 }
-};
-
-static driver_t channex_driver = {
-	"channex",
-	channex_methods,
-	sizeof(struct vnex_softc),
-};
-
-
-static devclass_t channex_devclass;
-DRIVER_MODULE(channex, vnex, channex_driver, channex_devclass, 0, 0);
-
-
-static int
-channex_probe(device_t dev)
-{
-	if (strcmp(ofw_bus_get_name(dev), "channel-devices"))
-		return (ENXIO);
-
-	device_set_desc(dev, "virtual channel devices");
-	return (0);
-}
-
 static device_method_t vnex_methods[] = {
 	/* Device interface */
 	DEVMETHOD(device_probe,		vnex_probe),
@@ -162,12 +109,11 @@
 	DEVMETHOD(bus_get_resource_list, vnex_get_resource_list),
 
 	/* ofw_bus interface */
-	DEVMETHOD(ofw_bus_get_devinfo,	vnex_get_devinfo),
-	DEVMETHOD(ofw_bus_get_compat,	ofw_bus_gen_get_compat),
-	DEVMETHOD(ofw_bus_get_model,	ofw_bus_gen_get_model),
-	DEVMETHOD(ofw_bus_get_name,	ofw_bus_gen_get_name),
-	DEVMETHOD(ofw_bus_get_node,	ofw_bus_gen_get_node),
-	DEVMETHOD(ofw_bus_get_type,	ofw_bus_gen_get_type),
+	/* mdesc_bus interface */
+	DEVMETHOD(mdesc_bus_get_devinfo, vnex_get_devinfo),
+	DEVMETHOD(mdesc_bus_get_compat,	mdesc_bus_gen_get_compat),
+	DEVMETHOD(mdesc_bus_get_name,	mdesc_bus_gen_get_name),
+	DEVMETHOD(mdesc_bus_get_type,	mdesc_bus_gen_get_type),
 
 	{ 0, 0 }
 };
@@ -198,10 +144,14 @@
 static int
 vnex_attach(device_t dev)
 {
-	struct vnex_devinfo *vndi;
-	struct vnex_softc *sc;
-	device_t cdev;
-	phandle_t node;
+	struct vnex_devinfo  *vndi;
+	struct vnex_softc    *sc;
+	device_t              cdev;
+	phandle_t             node;
+	mde_cookie_t          rootnode, *listp = NULL;
+	int                   i, listsz, num_nodes, num_devices;
+	md_t                 *mdp;
+
 
 	node = ofw_bus_get_node(dev);
 	if (node == -1)
@@ -218,17 +168,29 @@
 	    rman_manage_region(&sc->sc_mem_rman, 0ULL, ~0ULL) != 0)
 		panic("%s: failed to set up rmans.", __func__);
 
+	if ((mdp = md_get()) == NULL) 
+		return (ENXIO);
+
+	num_nodes = md_node_count(mdp);
+	listsz = num_nodes * sizeof(mde_cookie_t);
+	listp = (mde_cookie_t *)malloc(listsz, M_DEVBUF, M_WAITOK);
+	rootnode = md_root_node(mdp);
+	
 	/*
-	 * Now walk the OFW tree and attach top-level devices.
+	 * scan the machine description for virtual devices
 	 */
-	for (node = OF_child(node); node > 0; node = OF_peer(node)) {
-		if ((vndi = vnex_setup_dinfo(dev, node)) == NULL)
+	num_devices = md_scan_dag(mdp, rootnode, 
+				  md_find_name(mdp, "virtual-device"),
+				  md_find_name(mdp, "fwd"), listp);
+
+	for (i = 0; i < num_devices; i++) {
+		if ((vndi = vnex_setup_dinfo(dev, listp[i])) == NULL)
 			continue;
 
 		cdev = device_add_child(dev, NULL, -1);
 		if (cdev == NULL) {
 			device_printf(dev, "<%s>: device_add_child failed\n",
-			    vndi->vndi_obdinfo.obd_name);
+			    vndi->vndi_mbdinfo.mbd_name);
 			vnex_destroy_dinfo(vndi);
 			continue;
 		}
@@ -250,8 +212,7 @@
 		return (NULL);
 
 	vndi = malloc(sizeof(*vndi), M_DEVBUF, M_WAITOK | M_ZERO);
-	vndi->vndi_obdinfo.obd_node = -1;
-	vndi->vndi_obdinfo.obd_name = strdup(name, M_OFWPROP);
+	vndi->vndi_mbdinfo.mbd_name = strdup(name, M_OFWPROP);
 	resource_list_init(&vndi->vndi_rl);
 	device_set_ivars(cdev, vndi);
 
@@ -274,9 +235,9 @@
 {
 	const char *type;
 
-	device_printf(dev, "<%s>", ofw_bus_get_name(child));
+	device_printf(dev, "<%s>", mdesc_bus_get_name(child));
 	vnex_print_res(device_get_ivars(child));
-	type = ofw_bus_get_type(child);
+	type = mdesc_bus_get_type(child);
 	printf(" type %s (no driver attached)\n",
 	    type != NULL ? type : "unknown");
 }
@@ -358,40 +319,26 @@
 	return (&vndi->vndi_rl);
 }
 
-static const struct ofw_bus_devinfo *
+static const struct mdesc_bus_devinfo *
 vnex_get_devinfo(device_t dev, device_t child)
 {
 	struct vnex_devinfo *vndi;
 
 	vndi = device_get_ivars(child);
-	return (&vndi->vndi_obdinfo);
+	return (&vndi->vndi_mbdinfo);
 }
 
 static struct vnex_devinfo *
-vnex_setup_dinfo(device_t dev, phandle_t node)
+vnex_setup_dinfo(device_t dev, mde_cookie_t node)
 {
 	struct vnex_devinfo *vndi;
-	uint32_t *intr;
-	int i;
-	int nintr;
 
 	vndi = malloc(sizeof(*vndi), M_DEVBUF, M_WAITOK | M_ZERO);
-	if (ofw_bus_gen_setup_devinfo(&vndi->vndi_obdinfo, node) != 0) {
+	if (mdesc_bus_gen_setup_devinfo(&vndi->vndi_mbdinfo, node) != 0) {
 		free(vndi, M_DEVBUF);
 		return (NULL);
 	}
-	resource_list_init(&vndi->vndi_rl);
 
-	nintr = OF_getprop_alloc(node, "interrupts",  sizeof(*intr),
-	    (void **)&intr);
-	if (nintr > 0) {
-		for (i = 0; i < nintr; i++) {
-			resource_list_add(&vndi->vndi_rl, SYS_RES_IRQ, i, intr[i],
-			    intr[i], 1);
-		}
-		free(intr, M_OFWPROP);
-	}
-
 	return (vndi);
 }
 
@@ -400,7 +347,7 @@
 {
 
 	resource_list_free(&vndi->vndi_rl);
-	ofw_bus_gen_destroy_devinfo(&vndi->vndi_obdinfo);
+	mdesc_bus_gen_destroy_devinfo(&vndi->vndi_mbdinfo);
 	free(vndi, M_DEVBUF);
 }
 


More information about the p4-projects mailing list