123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- /*
- * Copyright 2020 Google LLC
- *
- * SPDX-License-Identifier: Apache-2.0
- */
- #ifndef ZEPHYR_INCLUDE_DRIVERS_ESPI_SPI_EMUL_H_
- #define ZEPHYR_INCLUDE_DRIVERS_ESPI_SPI_EMUL_H_
- /**
- * @file
- *
- * @brief Public APIs for the eSPI emulation drivers.
- */
- #include <zephyr/types.h>
- #include <device.h>
- /**
- * @brief eSPI Emulation Interface
- * @defgroup espi_emul_interface eSPI Emulation Interface
- * @ingroup io_emulators
- * @{
- */
- #ifdef __cplusplus
- extern "C" {
- #endif
- #define EMUL_ESPI_HOST_CHIPSEL 0
- struct espi_emul;
- /**
- * Passes eSPI virtual wires set request (virtual wire packet) to the emulator.
- * The emulator updates the state (level) of its virtual wire.
- *
- * @param emul Emulator instance
- * @param vw The signal to be set.
- * @param level The level of signal requested LOW(0) or HIGH(1).
- *
- * @retval 0 If successful.
- * @retval -EIO General input / output error.
- */
- typedef int (*emul_espi_api_set_vw)(struct espi_emul *emul,
- enum espi_vwire_signal vw,
- uint8_t level);
- /**
- * Passes eSPI virtual wires get request (virtual wire packet) to the emulator.
- * The emulator returns the state (level) of its virtual wire.
- *
- * @param emul Emulator instance
- * @param vw The signal to be get.
- * @param level The level of the signal to be get.
- *
- * @retval 0 If successful.
- * @retval -EIO General input / output error.
- */
- typedef int (*emul_espi_api_get_vw)(struct espi_emul *emul,
- enum espi_vwire_signal vw,
- uint8_t *level);
- #ifdef CONFIG_ESPI_PERIPHERAL_ACPI_SHM_REGION
- /**
- * Get the ACPI shared memory address owned by the emulator.
- *
- * @param emul Emulator instance.
- *
- * @retval The address of the memory.
- */
- typedef uintptr_t (*emul_espi_api_get_acpi_shm)(struct espi_emul *emul);
- #endif
- /**
- * Find an emulator present on a eSPI bus
- *
- * At present the function is used only to find an emulator of the host
- * device. It may be useful in systems with the SPI flash chips.
- *
- * @param dev eSPI emulation controller device
- * @param chipsel Chip-select value
- * @return emulator to use
- * @return NULL if not found
- */
- typedef struct espi_emul *(*emul_find_emul)(const struct device *dev,
- unsigned int chipsel);
- /**
- * Triggers an event on the emulator of eSPI controller side which causes
- * calling specific callbacks.
- *
- * @param dev Device instance of emulated eSPI controller
- * @param evt Event to be triggered
- *
- * @retval 0 If successful.
- * @retval -EIO General input / output error.
- */
- typedef int (*emul_trigger_event)(const struct device *dev,
- struct espi_event *evt);
- /** Definition of the eSPI device emulator API */
- struct emul_espi_device_api {
- emul_espi_api_set_vw set_vw;
- emul_espi_api_get_vw get_vw;
- #ifdef CONFIG_ESPI_PERIPHERAL_ACPI_SHM_REGION
- emul_espi_api_get_acpi_shm get_acpi_shm;
- #endif
- };
- /** Node in a linked list of emulators for eSPI devices */
- struct espi_emul {
- sys_snode_t node;
- /* API provided for this device */
- const struct emul_espi_device_api *api;
- /* eSPI chip-select of the emulated device */
- uint16_t chipsel;
- };
- /** Definition of the eSPI controller emulator API */
- struct emul_espi_driver_api {
- /* The struct espi_driver_api has to be first in
- * struct emul_espi_driver_api to make pointer casting working
- */
- struct espi_driver_api espi_api;
- /* The rest, emulator specific functions */
- emul_trigger_event trigger_event;
- emul_find_emul find_emul;
- };
- /**
- * Register an emulated device on the controller
- *
- * @param dev Device that will use the emulator
- * @param name User-friendly name for this emulator
- * @param emul eSPI emulator to use
- * @return 0 indicating success (always)
- */
- int espi_emul_register(const struct device *dev, const char *name,
- struct espi_emul *emul);
- /**
- * Sets the eSPI virtual wire on the host side, which will
- * trigger a proper event(and callbacks) on the emulated eSPI controller
- *
- * @param espi_dev eSPI emulation controller device
- * @param vw The signal to be set.
- * @param level The level of the signal to be set.
- *
- * @retval 0 If successful.
- * @retval -EIO General input / output error.
- */
- int emul_espi_host_send_vw(const struct device *espi_dev,
- enum espi_vwire_signal vw, uint8_t level);
- /**
- * Perform port80 write on the emulated host side, which will
- * trigger a proper event(and callbacks) on the emulated eSPI controller
- *
- * @param espi_dev eSPI emulation controller device
- * @param data The date to be written.
- *
- * @retval 0 If successful.
- * @retval -EIO General input / output error.
- */
- int emul_espi_host_port80_write(const struct device *espi_dev, uint32_t data);
- #ifdef CONFIG_ESPI_PERIPHERAL_ACPI_SHM_REGION
- /**
- * Get the host device's ACPI shared memory start address. The size of the region is
- * CONFIG_EMUL_ESPI_HOST_ACPI_SHM_REGION_SIZE.
- *
- * @param espi_dev eSPI emulation controller device.
- * @return Address of the start of the ACPI shared memory.
- */
- uintptr_t emul_espi_host_get_acpi_shm(const struct device *espi_dev);
- #endif
- #ifdef __cplusplus
- }
- #endif
- /**
- * @}
- */
- #endif /* ZEPHYR_INCLUDE_DRIVERS_ESPI_SPI_EMUL_H_ */
|