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