root/usr/src/uts/sun4u/lw8/sys/sgfrutree.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2000 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SGFRUTREE_H
#define _SGFRUTREE_H

#pragma ident   "%Z%%M% %I%     %E% SMI"

#ifdef  __cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <sys/sgfru.h>

#define ROOTPARENT              0               /* well-known node value */
#define MAX_NODE_CHILDREN       16              /* hint */
#define MAX_NODE_NAME           16              /* max name size */

/*
 * PICL classes used by serengeti sgfrutree
 */
#define TEMP_CLASS              0x0             /* currently unused */
#define FRU_CLASS               0x1             /* fru class */
#define LOCATION_CLASS          0x2             /* location class */
#define PSEUDO_FRU_CLASS        0x3             /* fru class with no seeprom */

typedef struct {
        fru_hdl_t       handle;                 /* (container) handle */
        char            nodename[MAX_NODE_NAME]; /* picl nodename, thing name */
        int16_t         has_children;           /* hint if node has children */
        uint16_t        class;                  /* one of the picl classes */
        union class_info {
            struct location_info {
                int16_t slot;                   /* location: valid slot or -1 */
                char    label[MAX_NODE_NAME];   /* label property, place name */
            } linfo;
        } cinfo;
} node_t;

#define location_slot   cinfo.linfo.slot
#define location_label  cinfo.linfo.label

typedef frup_info_t     child_info_t;
typedef frup_info_t     handles_t;
typedef frup_info_t     node_info_t;

/*
 *   PICL FRU Hierarchy
 *
 *          + frutree
 *          |
 *          +-- safari-node
 *              |
 *              +-- picl fru node, name = <name> (picl class = fru)
 *              |
 *              +-- picl location node, name = <name> (picl class = location)
 *              |     o optional property slot = <instance>
 *              |
 *              +-- picl location node, name = <name> (picl class = location)
 *              |  |  o optional property slot = <instance>
 *              |  |
 *              |  +-- picl fru node, name = <name> (picl class = fru)
 *              |
 *              +-- picl tree sibling +-- picl tree child
 *
 *
 * Request: child_info_t, with parent fru handle and max count
 * Receive: child_info_t, with child_info_t array and actual count
 */
#define SGFRU_GETCHILDLIST                      0x000f
/*
 * Request: handles_t, with fru handle, max count, and preallocated buffer
 * Receive: handles_t, with handle array and actual count
 */
#define SGFRU_GETCHILDHANDLES                   0x0010
/*
 * Request: node_info_t, with fru handle
 * Receive: node_info_t, with node_t info for the node
 */
#define SGFRU_GETNODEINFO                       0x0020

#ifdef DEBUG
/*
 * DESCRIPTION
 *   fru_get_children() fills an array of structures representing the
 *   children of a node.
 *
 * ARGUMENTS
 *
 * RETURN
 *   int
 *     On success, the number of node_t structures written is returned;
 *     on error, -1 is returned and "errno" is set appropriately.
 *
 * ERRORS
 *   ENOMEM
 *     The parent FRU has more than "max_children" children.
 */
int fru_get_children(fru_hdl_t parent, node_t *children, int max_children);

/*
 * DESCRIPTION
 *   fru_get_handles() fills an array of structures representing the
 *   children of a node that have FRUs. Use 0 for the top root node.
 *
 * ARGUMENTS
 *
 * RETURN
 *   int
 *     On success, the number of fru_hdl_t structures written is returned;
 *     on error, -1 is returned and "errno" is set appropriately.
 *
 * ERRORS
 *   ENOMEM
 *     The parent FRU has more than "max_handles" children.
 */
int fru_get_handles(fru_hdl_t parent, fru_hdl_t *children, int max_handles);

/*
 * DESCRIPTION
 *   fru_get_node_info() gets the node_t info for a handle.
 *
 * ARGUMENTS
 *
 * RETURN
 *   int
 *     On success, 0 is returned as well as the node_info;
 *     on error, -1 is returned and "errno" is set appropriately.
 *
 * ERRORS
 */
int fru_get_node_info(fru_hdl_t node_hdl, node_t *node);
#endif /* DEBUG */

#ifdef  __cplusplus
}
#endif

#endif  /* _SGFRUTREE_H */