xref: /freebsd/sys/dev/sfxge/common/efx_mon.c (revision 10b59a9b4add0320d52c15ce057dd697261e7dfc)
1 /*-
2  * Copyright 2007-2009 Solarflare Communications Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  */
25 
26 #include "efsys.h"
27 #include "efx.h"
28 #include "efx_types.h"
29 #include "efx_regs.h"
30 #include "efx_impl.h"
31 
32 #if EFSYS_OPT_MON_NULL
33 #include "nullmon.h"
34 #endif
35 
36 #if EFSYS_OPT_MON_LM87
37 #include "lm87.h"
38 #endif
39 
40 #if EFSYS_OPT_MON_MAX6647
41 #include "max6647.h"
42 #endif
43 
44 #if EFSYS_OPT_NAMES
45 
46 static const char	__cs * __cs __efx_mon_name[] = {
47 	"",
48 	"nullmon",
49 	"lm87",
50 	"max6647",
51 	"sfx90x0"
52 };
53 
54 		const char __cs *
55 efx_mon_name(
56 	__in	efx_nic_t *enp)
57 {
58 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
59 
60 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
61 
62 	EFSYS_ASSERT(encp->enc_mon_type != EFX_MON_INVALID);
63 	EFSYS_ASSERT3U(encp->enc_mon_type, <, EFX_MON_NTYPES);
64 	return (__efx_mon_name[encp->enc_mon_type]);
65 }
66 
67 #endif	/* EFSYS_OPT_NAMES */
68 
69 #if EFSYS_OPT_MON_NULL
70 static efx_mon_ops_t	__cs __efx_mon_null_ops = {
71 	nullmon_reset,			/* emo_reset */
72 	nullmon_reconfigure,		/* emo_reconfigure */
73 #if EFSYS_OPT_MON_STATS
74 	nullmon_stats_update		/* emo_stat_update */
75 #endif	/* EFSYS_OPT_MON_STATS */
76 };
77 #endif
78 
79 #if EFSYS_OPT_MON_LM87
80 static efx_mon_ops_t	__cs __efx_mon_lm87_ops = {
81 	lm87_reset,			/* emo_reset */
82 	lm87_reconfigure,		/* emo_reconfigure */
83 #if EFSYS_OPT_MON_STATS
84 	lm87_stats_update		/* emo_stat_update */
85 #endif	/* EFSYS_OPT_MON_STATS */
86 };
87 #endif
88 
89 #if EFSYS_OPT_MON_MAX6647
90 static efx_mon_ops_t	__cs __efx_mon_max6647_ops = {
91 	max6647_reset,			/* emo_reset */
92 	max6647_reconfigure,		/* emo_reconfigure */
93 #if EFSYS_OPT_MON_STATS
94 	max6647_stats_update		/* emo_stat_update */
95 #endif	/* EFSYS_OPT_MON_STATS */
96 };
97 #endif
98 
99 #if EFSYS_OPT_MON_SIENA
100 static efx_mon_ops_t	__cs __efx_mon_siena_ops = {
101 	siena_mon_reset,		/* emo_reset */
102 	siena_mon_reconfigure,		/* emo_reconfigure */
103 #if EFSYS_OPT_MON_STATS
104 	siena_mon_stats_update		/* emo_stat_update */
105 #endif	/* EFSYS_OPT_MON_STATS */
106 };
107 #endif
108 
109 
110 static efx_mon_ops_t	__cs * __cs __efx_mon_ops[] = {
111 	NULL,
112 #if EFSYS_OPT_MON_NULL
113 	&__efx_mon_null_ops,
114 #else
115 	NULL,
116 #endif
117 #if EFSYS_OPT_MON_LM87
118 	&__efx_mon_lm87_ops,
119 #else
120 	NULL,
121 #endif
122 #if EFSYS_OPT_MON_MAX6647
123 	&__efx_mon_max6647_ops,
124 #else
125 	NULL,
126 #endif
127 #if EFSYS_OPT_MON_SIENA
128 	&__efx_mon_siena_ops
129 #else
130 	NULL
131 #endif
132 };
133 
134 	__checkReturn	int
135 efx_mon_init(
136 	__in		efx_nic_t *enp)
137 {
138 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
139 	efx_mon_t *emp = &(enp->en_mon);
140 	efx_mon_ops_t *emop;
141 	int rc;
142 
143 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
144 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
145 
146 	if (enp->en_mod_flags & EFX_MOD_MON) {
147 		rc = EINVAL;
148 		goto fail1;
149 	}
150 
151 	enp->en_mod_flags |= EFX_MOD_MON;
152 
153 	emp->em_type = encp->enc_mon_type;
154 
155 	EFSYS_ASSERT(encp->enc_mon_type != EFX_MON_INVALID);
156 	EFSYS_ASSERT3U(emp->em_type, <, EFX_MON_NTYPES);
157 	if ((emop = (efx_mon_ops_t *)__efx_mon_ops[emp->em_type]) == NULL) {
158 		rc = ENOTSUP;
159 		goto fail2;
160 	}
161 
162 	if ((rc = emop->emo_reset(enp)) != 0)
163 		goto fail3;
164 
165 	if ((rc = emop->emo_reconfigure(enp)) != 0)
166 		goto fail4;
167 
168 	emp->em_emop = emop;
169 	return (0);
170 
171 fail4:
172 	EFSYS_PROBE(fail5);
173 
174 	(void) emop->emo_reset(enp);
175 
176 fail3:
177 	EFSYS_PROBE(fail4);
178 fail2:
179 	EFSYS_PROBE(fail3);
180 
181 	emp->em_type = EFX_MON_INVALID;
182 
183 	enp->en_mod_flags &= ~EFX_MOD_MON;
184 
185 fail1:
186 	EFSYS_PROBE1(fail1, int, rc);
187 
188 	return (rc);
189 }
190 
191 #if EFSYS_OPT_MON_STATS
192 
193 #if EFSYS_OPT_NAMES
194 
195 /* START MKCONFIG GENERATED MonitorStatNamesBlock 08518fd1fb4e2612 */
196 static const char 	__cs * __cs __mon_stat_name[] = {
197 	"value_2_5v",
198 	"value_vccp1",
199 	"value_vcc",
200 	"value_5v",
201 	"value_12v",
202 	"value_vccp2",
203 	"value_ext_temp",
204 	"value_int_temp",
205 	"value_ain1",
206 	"value_ain2",
207 	"controller_cooling",
208 	"ext_cooling",
209 	"1v",
210 	"1_2v",
211 	"1_8v",
212 	"3_3v",
213 };
214 
215 /* END MKCONFIG GENERATED MonitorStatNamesBlock */
216 
217 extern					const char __cs *
218 efx_mon_stat_name(
219 	__in				efx_nic_t *enp,
220 	__in				efx_mon_stat_t id)
221 {
222 	_NOTE(ARGUNUSED(enp))
223 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
224 
225 	EFSYS_ASSERT3U(id, <, EFX_MON_NSTATS);
226 	return (__mon_stat_name[id]);
227 }
228 
229 #endif	/* EFSYS_OPT_NAMES */
230 
231 	__checkReturn			int
232 efx_mon_stats_update(
233 	__in				efx_nic_t *enp,
234 	__in				efsys_mem_t *esmp,
235 	__out_ecount(EFX_MON_NSTATS)	efx_mon_stat_value_t *values)
236 {
237 	efx_mon_t *emp = &(enp->en_mon);
238 	efx_mon_ops_t *emop = emp->em_emop;
239 
240 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
241 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
242 
243 	return (emop->emo_stats_update(enp, esmp, values));
244 }
245 
246 #endif	/* EFSYS_OPT_MON_STATS */
247 
248 		void
249 efx_mon_fini(
250 	__in	efx_nic_t *enp)
251 {
252 	efx_mon_t *emp = &(enp->en_mon);
253 	efx_mon_ops_t *emop = emp->em_emop;
254 	int rc;
255 
256 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
257 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
258 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
259 
260 	emp->em_emop = NULL;
261 
262 	rc = emop->emo_reset(enp);
263 	if (rc != 0)
264 		EFSYS_PROBE1(fail1, int, rc);
265 
266 	emp->em_type = EFX_MON_INVALID;
267 
268 	enp->en_mod_flags &= ~EFX_MOD_MON;
269 }
270