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 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 #include <assert.h>
29 #include <pthread.h>
30 #include <strings.h>
31 #include <sys/fm/protocol.h>
32 
33 #include <topo_alloc.h>
34 #include <topo_error.h>
35 #include <topo_method.h>
36 #include <topo_prop.h>
37 #include <topo_protocol.h>
38 #include <topo_subr.h>
39 
40 #include <libtopo.h>
41 
42 int
43 topo_node_asru(tnode_t *node, nvlist_t **asru, nvlist_t *priv, int *err)
44 {
45 	nvlist_t *prop, *ap;
46 
47 	if (topo_prop_getprop(node, TOPO_PGROUP_PROTOCOL,
48 	    TOPO_PROP_ASRU, priv, &prop, err) < 0)
49 		return (-1);
50 
51 	if (nvlist_lookup_nvlist(prop, TOPO_PROP_VAL_VAL, &ap) != 0 ||
52 	    topo_hdl_nvdup(node->tn_hdl, ap, asru) < 0) {
53 		*err = ETOPO_PROP_NVL;
54 		nvlist_free(prop);
55 		return (-1);
56 	}
57 
58 	nvlist_free(prop);
59 
60 	return (0);
61 }
62 
63 int
64 topo_node_fru(tnode_t *node, nvlist_t **fru, nvlist_t *priv, int *err)
65 {
66 	nvlist_t *prop, *fp;
67 
68 	if (topo_prop_getprop(node, TOPO_PGROUP_PROTOCOL, TOPO_PROP_FRU,
69 	    priv, &prop, err) < 0)
70 		return (-1);
71 
72 	if (nvlist_lookup_nvlist(prop, TOPO_PROP_VAL_VAL, &fp) != 0 ||
73 	    topo_hdl_nvdup(node->tn_hdl, fp, fru) < 0) {
74 		*err = ETOPO_PROP_NVL;
75 		nvlist_free(prop);
76 		return (-1);
77 	}
78 
79 	nvlist_free(prop);
80 
81 	return (0);
82 }
83 
84 int
85 topo_node_resource(tnode_t *node, nvlist_t **resource, int *err)
86 {
87 
88 	return (topo_prop_get_fmri(node, TOPO_PGROUP_PROTOCOL,
89 	    TOPO_PROP_RESOURCE, resource, err));
90 }
91 
92 int
93 topo_node_label(tnode_t *node, char **label, int *err)
94 {
95 
96 	return (topo_prop_get_string(node, TOPO_PGROUP_PROTOCOL,
97 	    TOPO_PROP_LABEL, label, err));
98 }
99 
100 int
101 topo_node_asru_set(tnode_t *node, nvlist_t *asru, int flag, int *err)
102 {
103 	/*
104 	 * Inherit ASRU property from our parent if asru not specified
105 	 */
106 	if (asru == NULL) {
107 		if (topo_prop_inherit(node, TOPO_PGROUP_PROTOCOL,
108 		    TOPO_PROP_ASRU, err) < 0) {
109 			return (-1);
110 		}
111 
112 		return (0);
113 	}
114 
115 	if (flag & TOPO_ASRU_COMPUTE) {
116 		if (topo_prop_method_register(node, TOPO_PGROUP_PROTOCOL,
117 		    TOPO_PROP_ASRU, TOPO_TYPE_FMRI, TOPO_METH_ASRU_COMPUTE,
118 		    asru, err) < 0)
119 			return (-1);
120 	} else {
121 		if (topo_prop_set_fmri(node, TOPO_PGROUP_PROTOCOL,
122 		    TOPO_PROP_ASRU, TOPO_PROP_IMMUTABLE, asru, err) < 0)
123 			return (-1);
124 	}
125 
126 	return (0);
127 }
128 
129 int
130 topo_node_fru_set(tnode_t *node, nvlist_t *fru, int flag, int *err)
131 {
132 
133 	/*
134 	 * Inherit FRU property from our parent if * not specified
135 	 */
136 	if (fru == NULL) {
137 		if (topo_prop_inherit(node, TOPO_PGROUP_PROTOCOL, TOPO_PROP_FRU,
138 		    err) < 0) {
139 			return (-1);
140 		}
141 	}
142 
143 	if (flag & TOPO_FRU_COMPUTE) {
144 		if (topo_prop_method_register(node, TOPO_PGROUP_PROTOCOL,
145 		    TOPO_PROP_FRU, TOPO_TYPE_FMRI, TOPO_METH_FRU_COMPUTE,
146 		    fru, err) < 0)
147 			return (-1);
148 	} else {
149 		if (topo_prop_set_fmri(node, TOPO_PGROUP_PROTOCOL,
150 		    TOPO_PROP_FRU, TOPO_PROP_IMMUTABLE, fru, err) < 0)
151 			return (-1);
152 	}
153 
154 
155 	return (0);
156 }
157 
158 int
159 topo_node_label_set(tnode_t *node, char *label, int *err)
160 {
161 
162 	/*
163 	 * Inherit FRU property from our parent if * not specified
164 	 */
165 	if (label == NULL) {
166 		if (topo_prop_inherit(node, TOPO_PGROUP_PROTOCOL,
167 		    TOPO_PROP_LABEL, err) < 0) {
168 			return (-1);
169 		}
170 	} else {
171 		if (topo_prop_set_string(node, TOPO_PGROUP_PROTOCOL,
172 		    TOPO_PROP_LABEL, TOPO_PROP_IMMUTABLE, label, err) < 0)
173 			return (-1);
174 	}
175 
176 	return (0);
177 }
178