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 40int 41topo_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 61int 62topo_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 82int 83topo_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 90int 91topo_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 98int 99topo_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 127int 128topo_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 154int 155topo_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