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

          Line data    Source code
       1           1 : /*
       2             :  * Copyright 2020 Google LLC
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : #ifndef ZEPHYR_INCLUDE_DRIVERS_ESPI_SPI_EMUL_H_
       8             : #define ZEPHYR_INCLUDE_DRIVERS_ESPI_SPI_EMUL_H_
       9             : 
      10             : #include <zephyr/device.h>
      11             : #include <zephyr/drivers/emul.h>
      12             : #include <zephyr/drivers/espi.h>
      13             : #include <zephyr/sys/slist.h>
      14             : #include <zephyr/types.h>
      15             : 
      16             : /**
      17             :  * @file
      18             :  *
      19             :  * @brief Public APIs for the eSPI emulation drivers.
      20             :  */
      21             : 
      22             : /**
      23             :  * @brief eSPI Emulation Interface
      24             :  * @defgroup espi_emul_interface eSPI Emulation Interface
      25             :  * @ingroup io_emulators
      26             :  * @{
      27             :  */
      28             : 
      29             : #ifdef __cplusplus
      30             : extern "C" {
      31             : #endif
      32             : 
      33           0 : #define EMUL_ESPI_HOST_CHIPSEL 0
      34             : 
      35             : struct espi_emul;
      36             : 
      37             : /**
      38             :  * Passes eSPI virtual wires set request (virtual wire packet) to the emulator.
      39             :  * The emulator updates the state (level) of its virtual wire.
      40             :  *
      41             :  * @param target The device Emulator instance
      42             :  * @param vw The signal to be set.
      43             :  * @param level The level of signal requested LOW(0) or HIGH(1).
      44             :  *
      45             :  * @retval 0 If successful.
      46             :  * @retval -EIO General input / output error.
      47             :  */
      48           1 : typedef int (*emul_espi_api_set_vw)(const struct emul *target, enum espi_vwire_signal vw,
      49             :                                     uint8_t level);
      50             : 
      51             : /**
      52             :  * Passes eSPI virtual wires get request (virtual wire packet) to the emulator.
      53             :  * The emulator returns the state (level) of its virtual wire.
      54             :  *
      55             :  * @param target The device Emulator instance
      56             :  * @param vw The signal to be get.
      57             :  * @param level The level of the signal to be get.
      58             :  *
      59             :  * @retval 0 If successful.
      60             :  * @retval -EIO General input / output error.
      61             :  */
      62           1 : typedef int (*emul_espi_api_get_vw)(const struct emul *target, enum espi_vwire_signal vw,
      63             :                                     uint8_t *level);
      64             : 
      65             : #ifdef CONFIG_ESPI_PERIPHERAL_ACPI_SHM_REGION
      66             : /**
      67             :  * Get the ACPI shared memory address owned by the emulator.
      68             :  *
      69             :  * @param target The device Emulator instance
      70             :  *
      71             :  * @retval The address of the memory.
      72             :  */
      73             : typedef uintptr_t (*emul_espi_api_get_acpi_shm)(const struct emul *target);
      74             : #endif
      75             : 
      76             : /**
      77             :  * Find an emulator present on a eSPI bus
      78             :  *
      79             :  * At present the function is used only to find an emulator of the host
      80             :  * device. It may be useful in systems with the SPI flash chips.
      81             :  *
      82             :  * @param dev eSPI emulation controller device
      83             :  * @param chipsel Chip-select value
      84             :  * @return espi_emul to use
      85             :  * @return NULL if not found
      86             :  */
      87             : typedef struct espi_emul *(*emul_find_emul)(const struct device *dev, unsigned int chipsel);
      88             : 
      89             : /**
      90             :  * Triggers an event on the emulator of eSPI controller side which causes
      91             :  * calling specific callbacks.
      92             :  *
      93             :  * @param dev Device instance of emulated eSPI controller
      94             :  * @param evt Event to be triggered
      95             :  *
      96             :  * @retval 0 If successful.
      97             :  * @retval -EIO General input / output error.
      98             :  */
      99           1 : typedef int (*emul_trigger_event)(const struct device *dev, struct espi_event *evt);
     100             : 
     101             : /** Definition of the eSPI device emulator API */
     102           1 : struct emul_espi_device_api {
     103           0 :         emul_espi_api_set_vw set_vw;
     104           0 :         emul_espi_api_get_vw get_vw;
     105             : #ifdef CONFIG_ESPI_PERIPHERAL_ACPI_SHM_REGION
     106             :         emul_espi_api_get_acpi_shm get_acpi_shm;
     107             : #endif
     108             : };
     109             : 
     110             : /** Node in a linked list of emulators for eSPI devices */
     111           1 : struct espi_emul {
     112           0 :         sys_snode_t node;
     113             :         /** Target emulator - REQUIRED for all emulated bus nodes of any type */
     114           1 :         const struct emul *target;
     115             :         /** API provided for this device */
     116           1 :         const struct emul_espi_device_api *api;
     117             :         /** eSPI chip-select of the emulated device */
     118           1 :         uint16_t chipsel;
     119             : };
     120             : 
     121             : /** Definition of the eSPI controller emulator API */
     122           1 : struct emul_espi_driver_api {
     123             :         /* The struct espi_driver_api has to be first in
     124             :          * struct emul_espi_driver_api to make pointer casting working
     125             :          */
     126           0 :         struct espi_driver_api espi_api;
     127             :         /* The rest, emulator specific functions */
     128           0 :         emul_trigger_event trigger_event;
     129           0 :         emul_find_emul find_emul;
     130             : };
     131             : 
     132             : /**
     133             :  * Register an emulated device on the controller
     134             :  *
     135             :  * @param dev Device that will use the emulator
     136             :  * @param emul eSPI emulator to use
     137             :  * @return 0 indicating success (always)
     138             :  */
     139           1 : int espi_emul_register(const struct device *dev, struct espi_emul *emul);
     140             : 
     141             : /**
     142             :  * Sets the eSPI virtual wire on the host side, which will
     143             :  * trigger a proper event(and callbacks) on the emulated eSPI controller
     144             :  *
     145             :  * @param espi_dev eSPI emulation controller device
     146             :  * @param vw The signal to be set.
     147             :  * @param level The level of the signal to be set.
     148             :  *
     149             :  * @retval 0 If successful.
     150             :  * @retval -EIO General input / output error.
     151             :  */
     152           1 : int emul_espi_host_send_vw(const struct device *espi_dev, enum espi_vwire_signal vw, uint8_t level);
     153             : 
     154             : /**
     155             :  * Perform port80 write on the emulated host side, which will
     156             :  * trigger a proper event(and callbacks) on the emulated eSPI controller
     157             :  *
     158             :  * @param espi_dev eSPI emulation controller device
     159             :  * @param data The date to be written.
     160             :  *
     161             :  * @retval 0 If successful.
     162             :  * @retval -EIO General input / output error.
     163             :  */
     164           1 : int emul_espi_host_port80_write(const struct device *espi_dev, uint32_t data);
     165             : 
     166             : #ifdef CONFIG_ESPI_PERIPHERAL_ACPI_SHM_REGION
     167             : /**
     168             :  * Get the host device's ACPI shared memory start address. The size of the region is
     169             :  * CONFIG_EMUL_ESPI_HOST_ACPI_SHM_REGION_SIZE.
     170             :  *
     171             :  * @param espi_dev eSPI emulation controller device.
     172             :  * @return Address of the start of the ACPI shared memory.
     173             :  */
     174             : uintptr_t emul_espi_host_get_acpi_shm(const struct device *espi_dev);
     175             : #endif
     176             : 
     177             : #ifdef __cplusplus
     178             : }
     179             : #endif
     180             : 
     181             : /**
     182             :  * @}
     183             :  */
     184             : 
     185             : #endif /* ZEPHYR_INCLUDE_DRIVERS_ESPI_SPI_EMUL_H_ */

Generated by: LCOV version 1.14