123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981 |
- #ifndef ZEPHYR_INCLUDE_ESPI_H_
- #define ZEPHYR_INCLUDE_ESPI_H_
- #include <sys/__assert.h>
- #include <zephyr/types.h>
- #include <device.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- enum espi_io_mode {
- ESPI_IO_MODE_SINGLE_LINE = BIT(0),
- ESPI_IO_MODE_DUAL_LINES = BIT(1),
- ESPI_IO_MODE_QUAD_LINES = BIT(2),
- };
- enum espi_channel {
- ESPI_CHANNEL_PERIPHERAL = BIT(0),
- ESPI_CHANNEL_VWIRE = BIT(1),
- ESPI_CHANNEL_OOB = BIT(2),
- ESPI_CHANNEL_FLASH = BIT(3),
- };
- enum espi_bus_event {
- ESPI_BUS_RESET = BIT(0),
- ESPI_BUS_EVENT_CHANNEL_READY = BIT(1),
- ESPI_BUS_EVENT_VWIRE_RECEIVED = BIT(2),
- ESPI_BUS_EVENT_OOB_RECEIVED = BIT(3),
- ESPI_BUS_PERIPHERAL_NOTIFICATION = BIT(4),
- };
- #define ESPI_PERIPHERAL_INDEX_0 0ul
- #define ESPI_PERIPHERAL_INDEX_1 1ul
- #define ESPI_PERIPHERAL_INDEX_2 2ul
- #define ESPI_SLAVE_TO_MASTER 0ul
- #define ESPI_MASTER_TO_SLAVE 1ul
- #define ESPI_VWIRE_SRC_ID0 0ul
- #define ESPI_VWIRE_SRC_ID1 1ul
- #define ESPI_VWIRE_SRC_ID2 2ul
- #define ESPI_VWIRE_SRC_ID3 3ul
- #define ESPI_VWIRE_SRC_ID_MAX 4ul
- #define ESPI_PERIPHERAL_NODATA 0ul
- #define E8042_START_OPCODE 0x50
- #define E8042_MAX_OPCODE 0x5F
- #define EACPI_START_OPCODE 0x60
- #define EACPI_MAX_OPCODE 0x6F
- #define ECUSTOM_START_OPCODE 0xF0
- #define ECUSTOM_MAX_OPCODE 0xFF
- enum espi_virtual_peripheral {
- ESPI_PERIPHERAL_UART,
- ESPI_PERIPHERAL_8042_KBC,
- ESPI_PERIPHERAL_HOST_IO,
- ESPI_PERIPHERAL_DEBUG_PORT80,
- ESPI_PERIPHERAL_HOST_IO_PVT,
- #if defined(CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD)
- ESPI_PERIPHERAL_EC_HOST_CMD,
- #endif
- };
- enum espi_cycle_type {
- ESPI_CYCLE_MEMORY_READ32,
- ESPI_CYCLE_MEMORY_READ64,
- ESPI_CYCLE_MEMORY_WRITE32,
- ESPI_CYCLE_MEMORY_WRITE64,
- ESPI_CYCLE_MESSAGE_NODATA,
- ESPI_CYCLE_MESSAGE_DATA,
- ESPI_CYCLE_OK_COMPLETION_NODATA,
- ESPI_CYCLE_OKCOMPLETION_DATA,
- ESPI_CYCLE_NOK_COMPLETION_NODATA,
- };
- enum espi_vwire_signal {
-
- ESPI_VWIRE_SIGNAL_SLP_S3,
- ESPI_VWIRE_SIGNAL_SLP_S4,
- ESPI_VWIRE_SIGNAL_SLP_S5,
- ESPI_VWIRE_SIGNAL_OOB_RST_WARN,
- ESPI_VWIRE_SIGNAL_PLTRST,
- ESPI_VWIRE_SIGNAL_SUS_STAT,
- ESPI_VWIRE_SIGNAL_NMIOUT,
- ESPI_VWIRE_SIGNAL_SMIOUT,
- ESPI_VWIRE_SIGNAL_HOST_RST_WARN,
- ESPI_VWIRE_SIGNAL_SLP_A,
- ESPI_VWIRE_SIGNAL_SUS_PWRDN_ACK,
- ESPI_VWIRE_SIGNAL_SUS_WARN,
- ESPI_VWIRE_SIGNAL_SLP_WLAN,
- ESPI_VWIRE_SIGNAL_SLP_LAN,
- ESPI_VWIRE_SIGNAL_HOST_C10,
- ESPI_VWIRE_SIGNAL_DNX_WARN,
-
- ESPI_VWIRE_SIGNAL_PME,
- ESPI_VWIRE_SIGNAL_WAKE,
- ESPI_VWIRE_SIGNAL_OOB_RST_ACK,
- ESPI_VWIRE_SIGNAL_SLV_BOOT_STS,
- ESPI_VWIRE_SIGNAL_ERR_NON_FATAL,
- ESPI_VWIRE_SIGNAL_ERR_FATAL,
- ESPI_VWIRE_SIGNAL_SLV_BOOT_DONE,
- ESPI_VWIRE_SIGNAL_HOST_RST_ACK,
- ESPI_VWIRE_SIGNAL_RST_CPU_INIT,
-
- ESPI_VWIRE_SIGNAL_SMI,
-
- ESPI_VWIRE_SIGNAL_SCI,
- ESPI_VWIRE_SIGNAL_DNX_ACK,
- ESPI_VWIRE_SIGNAL_SUS_ACK,
- };
- enum lpc_peripheral_opcode {
-
- E8042_OBF_HAS_CHAR = 0x50,
- E8042_IBF_HAS_CHAR,
-
- E8042_WRITE_KB_CHAR,
- E8042_WRITE_MB_CHAR,
-
- E8042_RESUME_IRQ,
- E8042_PAUSE_IRQ,
- E8042_CLEAR_OBF,
-
- E8042_READ_KB_STS,
- E8042_SET_FLAG,
- E8042_CLEAR_FLAG,
-
- EACPI_OBF_HAS_CHAR = EACPI_START_OPCODE,
- EACPI_IBF_HAS_CHAR,
-
- EACPI_WRITE_CHAR,
-
- EACPI_READ_STS,
- EACPI_WRITE_STS,
- #if defined(CONFIG_ESPI_PERIPHERAL_ACPI_SHM_REGION)
-
- EACPI_GET_SHARED_MEMORY,
- #endif
- #if defined(CONFIG_ESPI_PERIPHERAL_CUSTOM_OPCODE)
-
- ECUSTOM_HOST_SUBS_INTERRUPT_EN = ECUSTOM_START_OPCODE,
- ECUSTOM_HOST_CMD_GET_PARAM_MEMORY,
- ECUSTOM_HOST_CMD_SEND_RESULT,
- #endif
- };
- #define HOST_KBC_EVT_IBF BIT(0)
- #define HOST_KBC_EVT_OBE BIT(1)
- struct espi_evt_data_kbc {
- uint32_t type:8;
- uint32_t data:8;
- uint32_t evt:8;
- uint32_t reserved:8;
- };
- struct espi_evt_data_acpi {
- uint32_t type:8;
- uint32_t data:8;
- uint32_t reserved:16;
- };
- struct espi_event {
-
- enum espi_bus_event evt_type;
-
- uint32_t evt_details;
-
- uint32_t evt_data;
- };
- struct espi_cfg {
-
- enum espi_io_mode io_caps;
-
- enum espi_channel channel_caps;
-
- uint8_t max_freq;
- };
- struct espi_request_packet {
- enum espi_cycle_type cycle_type;
- uint8_t tag;
- uint16_t len;
- uint32_t address;
- uint8_t *data;
- };
- struct espi_oob_packet {
- uint8_t *buf;
- uint16_t len;
- };
- struct espi_flash_packet {
- uint8_t *buf;
- uint32_t flash_addr;
- uint16_t len;
- };
- struct espi_callback;
- typedef void (*espi_callback_handler_t) (const struct device *dev,
- struct espi_callback *cb,
- struct espi_event espi_evt);
- struct espi_callback {
-
- sys_snode_t node;
-
- espi_callback_handler_t handler;
-
- enum espi_bus_event evt_type;
- };
- typedef int (*espi_api_config)(const struct device *dev, struct espi_cfg *cfg);
- typedef bool (*espi_api_get_channel_status)(const struct device *dev,
- enum espi_channel ch);
- typedef int (*espi_api_read_request)(const struct device *dev,
- struct espi_request_packet *req);
- typedef int (*espi_api_write_request)(const struct device *dev,
- struct espi_request_packet *req);
- typedef int (*espi_api_lpc_read_request)(const struct device *dev,
- enum lpc_peripheral_opcode op,
- uint32_t *data);
- typedef int (*espi_api_lpc_write_request)(const struct device *dev,
- enum lpc_peripheral_opcode op,
- uint32_t *data);
- typedef int (*espi_api_send_vwire)(const struct device *dev,
- enum espi_vwire_signal vw,
- uint8_t level);
- typedef int (*espi_api_receive_vwire)(const struct device *dev,
- enum espi_vwire_signal vw,
- uint8_t *level);
- typedef int (*espi_api_send_oob)(const struct device *dev,
- struct espi_oob_packet *pckt);
- typedef int (*espi_api_receive_oob)(const struct device *dev,
- struct espi_oob_packet *pckt);
- typedef int (*espi_api_flash_read)(const struct device *dev,
- struct espi_flash_packet *pckt);
- typedef int (*espi_api_flash_write)(const struct device *dev,
- struct espi_flash_packet *pckt);
- typedef int (*espi_api_flash_erase)(const struct device *dev,
- struct espi_flash_packet *pckt);
- typedef int (*espi_api_manage_callback)(const struct device *dev,
- struct espi_callback *callback,
- bool set);
- __subsystem struct espi_driver_api {
- espi_api_config config;
- espi_api_get_channel_status get_channel_status;
- espi_api_read_request read_request;
- espi_api_write_request write_request;
- espi_api_lpc_read_request read_lpc_request;
- espi_api_lpc_write_request write_lpc_request;
- espi_api_send_vwire send_vwire;
- espi_api_receive_vwire receive_vwire;
- espi_api_send_oob send_oob;
- espi_api_receive_oob receive_oob;
- espi_api_flash_read flash_read;
- espi_api_flash_write flash_write;
- espi_api_flash_erase flash_erase;
- espi_api_manage_callback manage_callback;
- };
- __syscall int espi_config(const struct device *dev, struct espi_cfg *cfg);
- static inline int z_impl_espi_config(const struct device *dev,
- struct espi_cfg *cfg)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- return api->config(dev, cfg);
- }
- __syscall bool espi_get_channel_status(const struct device *dev,
- enum espi_channel ch);
- static inline bool z_impl_espi_get_channel_status(const struct device *dev,
- enum espi_channel ch)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- return api->get_channel_status(dev, ch);
- }
- __syscall int espi_read_request(const struct device *dev,
- struct espi_request_packet *req);
- static inline int z_impl_espi_read_request(const struct device *dev,
- struct espi_request_packet *req)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->read_request) {
- return -ENOTSUP;
- }
- return api->read_request(dev, req);
- }
- __syscall int espi_write_request(const struct device *dev,
- struct espi_request_packet *req);
- static inline int z_impl_espi_write_request(const struct device *dev,
- struct espi_request_packet *req)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->write_request) {
- return -ENOTSUP;
- }
- return api->write_request(dev, req);
- }
- __syscall int espi_read_lpc_request(const struct device *dev,
- enum lpc_peripheral_opcode op,
- uint32_t *data);
- static inline int z_impl_espi_read_lpc_request(const struct device *dev,
- enum lpc_peripheral_opcode op,
- uint32_t *data)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->read_lpc_request) {
- return -ENOTSUP;
- }
- return api->read_lpc_request(dev, op, data);
- }
- __syscall int espi_write_lpc_request(const struct device *dev,
- enum lpc_peripheral_opcode op,
- uint32_t *data);
- static inline int z_impl_espi_write_lpc_request(const struct device *dev,
- enum lpc_peripheral_opcode op,
- uint32_t *data)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->write_lpc_request) {
- return -ENOTSUP;
- }
- return api->write_lpc_request(dev, op, data);
- }
- __syscall int espi_send_vwire(const struct device *dev,
- enum espi_vwire_signal signal,
- uint8_t level);
- static inline int z_impl_espi_send_vwire(const struct device *dev,
- enum espi_vwire_signal signal,
- uint8_t level)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- return api->send_vwire(dev, signal, level);
- }
- __syscall int espi_receive_vwire(const struct device *dev,
- enum espi_vwire_signal signal,
- uint8_t *level);
- static inline int z_impl_espi_receive_vwire(const struct device *dev,
- enum espi_vwire_signal signal,
- uint8_t *level)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- return api->receive_vwire(dev, signal, level);
- }
- __syscall int espi_send_oob(const struct device *dev,
- struct espi_oob_packet *pckt);
- static inline int z_impl_espi_send_oob(const struct device *dev,
- struct espi_oob_packet *pckt)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->send_oob) {
- return -ENOTSUP;
- }
- return api->send_oob(dev, pckt);
- }
- __syscall int espi_receive_oob(const struct device *dev,
- struct espi_oob_packet *pckt);
- static inline int z_impl_espi_receive_oob(const struct device *dev,
- struct espi_oob_packet *pckt)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->receive_oob) {
- return -ENOTSUP;
- }
- return api->receive_oob(dev, pckt);
- }
- __syscall int espi_read_flash(const struct device *dev,
- struct espi_flash_packet *pckt);
- static inline int z_impl_espi_read_flash(const struct device *dev,
- struct espi_flash_packet *pckt)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->flash_read) {
- return -ENOTSUP;
- }
- return api->flash_read(dev, pckt);
- }
- __syscall int espi_write_flash(const struct device *dev,
- struct espi_flash_packet *pckt);
- static inline int z_impl_espi_write_flash(const struct device *dev,
- struct espi_flash_packet *pckt)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->flash_write) {
- return -ENOTSUP;
- }
- return api->flash_write(dev, pckt);
- }
- __syscall int espi_flash_erase(const struct device *dev,
- struct espi_flash_packet *pckt);
- static inline int z_impl_espi_flash_erase(const struct device *dev,
- struct espi_flash_packet *pckt)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->flash_erase) {
- return -ENOTSUP;
- }
- return api->flash_erase(dev, pckt);
- }
- static inline void espi_init_callback(struct espi_callback *callback,
- espi_callback_handler_t handler,
- enum espi_bus_event evt_type)
- {
- __ASSERT(callback, "Callback pointer should not be NULL");
- __ASSERT(handler, "Callback handler pointer should not be NULL");
- callback->handler = handler;
- callback->evt_type = evt_type;
- }
- static inline int espi_add_callback(const struct device *dev,
- struct espi_callback *callback)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->manage_callback) {
- return -ENOTSUP;
- }
- return api->manage_callback(dev, callback, true);
- }
- static inline int espi_remove_callback(const struct device *dev,
- struct espi_callback *callback)
- {
- const struct espi_driver_api *api =
- (const struct espi_driver_api *)dev->api;
- if (!api->manage_callback) {
- return -ENOTSUP;
- }
- return api->manage_callback(dev, callback, false);
- }
- #ifdef __cplusplus
- }
- #endif
- #include <syscalls/espi.h>
- #endif
|