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