LCOV - code coverage report
Current view: top level - zephyr/drivers/i3c - ibi.h Coverage Total Hit
Test: new.info Lines: 76.9 % 26 20
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            0 : /*
       2              :  * Copyright 2022 Intel Corporation
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : #ifndef ZEPHYR_INCLUDE_DRIVERS_I3C_IBI_H_
       8              : #define ZEPHYR_INCLUDE_DRIVERS_I3C_IBI_H_
       9              : 
      10              : /**
      11              :  * @brief I3C In-Band Interrupts
      12              :  * @defgroup i3c_ibi I3C In-Band Interrupts
      13              :  * @ingroup i3c_interface
      14              :  * @{
      15              :  */
      16              : 
      17              : #include <stdint.h>
      18              : 
      19              : #include <zephyr/device.h>
      20              : #include <zephyr/kernel.h>
      21              : #include <zephyr/sys/slist.h>
      22              : 
      23              : #ifndef CONFIG_I3C_IBI_MAX_PAYLOAD_SIZE
      24            0 : #define CONFIG_I3C_IBI_MAX_PAYLOAD_SIZE 0
      25              : #endif
      26              : 
      27              : #ifdef __cplusplus
      28              : extern "C" {
      29              : #endif
      30              : 
      31              : struct i3c_device_desc;
      32              : 
      33              : /**
      34              :  * @brief IBI Types.
      35              :  */
      36            0 : enum i3c_ibi_type {
      37              :         /** Target interrupt */
      38              :         I3C_IBI_TARGET_INTR,
      39              : 
      40              :         /** Controller Role Request */
      41              :         I3C_IBI_CONTROLLER_ROLE_REQUEST,
      42              : 
      43              :         /** Hot Join Request */
      44              :         I3C_IBI_HOTJOIN,
      45              : 
      46              :         I3C_IBI_TYPE_MAX = I3C_IBI_HOTJOIN,
      47              : 
      48              :         /**
      49              :          * Not an actual IBI type, but simply used by
      50              :          * the IBI workq for generic callbacks.
      51              :          */
      52              :         I3C_IBI_WORKQUEUE_CB,
      53              : };
      54              : 
      55              : /**
      56              :  * @brief Struct for IBI request.
      57              :  */
      58            1 : struct i3c_ibi {
      59              :         /** Type of IBI. */
      60            1 :         enum i3c_ibi_type       ibi_type;
      61              : 
      62              :         /** Pointer to payload of IBI. */
      63            1 :         uint8_t                 *payload;
      64              : 
      65              :         /** Length in bytes of the IBI payload. */
      66            1 :         uint8_t                 payload_len;
      67              : };
      68              : 
      69              : /**
      70              :  * @brief Structure of payload buffer for IBI.
      71              :  *
      72              :  * This is used for the IBI callback.
      73              :  */
      74            1 : struct i3c_ibi_payload {
      75              :         /**
      76              :          * Length of available data in the payload buffer.
      77              :          */
      78            1 :         uint8_t payload_len;
      79              : 
      80              :         /**
      81              :          * Pointer to byte array as payload buffer.
      82              :          */
      83            1 :         uint8_t payload[CONFIG_I3C_IBI_MAX_PAYLOAD_SIZE];
      84              : };
      85              : 
      86              : /**
      87              :  * @brief Node about a queued IBI.
      88              :  */
      89            1 : struct i3c_ibi_work {
      90            0 :         sys_snode_t node;
      91              : 
      92              :         /**
      93              :          * k_work struct.
      94              :          */
      95            1 :         struct k_work work;
      96              : 
      97              :         /**
      98              :          * IBI type.
      99              :          */
     100            1 :         enum i3c_ibi_type type;
     101              : 
     102              :         union {
     103              :                 /**
     104              :                  * Use for @see I3C_IBI_HOTJOIN.
     105              :                  */
     106            1 :                 const struct device *controller;
     107              : 
     108              :                 /**
     109              :                  * Use for @see I3C_IBI_TARGET_INTR,
     110              :                  * and @see I3C_IBI_CONTROLLER_ROLE_REQUEST.
     111              :                  */
     112            1 :                 struct i3c_device_desc *target;
     113            0 :         };
     114              : 
     115              :         union {
     116              :                 /**
     117              :                  * IBI payload.
     118              :                  */
     119            1 :                 struct i3c_ibi_payload payload;
     120              : 
     121              :                 /**
     122              :                  * Generic workqueue callback when
     123              :                  * type is I3C_IBI_WORKQUEUE_CB.
     124              :                  */
     125            1 :                 k_work_handler_t work_cb;
     126            0 :         };
     127              : };
     128              : 
     129              : /**
     130              :  * @brief Function called when In-Band Interrupt received from target device.
     131              :  *
     132              :  * This function is invoked by the controller when the controller
     133              :  * receives an In-Band Interrupt from the target device.
     134              :  *
     135              :  * A success return shall cause the controller to ACK the next byte
     136              :  * received.  An error return shall cause the controller to NACK the
     137              :  * next byte received.
     138              :  *
     139              :  * @param target the device description structure associated with the
     140              :  *               device to which the operation is addressed.
     141              :  * @param payload Payload associated with the IBI. NULL if there is
     142              :  *                no payload.
     143              :  *
     144              :  * @return 0 if the IBI is accepted, or a negative error code.
     145              :  */
     146            1 : typedef int (*i3c_target_ibi_cb_t)(struct i3c_device_desc *target,
     147              :                                    struct i3c_ibi_payload *payload);
     148              : 
     149              : 
     150              : /**
     151              :  * @brief Queue an IBI work item for future processing.
     152              :  *
     153              :  * This queues up an IBI work item in the IBI workqueue
     154              :  * for future processing.
     155              :  *
     156              :  * Note that this will copy the @p ibi_work struct into
     157              :  * internal structure. If there is not enough space to
     158              :  * copy the @p ibi_work struct, this returns -ENOMEM.
     159              :  *
     160              :  * @param ibi_work Pointer to the IBI work item struct.
     161              :  *
     162              :  * @retval 0 If work item is successfully queued.
     163              :  * @retval -ENOMEM If no more free internal node to
     164              :  *                 store IBI work item.
     165              :  * @retval Others @see k_work_submit_to_queue
     166              :  */
     167            1 : int i3c_ibi_work_enqueue(struct i3c_ibi_work *ibi_work);
     168              : 
     169              : /**
     170              :  * @brief Queue a target interrupt IBI for future processing.
     171              :  *
     172              :  * This queues up a target interrupt IBI in the IBI workqueue
     173              :  * for future processing.
     174              :  *
     175              :  * @param target Pointer to target device descriptor.
     176              :  * @param payload Pointer to IBI payload byte array.
     177              :  * @param payload_len Length of payload byte array.
     178              :  *
     179              :  * @retval 0 If work item is successfully queued.
     180              :  * @retval -ENOMEM If no more free internal node to
     181              :  *                 store IBI work item.
     182              :  * @retval Others @see k_work_submit_to_queue
     183              :  */
     184            1 : int i3c_ibi_work_enqueue_target_irq(struct i3c_device_desc *target,
     185              :                                     uint8_t *payload, size_t payload_len);
     186              : 
     187              : /**
     188              :  * @brief Queue a controllership request IBI for future processing.
     189              :  *
     190              :  * This queues up a controllership request IBI in the IBI workqueue
     191              :  * for future processing.
     192              :  *
     193              :  * @param target Pointer to target device descriptor.
     194              :  *
     195              :  * @retval 0 If work item is successfully queued.
     196              :  * @retval -ENOMEM If no more free internal node to
     197              :  *                 store IBI work item.
     198              :  * @retval Others @see k_work_submit_to_queue
     199              :  */
     200            1 : int i3c_ibi_work_enqueue_controller_request(struct i3c_device_desc *target);
     201              : 
     202              : /**
     203              :  * @brief Queue a hot join IBI for future processing.
     204              :  *
     205              :  * This queues up a hot join IBI in the IBI workqueue
     206              :  * for future processing.
     207              :  *
     208              :  * @param dev Pointer to controller device driver instance.
     209              :  *
     210              :  * @retval 0 If work item is successfully queued.
     211              :  * @retval -ENOMEM If no more free internal node to
     212              :  *                 store IBI work item.
     213              :  * @retval Others @see k_work_submit_to_queue
     214              :  */
     215            1 : int i3c_ibi_work_enqueue_hotjoin(const struct device *dev);
     216              : 
     217              : /**
     218              :  * @brief Queue a generic callback for future processing.
     219              :  *
     220              :  * This queues up a generic callback in the IBI workqueue
     221              :  * for future processing.
     222              :  *
     223              :  * @param dev Pointer to controller device driver instance.
     224              :  * @param work_cb Callback function.
     225              :  *
     226              :  * @retval 0 If work item is successfully queued.
     227              :  * @retval -ENOMEM If no more free internal node to
     228              :  *                 store IBI work item.
     229              :  * @retval Others @see k_work_submit_to_queue
     230              :  */
     231            1 : int i3c_ibi_work_enqueue_cb(const struct device *dev,
     232              :                             k_work_handler_t work_cb);
     233              : 
     234              : #ifdef __cplusplus
     235              : }
     236              : #endif
     237              : 
     238              : /**
     239              :  * @}
     240              :  */
     241              : 
     242              : #endif /* ZEPHYR_INCLUDE_DRIVERS_I3C_IBI_H_ */
        

Generated by: LCOV version 2.0-1