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

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2021 Antmicro <www.antmicro.com>
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : #ifndef ZEPHYR_INCLUDE_DRIVERS_FPGA_H_
       8             : #define ZEPHYR_INCLUDE_DRIVERS_FPGA_H_
       9             : 
      10             : #include <errno.h>
      11             : 
      12             : #include <zephyr/types.h>
      13             : #include <zephyr/sys/util.h>
      14             : #include <zephyr/device.h>
      15             : 
      16             : #ifdef __cplusplus
      17             : extern "C" {
      18             : #endif
      19             : 
      20           0 : enum FPGA_status {
      21             :         /* Inactive is when the FPGA cannot accept the bitstream
      22             :          * and will not be programmed correctly
      23             :          */
      24             :         FPGA_STATUS_INACTIVE,
      25             :         /* Active is when the FPGA can accept the bitstream and
      26             :          * can be programmed correctly
      27             :          */
      28             :         FPGA_STATUS_ACTIVE
      29             : };
      30             : 
      31             : typedef enum FPGA_status (*fpga_api_get_status)(const struct device *dev);
      32           0 : typedef int (*fpga_api_load)(const struct device *dev, uint32_t *image_ptr,
      33             :                              uint32_t img_size);
      34           0 : typedef int (*fpga_api_reset)(const struct device *dev);
      35           0 : typedef int (*fpga_api_on)(const struct device *dev);
      36           0 : typedef int (*fpga_api_off)(const struct device *dev);
      37           0 : typedef const char *(*fpga_api_get_info)(const struct device *dev);
      38             : 
      39           0 : __subsystem struct fpga_driver_api {
      40           0 :         fpga_api_get_status get_status;
      41           0 :         fpga_api_reset reset;
      42           0 :         fpga_api_load load;
      43           0 :         fpga_api_on on;
      44           0 :         fpga_api_off off;
      45           0 :         fpga_api_get_info get_info;
      46             : };
      47             : 
      48             : /**
      49             :  * @brief Read the status of FPGA.
      50             :  *
      51             :  * @param dev FPGA device structure.
      52             :  *
      53             :  * @retval 0 if the FPGA is in INACTIVE state.
      54             :  * @retval 1 if the FPGA is in ACTIVE state.
      55             :  */
      56           1 : static inline enum FPGA_status fpga_get_status(const struct device *dev)
      57             : {
      58             :         const struct fpga_driver_api *api =
      59             :                 (const struct fpga_driver_api *)dev->api;
      60             : 
      61             :         if (api->get_status == NULL) {
      62             :                 /* assume it can never be reprogrammed if it
      63             :                  * doesn't support the get_status callback
      64             :                  */
      65             :                 return FPGA_STATUS_INACTIVE;
      66             :         }
      67             : 
      68             :         return api->get_status(dev);
      69             : }
      70             : 
      71             : /**
      72             :  * @brief Reset the FPGA.
      73             :  *
      74             :  * @param dev FPGA device structure.
      75             :  *
      76             :  * @retval 0 if successful.
      77             :  * @retval Failed Otherwise.
      78             :  */
      79           1 : static inline int fpga_reset(const struct device *dev)
      80             : {
      81             :         const struct fpga_driver_api *api =
      82             :                 (const struct fpga_driver_api *)dev->api;
      83             : 
      84             :         if (api->reset == NULL) {
      85             :                 return -ENOTSUP;
      86             :         }
      87             : 
      88             :         return api->reset(dev);
      89             : }
      90             : 
      91             : /**
      92             :  * @brief Load the bitstream and program the FPGA
      93             :  *
      94             :  * @param dev FPGA device structure.
      95             :  * @param image_ptr Pointer to bitstream.
      96             :  * @param img_size Bitstream size in bytes.
      97             :  *
      98             :  * @retval 0 if successful.
      99             :  * @retval Failed Otherwise.
     100             :  */
     101           1 : static inline int fpga_load(const struct device *dev, uint32_t *image_ptr,
     102             :                             uint32_t img_size)
     103             : {
     104             :         const struct fpga_driver_api *api =
     105             :                 (const struct fpga_driver_api *)dev->api;
     106             : 
     107             :         if (api->load == NULL) {
     108             :                 return -ENOTSUP;
     109             :         }
     110             : 
     111             :         return api->load(dev, image_ptr, img_size);
     112             : }
     113             : 
     114             : /**
     115             :  * @brief Turns on the FPGA.
     116             :  *
     117             :  * @param dev FPGA device structure.
     118             :  *
     119             :  * @retval 0 if successful.
     120             :  * @retval negative errno code on failure.
     121             :  */
     122           1 : static inline int fpga_on(const struct device *dev)
     123             : {
     124             :         const struct fpga_driver_api *api =
     125             :                 (const struct fpga_driver_api *)dev->api;
     126             : 
     127             :         if (api->on == NULL) {
     128             :                 return -ENOTSUP;
     129             :         }
     130             : 
     131             :         return api->on(dev);
     132             : }
     133             : 
     134           0 : #define FPGA_GET_INFO_DEFAULT "n/a"
     135             : 
     136             : /**
     137             :  * @brief Returns information about the FPGA.
     138             :  *
     139             :  * @param dev FPGA device structure.
     140             :  *
     141             :  * @return String containing information.
     142             :  */
     143           1 : static inline const char *fpga_get_info(const struct device *dev)
     144             : {
     145             :         const struct fpga_driver_api *api =
     146             :                 (const struct fpga_driver_api *)dev->api;
     147             : 
     148             :         if (api->get_info == NULL) {
     149             :                 return FPGA_GET_INFO_DEFAULT;
     150             :         }
     151             : 
     152             :         return api->get_info(dev);
     153             : }
     154             : 
     155             : /**
     156             :  * @brief Turns off the FPGA.
     157             :  *
     158             :  * @param dev FPGA device structure.
     159             :  *
     160             :  * @retval 0 if successful.
     161             :  * @retval negative errno code on failure.
     162             :  */
     163           1 : static inline int fpga_off(const struct device *dev)
     164             : {
     165             :         const struct fpga_driver_api *api =
     166             :                 (const struct fpga_driver_api *)dev->api;
     167             : 
     168             :         if (api->off == NULL) {
     169             :                 return -ENOTSUP;
     170             :         }
     171             : 
     172             :         return api->off(dev);
     173             : }
     174             : 
     175             : #ifdef __cplusplus
     176             : }
     177             : #endif
     178             : 
     179             : #endif /* ZEPHYR_INCLUDE_DRIVERS_FPGA_H_ */

Generated by: LCOV version 1.14