1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER START
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The contents of this file are subject to the terms of the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Common Development and Distribution License (the "License").
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You may not use this file except in compliance with the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * See the License for the specific language governing permissions
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * and limitations under the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * When distributing Covered Code, include this CDDL HEADER in each
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * If applicable, add the following below this CDDL HEADER, with the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * fields enclosed by brackets "[]" replaced with your own identifying
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * information: Portions Copyright [yyyy] [name of copyright owner]
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER END
de81a4f48d467f6d0263221cbf4a199b6a925948jm * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Use is subject to license terms.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#pragma ident "%Z%%M% %I% %E% SMI"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * A property attached to a node in the kernel's
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * shadow copy of the PROM device tree.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * A node in the kernel's shadow copy of the PROM
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * device tree.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic prom_node_t *find_node_work(prom_node_t *np, pnode_t node);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic void create_prop(prom_node_t *pnp, char *name, void *val, int len);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic prom_node_t *create_node(prom_node_t *parent, pnode_t node);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic void create_peers(prom_node_t *pnp, pnode_t node);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic void create_children(prom_node_t *pnp, pnode_t parent);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Hooks for kmdb for accessing the PROM shadow tree. The driver portion
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * of kmdb will retrieve the root of the tree and pass it down to the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * debugger portion of kmdb. As the kmdb debugger is standalone, it has
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * its own promif_root pointer that it will be set to the value passed by
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * the driver so that kmdb points to the shadow tree maintained by the kernel.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * So the "get" function is in the kernel while the "set" function is in kmdb.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Interfaces used internally by promif functions.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * These hide all accesses to the shadow tree.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Note: next(0) returns the root node
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (-1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppopromif_stree_getprop(pnode_t nodeid, char *name, void *value)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (-1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (len > 0) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppopromif_stree_nextprop(pnode_t nodeid, char *name, char *next)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (propp = pnp->pn_propp; propp != NULL; propp = propp->pp_next)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (-1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic void *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (propp = np->pn_propp; propp != NULL; propp = propp->pp_next)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic char *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * getting next of NULL or a null string returns the first prop name
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (propp = pnp->pn_propp; propp != NULL; propp = propp->pp_next)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppopromif_stree_setprop(pnode_t nodeid, char *name, void *value, int len)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (-1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * If a property with this name exists, replace the existing
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (prop = pnp->pn_propp; prop; prop = prop->pp_next)
de81a4f48d467f6d0263221cbf4a199b6a925948jm * Make sure we don't get dispatched onto a
de81a4f48d467f6d0263221cbf4a199b6a925948jm * different cpu if we happen to sleep. See
de81a4f48d467f6d0263221cbf4a199b6a925948jm * kern_postprom().
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (len > 0) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (-1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Create a promif private copy of boot's device tree.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo while (1) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo while (1) {
a47315d76ac34b1416ba8bd333c4d3b7ee54a56bjm * Make sure we don't get dispatched onto a different
a47315d76ac34b1416ba8bd333c4d3b7ee54a56bjm * cpu if we happen to sleep. See kern_postprom().
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo while (1) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if ((proplen = prom_getproplen(node, propname)) == -1)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (proplen != 0) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppocreate_prop(prom_node_t *pnp, char *name, void *val, int len)
a47315d76ac34b1416ba8bd333c4d3b7ee54a56bjm * Make sure we don't get dispatched onto a different
a47315d76ac34b1416ba8bd333c4d3b7ee54a56bjm * cpu if we happen to sleep. See kern_postprom().
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo newprop->pp_name = kmem_zalloc(prom_strlen(name) + 1, KM_SLEEP);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* move to the end of the prop list */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (prop = pnp->pn_propp; prop->pp_next != NULL; prop = prop->pp_next)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* empty */;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* append the new prop */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (i = 0; i < level; i++) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo prom_printf("Node 0x%x (parent=0x%x, sibling=0x%x)\n", pnp->pn_nodeid,