Home | History | Annotate | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #include <assert.h>
     27 #include <pthread.h>
     28 #include <strings.h>
     29 #include <sys/fm/protocol.h>
     30 
     31 #include <topo_alloc.h>
     32 #include <topo_error.h>
     33 #include <topo_method.h>
     34 #include <topo_prop.h>
     35 #include <topo_protocol.h>
     36 #include <topo_subr.h>
     37 
     38 #include <libtopo.h>
     39 
     40 int
     41 topo_node_asru(tnode_t *node, nvlist_t **asru, nvlist_t *priv, int *err)
     42 {
     43 	nvlist_t *prop, *ap;
     44 
     45 	if (topo_prop_getprop(node, TOPO_PGROUP_PROTOCOL,
     46 	    TOPO_PROP_ASRU, priv, &prop, err) < 0)
     47 		return (-1);
     48 
     49 	if (nvlist_lookup_nvlist(prop, TOPO_PROP_VAL_VAL, &ap) != 0 ||
     50 	    topo_hdl_nvdup(node->tn_hdl, ap, asru) < 0) {
     51 		*err = ETOPO_PROP_NVL;
     52 		nvlist_free(prop);
     53 		return (-1);
     54 	}
     55 
     56 	nvlist_free(prop);
     57 
     58 	return (0);
     59 }
     60 
     61 int
     62 topo_node_fru(tnode_t *node, nvlist_t **fru, nvlist_t *priv, int *err)
     63 {
     64 	nvlist_t *prop, *fp;
     65 
     66 	if (topo_prop_getprop(node, TOPO_PGROUP_PROTOCOL, TOPO_PROP_FRU,
     67 	    priv, &prop, err) < 0)
     68 		return (-1);
     69 
     70 	if (nvlist_lookup_nvlist(prop, TOPO_PROP_VAL_VAL, &fp) != 0 ||
     71 	    topo_hdl_nvdup(node->tn_hdl, fp, fru) < 0) {
     72 		*err = ETOPO_PROP_NVL;
     73 		nvlist_free(prop);
     74 		return (-1);
     75 	}
     76 
     77 	nvlist_free(prop);
     78 
     79 	return (0);
     80 }
     81 
     82 int
     83 topo_node_resource(tnode_t *node, nvlist_t **resource, int *err)
     84 {
     85 
     86 	return (topo_prop_get_fmri(node, TOPO_PGROUP_PROTOCOL,
     87 	    TOPO_PROP_RESOURCE, resource, err));
     88 }
     89 
     90 int
     91 topo_node_label(tnode_t *node, char **label, int *err)
     92 {
     93 
     94 	return (topo_prop_get_string(node, TOPO_PGROUP_PROTOCOL,
     95 	    TOPO_PROP_LABEL, label, err));
     96 }
     97 
     98 int
     99 topo_node_asru_set(tnode_t *node, nvlist_t *asru, int flag, int *err)
    100 {
    101 	/*
    102 	 * Inherit ASRU property from our parent if asru not specified
    103 	 */
    104 	if (asru == NULL) {
    105 		if (topo_prop_inherit(node, TOPO_PGROUP_PROTOCOL,
    106 		    TOPO_PROP_ASRU, err) < 0) {
    107 			return (-1);
    108 		}
    109 
    110 		return (0);
    111 	}
    112 
    113 	if (flag & TOPO_ASRU_COMPUTE) {
    114 		if (topo_prop_method_register(node, TOPO_PGROUP_PROTOCOL,
    115 		    TOPO_PROP_ASRU, TOPO_TYPE_FMRI, TOPO_METH_ASRU_COMPUTE,
    116 		    asru, err) < 0)
    117 			return (-1);
    118 	} else {
    119 		if (topo_prop_set_fmri(node, TOPO_PGROUP_PROTOCOL,
    120 		    TOPO_PROP_ASRU, TOPO_PROP_IMMUTABLE, asru, err) < 0)
    121 			return (-1);
    122 	}
    123 
    124 	return (0);
    125 }
    126 
    127 int
    128 topo_node_fru_set(tnode_t *node, nvlist_t *fru, int flag, int *err)
    129 {
    130 
    131 	/*
    132 	 * Inherit FRU property from our parent if not specified
    133 	 */
    134 	if (fru == NULL) {
    135 		if (topo_prop_inherit(node, TOPO_PGROUP_PROTOCOL, TOPO_PROP_FRU,
    136 		    err) < 0) {
    137 			return (-1);
    138 		}
    139 	} else if (flag & TOPO_FRU_COMPUTE) {
    140 		if (topo_prop_method_register(node, TOPO_PGROUP_PROTOCOL,
    141 		    TOPO_PROP_FRU, TOPO_TYPE_FMRI, TOPO_METH_FRU_COMPUTE,
    142 		    fru, err) < 0)
    143 			return (-1);
    144 	} else {
    145 		if (topo_prop_set_fmri(node, TOPO_PGROUP_PROTOCOL,
    146 		    TOPO_PROP_FRU, TOPO_PROP_IMMUTABLE, fru, err) < 0)
    147 			return (-1);
    148 	}
    149 
    150 
    151 	return (0);
    152 }
    153 
    154 int
    155 topo_node_label_set(tnode_t *node, char *label, int *err)
    156 {
    157 
    158 	/*
    159 	 * Inherit FRU property from our parent if * not specified
    160 	 */
    161 	if (label == NULL) {
    162 		if (topo_prop_inherit(node, TOPO_PGROUP_PROTOCOL,
    163 		    TOPO_PROP_LABEL, err) < 0) {
    164 			return (-1);
    165 		}
    166 	} else {
    167 		if (topo_prop_set_string(node, TOPO_PGROUP_PROTOCOL,
    168 		    TOPO_PROP_LABEL, TOPO_PROP_IMMUTABLE, label, err) < 0)
    169 			return (-1);
    170 	}
    171 
    172 	return (0);
    173 }
    174