1
2
3
4#include <linux/kernel.h>
5#include <linux/slab.h>
6
7#include "nfp.h"
8#include "nfp_nsp.h"
9
10struct nsp_identify {
11 u8 version[40];
12 u8 flags;
13 u8 br_primary;
14 u8 br_secondary;
15 u8 br_nsp;
16 __le16 primary;
17 __le16 secondary;
18 __le16 nsp;
19 u8 reserved[6];
20 __le64 sensor_mask;
21};
22
23struct nfp_nsp_identify *__nfp_nsp_identify(struct nfp_nsp *nsp)
24{
25 struct nfp_nsp_identify *nspi = NULL;
26 struct nsp_identify *ni;
27 int ret;
28
29 if (nfp_nsp_get_abi_ver_minor(nsp) < 15)
30 return NULL;
31
32 ni = kzalloc(sizeof(*ni), GFP_KERNEL);
33 if (!ni)
34 return NULL;
35
36 ret = nfp_nsp_read_identify(nsp, ni, sizeof(*ni));
37 if (ret < 0) {
38 nfp_err(nfp_nsp_cpp(nsp), "reading bsp version failed %d\n",
39 ret);
40 goto exit_free;
41 }
42
43 nspi = kzalloc(sizeof(*nspi), GFP_KERNEL);
44 if (!nspi)
45 goto exit_free;
46
47 memcpy(nspi->version, ni->version, sizeof(nspi->version));
48 nspi->version[sizeof(nspi->version) - 1] = '\0';
49 nspi->flags = ni->flags;
50 nspi->br_primary = ni->br_primary;
51 nspi->br_secondary = ni->br_secondary;
52 nspi->br_nsp = ni->br_nsp;
53 nspi->primary = le16_to_cpu(ni->primary);
54 nspi->secondary = le16_to_cpu(ni->secondary);
55 nspi->nsp = le16_to_cpu(ni->nsp);
56 nspi->sensor_mask = le64_to_cpu(ni->sensor_mask);
57
58exit_free:
59 kfree(ni);
60 return nspi;
61}
62
63struct nfp_sensors {
64 __le32 chip_temp;
65 __le32 assembly_power;
66 __le32 assembly_12v_power;
67 __le32 assembly_3v3_power;
68};
69
70int nfp_hwmon_read_sensor(struct nfp_cpp *cpp, enum nfp_nsp_sensor_id id,
71 long *val)
72{
73 struct nfp_sensors s;
74 struct nfp_nsp *nsp;
75 int ret;
76
77 nsp = nfp_nsp_open(cpp);
78 if (IS_ERR(nsp))
79 return PTR_ERR(nsp);
80
81 ret = nfp_nsp_read_sensors(nsp, BIT(id), &s, sizeof(s));
82 nfp_nsp_close(nsp);
83
84 if (ret < 0)
85 return ret;
86
87 switch (id) {
88 case NFP_SENSOR_CHIP_TEMPERATURE:
89 *val = le32_to_cpu(s.chip_temp);
90 break;
91 case NFP_SENSOR_ASSEMBLY_POWER:
92 *val = le32_to_cpu(s.assembly_power);
93 break;
94 case NFP_SENSOR_ASSEMBLY_12V_POWER:
95 *val = le32_to_cpu(s.assembly_12v_power);
96 break;
97 case NFP_SENSOR_ASSEMBLY_3V3_POWER:
98 *val = le32_to_cpu(s.assembly_3v3_power);
99 break;
100 default:
101 return -EINVAL;
102 }
103 return 0;
104}
105