1 | // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) |
2 | /* Copyright (C) 2017 Netronome Systems, Inc. */ |
3 | |
4 | #include <linux/kernel.h> |
5 | #include <linux/slab.h> |
6 | |
7 | #include "nfp.h" |
8 | #include "nfp_nsp.h" |
9 | |
10 | struct 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 | |
23 | struct 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(state: nsp) < 15) |
30 | return NULL; |
31 | |
32 | ni = kzalloc(size: sizeof(*ni), GFP_KERNEL); |
33 | if (!ni) |
34 | return NULL; |
35 | |
36 | ret = nfp_nsp_read_identify(state: nsp, buf: ni, size: 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(size: 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 | |
58 | exit_free: |
59 | kfree(objp: ni); |
60 | return nspi; |
61 | } |
62 | |
63 | struct nfp_sensors { |
64 | __le32 chip_temp; |
65 | __le32 assembly_power; |
66 | __le32 assembly_12v_power; |
67 | __le32 assembly_3v3_power; |
68 | }; |
69 | |
70 | int 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(ptr: nsp)) |
79 | return PTR_ERR(ptr: nsp); |
80 | |
81 | ret = nfp_nsp_read_sensors(state: nsp, BIT(id), buf: &s, size: sizeof(s)); |
82 | nfp_nsp_close(state: 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 | |