Line data Source code
1 1 : /*
2 : * Copyright (c) 2020 Intel Corporation.
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief Public Platform Environment Control Interface driver APIs
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_DRIVERS_PECI_H_
13 : #define ZEPHYR_INCLUDE_DRIVERS_PECI_H_
14 :
15 : /**
16 : * @brief PECI Interface 3.0
17 : * @defgroup peci_interface PECI Interface
18 : * @since 2.1
19 : * @version 1.0.0
20 : * @ingroup io_interfaces
21 : * @{
22 : */
23 :
24 : #include <errno.h>
25 : #include <zephyr/types.h>
26 : #include <stddef.h>
27 : #include <zephyr/device.h>
28 :
29 : #ifdef __cplusplus
30 : extern "C" {
31 : #endif
32 :
33 : /**
34 : * @brief PECI error codes.
35 : */
36 0 : enum peci_error_code {
37 : PECI_GENERAL_SENSOR_ERROR = 0x8000,
38 : PECI_UNDERFLOW_SENSOR_ERROR = 0x8002,
39 : PECI_OVERFLOW_SENSOR_ERROR = 0x8003,
40 : };
41 :
42 : /**
43 : * @brief PECI commands.
44 : */
45 0 : enum peci_command_code {
46 : PECI_CMD_PING = 0x00,
47 : PECI_CMD_GET_TEMP0 = 0x01,
48 : PECI_CMD_GET_TEMP1 = 0x02,
49 : PECI_CMD_RD_PCI_CFG0 = 0x61,
50 : PECI_CMD_RD_PCI_CFG1 = 0x62,
51 : PECI_CMD_WR_PCI_CFG0 = 0x65,
52 : PECI_CMD_WR_PCI_CFG1 = 0x66,
53 : PECI_CMD_RD_PKG_CFG0 = 0xA1,
54 : PECI_CMD_RD_PKG_CFG1 = 0xA,
55 : PECI_CMD_WR_PKG_CFG0 = 0xA5,
56 : PECI_CMD_WR_PKG_CFG1 = 0xA6,
57 : PECI_CMD_RD_IAMSR0 = 0xB1,
58 : PECI_CMD_RD_IAMSR1 = 0xB2,
59 : PECI_CMD_WR_IAMSR0 = 0xB5,
60 : PECI_CMD_WR_IAMSR1 = 0xB6,
61 : PECI_CMD_RD_PCI_CFG_LOCAL0 = 0xE1,
62 : PECI_CMD_RD_PCI_CFG_LOCAL1 = 0xE2,
63 : PECI_CMD_WR_PCI_CFG_LOCAL0 = 0xE5,
64 : PECI_CMD_WR_PCI_CFG_LOCAL1 = 0xE6,
65 : PECI_CMD_GET_DIB = 0xF7,
66 : };
67 :
68 : /**
69 : * @name PECI read/write supported responses.
70 : * @{
71 : */
72 0 : #define PECI_CC_RSP_SUCCESS (0x40U)
73 0 : #define PECI_CC_RSP_TIMEOUT (0x80U)
74 0 : #define PECI_CC_OUT_OF_RESOURCES_TIMEOUT (0x81U)
75 0 : #define PECI_CC_RESOURCES_LOWPWR_TIMEOUT (0x82U)
76 0 : #define PECI_CC_ILLEGAL_REQUEST (0x90U)
77 : /** @} */
78 :
79 : /**
80 : * @name Ping command format.
81 : * @{
82 : */
83 0 : #define PECI_PING_WR_LEN (0U)
84 0 : #define PECI_PING_RD_LEN (0U)
85 0 : #define PECI_PING_LEN (3U)
86 : /** @} */
87 :
88 : /**
89 : * @name GetDIB command format.
90 : * @{
91 : */
92 0 : #define PECI_GET_DIB_WR_LEN (1U)
93 0 : #define PECI_GET_DIB_RD_LEN (8U)
94 0 : #define PECI_GET_DIB_CMD_LEN (4U)
95 0 : #define PECI_GET_DIB_DEVINFO (0U)
96 0 : #define PECI_GET_DIB_REVNUM (1U)
97 0 : #define PECI_GET_DIB_DOMAIN_BIT_MASK (0x4U)
98 0 : #define PECI_GET_DIB_MAJOR_REV_MASK 0xF0
99 0 : #define PECI_GET_DIB_MINOR_REV_MASK 0x0F
100 : /** @} */
101 :
102 : /**
103 : * @name GetTemp command format.
104 : * @{
105 : */
106 0 : #define PECI_GET_TEMP_WR_LEN (1U)
107 0 : #define PECI_GET_TEMP_RD_LEN (2U)
108 0 : #define PECI_GET_TEMP_CMD_LEN (4U)
109 0 : #define PECI_GET_TEMP_LSB (0U)
110 0 : #define PECI_GET_TEMP_MSB (1U)
111 0 : #define PECI_GET_TEMP_ERR_MSB (0x80U)
112 0 : #define PECI_GET_TEMP_ERR_LSB_GENERAL (0x0U)
113 0 : #define PECI_GET_TEMP_ERR_LSB_RES (0x1U)
114 0 : #define PECI_GET_TEMP_ERR_LSB_TEMP_LO (0x2U)
115 0 : #define PECI_GET_TEMP_ERR_LSB_TEMP_HI (0x3U)
116 : /** @} */
117 :
118 : /**
119 : * @name RdPkgConfig command format.
120 : * @{
121 : */
122 0 : #define PECI_RD_PKG_WR_LEN (5U)
123 0 : #define PECI_RD_PKG_LEN_BYTE (2U)
124 0 : #define PECI_RD_PKG_LEN_WORD (3U)
125 0 : #define PECI_RD_PKG_LEN_DWORD (5U)
126 0 : #define PECI_RD_PKG_CMD_LEN (8U)
127 : /** @} */
128 :
129 : /**
130 : * @name WrPkgConfig command format.
131 : * @{
132 : */
133 0 : #define PECI_WR_PKG_RD_LEN (1U)
134 0 : #define PECI_WR_PKG_LEN_BYTE (7U)
135 0 : #define PECI_WR_PKG_LEN_WORD (8U)
136 0 : #define PECI_WR_PKG_LEN_DWORD (10U)
137 0 : #define PECI_WR_PKG_CMD_LEN (9U)
138 : /** @} */
139 :
140 : /**
141 : * @name RdIAMSR command format.
142 : * @{
143 : */
144 0 : #define PECI_RD_IAMSR_WR_LEN (5U)
145 0 : #define PECI_RD_IAMSR_LEN_BYTE (2U)
146 0 : #define PECI_RD_IAMSR_LEN_WORD (3U)
147 0 : #define PECI_RD_IAMSR_LEN_DWORD (5U)
148 0 : #define PECI_RD_IAMSR_LEN_QWORD (9U)
149 0 : #define PECI_RD_IAMSR_CMD_LEN (8U)
150 : /** @} */
151 :
152 : /**
153 : * @name WrIAMSR command format.
154 : * @{
155 : */
156 0 : #define PECI_WR_IAMSR_RD_LEN (1U)
157 0 : #define PECI_WR_IAMSR_LEN_BYTE (7U)
158 0 : #define PECI_WR_IAMSR_LEN_WORD (8U)
159 0 : #define PECI_WR_IAMSR_LEN_DWORD (10U)
160 0 : #define PECI_WR_IAMSR_LEN_QWORD (14U)
161 0 : #define PECI_WR_IAMSR_CMD_LEN (9U)
162 : /** @} */
163 :
164 : /**
165 : * @name RdPCIConfig command format.
166 : * @{
167 : */
168 0 : #define PECI_RD_PCICFG_WR_LEN (6U)
169 0 : #define PECI_RD_PCICFG_LEN_BYTE (2U)
170 0 : #define PECI_RD_PCICFG_LEN_WORD (3U)
171 0 : #define PECI_RD_PCICFG_LEN_DWORD (5U)
172 0 : #define PECI_RD_PCICFG_CMD_LEN (9U)
173 : /** @} */
174 :
175 : /**
176 : * @name WrPCIConfig command format.
177 : * @{
178 : */
179 0 : #define PECI_WR_PCICFG_RD_LEN (1U)
180 0 : #define PECI_WR_PCICFG_LEN_BYTE (8U)
181 0 : #define PECI_WR_PCICFG_LEN_WORD (9U)
182 0 : #define PECI_WR_PCICFG_LEN_DWORD (11U)
183 0 : #define PECI_WR_PCICFG_CMD_LEN (10U)
184 : /** @} */
185 :
186 : /**
187 : * @name RdPCIConfigLocal command format.
188 : * @{
189 : */
190 0 : #define PECI_RD_PCICFGL_WR_LEN (5U)
191 0 : #define PECI_RD_PCICFGL_RD_LEN_BYTE (2U)
192 0 : #define PECI_RD_PCICFGL_RD_LEN_WORD (3U)
193 0 : #define PECI_RD_PCICFGL_RD_LEN_DWORD (5U)
194 0 : #define PECI_RD_PCICFGL_CMD_LEN (8U)
195 : /** @} */
196 :
197 : /**
198 : * @name WrPCIConfigLocal command format.
199 : * @{
200 : */
201 0 : #define PECI_WR_PCICFGL_RD_LEN (1U)
202 0 : #define PECI_WR_PCICFGL_WR_LEN_BYTE (7U)
203 0 : #define PECI_WR_PCICFGL_WR_LEN_WORD (8U)
204 0 : #define PECI_WR_PCICFGL_WR_LEN_DWORD (10U)
205 0 : #define PECI_WR_PCICFGL_CMD_LEN (9U)
206 : /** @} */
207 :
208 : /**
209 : * @brief PECI buffer structure
210 : */
211 1 : struct peci_buf {
212 : /**
213 : * Valid pointer on a data buffer, or NULL otherwise.
214 : */
215 1 : uint8_t *buf;
216 : /**
217 : * Length of the data buffer expected to be received without considering
218 : * the frame check sequence byte.
219 : *
220 : * @note Frame check sequence byte is added into rx buffer: need to allocate
221 : * an additional byte for this in rx buffer.
222 : */
223 1 : size_t len;
224 : };
225 :
226 : /**
227 : * @brief PECI transaction packet format.
228 : */
229 1 : struct peci_msg {
230 : /** Client address */
231 1 : uint8_t addr;
232 : /** Command code */
233 1 : enum peci_command_code cmd_code;
234 : /** Pointer to buffer of write data */
235 1 : struct peci_buf tx_buffer;
236 : /** Pointer to buffer of read data */
237 1 : struct peci_buf rx_buffer;
238 : /** PECI msg flags */
239 1 : uint8_t flags;
240 : };
241 :
242 : /**
243 : * @cond INTERNAL_HIDDEN
244 : *
245 : * PECI driver API definition and system call entry points
246 : *
247 : * (Internal use only.)
248 : */
249 : typedef int (*peci_config_t)(const struct device *dev, uint32_t bitrate);
250 : typedef int (*peci_transfer_t)(const struct device *dev, struct peci_msg *msg);
251 : typedef int (*peci_disable_t)(const struct device *dev);
252 : typedef int (*peci_enable_t)(const struct device *dev);
253 :
254 : __subsystem struct peci_driver_api {
255 : peci_config_t config;
256 : peci_disable_t disable;
257 : peci_enable_t enable;
258 : peci_transfer_t transfer;
259 : };
260 :
261 : /**
262 : * @endcond
263 : */
264 :
265 : /**
266 : * @brief Configures the PECI interface.
267 : *
268 : * @param dev Pointer to the device structure for the driver instance.
269 : * @param bitrate the selected bitrate expressed in Kbps.
270 : *
271 : * @retval 0 If successful.
272 : * @retval Negative errno code if failure.
273 : */
274 1 : __syscall int peci_config(const struct device *dev, uint32_t bitrate);
275 :
276 : static inline int z_impl_peci_config(const struct device *dev,
277 : uint32_t bitrate)
278 : {
279 : struct peci_driver_api *api;
280 :
281 : api = (struct peci_driver_api *)dev->api;
282 : return api->config(dev, bitrate);
283 : }
284 :
285 : /**
286 : * @brief Enable PECI interface.
287 : *
288 : * @param dev Pointer to the device structure for the driver instance.
289 : *
290 : * @retval 0 If successful.
291 : * @retval Negative errno code if failure.
292 : */
293 1 : __syscall int peci_enable(const struct device *dev);
294 :
295 : static inline int z_impl_peci_enable(const struct device *dev)
296 : {
297 : struct peci_driver_api *api;
298 :
299 : api = (struct peci_driver_api *)dev->api;
300 : return api->enable(dev);
301 : }
302 :
303 : /**
304 : * @brief Disable PECI interface.
305 : *
306 : * @param dev Pointer to the device structure for the driver instance.
307 : *
308 : * @retval 0 If successful.
309 : * @retval Negative errno code if failure.
310 : */
311 1 : __syscall int peci_disable(const struct device *dev);
312 :
313 : static inline int z_impl_peci_disable(const struct device *dev)
314 : {
315 : struct peci_driver_api *api;
316 :
317 : api = (struct peci_driver_api *)dev->api;
318 : return api->disable(dev);
319 : }
320 :
321 : /**
322 : * @brief Performs a PECI transaction.
323 : *
324 : * @param dev Pointer to the device structure for the driver instance.
325 : * @param msg Structure representing a PECI transaction.
326 : *
327 : * @retval 0 If successful.
328 : * @retval Negative errno code if failure.
329 : */
330 :
331 1 : __syscall int peci_transfer(const struct device *dev, struct peci_msg *msg);
332 :
333 : static inline int z_impl_peci_transfer(const struct device *dev,
334 : struct peci_msg *msg)
335 : {
336 : struct peci_driver_api *api;
337 :
338 : api = (struct peci_driver_api *)dev->api;
339 : return api->transfer(dev, msg);
340 : }
341 :
342 :
343 : #ifdef __cplusplus
344 : }
345 : #endif
346 :
347 : /**
348 : * @}
349 : */
350 :
351 : #include <zephyr/syscalls/peci.h>
352 :
353 : #endif /* ZEPHYR_INCLUDE_DRIVERS_PECI_H_ */
|