xref: /freebsd/sys/dev/sfxge/common/efx_mon.c (revision f634dfda)
1e948693eSPhilip Paeps /*-
23c838a9fSAndrew Rybchenko  * Copyright (c) 2007-2015 Solarflare Communications Inc.
33c838a9fSAndrew Rybchenko  * All rights reserved.
4e948693eSPhilip Paeps  *
5e948693eSPhilip Paeps  * Redistribution and use in source and binary forms, with or without
63c838a9fSAndrew Rybchenko  * modification, are permitted provided that the following conditions are met:
7e948693eSPhilip Paeps  *
83c838a9fSAndrew Rybchenko  * 1. Redistributions of source code must retain the above copyright notice,
93c838a9fSAndrew Rybchenko  *    this list of conditions and the following disclaimer.
103c838a9fSAndrew Rybchenko  * 2. Redistributions in binary form must reproduce the above copyright notice,
113c838a9fSAndrew Rybchenko  *    this list of conditions and the following disclaimer in the documentation
123c838a9fSAndrew Rybchenko  *    and/or other materials provided with the distribution.
133c838a9fSAndrew Rybchenko  *
143c838a9fSAndrew Rybchenko  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
153c838a9fSAndrew Rybchenko  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
163c838a9fSAndrew Rybchenko  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
173c838a9fSAndrew Rybchenko  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
183c838a9fSAndrew Rybchenko  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
193c838a9fSAndrew Rybchenko  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
203c838a9fSAndrew Rybchenko  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
213c838a9fSAndrew Rybchenko  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
223c838a9fSAndrew Rybchenko  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
233c838a9fSAndrew Rybchenko  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
243c838a9fSAndrew Rybchenko  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
253c838a9fSAndrew Rybchenko  *
263c838a9fSAndrew Rybchenko  * The views and conclusions contained in the software and documentation are
273c838a9fSAndrew Rybchenko  * those of the authors and should not be interpreted as representing official
283c838a9fSAndrew Rybchenko  * policies, either expressed or implied, of the FreeBSD Project.
29e948693eSPhilip Paeps  */
30e948693eSPhilip Paeps 
315dee87d7SPhilip Paeps #include <sys/cdefs.h>
325dee87d7SPhilip Paeps __FBSDID("$FreeBSD$");
335dee87d7SPhilip Paeps 
34e948693eSPhilip Paeps #include "efx.h"
35e948693eSPhilip Paeps #include "efx_impl.h"
36e948693eSPhilip Paeps 
373c838a9fSAndrew Rybchenko #if EFSYS_OPT_MON_MCDI
383c838a9fSAndrew Rybchenko #include "mcdi_mon.h"
393c838a9fSAndrew Rybchenko #endif
403c838a9fSAndrew Rybchenko 
41e948693eSPhilip Paeps #if EFSYS_OPT_NAMES
42e948693eSPhilip Paeps 
433c838a9fSAndrew Rybchenko static const char	*__efx_mon_name[] = {
44e948693eSPhilip Paeps 	"",
45e948693eSPhilip Paeps 	"nullmon",
46e948693eSPhilip Paeps 	"lm87",
47e948693eSPhilip Paeps 	"max6647",
483c838a9fSAndrew Rybchenko 	"sfx90x0",
493c838a9fSAndrew Rybchenko 	"sfx91x0"
50b13ad4deSAndrew Rybchenko 	"sfx92x0"
51e948693eSPhilip Paeps };
52e948693eSPhilip Paeps 
533c838a9fSAndrew Rybchenko 		const char *
54e948693eSPhilip Paeps efx_mon_name(
55e948693eSPhilip Paeps 	__in	efx_nic_t *enp)
56e948693eSPhilip Paeps {
57e948693eSPhilip Paeps 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
58e948693eSPhilip Paeps 
59e948693eSPhilip Paeps 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
60e948693eSPhilip Paeps 
61e948693eSPhilip Paeps 	EFSYS_ASSERT(encp->enc_mon_type != EFX_MON_INVALID);
62e948693eSPhilip Paeps 	EFSYS_ASSERT3U(encp->enc_mon_type, <, EFX_MON_NTYPES);
63e948693eSPhilip Paeps 	return (__efx_mon_name[encp->enc_mon_type]);
64e948693eSPhilip Paeps }
65e948693eSPhilip Paeps 
66e948693eSPhilip Paeps #endif	/* EFSYS_OPT_NAMES */
67e948693eSPhilip Paeps 
683c838a9fSAndrew Rybchenko #if EFSYS_OPT_MON_MCDI
693c838a9fSAndrew Rybchenko static efx_mon_ops_t	__efx_mon_mcdi_ops = {
703c838a9fSAndrew Rybchenko 	NULL,				/* emo_reset */
713c838a9fSAndrew Rybchenko 	NULL,				/* emo_reconfigure */
72e948693eSPhilip Paeps #if EFSYS_OPT_MON_STATS
733c838a9fSAndrew Rybchenko 	mcdi_mon_stats_update		/* emo_stats_update */
74e948693eSPhilip Paeps #endif	/* EFSYS_OPT_MON_STATS */
75e948693eSPhilip Paeps };
76e948693eSPhilip Paeps #endif
77e948693eSPhilip Paeps 
78e948693eSPhilip Paeps 
79460cb568SAndrew Rybchenko 	__checkReturn	efx_rc_t
80e948693eSPhilip Paeps efx_mon_init(
81e948693eSPhilip Paeps 	__in		efx_nic_t *enp)
82e948693eSPhilip Paeps {
83e948693eSPhilip Paeps 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
84e948693eSPhilip Paeps 	efx_mon_t *emp = &(enp->en_mon);
85e948693eSPhilip Paeps 	efx_mon_ops_t *emop;
86460cb568SAndrew Rybchenko 	efx_rc_t rc;
87e948693eSPhilip Paeps 
88e948693eSPhilip Paeps 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
89e948693eSPhilip Paeps 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
90e948693eSPhilip Paeps 
91e948693eSPhilip Paeps 	if (enp->en_mod_flags & EFX_MOD_MON) {
92e948693eSPhilip Paeps 		rc = EINVAL;
93e948693eSPhilip Paeps 		goto fail1;
94e948693eSPhilip Paeps 	}
95e948693eSPhilip Paeps 
96e948693eSPhilip Paeps 	enp->en_mod_flags |= EFX_MOD_MON;
97e948693eSPhilip Paeps 
98e948693eSPhilip Paeps 	emp->em_type = encp->enc_mon_type;
99e948693eSPhilip Paeps 
100e948693eSPhilip Paeps 	EFSYS_ASSERT(encp->enc_mon_type != EFX_MON_INVALID);
101b13ad4deSAndrew Rybchenko 	switch (emp->em_type) {
102b13ad4deSAndrew Rybchenko #if EFSYS_OPT_MON_MCDI
103b13ad4deSAndrew Rybchenko 	case EFX_MON_SFC90X0:
104b13ad4deSAndrew Rybchenko 	case EFX_MON_SFC91X0:
105b13ad4deSAndrew Rybchenko 	case EFX_MON_SFC92X0:
106b13ad4deSAndrew Rybchenko 		emop = &__efx_mon_mcdi_ops;
107b13ad4deSAndrew Rybchenko 		break;
108b13ad4deSAndrew Rybchenko #endif
109b13ad4deSAndrew Rybchenko 	default:
110e948693eSPhilip Paeps 		rc = ENOTSUP;
111e948693eSPhilip Paeps 		goto fail2;
112e948693eSPhilip Paeps 	}
113e948693eSPhilip Paeps 
1143c838a9fSAndrew Rybchenko 	if (emop->emo_reset != NULL) {
115e948693eSPhilip Paeps 		if ((rc = emop->emo_reset(enp)) != 0)
116e948693eSPhilip Paeps 			goto fail3;
1173c838a9fSAndrew Rybchenko 	}
118e948693eSPhilip Paeps 
1193c838a9fSAndrew Rybchenko 	if (emop->emo_reconfigure != NULL) {
120e948693eSPhilip Paeps 		if ((rc = emop->emo_reconfigure(enp)) != 0)
121e948693eSPhilip Paeps 			goto fail4;
1223c838a9fSAndrew Rybchenko 	}
123e948693eSPhilip Paeps 
124e948693eSPhilip Paeps 	emp->em_emop = emop;
125e948693eSPhilip Paeps 	return (0);
126e948693eSPhilip Paeps 
127e948693eSPhilip Paeps fail4:
128e948693eSPhilip Paeps 	EFSYS_PROBE(fail5);
129e948693eSPhilip Paeps 
1303c838a9fSAndrew Rybchenko 	if (emop->emo_reset != NULL)
131e948693eSPhilip Paeps 		(void) emop->emo_reset(enp);
132e948693eSPhilip Paeps 
133e948693eSPhilip Paeps fail3:
134e948693eSPhilip Paeps 	EFSYS_PROBE(fail4);
135e948693eSPhilip Paeps fail2:
136e948693eSPhilip Paeps 	EFSYS_PROBE(fail3);
137e948693eSPhilip Paeps 
138e948693eSPhilip Paeps 	emp->em_type = EFX_MON_INVALID;
139e948693eSPhilip Paeps 
140e948693eSPhilip Paeps 	enp->en_mod_flags &= ~EFX_MOD_MON;
141e948693eSPhilip Paeps 
142e948693eSPhilip Paeps fail1:
143460cb568SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
144e948693eSPhilip Paeps 
145e948693eSPhilip Paeps 	return (rc);
146e948693eSPhilip Paeps }
147e948693eSPhilip Paeps 
148e948693eSPhilip Paeps #if EFSYS_OPT_MON_STATS
149e948693eSPhilip Paeps 
150e948693eSPhilip Paeps #if EFSYS_OPT_NAMES
151e948693eSPhilip Paeps 
152f634dfdaSAndrew Rybchenko /* START MKCONFIG GENERATED MonitorStatNamesBlock 31f437eafb0b0437 */
1533c838a9fSAndrew Rybchenko static const char 	*__mon_stat_name[] = {
154e948693eSPhilip Paeps 	"value_2_5v",
155e948693eSPhilip Paeps 	"value_vccp1",
156e948693eSPhilip Paeps 	"value_vcc",
157e948693eSPhilip Paeps 	"value_5v",
158e948693eSPhilip Paeps 	"value_12v",
159e948693eSPhilip Paeps 	"value_vccp2",
160e948693eSPhilip Paeps 	"value_ext_temp",
161e948693eSPhilip Paeps 	"value_int_temp",
162e948693eSPhilip Paeps 	"value_ain1",
163e948693eSPhilip Paeps 	"value_ain2",
164e948693eSPhilip Paeps 	"controller_cooling",
165e948693eSPhilip Paeps 	"ext_cooling",
166e948693eSPhilip Paeps 	"1v",
167e948693eSPhilip Paeps 	"1_2v",
168e948693eSPhilip Paeps 	"1_8v",
169e948693eSPhilip Paeps 	"3_3v",
1709bdc809cSAndrew Rybchenko 	"1_2va",
1719bdc809cSAndrew Rybchenko 	"vref",
1729bdc809cSAndrew Rybchenko 	"vaoe",
1739bdc809cSAndrew Rybchenko 	"aoe_temperature",
1749bdc809cSAndrew Rybchenko 	"psu_aoe_temperature",
1759bdc809cSAndrew Rybchenko 	"psu_temperature",
1769bdc809cSAndrew Rybchenko 	"fan0",
1779bdc809cSAndrew Rybchenko 	"fan1",
1789bdc809cSAndrew Rybchenko 	"fan2",
1799bdc809cSAndrew Rybchenko 	"fan3",
1809bdc809cSAndrew Rybchenko 	"fan4",
1819bdc809cSAndrew Rybchenko 	"vaoe_in",
1829bdc809cSAndrew Rybchenko 	"iaoe",
1839bdc809cSAndrew Rybchenko 	"iaoe_in",
1843c838a9fSAndrew Rybchenko 	"nic_power",
1853c838a9fSAndrew Rybchenko 	"0_9v",
1863c838a9fSAndrew Rybchenko 	"i0_9v",
1873c838a9fSAndrew Rybchenko 	"i1_2v",
1883c838a9fSAndrew Rybchenko 	"0_9v_adc",
1893c838a9fSAndrew Rybchenko 	"controller_temperature2",
1903c838a9fSAndrew Rybchenko 	"vreg_temperature",
1913c838a9fSAndrew Rybchenko 	"vreg_0_9v_temperature",
1923c838a9fSAndrew Rybchenko 	"vreg_1_2v_temperature",
1933c838a9fSAndrew Rybchenko 	"int_vptat",
1943c838a9fSAndrew Rybchenko 	"controller_internal_adc_temperature",
1953c838a9fSAndrew Rybchenko 	"ext_vptat",
1963c838a9fSAndrew Rybchenko 	"controller_external_adc_temperature",
1973c838a9fSAndrew Rybchenko 	"ambient_temperature",
1983c838a9fSAndrew Rybchenko 	"airflow",
1993c838a9fSAndrew Rybchenko 	"vdd08d_vss08d_csr",
2003c838a9fSAndrew Rybchenko 	"vdd08d_vss08d_csr_extadc",
2013c838a9fSAndrew Rybchenko 	"hotpoint_temperature",
2023c838a9fSAndrew Rybchenko 	"phy_power_switch_port0",
2033c838a9fSAndrew Rybchenko 	"phy_power_switch_port1",
2043c838a9fSAndrew Rybchenko 	"mum_vcc",
2053c838a9fSAndrew Rybchenko 	"0v9_a",
2063c838a9fSAndrew Rybchenko 	"i0v9_a",
2073c838a9fSAndrew Rybchenko 	"0v9_a_temp",
2083c838a9fSAndrew Rybchenko 	"0v9_b",
2093c838a9fSAndrew Rybchenko 	"i0v9_b",
2103c838a9fSAndrew Rybchenko 	"0v9_b_temp",
2113c838a9fSAndrew Rybchenko 	"ccom_avreg_1v2_supply",
2123c838a9fSAndrew Rybchenko 	"ccom_avreg_1v2_supply_ext_adc",
2133c838a9fSAndrew Rybchenko 	"ccom_avreg_1v8_supply",
2143c838a9fSAndrew Rybchenko 	"ccom_avreg_1v8_supply_ext_adc",
2153c838a9fSAndrew Rybchenko 	"controller_master_vptat",
2163c838a9fSAndrew Rybchenko 	"controller_master_internal_temp",
2173c838a9fSAndrew Rybchenko 	"controller_master_vptat_ext_adc",
2183c838a9fSAndrew Rybchenko 	"controller_master_internal_temp_ext_adc",
2193c838a9fSAndrew Rybchenko 	"controller_slave_vptat",
2203c838a9fSAndrew Rybchenko 	"controller_slave_internal_temp",
2213c838a9fSAndrew Rybchenko 	"controller_slave_vptat_ext_adc",
2223c838a9fSAndrew Rybchenko 	"controller_slave_internal_temp_ext_adc",
223435c2014SAndrew Rybchenko 	"sodimm_vout",
224435c2014SAndrew Rybchenko 	"sodimm_0_temp",
225435c2014SAndrew Rybchenko 	"sodimm_1_temp",
226435c2014SAndrew Rybchenko 	"phy0_vcc",
227435c2014SAndrew Rybchenko 	"phy1_vcc",
228435c2014SAndrew Rybchenko 	"controller_tdiode_temp",
229f634dfdaSAndrew Rybchenko 	"board_front_temp",
230f634dfdaSAndrew Rybchenko 	"board_back_temp",
231e948693eSPhilip Paeps };
232e948693eSPhilip Paeps 
233e948693eSPhilip Paeps /* END MKCONFIG GENERATED MonitorStatNamesBlock */
234e948693eSPhilip Paeps 
2353c838a9fSAndrew Rybchenko extern					const char *
236e948693eSPhilip Paeps efx_mon_stat_name(
237e948693eSPhilip Paeps 	__in				efx_nic_t *enp,
238e948693eSPhilip Paeps 	__in				efx_mon_stat_t id)
239e948693eSPhilip Paeps {
240e948693eSPhilip Paeps 	_NOTE(ARGUNUSED(enp))
241e948693eSPhilip Paeps 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
242e948693eSPhilip Paeps 
243e948693eSPhilip Paeps 	EFSYS_ASSERT3U(id, <, EFX_MON_NSTATS);
244e948693eSPhilip Paeps 	return (__mon_stat_name[id]);
245e948693eSPhilip Paeps }
246e948693eSPhilip Paeps 
247e948693eSPhilip Paeps #endif	/* EFSYS_OPT_NAMES */
248e948693eSPhilip Paeps 
249460cb568SAndrew Rybchenko 	__checkReturn			efx_rc_t
250e948693eSPhilip Paeps efx_mon_stats_update(
251e948693eSPhilip Paeps 	__in				efx_nic_t *enp,
252e948693eSPhilip Paeps 	__in				efsys_mem_t *esmp,
253536c03c2SAndrew Rybchenko 	__inout_ecount(EFX_MON_NSTATS)	efx_mon_stat_value_t *values)
254e948693eSPhilip Paeps {
255e948693eSPhilip Paeps 	efx_mon_t *emp = &(enp->en_mon);
256e948693eSPhilip Paeps 	efx_mon_ops_t *emop = emp->em_emop;
257e948693eSPhilip Paeps 
258e948693eSPhilip Paeps 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
259e948693eSPhilip Paeps 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
260e948693eSPhilip Paeps 
261e948693eSPhilip Paeps 	return (emop->emo_stats_update(enp, esmp, values));
262e948693eSPhilip Paeps }
263e948693eSPhilip Paeps 
264e948693eSPhilip Paeps #endif	/* EFSYS_OPT_MON_STATS */
265e948693eSPhilip Paeps 
266e948693eSPhilip Paeps 		void
267e948693eSPhilip Paeps efx_mon_fini(
268e948693eSPhilip Paeps 	__in	efx_nic_t *enp)
269e948693eSPhilip Paeps {
270e948693eSPhilip Paeps 	efx_mon_t *emp = &(enp->en_mon);
271e948693eSPhilip Paeps 	efx_mon_ops_t *emop = emp->em_emop;
272460cb568SAndrew Rybchenko 	efx_rc_t rc;
273e948693eSPhilip Paeps 
274e948693eSPhilip Paeps 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
275e948693eSPhilip Paeps 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
276e948693eSPhilip Paeps 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
277e948693eSPhilip Paeps 
278e948693eSPhilip Paeps 	emp->em_emop = NULL;
279e948693eSPhilip Paeps 
2803c838a9fSAndrew Rybchenko 	if (emop->emo_reset != NULL) {
281e948693eSPhilip Paeps 		rc = emop->emo_reset(enp);
282e948693eSPhilip Paeps 		if (rc != 0)
283460cb568SAndrew Rybchenko 			EFSYS_PROBE1(fail1, efx_rc_t, rc);
2843c838a9fSAndrew Rybchenko 	}
285e948693eSPhilip Paeps 
286e948693eSPhilip Paeps 	emp->em_type = EFX_MON_INVALID;
287e948693eSPhilip Paeps 
288e948693eSPhilip Paeps 	enp->en_mod_flags &= ~EFX_MOD_MON;
289e948693eSPhilip Paeps }
290