New upstream version 18.08
[deb_dpdk.git] / drivers / net / sfc / base / efx_mon.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright (c) 2007-2018 Solarflare Communications Inc.
4  * All rights reserved.
5  */
6
7 #include "efx.h"
8 #include "efx_impl.h"
9
10 #if EFSYS_OPT_MON_MCDI
11 #include "mcdi_mon.h"
12 #endif
13
14 #if EFSYS_OPT_NAMES
15
16 static const char * const __efx_mon_name[] = {
17         "",
18         "sfx90x0",
19         "sfx91x0",
20         "sfx92x0"
21 };
22
23                 const char *
24 efx_mon_name(
25         __in    efx_nic_t *enp)
26 {
27         efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
28
29         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
30
31         EFSYS_ASSERT(encp->enc_mon_type != EFX_MON_INVALID);
32         EFSYS_ASSERT3U(encp->enc_mon_type, <, EFX_MON_NTYPES);
33         return (__efx_mon_name[encp->enc_mon_type]);
34 }
35
36 #endif  /* EFSYS_OPT_NAMES */
37
38 #if EFSYS_OPT_MON_MCDI
39 static const efx_mon_ops_t      __efx_mon_mcdi_ops = {
40 #if EFSYS_OPT_MON_STATS
41         mcdi_mon_stats_update           /* emo_stats_update */
42 #endif  /* EFSYS_OPT_MON_STATS */
43 };
44 #endif
45
46
47         __checkReturn   efx_rc_t
48 efx_mon_init(
49         __in            efx_nic_t *enp)
50 {
51         efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
52         efx_mon_t *emp = &(enp->en_mon);
53         const efx_mon_ops_t *emop;
54         efx_rc_t rc;
55
56         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
57         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
58
59         if (enp->en_mod_flags & EFX_MOD_MON) {
60                 rc = EINVAL;
61                 goto fail1;
62         }
63
64         enp->en_mod_flags |= EFX_MOD_MON;
65
66         emp->em_type = encp->enc_mon_type;
67
68         EFSYS_ASSERT(encp->enc_mon_type != EFX_MON_INVALID);
69         switch (emp->em_type) {
70 #if EFSYS_OPT_MON_MCDI
71         case EFX_MON_SFC90X0:
72         case EFX_MON_SFC91X0:
73         case EFX_MON_SFC92X0:
74                 emop = &__efx_mon_mcdi_ops;
75                 break;
76 #endif
77         default:
78                 rc = ENOTSUP;
79                 goto fail2;
80         }
81
82         emp->em_emop = emop;
83         return (0);
84
85 fail2:
86         EFSYS_PROBE(fail2);
87
88         emp->em_type = EFX_MON_INVALID;
89
90         enp->en_mod_flags &= ~EFX_MOD_MON;
91
92 fail1:
93         EFSYS_PROBE1(fail1, efx_rc_t, rc);
94
95         return (rc);
96 }
97
98 #if EFSYS_OPT_MON_STATS
99
100 #if EFSYS_OPT_NAMES
101
102 /* START MKCONFIG GENERATED MonitorStatNamesBlock 8150a068198c0f96 */
103 static const char * const __mon_stat_name[] = {
104         "value_2_5v",
105         "value_vccp1",
106         "value_vcc",
107         "value_5v",
108         "value_12v",
109         "value_vccp2",
110         "value_ext_temp",
111         "value_int_temp",
112         "value_ain1",
113         "value_ain2",
114         "controller_cooling",
115         "ext_cooling",
116         "1v",
117         "1_2v",
118         "1_8v",
119         "3_3v",
120         "1_2va",
121         "vref",
122         "vaoe",
123         "aoe_temperature",
124         "psu_aoe_temperature",
125         "psu_temperature",
126         "fan0",
127         "fan1",
128         "fan2",
129         "fan3",
130         "fan4",
131         "vaoe_in",
132         "iaoe",
133         "iaoe_in",
134         "nic_power",
135         "0_9v",
136         "i0_9v",
137         "i1_2v",
138         "0_9v_adc",
139         "controller_temperature2",
140         "vreg_temperature",
141         "vreg_0_9v_temperature",
142         "vreg_1_2v_temperature",
143         "int_vptat",
144         "controller_internal_adc_temperature",
145         "ext_vptat",
146         "controller_external_adc_temperature",
147         "ambient_temperature",
148         "airflow",
149         "vdd08d_vss08d_csr",
150         "vdd08d_vss08d_csr_extadc",
151         "hotpoint_temperature",
152         "phy_power_switch_port0",
153         "phy_power_switch_port1",
154         "mum_vcc",
155         "0v9_a",
156         "i0v9_a",
157         "0v9_a_temp",
158         "0v9_b",
159         "i0v9_b",
160         "0v9_b_temp",
161         "ccom_avreg_1v2_supply",
162         "ccom_avreg_1v2_supply_ext_adc",
163         "ccom_avreg_1v8_supply",
164         "ccom_avreg_1v8_supply_ext_adc",
165         "controller_master_vptat",
166         "controller_master_internal_temp",
167         "controller_master_vptat_ext_adc",
168         "controller_master_internal_temp_ext_adc",
169         "controller_slave_vptat",
170         "controller_slave_internal_temp",
171         "controller_slave_vptat_ext_adc",
172         "controller_slave_internal_temp_ext_adc",
173         "sodimm_vout",
174         "sodimm_0_temp",
175         "sodimm_1_temp",
176         "phy0_vcc",
177         "phy1_vcc",
178         "controller_tdiode_temp",
179         "board_front_temp",
180         "board_back_temp",
181         "i1v8",
182         "i2v5",
183         "i3v3",
184         "i12v0",
185         "1v3",
186         "i1v3",
187 };
188
189 /* END MKCONFIG GENERATED MonitorStatNamesBlock */
190
191 extern                                  const char *
192 efx_mon_stat_name(
193         __in                            efx_nic_t *enp,
194         __in                            efx_mon_stat_t id)
195 {
196         _NOTE(ARGUNUSED(enp))
197         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
198
199         EFSYS_ASSERT3U(id, <, EFX_MON_NSTATS);
200         return (__mon_stat_name[id]);
201 }
202
203 #endif  /* EFSYS_OPT_NAMES */
204
205         __checkReturn                   efx_rc_t
206 efx_mon_stats_update(
207         __in                            efx_nic_t *enp,
208         __in                            efsys_mem_t *esmp,
209         __inout_ecount(EFX_MON_NSTATS)  efx_mon_stat_value_t *values)
210 {
211         efx_mon_t *emp = &(enp->en_mon);
212         const efx_mon_ops_t *emop = emp->em_emop;
213
214         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
215         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
216
217         return (emop->emo_stats_update(enp, esmp, values));
218 }
219
220 #endif  /* EFSYS_OPT_MON_STATS */
221
222                 void
223 efx_mon_fini(
224         __in    efx_nic_t *enp)
225 {
226         efx_mon_t *emp = &(enp->en_mon);
227
228         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
229         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
230         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
231
232         emp->em_emop = NULL;
233
234         emp->em_type = EFX_MON_INVALID;
235
236         enp->en_mod_flags &= ~EFX_MOD_MON;
237 }