1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER START
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
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 *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * or http://www.opensolaris.org/os/licensing.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * See the License for the specific language governing permissions
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * and limitations under the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
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 *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER END
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
b5353d912e615fb002628d16835832e79668c442Abhinandan Ekande * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Use is subject to license terms.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/types.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/esunddi.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/promif_impl.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef _KMDB
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic pnode_t chosennode;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic pnode_t optionsnode;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#else
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic char *gettoken(char *tp, char *token);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic pnode_t finddevice(char *path);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Routines for walking the PROMs devinfo tree
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef _KMDB
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppovoid
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppopromif_set_nodes(pnode_t chosen, pnode_t options)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo chosennode = chosen;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo optionsnode = options;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppopromif_finddevice(void *p)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo cell_t *ci = (cell_t *)p;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char *path;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ASSERT(ci[1] == 1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo path = p1275_cell2ptr(ci[3]);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (strcmp("/chosen", path) == 0) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ci[4] = p1275_dnode2cell(chosennode);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo } else if (strcmp("/options", path) == 0) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ci[4] = p1275_dnode2cell(optionsnode);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo } else {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* only supports known nodes */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ASSERT(0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#else
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppopromif_finddevice(void *p)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo cell_t *ci = (cell_t *)p;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo pnode_t node;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ASSERT(ci[1] == 1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
b5353d912e615fb002628d16835832e79668c442Abhinandan Ekande /*
b5353d912e615fb002628d16835832e79668c442Abhinandan Ekande * We are passing the cpu pointer (CPU->cpu_id) explicitly to
b5353d912e615fb002628d16835832e79668c442Abhinandan Ekande * thread_affinity_set() so that we don't attempt to grab the
b5353d912e615fb002628d16835832e79668c442Abhinandan Ekande * cpu_lock internally in thread_affinity_set() and may sleep
b5353d912e615fb002628d16835832e79668c442Abhinandan Ekande * as a result.
b5353d912e615fb002628d16835832e79668c442Abhinandan Ekande * It is safe to pass CPU->cpu_id and it will always be valid.
b5353d912e615fb002628d16835832e79668c442Abhinandan Ekande */
b5353d912e615fb002628d16835832e79668c442Abhinandan Ekande thread_affinity_set(curthread, CPU->cpu_id);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo node = finddevice(p1275_cell2ptr(ci[3]));
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ci[4] = p1275_dnode2cell(node);
b5353d912e615fb002628d16835832e79668c442Abhinandan Ekande thread_affinity_clear(curthread);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppopromif_nextnode(void *p)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo cell_t *ci = (cell_t *)p;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo pnode_t next;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ASSERT(ci[1] == 1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo next = promif_stree_nextnode(p1275_cell2dnode(ci[3]));
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ci[4] = p1275_dnode2cell(next);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppopromif_childnode(void *p)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo cell_t *ci = (cell_t *)p;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo pnode_t child;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ASSERT(ci[1] == 1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo child = promif_stree_childnode(p1275_cell2dnode(ci[3]));
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ci[4] = p1275_dnode2cell(child);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppopromif_parentnode(void *p)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo cell_t *ci = (cell_t *)p;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo pnode_t parent;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ASSERT(ci[1] == 1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo parent = promif_stree_parentnode(p1275_cell2dnode(ci[3]));
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ci[4] = p1275_dnode2cell(parent);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifndef _KMDB
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Get a token from a prom pathname, collecting everything
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * until a non-comma, non-colon separator is found. Any
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * options, including the ':' option separator, on the end
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * of the token are removed.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic char *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppogettoken(char *tp, char *token)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char *result = token;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (;;) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo tp = prom_path_gettoken(tp, token);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo token += prom_strlen(token);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if ((*tp == ',') || (*tp == ':')) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *token++ = *tp++;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *token = '\0';
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo continue;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* strip off any options from the token */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo prom_strip_options(result, result);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (tp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Retrieve the unit address for a node by looking it up
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * in the corresponding dip. -1 is returned if no unit
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * address can be determined.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic int
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoget_unit_addr(pnode_t np, char *paddr)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo dev_info_t *dip;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char *addr;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if ((dip = e_ddi_nodeid_to_dip(np)) == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (-1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if ((addr = ddi_get_name_addr(dip)) == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ddi_release_devi(dip);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (-1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) prom_strcpy(paddr, addr);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ddi_release_devi(dip);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Get node id of node in prom tree that path identifies
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic pnode_t
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppofinddevice(char *path)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char name[OBP_MAXPROPNAME];
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char addr[OBP_MAXPROPNAME];
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char pname[OBP_MAXPROPNAME];
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char paddr[OBP_MAXPROPNAME];
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char *tp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo pnode_t np;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo pnode_t device;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo CIF_DBG_NODE("finddevice: %s\n", path);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo tp = path;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo np = prom_rootnode();
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo device = OBP_BADNODE;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* must be a fully specified path */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (*tp++ != '/')
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo goto done;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (;;) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* get the name from the path */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo tp = gettoken(tp, name);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (*name == '\0')
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* get the address from the path */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (*tp == '@') {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo tp++;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo tp = gettoken(tp, addr);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo } else {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo addr[0] = '\0';
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo CIF_DBG_NODE("looking for: %s%s%s\n", name,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (*addr != '\0') ? "@" : "", addr);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if ((np = prom_childnode(np)) == OBP_NONODE)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo while (np != OBP_NONODE) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* get the name from the current node */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (prom_getprop(np, OBP_NAME, pname) < 0)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo goto done;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* get the address from the current node */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (get_unit_addr(np, paddr) < 0)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo paddr[0] = '\0';
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* compare the names and addresses */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if ((prom_strcmp(name, pname) == 0) &&
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (prom_strcmp(addr, paddr) == 0)) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo CIF_DBG_NODE("found dev: %s%s%s (0x%x)\n",
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo pname, (*paddr != '\0') ? "@" : "",
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo paddr, np);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo } else {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo CIF_DBG_NODE(" no match: %s%s%s vs %s%s%s\n",
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo name, (*addr != '\0') ? "@" : "", addr,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo pname, (*paddr != '\0') ? "@" : "", paddr);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo np = prom_nextnode(np);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* path does not map to a node */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (np == OBP_NONODE)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (*tp == '\0') {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* found a matching node */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo device = np;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Continue the loop with the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * next component of the path.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo tp++;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppodone:
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (device == OBP_BADNODE) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo CIF_DBG_NODE("device not found\n\n");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo } else {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo CIF_DBG_NODE("returning 0x%x\n\n", device);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (device);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif