1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2007-2016 Solarflare Communications Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright notice,
11 *    this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright notice,
13 *    this list of conditions and the following disclaimer in the documentation
14 *    and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * The views and conclusions contained in the software and documentation are
29 * those of the authors and should not be interpreted as representing official
30 * policies, either expressed or implied, of the FreeBSD Project.
31 */
32
33#include <sys/cdefs.h>
34__FBSDID("$FreeBSD$");
35
36#include "efx.h"
37#include "efx_impl.h"
38
39#if EFSYS_OPT_MON_MCDI
40#include "mcdi_mon.h"
41#endif
42
43#if EFSYS_OPT_NAMES
44
45static const char * const __efx_mon_name[] = {
46	"",
47	"sfx90x0",
48	"sfx91x0",
49	"sfx92x0"
50};
51
52		const char *
53efx_mon_name(
54	__in	efx_nic_t *enp)
55{
56	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
57
58	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
59
60	EFSYS_ASSERT(encp->enc_mon_type != EFX_MON_INVALID);
61	EFSYS_ASSERT3U(encp->enc_mon_type, <, EFX_MON_NTYPES);
62	return (__efx_mon_name[encp->enc_mon_type]);
63}
64
65#endif	/* EFSYS_OPT_NAMES */
66
67#if EFSYS_OPT_MON_MCDI
68static const efx_mon_ops_t	__efx_mon_mcdi_ops = {
69#if EFSYS_OPT_MON_STATS
70	mcdi_mon_stats_update,		/* emo_stats_update */
71	mcdi_mon_limits_update,		/* emo_limits_update */
72#endif	/* EFSYS_OPT_MON_STATS */
73};
74#endif
75
76	__checkReturn	efx_rc_t
77efx_mon_init(
78	__in		efx_nic_t *enp)
79{
80	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
81	efx_mon_t *emp = &(enp->en_mon);
82	const efx_mon_ops_t *emop;
83	efx_rc_t rc;
84
85	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
86	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
87
88	if (enp->en_mod_flags & EFX_MOD_MON) {
89		rc = EINVAL;
90		goto fail1;
91	}
92
93	enp->en_mod_flags |= EFX_MOD_MON;
94
95	emp->em_type = encp->enc_mon_type;
96
97	EFSYS_ASSERT(encp->enc_mon_type != EFX_MON_INVALID);
98	switch (emp->em_type) {
99#if EFSYS_OPT_MON_MCDI
100	case EFX_MON_SFC90X0:
101	case EFX_MON_SFC91X0:
102	case EFX_MON_SFC92X0:
103		emop = &__efx_mon_mcdi_ops;
104		break;
105#endif
106	default:
107		rc = ENOTSUP;
108		goto fail2;
109	}
110
111	emp->em_emop = emop;
112	return (0);
113
114fail2:
115	EFSYS_PROBE(fail2);
116
117	emp->em_type = EFX_MON_INVALID;
118
119	enp->en_mod_flags &= ~EFX_MOD_MON;
120
121fail1:
122	EFSYS_PROBE1(fail1, efx_rc_t, rc);
123
124	return (rc);
125}
126
127#if EFSYS_OPT_MON_STATS
128
129#if EFSYS_OPT_NAMES
130
131/* START MKCONFIG GENERATED MonitorStatNamesBlock 277c17eda1a6d1a4 */
132static const char * const __mon_stat_name[] = {
133	"controller_temp",
134	"phy_common_temp",
135	"controller_cooling",
136	"phy0_temp",
137	"phy0_cooling",
138	"phy1_temp",
139	"phy1_cooling",
140	"in_1v0",
141	"in_1v2",
142	"in_1v8",
143	"in_2v5",
144	"in_3v3",
145	"in_12v0",
146	"in_1v2a",
147	"in_vref",
148	"out_vaoe",
149	"aoe_temp",
150	"psu_aoe_temp",
151	"psu_temp",
152	"fan_0",
153	"fan_1",
154	"fan_2",
155	"fan_3",
156	"fan_4",
157	"in_vaoe",
158	"out_iaoe",
159	"in_iaoe",
160	"nic_power",
161	"in_0v9",
162	"in_i0v9",
163	"in_i1v2",
164	"in_0v9_adc",
165	"controller_2_temp",
166	"vreg_internal_temp",
167	"vreg_0v9_temp",
168	"vreg_1v2_temp",
169	"controller_vptat",
170	"controller_internal_temp",
171	"controller_vptat_extadc",
172	"controller_internal_temp_extadc",
173	"ambient_temp",
174	"airflow",
175	"vdd08d_vss08d_csr",
176	"vdd08d_vss08d_csr_extadc",
177	"hotpoint_temp",
178	"phy_power_port0",
179	"phy_power_port1",
180	"mum_vcc",
181	"in_0v9_a",
182	"in_i0v9_a",
183	"vreg_0v9_a_temp",
184	"in_0v9_b",
185	"in_i0v9_b",
186	"vreg_0v9_b_temp",
187	"ccom_avreg_1v2_supply",
188	"ccom_avreg_1v2_supply_extadc",
189	"ccom_avreg_1v8_supply",
190	"ccom_avreg_1v8_supply_extadc",
191	"controller_master_vptat",
192	"controller_master_internal_temp",
193	"controller_master_vptat_extadc",
194	"controller_master_internal_temp_extadc",
195	"controller_slave_vptat",
196	"controller_slave_internal_temp",
197	"controller_slave_vptat_extadc",
198	"controller_slave_internal_temp_extadc",
199	"sodimm_vout",
200	"sodimm_0_temp",
201	"sodimm_1_temp",
202	"phy0_vcc",
203	"phy1_vcc",
204	"controller_tdiode_temp",
205	"board_front_temp",
206	"board_back_temp",
207	"in_i1v8",
208	"in_i2v5",
209	"in_i3v3",
210	"in_i12v0",
211	"in_1v3",
212	"in_i1v3",
213};
214
215/* END MKCONFIG GENERATED MonitorStatNamesBlock */
216
217					const char *
218efx_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
229typedef struct _stat_description_t {
230	efx_mon_stat_t	stat;
231	const char	*desc;
232} stat_description_t;
233
234/* START MKCONFIG GENERATED MonitorStatDescriptionsBlock f072138f16d2e1f8 */
235static const char *__mon_stat_description[] = {
236	MC_CMD_SENSOR_CONTROLLER_TEMP_ENUM_STR,
237	MC_CMD_SENSOR_PHY_COMMON_TEMP_ENUM_STR,
238	MC_CMD_SENSOR_CONTROLLER_COOLING_ENUM_STR,
239	MC_CMD_SENSOR_PHY0_TEMP_ENUM_STR,
240	MC_CMD_SENSOR_PHY0_COOLING_ENUM_STR,
241	MC_CMD_SENSOR_PHY1_TEMP_ENUM_STR,
242	MC_CMD_SENSOR_PHY1_COOLING_ENUM_STR,
243	MC_CMD_SENSOR_IN_1V0_ENUM_STR,
244	MC_CMD_SENSOR_IN_1V2_ENUM_STR,
245	MC_CMD_SENSOR_IN_1V8_ENUM_STR,
246	MC_CMD_SENSOR_IN_2V5_ENUM_STR,
247	MC_CMD_SENSOR_IN_3V3_ENUM_STR,
248	MC_CMD_SENSOR_IN_12V0_ENUM_STR,
249	MC_CMD_SENSOR_IN_1V2A_ENUM_STR,
250	MC_CMD_SENSOR_IN_VREF_ENUM_STR,
251	MC_CMD_SENSOR_OUT_VAOE_ENUM_STR,
252	MC_CMD_SENSOR_AOE_TEMP_ENUM_STR,
253	MC_CMD_SENSOR_PSU_AOE_TEMP_ENUM_STR,
254	MC_CMD_SENSOR_PSU_TEMP_ENUM_STR,
255	MC_CMD_SENSOR_FAN_0_ENUM_STR,
256	MC_CMD_SENSOR_FAN_1_ENUM_STR,
257	MC_CMD_SENSOR_FAN_2_ENUM_STR,
258	MC_CMD_SENSOR_FAN_3_ENUM_STR,
259	MC_CMD_SENSOR_FAN_4_ENUM_STR,
260	MC_CMD_SENSOR_IN_VAOE_ENUM_STR,
261	MC_CMD_SENSOR_OUT_IAOE_ENUM_STR,
262	MC_CMD_SENSOR_IN_IAOE_ENUM_STR,
263	MC_CMD_SENSOR_NIC_POWER_ENUM_STR,
264	MC_CMD_SENSOR_IN_0V9_ENUM_STR,
265	MC_CMD_SENSOR_IN_I0V9_ENUM_STR,
266	MC_CMD_SENSOR_IN_I1V2_ENUM_STR,
267	MC_CMD_SENSOR_IN_0V9_ADC_ENUM_STR,
268	MC_CMD_SENSOR_CONTROLLER_2_TEMP_ENUM_STR,
269	MC_CMD_SENSOR_VREG_INTERNAL_TEMP_ENUM_STR,
270	MC_CMD_SENSOR_VREG_0V9_TEMP_ENUM_STR,
271	MC_CMD_SENSOR_VREG_1V2_TEMP_ENUM_STR,
272	MC_CMD_SENSOR_CONTROLLER_VPTAT_ENUM_STR,
273	MC_CMD_SENSOR_CONTROLLER_INTERNAL_TEMP_ENUM_STR,
274	MC_CMD_SENSOR_CONTROLLER_VPTAT_EXTADC_ENUM_STR,
275	MC_CMD_SENSOR_CONTROLLER_INTERNAL_TEMP_EXTADC_ENUM_STR,
276	MC_CMD_SENSOR_AMBIENT_TEMP_ENUM_STR,
277	MC_CMD_SENSOR_AIRFLOW_ENUM_STR,
278	MC_CMD_SENSOR_VDD08D_VSS08D_CSR_ENUM_STR,
279	MC_CMD_SENSOR_VDD08D_VSS08D_CSR_EXTADC_ENUM_STR,
280	MC_CMD_SENSOR_HOTPOINT_TEMP_ENUM_STR,
281	MC_CMD_SENSOR_PHY_POWER_PORT0_ENUM_STR,
282	MC_CMD_SENSOR_PHY_POWER_PORT1_ENUM_STR,
283	MC_CMD_SENSOR_MUM_VCC_ENUM_STR,
284	MC_CMD_SENSOR_IN_0V9_A_ENUM_STR,
285	MC_CMD_SENSOR_IN_I0V9_A_ENUM_STR,
286	MC_CMD_SENSOR_VREG_0V9_A_TEMP_ENUM_STR,
287	MC_CMD_SENSOR_IN_0V9_B_ENUM_STR,
288	MC_CMD_SENSOR_IN_I0V9_B_ENUM_STR,
289	MC_CMD_SENSOR_VREG_0V9_B_TEMP_ENUM_STR,
290	MC_CMD_SENSOR_CCOM_AVREG_1V2_SUPPLY_ENUM_STR,
291	MC_CMD_SENSOR_CCOM_AVREG_1V2_SUPPLY_EXTADC_ENUM_STR,
292	MC_CMD_SENSOR_CCOM_AVREG_1V8_SUPPLY_ENUM_STR,
293	MC_CMD_SENSOR_CCOM_AVREG_1V8_SUPPLY_EXTADC_ENUM_STR,
294	MC_CMD_SENSOR_CONTROLLER_MASTER_VPTAT_ENUM_STR,
295	MC_CMD_SENSOR_CONTROLLER_MASTER_INTERNAL_TEMP_ENUM_STR,
296	MC_CMD_SENSOR_CONTROLLER_MASTER_VPTAT_EXTADC_ENUM_STR,
297	MC_CMD_SENSOR_CONTROLLER_MASTER_INTERNAL_TEMP_EXTADC_ENUM_STR,
298	MC_CMD_SENSOR_CONTROLLER_SLAVE_VPTAT_ENUM_STR,
299	MC_CMD_SENSOR_CONTROLLER_SLAVE_INTERNAL_TEMP_ENUM_STR,
300	MC_CMD_SENSOR_CONTROLLER_SLAVE_VPTAT_EXTADC_ENUM_STR,
301	MC_CMD_SENSOR_CONTROLLER_SLAVE_INTERNAL_TEMP_EXTADC_ENUM_STR,
302	MC_CMD_SENSOR_SODIMM_VOUT_ENUM_STR,
303	MC_CMD_SENSOR_SODIMM_0_TEMP_ENUM_STR,
304	MC_CMD_SENSOR_SODIMM_1_TEMP_ENUM_STR,
305	MC_CMD_SENSOR_PHY0_VCC_ENUM_STR,
306	MC_CMD_SENSOR_PHY1_VCC_ENUM_STR,
307	MC_CMD_SENSOR_CONTROLLER_TDIODE_TEMP_ENUM_STR,
308	MC_CMD_SENSOR_BOARD_FRONT_TEMP_ENUM_STR,
309	MC_CMD_SENSOR_BOARD_BACK_TEMP_ENUM_STR,
310	MC_CMD_SENSOR_IN_I1V8_ENUM_STR,
311	MC_CMD_SENSOR_IN_I2V5_ENUM_STR,
312	MC_CMD_SENSOR_IN_I3V3_ENUM_STR,
313	MC_CMD_SENSOR_IN_I12V0_ENUM_STR,
314	MC_CMD_SENSOR_IN_1V3_ENUM_STR,
315	MC_CMD_SENSOR_IN_I1V3_ENUM_STR,
316};
317
318/* END MKCONFIG GENERATED MonitorStatDescriptionsBlock */
319
320					const char *
321efx_mon_stat_description(
322	__in				efx_nic_t *enp,
323	__in				efx_mon_stat_t id)
324{
325	_NOTE(ARGUNUSED(enp))
326	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
327
328	EFSYS_ASSERT3U(id, <, EFX_MON_NSTATS);
329	return (__mon_stat_description[id]);
330}
331
332#endif	/* EFSYS_OPT_NAMES */
333
334/* START MKCONFIG GENERATED MonitorMcdiMappingBlock 173eee0a5599996a */
335	__checkReturn			boolean_t
336efx_mon_mcdi_to_efx_stat(
337	__in				int mcdi_index,
338	__out				efx_mon_stat_t *statp)
339{
340
341	if ((mcdi_index % (MC_CMD_SENSOR_PAGE0_NEXT + 1)) ==
342	    MC_CMD_SENSOR_PAGE0_NEXT) {
343		*statp = EFX_MON_NSTATS;
344		return (B_FALSE);
345	}
346
347	switch (mcdi_index) {
348	case MC_CMD_SENSOR_IN_I0V9:
349		*statp = EFX_MON_STAT_IN_I0V9;
350		break;
351	case MC_CMD_SENSOR_CONTROLLER_SLAVE_VPTAT_EXTADC:
352		*statp = EFX_MON_STAT_CONTROLLER_SLAVE_VPTAT_EXTADC;
353		break;
354	case MC_CMD_SENSOR_CONTROLLER_SLAVE_VPTAT:
355		*statp = EFX_MON_STAT_CONTROLLER_SLAVE_VPTAT;
356		break;
357	case MC_CMD_SENSOR_PSU_TEMP:
358		*statp = EFX_MON_STAT_PSU_TEMP;
359		break;
360	case MC_CMD_SENSOR_FAN_2:
361		*statp = EFX_MON_STAT_FAN_2;
362		break;
363	case MC_CMD_SENSOR_CONTROLLER_INTERNAL_TEMP_EXTADC:
364		*statp = EFX_MON_STAT_CONTROLLER_INTERNAL_TEMP_EXTADC;
365		break;
366	case MC_CMD_SENSOR_BOARD_BACK_TEMP:
367		*statp = EFX_MON_STAT_BOARD_BACK_TEMP;
368		break;
369	case MC_CMD_SENSOR_IN_1V3:
370		*statp = EFX_MON_STAT_IN_1V3;
371		break;
372	case MC_CMD_SENSOR_CONTROLLER_TDIODE_TEMP:
373		*statp = EFX_MON_STAT_CONTROLLER_TDIODE_TEMP;
374		break;
375	case MC_CMD_SENSOR_IN_2V5:
376		*statp = EFX_MON_STAT_IN_2V5;
377		break;
378	case MC_CMD_SENSOR_PHY_COMMON_TEMP:
379		*statp = EFX_MON_STAT_PHY_COMMON_TEMP;
380		break;
381	case MC_CMD_SENSOR_PHY1_TEMP:
382		*statp = EFX_MON_STAT_PHY1_TEMP;
383		break;
384	case MC_CMD_SENSOR_VREG_INTERNAL_TEMP:
385		*statp = EFX_MON_STAT_VREG_INTERNAL_TEMP;
386		break;
387	case MC_CMD_SENSOR_IN_1V0:
388		*statp = EFX_MON_STAT_IN_1V0;
389		break;
390	case MC_CMD_SENSOR_FAN_1:
391		*statp = EFX_MON_STAT_FAN_1;
392		break;
393	case MC_CMD_SENSOR_IN_1V2:
394		*statp = EFX_MON_STAT_IN_1V2;
395		break;
396	case MC_CMD_SENSOR_FAN_3:
397		*statp = EFX_MON_STAT_FAN_3;
398		break;
399	case MC_CMD_SENSOR_IN_1V2A:
400		*statp = EFX_MON_STAT_IN_1V2A;
401		break;
402	case MC_CMD_SENSOR_SODIMM_0_TEMP:
403		*statp = EFX_MON_STAT_SODIMM_0_TEMP;
404		break;
405	case MC_CMD_SENSOR_IN_1V8:
406		*statp = EFX_MON_STAT_IN_1V8;
407		break;
408	case MC_CMD_SENSOR_IN_VREF:
409		*statp = EFX_MON_STAT_IN_VREF;
410		break;
411	case MC_CMD_SENSOR_SODIMM_VOUT:
412		*statp = EFX_MON_STAT_SODIMM_VOUT;
413		break;
414	case MC_CMD_SENSOR_CCOM_AVREG_1V2_SUPPLY:
415		*statp = EFX_MON_STAT_CCOM_AVREG_1V2_SUPPLY;
416		break;
417	case MC_CMD_SENSOR_IN_I1V2:
418		*statp = EFX_MON_STAT_IN_I1V2;
419		break;
420	case MC_CMD_SENSOR_IN_I1V3:
421		*statp = EFX_MON_STAT_IN_I1V3;
422		break;
423	case MC_CMD_SENSOR_AIRFLOW:
424		*statp = EFX_MON_STAT_AIRFLOW;
425		break;
426	case MC_CMD_SENSOR_HOTPOINT_TEMP:
427		*statp = EFX_MON_STAT_HOTPOINT_TEMP;
428		break;
429	case MC_CMD_SENSOR_VDD08D_VSS08D_CSR:
430		*statp = EFX_MON_STAT_VDD08D_VSS08D_CSR;
431		break;
432	case MC_CMD_SENSOR_AOE_TEMP:
433		*statp = EFX_MON_STAT_AOE_TEMP;
434		break;
435	case MC_CMD_SENSOR_IN_I1V8:
436		*statp = EFX_MON_STAT_IN_I1V8;
437		break;
438	case MC_CMD_SENSOR_IN_I2V5:
439		*statp = EFX_MON_STAT_IN_I2V5;
440		break;
441	case MC_CMD_SENSOR_PHY1_COOLING:
442		*statp = EFX_MON_STAT_PHY1_COOLING;
443		break;
444	case MC_CMD_SENSOR_CCOM_AVREG_1V8_SUPPLY_EXTADC:
445		*statp = EFX_MON_STAT_CCOM_AVREG_1V8_SUPPLY_EXTADC;
446		break;
447	case MC_CMD_SENSOR_IN_0V9_ADC:
448		*statp = EFX_MON_STAT_IN_0V9_ADC;
449		break;
450	case MC_CMD_SENSOR_VREG_0V9_A_TEMP:
451		*statp = EFX_MON_STAT_VREG_0V9_A_TEMP;
452		break;
453	case MC_CMD_SENSOR_CONTROLLER_MASTER_VPTAT:
454		*statp = EFX_MON_STAT_CONTROLLER_MASTER_VPTAT;
455		break;
456	case MC_CMD_SENSOR_PHY0_VCC:
457		*statp = EFX_MON_STAT_PHY0_VCC;
458		break;
459	case MC_CMD_SENSOR_PHY0_COOLING:
460		*statp = EFX_MON_STAT_PHY0_COOLING;
461		break;
462	case MC_CMD_SENSOR_PSU_AOE_TEMP:
463		*statp = EFX_MON_STAT_PSU_AOE_TEMP;
464		break;
465	case MC_CMD_SENSOR_VREG_0V9_TEMP:
466		*statp = EFX_MON_STAT_VREG_0V9_TEMP;
467		break;
468	case MC_CMD_SENSOR_IN_I0V9_A:
469		*statp = EFX_MON_STAT_IN_I0V9_A;
470		break;
471	case MC_CMD_SENSOR_IN_I3V3:
472		*statp = EFX_MON_STAT_IN_I3V3;
473		break;
474	case MC_CMD_SENSOR_BOARD_FRONT_TEMP:
475		*statp = EFX_MON_STAT_BOARD_FRONT_TEMP;
476		break;
477	case MC_CMD_SENSOR_OUT_VAOE:
478		*statp = EFX_MON_STAT_OUT_VAOE;
479		break;
480	case MC_CMD_SENSOR_VDD08D_VSS08D_CSR_EXTADC:
481		*statp = EFX_MON_STAT_VDD08D_VSS08D_CSR_EXTADC;
482		break;
483	case MC_CMD_SENSOR_IN_I12V0:
484		*statp = EFX_MON_STAT_IN_I12V0;
485		break;
486	case MC_CMD_SENSOR_PHY_POWER_PORT1:
487		*statp = EFX_MON_STAT_PHY_POWER_PORT1;
488		break;
489	case MC_CMD_SENSOR_PHY_POWER_PORT0:
490		*statp = EFX_MON_STAT_PHY_POWER_PORT0;
491		break;
492	case MC_CMD_SENSOR_CONTROLLER_SLAVE_INTERNAL_TEMP_EXTADC:
493		*statp = EFX_MON_STAT_CONTROLLER_SLAVE_INTERNAL_TEMP_EXTADC;
494		break;
495	case MC_CMD_SENSOR_CONTROLLER_MASTER_INTERNAL_TEMP:
496		*statp = EFX_MON_STAT_CONTROLLER_MASTER_INTERNAL_TEMP;
497		break;
498	case MC_CMD_SENSOR_CONTROLLER_TEMP:
499		*statp = EFX_MON_STAT_CONTROLLER_TEMP;
500		break;
501	case MC_CMD_SENSOR_IN_IAOE:
502		*statp = EFX_MON_STAT_IN_IAOE;
503		break;
504	case MC_CMD_SENSOR_IN_VAOE:
505		*statp = EFX_MON_STAT_IN_VAOE;
506		break;
507	case MC_CMD_SENSOR_CONTROLLER_MASTER_VPTAT_EXTADC:
508		*statp = EFX_MON_STAT_CONTROLLER_MASTER_VPTAT_EXTADC;
509		break;
510	case MC_CMD_SENSOR_CCOM_AVREG_1V8_SUPPLY:
511		*statp = EFX_MON_STAT_CCOM_AVREG_1V8_SUPPLY;
512		break;
513	case MC_CMD_SENSOR_PHY1_VCC:
514		*statp = EFX_MON_STAT_PHY1_VCC;
515		break;
516	case MC_CMD_SENSOR_CONTROLLER_COOLING:
517		*statp = EFX_MON_STAT_CONTROLLER_COOLING;
518		break;
519	case MC_CMD_SENSOR_AMBIENT_TEMP:
520		*statp = EFX_MON_STAT_AMBIENT_TEMP;
521		break;
522	case MC_CMD_SENSOR_IN_3V3:
523		*statp = EFX_MON_STAT_IN_3V3;
524		break;
525	case MC_CMD_SENSOR_PHY0_TEMP:
526		*statp = EFX_MON_STAT_PHY0_TEMP;
527		break;
528	case MC_CMD_SENSOR_SODIMM_1_TEMP:
529		*statp = EFX_MON_STAT_SODIMM_1_TEMP;
530		break;
531	case MC_CMD_SENSOR_MUM_VCC:
532		*statp = EFX_MON_STAT_MUM_VCC;
533		break;
534	case MC_CMD_SENSOR_VREG_0V9_B_TEMP:
535		*statp = EFX_MON_STAT_VREG_0V9_B_TEMP;
536		break;
537	case MC_CMD_SENSOR_CONTROLLER_SLAVE_INTERNAL_TEMP:
538		*statp = EFX_MON_STAT_CONTROLLER_SLAVE_INTERNAL_TEMP;
539		break;
540	case MC_CMD_SENSOR_FAN_4:
541		*statp = EFX_MON_STAT_FAN_4;
542		break;
543	case MC_CMD_SENSOR_CONTROLLER_2_TEMP:
544		*statp = EFX_MON_STAT_CONTROLLER_2_TEMP;
545		break;
546	case MC_CMD_SENSOR_CCOM_AVREG_1V2_SUPPLY_EXTADC:
547		*statp = EFX_MON_STAT_CCOM_AVREG_1V2_SUPPLY_EXTADC;
548		break;
549	case MC_CMD_SENSOR_IN_0V9_A:
550		*statp = EFX_MON_STAT_IN_0V9_A;
551		break;
552	case MC_CMD_SENSOR_CONTROLLER_VPTAT_EXTADC:
553		*statp = EFX_MON_STAT_CONTROLLER_VPTAT_EXTADC;
554		break;
555	case MC_CMD_SENSOR_IN_0V9:
556		*statp = EFX_MON_STAT_IN_0V9;
557		break;
558	case MC_CMD_SENSOR_IN_I0V9_B:
559		*statp = EFX_MON_STAT_IN_I0V9_B;
560		break;
561	case MC_CMD_SENSOR_NIC_POWER:
562		*statp = EFX_MON_STAT_NIC_POWER;
563		break;
564	case MC_CMD_SENSOR_IN_12V0:
565		*statp = EFX_MON_STAT_IN_12V0;
566		break;
567	case MC_CMD_SENSOR_OUT_IAOE:
568		*statp = EFX_MON_STAT_OUT_IAOE;
569		break;
570	case MC_CMD_SENSOR_CONTROLLER_VPTAT:
571		*statp = EFX_MON_STAT_CONTROLLER_VPTAT;
572		break;
573	case MC_CMD_SENSOR_CONTROLLER_MASTER_INTERNAL_TEMP_EXTADC:
574		*statp = EFX_MON_STAT_CONTROLLER_MASTER_INTERNAL_TEMP_EXTADC;
575		break;
576	case MC_CMD_SENSOR_CONTROLLER_INTERNAL_TEMP:
577		*statp = EFX_MON_STAT_CONTROLLER_INTERNAL_TEMP;
578		break;
579	case MC_CMD_SENSOR_FAN_0:
580		*statp = EFX_MON_STAT_FAN_0;
581		break;
582	case MC_CMD_SENSOR_VREG_1V2_TEMP:
583		*statp = EFX_MON_STAT_VREG_1V2_TEMP;
584		break;
585	case MC_CMD_SENSOR_IN_0V9_B:
586		*statp = EFX_MON_STAT_IN_0V9_B;
587		break;
588	default:
589		*statp = EFX_MON_NSTATS;
590		break;
591	};
592
593	if (*statp == EFX_MON_NSTATS)
594		goto fail1;
595
596	return (B_TRUE);
597
598fail1:
599	EFSYS_PROBE1(fail1, boolean_t, B_TRUE);
600	return (B_FALSE);
601};
602
603/* END MKCONFIG GENERATED MonitorMcdiMappingBlock */
604
605/* START MKCONFIG GENERATED MonitorStatisticUnitsBlock 2d447c656cc2d01d */
606	__checkReturn			boolean_t
607efx_mon_get_stat_unit(
608	__in				efx_mon_stat_t stat,
609	__out				efx_mon_stat_unit_t *unitp)
610{
611	switch (stat) {
612	case EFX_MON_STAT_IN_1V0:
613	case EFX_MON_STAT_IN_1V2:
614	case EFX_MON_STAT_IN_1V8:
615	case EFX_MON_STAT_IN_2V5:
616	case EFX_MON_STAT_IN_3V3:
617	case EFX_MON_STAT_IN_12V0:
618	case EFX_MON_STAT_IN_1V2A:
619	case EFX_MON_STAT_IN_VREF:
620	case EFX_MON_STAT_OUT_VAOE:
621	case EFX_MON_STAT_IN_VAOE:
622	case EFX_MON_STAT_IN_0V9:
623	case EFX_MON_STAT_IN_0V9_ADC:
624	case EFX_MON_STAT_CONTROLLER_VPTAT_EXTADC:
625	case EFX_MON_STAT_VDD08D_VSS08D_CSR:
626	case EFX_MON_STAT_VDD08D_VSS08D_CSR_EXTADC:
627	case EFX_MON_STAT_MUM_VCC:
628	case EFX_MON_STAT_IN_0V9_A:
629	case EFX_MON_STAT_IN_0V9_B:
630	case EFX_MON_STAT_CCOM_AVREG_1V2_SUPPLY:
631	case EFX_MON_STAT_CCOM_AVREG_1V2_SUPPLY_EXTADC:
632	case EFX_MON_STAT_CCOM_AVREG_1V8_SUPPLY:
633	case EFX_MON_STAT_CCOM_AVREG_1V8_SUPPLY_EXTADC:
634	case EFX_MON_STAT_CONTROLLER_MASTER_VPTAT:
635	case EFX_MON_STAT_CONTROLLER_MASTER_VPTAT_EXTADC:
636	case EFX_MON_STAT_CONTROLLER_SLAVE_VPTAT:
637	case EFX_MON_STAT_CONTROLLER_SLAVE_VPTAT_EXTADC:
638	case EFX_MON_STAT_SODIMM_VOUT:
639	case EFX_MON_STAT_PHY0_VCC:
640	case EFX_MON_STAT_PHY1_VCC:
641	case EFX_MON_STAT_IN_1V3:
642		*unitp = EFX_MON_STAT_UNIT_VOLTAGE_MV;
643		break;
644	case EFX_MON_STAT_CONTROLLER_TEMP:
645	case EFX_MON_STAT_PHY_COMMON_TEMP:
646	case EFX_MON_STAT_PHY0_TEMP:
647	case EFX_MON_STAT_PHY1_TEMP:
648	case EFX_MON_STAT_AOE_TEMP:
649	case EFX_MON_STAT_PSU_AOE_TEMP:
650	case EFX_MON_STAT_PSU_TEMP:
651	case EFX_MON_STAT_CONTROLLER_2_TEMP:
652	case EFX_MON_STAT_VREG_INTERNAL_TEMP:
653	case EFX_MON_STAT_VREG_0V9_TEMP:
654	case EFX_MON_STAT_VREG_1V2_TEMP:
655	case EFX_MON_STAT_CONTROLLER_VPTAT:
656	case EFX_MON_STAT_CONTROLLER_INTERNAL_TEMP:
657	case EFX_MON_STAT_CONTROLLER_INTERNAL_TEMP_EXTADC:
658	case EFX_MON_STAT_AMBIENT_TEMP:
659	case EFX_MON_STAT_HOTPOINT_TEMP:
660	case EFX_MON_STAT_VREG_0V9_A_TEMP:
661	case EFX_MON_STAT_VREG_0V9_B_TEMP:
662	case EFX_MON_STAT_CONTROLLER_MASTER_INTERNAL_TEMP:
663	case EFX_MON_STAT_CONTROLLER_MASTER_INTERNAL_TEMP_EXTADC:
664	case EFX_MON_STAT_CONTROLLER_SLAVE_INTERNAL_TEMP:
665	case EFX_MON_STAT_CONTROLLER_SLAVE_INTERNAL_TEMP_EXTADC:
666	case EFX_MON_STAT_SODIMM_0_TEMP:
667	case EFX_MON_STAT_SODIMM_1_TEMP:
668	case EFX_MON_STAT_CONTROLLER_TDIODE_TEMP:
669	case EFX_MON_STAT_BOARD_FRONT_TEMP:
670	case EFX_MON_STAT_BOARD_BACK_TEMP:
671		*unitp = EFX_MON_STAT_UNIT_TEMP_C;
672		break;
673	case EFX_MON_STAT_CONTROLLER_COOLING:
674	case EFX_MON_STAT_PHY0_COOLING:
675	case EFX_MON_STAT_PHY1_COOLING:
676	case EFX_MON_STAT_AIRFLOW:
677	case EFX_MON_STAT_PHY_POWER_PORT0:
678	case EFX_MON_STAT_PHY_POWER_PORT1:
679		*unitp = EFX_MON_STAT_UNIT_BOOL;
680		break;
681	case EFX_MON_STAT_NIC_POWER:
682		*unitp = EFX_MON_STAT_UNIT_POWER_W;
683		break;
684	case EFX_MON_STAT_OUT_IAOE:
685	case EFX_MON_STAT_IN_IAOE:
686	case EFX_MON_STAT_IN_I0V9:
687	case EFX_MON_STAT_IN_I1V2:
688	case EFX_MON_STAT_IN_I0V9_A:
689	case EFX_MON_STAT_IN_I0V9_B:
690	case EFX_MON_STAT_IN_I1V8:
691	case EFX_MON_STAT_IN_I2V5:
692	case EFX_MON_STAT_IN_I3V3:
693	case EFX_MON_STAT_IN_I12V0:
694	case EFX_MON_STAT_IN_I1V3:
695		*unitp = EFX_MON_STAT_UNIT_CURRENT_MA;
696		break;
697	case EFX_MON_STAT_FAN_0:
698	case EFX_MON_STAT_FAN_1:
699	case EFX_MON_STAT_FAN_2:
700	case EFX_MON_STAT_FAN_3:
701	case EFX_MON_STAT_FAN_4:
702		*unitp = EFX_MON_STAT_UNIT_RPM;
703		break;
704	default:
705		*unitp = EFX_MON_STAT_UNIT_UNKNOWN;
706		break;
707	};
708
709	if (*unitp == EFX_MON_STAT_UNIT_UNKNOWN)
710		goto fail1;
711
712	return (B_TRUE);
713
714fail1:
715	EFSYS_PROBE1(fail1, boolean_t, B_TRUE);
716	return (B_FALSE);
717};
718
719/* END MKCONFIG GENERATED MonitorStatisticUnitsBlock */
720
721/* START MKCONFIG GENERATED MonitorStatisticPortsBlock 1719b751d842534f */
722	__checkReturn			boolean_t
723efx_mon_get_stat_portmap(
724	__in				efx_mon_stat_t stat,
725	__out				efx_mon_stat_portmask_t *maskp)
726{
727
728	switch (stat) {
729	case EFX_MON_STAT_PHY1_TEMP:
730	case EFX_MON_STAT_PHY1_COOLING:
731	case EFX_MON_STAT_PHY_POWER_PORT1:
732		*maskp = EFX_MON_STAT_PORTMAP_PORT1;
733		break;
734	case EFX_MON_STAT_CONTROLLER_TEMP:
735	case EFX_MON_STAT_PHY_COMMON_TEMP:
736	case EFX_MON_STAT_CONTROLLER_COOLING:
737	case EFX_MON_STAT_IN_1V0:
738	case EFX_MON_STAT_IN_1V2:
739	case EFX_MON_STAT_IN_1V8:
740	case EFX_MON_STAT_IN_2V5:
741	case EFX_MON_STAT_IN_3V3:
742	case EFX_MON_STAT_IN_12V0:
743	case EFX_MON_STAT_IN_1V2A:
744	case EFX_MON_STAT_IN_VREF:
745	case EFX_MON_STAT_OUT_VAOE:
746	case EFX_MON_STAT_AOE_TEMP:
747	case EFX_MON_STAT_PSU_AOE_TEMP:
748	case EFX_MON_STAT_PSU_TEMP:
749	case EFX_MON_STAT_FAN_0:
750	case EFX_MON_STAT_FAN_1:
751	case EFX_MON_STAT_FAN_2:
752	case EFX_MON_STAT_FAN_3:
753	case EFX_MON_STAT_FAN_4:
754	case EFX_MON_STAT_IN_VAOE:
755	case EFX_MON_STAT_OUT_IAOE:
756	case EFX_MON_STAT_IN_IAOE:
757	case EFX_MON_STAT_NIC_POWER:
758	case EFX_MON_STAT_IN_0V9:
759	case EFX_MON_STAT_IN_I0V9:
760	case EFX_MON_STAT_IN_I1V2:
761	case EFX_MON_STAT_IN_0V9_ADC:
762	case EFX_MON_STAT_CONTROLLER_2_TEMP:
763	case EFX_MON_STAT_VREG_INTERNAL_TEMP:
764	case EFX_MON_STAT_VREG_0V9_TEMP:
765	case EFX_MON_STAT_VREG_1V2_TEMP:
766	case EFX_MON_STAT_CONTROLLER_VPTAT:
767	case EFX_MON_STAT_CONTROLLER_INTERNAL_TEMP:
768	case EFX_MON_STAT_CONTROLLER_VPTAT_EXTADC:
769	case EFX_MON_STAT_CONTROLLER_INTERNAL_TEMP_EXTADC:
770	case EFX_MON_STAT_AMBIENT_TEMP:
771	case EFX_MON_STAT_AIRFLOW:
772	case EFX_MON_STAT_VDD08D_VSS08D_CSR:
773	case EFX_MON_STAT_VDD08D_VSS08D_CSR_EXTADC:
774	case EFX_MON_STAT_HOTPOINT_TEMP:
775	case EFX_MON_STAT_MUM_VCC:
776	case EFX_MON_STAT_IN_0V9_A:
777	case EFX_MON_STAT_IN_I0V9_A:
778	case EFX_MON_STAT_VREG_0V9_A_TEMP:
779	case EFX_MON_STAT_IN_0V9_B:
780	case EFX_MON_STAT_IN_I0V9_B:
781	case EFX_MON_STAT_VREG_0V9_B_TEMP:
782	case EFX_MON_STAT_CCOM_AVREG_1V2_SUPPLY:
783	case EFX_MON_STAT_CCOM_AVREG_1V2_SUPPLY_EXTADC:
784	case EFX_MON_STAT_CCOM_AVREG_1V8_SUPPLY:
785	case EFX_MON_STAT_CCOM_AVREG_1V8_SUPPLY_EXTADC:
786	case EFX_MON_STAT_CONTROLLER_MASTER_VPTAT:
787	case EFX_MON_STAT_CONTROLLER_MASTER_INTERNAL_TEMP:
788	case EFX_MON_STAT_CONTROLLER_MASTER_VPTAT_EXTADC:
789	case EFX_MON_STAT_CONTROLLER_MASTER_INTERNAL_TEMP_EXTADC:
790	case EFX_MON_STAT_CONTROLLER_SLAVE_VPTAT:
791	case EFX_MON_STAT_CONTROLLER_SLAVE_INTERNAL_TEMP:
792	case EFX_MON_STAT_CONTROLLER_SLAVE_VPTAT_EXTADC:
793	case EFX_MON_STAT_CONTROLLER_SLAVE_INTERNAL_TEMP_EXTADC:
794	case EFX_MON_STAT_SODIMM_VOUT:
795	case EFX_MON_STAT_SODIMM_0_TEMP:
796	case EFX_MON_STAT_SODIMM_1_TEMP:
797	case EFX_MON_STAT_PHY0_VCC:
798	case EFX_MON_STAT_PHY1_VCC:
799	case EFX_MON_STAT_CONTROLLER_TDIODE_TEMP:
800	case EFX_MON_STAT_BOARD_FRONT_TEMP:
801	case EFX_MON_STAT_BOARD_BACK_TEMP:
802	case EFX_MON_STAT_IN_I1V8:
803	case EFX_MON_STAT_IN_I2V5:
804	case EFX_MON_STAT_IN_I3V3:
805	case EFX_MON_STAT_IN_I12V0:
806	case EFX_MON_STAT_IN_1V3:
807	case EFX_MON_STAT_IN_I1V3:
808		*maskp = EFX_MON_STAT_PORTMAP_ALL;
809		break;
810	case EFX_MON_STAT_PHY0_TEMP:
811	case EFX_MON_STAT_PHY0_COOLING:
812	case EFX_MON_STAT_PHY_POWER_PORT0:
813		*maskp = EFX_MON_STAT_PORTMAP_PORT0;
814		break;
815	default:
816		*maskp = EFX_MON_STAT_PORTMAP_UNKNOWN;
817		break;
818	};
819
820	if (*maskp == EFX_MON_STAT_PORTMAP_UNKNOWN)
821		goto fail1;
822
823	return (B_TRUE);
824
825fail1:
826	EFSYS_PROBE1(fail1, boolean_t, B_TRUE);
827	return (B_FALSE);
828};
829
830/* END MKCONFIG GENERATED MonitorStatisticPortsBlock */
831
832	__checkReturn			efx_rc_t
833efx_mon_stats_update(
834	__in				efx_nic_t *enp,
835	__in				efsys_mem_t *esmp,
836	__inout_ecount(EFX_MON_NSTATS)	efx_mon_stat_value_t *values)
837{
838	efx_mon_t *emp = &(enp->en_mon);
839	const efx_mon_ops_t *emop = emp->em_emop;
840
841	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
842	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
843
844	return (emop->emo_stats_update(enp, esmp, values));
845}
846
847	__checkReturn			efx_rc_t
848efx_mon_limits_update(
849	__in				efx_nic_t *enp,
850	__inout_ecount(EFX_MON_NSTATS)	efx_mon_stat_limits_t *values)
851{
852	efx_mon_t *emp = &(enp->en_mon);
853	const efx_mon_ops_t *emop = emp->em_emop;
854
855	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
856	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
857
858	return (emop->emo_limits_update(enp, values));
859}
860
861#endif	/* EFSYS_OPT_MON_STATS */
862
863		void
864efx_mon_fini(
865	__in	efx_nic_t *enp)
866{
867	efx_mon_t *emp = &(enp->en_mon);
868
869	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
870	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
871	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
872
873	emp->em_emop = NULL;
874
875	emp->em_type = EFX_MON_INVALID;
876
877	enp->en_mod_flags &= ~EFX_MOD_MON;
878}
879