LCOV - code coverage report
Current view: top level - zephyr/drivers - peci.h Hit Total Coverage
Test: new.info Lines: 14 84 16.7 %
Date: 2024-12-22 00:14:23

          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_ */

Generated by: LCOV version 1.14